private def accountDetailsFromStripeSubscription()

in membership-attribute-service/app/services/GuardianPatronService.scala [63:139]


  private def accountDetailsFromStripeSubscription(
      subscription: Stripe.Subscription,
      paymentDetails: Stripe.CustomersPaymentMethods,
      stripePublicKey: String,
  ): AccountDetails = {
    val price = Price(subscription.plan.amount.toFloat, subscription.plan.currency)
    AccountDetails(
      contactId = "Guardian Patrons don't have a Salesforce contactId",
      regNumber = None,
      email = Some(subscription.customer.email),
      deliveryAddress = None,
      subscription = Subscription(
        id = Id(subscription.id),
        subscriptionNumber = SubscriptionNumber(subscription.id),
        accountId = AccountId(subscription.customer.id),
        contractEffectiveDate = subscription.created,
        customerAcceptanceDate = subscription.created,
        termEndDate = subscription.currentPeriodEnd,
        isCancelled = subscription.isCancelled,
        ratePlans = List(
          RatePlan(
            id = RatePlanId("guardian_patron_unused"), // only used for contribution amount change
            productRatePlanId = Catalog.guardianPatronProductRatePlanId,
            productName = "guardianpatron",
            lastChangeType = None,
            features = Nil,
            ratePlanCharges = NonEmptyList(
              RatePlanCharge(
                id = SubscriptionRatePlanChargeId(""), // only used for update contribution amount
                productRatePlanChargeId = ProductRatePlanChargeId(""), // benefit is only used for paper days (was Benefit.GuardianPatron)
                pricing = PricingSummary(Map(subscription.plan.currency -> price)),
                zBillingPeriod = Some(billingPeriodFromInterval(subscription.plan.interval)),
                specificBillingPeriod = None, // only used for fixed period e.g. GW 6 for 6
                endDateCondition = SubscriptionEnd,
                upToPeriods = None, // only used for fixed periods
                upToPeriodsType = None, // only used for fixed periods
                chargedThroughDate = Some(subscription.currentPeriodEnd),
                effectiveStartDate = subscription.currentPeriodStart,
                effectiveEndDate = subscription.currentPeriodEnd,
              ),
            ),
          ),
        ),
        readerType = Direct,
        autoRenew = true,
      ),
      paymentDetails = PaymentDetails(
        subscriberId = subscription.id,
        startDate = subscription.currentPeriodStart,
        customerAcceptanceDate = subscription.created,
        chargedThroughDate = Some(subscription.currentPeriodEnd),
        termEndDate = subscription.currentPeriodEnd,
        nextPaymentPrice = Some(subscription.plan.amount),
        lastPaymentDate = Some(subscription.currentPeriodStart),
        nextPaymentDate = subscription.nextPaymentDate,
        nextInvoiceDate = subscription.nextPaymentDate,
        remainingTrialLength = 0,
        pendingCancellation = subscription.isPastDue,
        paymentMethod = paymentDetails.cardStripeList.data.headOption.map(card =>
          PaymentCard(
            isReferenceTransaction = false,
            cardType = Some(card.`type`),
            paymentCardDetails = Some(PaymentCardDetails(card.last4, card.exp_month, card.exp_year)),
          ),
        ),
        plan = PersonalPlan("guardianpatron", price, subscription.plan.interval),
      ),
      billingCountry = None,
      stripePublicKey = stripePublicKey,
      accountHasMissedRecentPayments = subscription.isPastDue,
      safeToUpdatePaymentMethod = false, // TODO, this will require quite a few changes so for now we won't allow it
      isAutoRenew = true,
      alertText = None,
      accountId = subscription.customer.id,
      cancellationEffectiveDate = subscription.cancellationEffectiveDate.map(_.toString(DateTimeFormat.forPattern("yyyy-MM-dd"))),
    )
  }