def priceDataWithRatePlanMatching()

in lambda/src/main/scala/pricemigrationengine/model/AmendmentData.scala [244:279]


  def priceDataWithRatePlanMatching(
      account: ZuoraAccount,
      catalogue: ZuoraProductCatalogue,
      subscription: ZuoraSubscription,
      invoiceList: ZuoraInvoiceList,
      nextServiceStartDate: LocalDate,
  ): Either[DataExtractionFailure, PriceData] = {

    val invoiceItems = ZuoraInvoiceItem.items(invoiceList, subscription, nextServiceStartDate)

    val zoneABCPlanNames = List("Guardian Weekly Zone A", "Guardian Weekly Zone B", "Guardian Weekly Zone C")

    for {
      ratePlanCharges <- ratePlanChargesOrFail(subscription, invoiceItems)
      ratePlan <- ZuoraRatePlan
        .ratePlanChargeToMatchingRatePlan(subscription, ratePlanCharges.head)
        .toRight(DataExtractionFailure(s"Failed to get RatePlan for charges: $ratePlanCharges"))

      isZoneABC = zoneABCPlanNames contains ratePlan.productName

      pairs <-
        if (isZoneABC)
          GuardianWeeklyMigration.getNewRatePlanCharges(account, catalogue, ratePlanCharges).map(_.chargePairs)
        else ratePlanChargePairs(catalogue, ratePlanCharges)

      currency <- pairs.headOption
        .map(p => Right(p.chargeFromSubscription.currency))
        .getOrElse(Left(DataExtractionFailure(s"No invoice items for date: $nextServiceStartDate")))
      oldPrice <- totalChargeAmount(subscription, invoiceList, nextServiceStartDate)
      newPrice <- totalChargeAmount(pairs)
      billingPeriod <- pairs
        .flatMap(_.chargeFromSubscription.billingPeriod)
        .headOption
        .toRight(DataExtractionFailure("Unknown billing period"))
    } yield PriceData(currency, oldPrice, newPrice, billingPeriod)
  }