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