in handlers/new-product-api/src/main/scala/com/gu/newproduct/api/addsubscription/AddSupporterPlus.scala [52:110]
override def addProduct(request: AddSubscriptionRequest): AsyncApiGatewayOp[SubscriptionName] =
for {
customerData <- getCustomerData(request.zuoraAccountId).toAsync
SupporterPlusCustomerData(account, paymentMethod, subscriptions, contacts) = customerData
validatableFields = ValidatableFields(request.amountMinorUnits, request.startDate)
amountMinorUnits <- supporterPlusValidations(
validatableFields,
request.planId,
account.currency,
).toApiGatewayOp.toAsync
acceptanceDate = request.startDate
plan = getPlan(request.planId)
planAndCharge <- getPlanAndCharge(request.planId)
.toApiGatewayContinueProcessing(internalServerError(s"no Zuora id for ${request.planId}!"))
.toAsync
contributionAmount = getContributionAmount(amountMinorUnits, account.currency, plan)
chargeOverride = ChargeOverride(Some(contributionAmount), planAndCharge.contributionProductRatePlanChargeId, None)
ratePlans = request.discountRatePlanId
.map(id =>
List(
ZuoraCreateSubRequestRatePlan(
productRatePlanId = id,
maybeChargeOverride = None,
),
ZuoraCreateSubRequestRatePlan(
productRatePlanId = planAndCharge.productRatePlanId,
maybeChargeOverride = Some(chargeOverride),
),
),
)
.getOrElse(
List(
ZuoraCreateSubRequestRatePlan(
productRatePlanId = planAndCharge.productRatePlanId,
maybeChargeOverride = Some(chargeOverride),
),
),
)
zuoraCreateSubRequest = ZuoraCreateSubRequest(
request = request,
acceptanceDate = acceptanceDate,
ratePlans = ratePlans,
)
subscriptionName <- createSubscription(zuoraCreateSubRequest).toAsyncApiGatewayOp("create monthly supporter plus")
supporterPlusEmailData = toSupporterPlusEmailData(
request = request,
currency = account.currency,
paymentMethod = paymentMethod,
firstPaymentDate = acceptanceDate,
contacts = contacts,
amountMinorUnits = amountMinorUnits,
plan = plan,
currentDate = getCurrentDate(),
subscriptionName = subscriptionName,
)
_ <- sendConfirmationEmail(account.sfContactId, supporterPlusEmailData).recoverAndLog(
"send supporter plus confirmation email",
)
} yield subscriptionName