override def addProduct()

in handlers/new-product-api/src/main/scala/com/gu/newproduct/api/addsubscription/AddPaperSub.scala [56:115]


  override def addProduct(request: AddSubscriptionRequest): AsyncApiGatewayOp[SubscriptionName] = for {
    _ <- validateStartDate(request.planId, request.startDate).toApiGatewayOp.toAsync
    _ <- validateDeliveryAgent(request.planId, request.deliveryAgent).toApiGatewayOp.toAsync

    customerData <- getCustomerData(request.zuoraAccountId).toAsync
    _ <- validateAddress(request.planId, customerData.contacts.soldTo.address).toApiGatewayOp.toAsync
    zuoraRatePlanId <- getZuoraRateplanId(request.planId)
      .toApiGatewayContinueProcessing(internalServerError(s"no Zuora id for ${request.planId}!"))
      .toAsync

    ratePlans = request.discountRatePlanId
      .map(id =>
        List(
          ZuoraCreateSubRequestRatePlan(
            productRatePlanId = id,
            maybeChargeOverride = None,
          ),
          ZuoraCreateSubRequestRatePlan(
            maybeChargeOverride = None,
            productRatePlanId = zuoraRatePlanId,
          ),
        ),
      )
      .getOrElse(
        List(
          ZuoraCreateSubRequestRatePlan(
            maybeChargeOverride = None,
            productRatePlanId = zuoraRatePlanId,
          ),
        ),
      )

    createSubRequest = ZuoraCreateSubRequest(
      request = request,
      acceptanceDate = request.startDate,
      ratePlans = ratePlans,
    )
    subscriptionName <- createSubscription(createSubRequest).toAsyncApiGatewayOp("create paper subscription")
    plan = getPlan(request.planId)
    deliveryAgentRecord <- (request.deliveryAgent match {
      case Some(deliveryAgent) => lookupDeliveryAgent(deliveryAgent)
      case None => ClientSuccess(None).toApiGatewayOp("skip getAgents call")
    }).toAsync
    paperEmailData = PaperEmailData(
      plan = plan,
      firstPaymentDate = request.startDate,
      firstPaperDate = request.startDate,
      subscriptionName = subscriptionName,
      contacts = customerData.contacts,
      paymentMethod = customerData.paymentMethod,
      currency = customerData.account.currency,
      deliveryAgentDetails = deliveryAgentRecord.map { record =>
        import record._
        DeliveryAgentDetails(agentName, telephone, email, address1, address2, town, county, postcode)
      },
      discountMessage = request.discountMessage,
    )
    _ <- sendConfirmationEmail(customerData.account.sfContactId, paperEmailData)
      .recoverAndLog("send paper confirmation email")
  } yield subscriptionName