def zuoraUpdate()

in lambda/src/main/scala/pricemigrationengine/model/ZuoraSubscriptionUpdate.scala [33:78]


  def zuoraUpdate(
      account: ZuoraAccount,
      catalogue: ZuoraProductCatalogue,
      subscription: ZuoraSubscription,
      invoiceList: ZuoraInvoiceList,
      effectiveDate: LocalDate,
      enforcedPrice: Option[BigDecimal]
  ): Either[DataExtractionFailure, ZuoraSubscriptionUpdate] = {

    val activeRatePlans = (for {
      invoiceItem <- ZuoraInvoiceItem.items(invoiceList, subscription, effectiveDate)
      ratePlanCharge <- ZuoraRatePlanCharge.matchingRatePlanCharge(subscription, invoiceItem).toSeq
      price <- ratePlanCharge.price.toSeq
      if price > 0
      ratePlan <- ZuoraRatePlan.ratePlanChargeToMatchingRatePlan(subscription, ratePlanCharge).toSeq
    } yield ratePlan).distinct

    if (activeRatePlans.isEmpty)
      Left(DataExtractionFailure(s"No rate plans to update for subscription ${subscription.subscriptionNumber}"))
    else if (activeRatePlans.size > 1)
      Left(DataExtractionFailure(s"Multiple rate plans to update: ${activeRatePlans.map(_.id)}"))
    else {
      val isZoneABC = activeRatePlans.filter(zoneABCPlanNames contains _.productName)
      val pricingData = productPricingMap(catalogue)

      activeRatePlans
        .map(
          if (isZoneABC.nonEmpty)
            AddZuoraRatePlan.fromRatePlanGuardianWeekly(account, catalogue, effectiveDate, enforcedPrice)
          else AddZuoraRatePlan.fromRatePlan(pricingData, effectiveDate, enforcedPrice)
        )
        .sequence
        .map { add =>
          val isTermTooShort = subscription.termEndDate.isBefore(effectiveDate)
          ZuoraSubscriptionUpdate(
            add,
            remove = activeRatePlans.map(ratePlan => RemoveZuoraRatePlan(ratePlan.id, effectiveDate)),
            currentTerm =
              if (isTermTooShort)
                Some(subscription.termStartDate.until(effectiveDate, DAYS).toInt)
              else None,
            currentTermPeriodType = if (isTermTooShort) Some("Day") else None
          )
        }
    }
  }