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