override def addProduct()

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