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)
}