in lambda/src/main/scala/pricemigrationengine/model/AmendmentData.scala [161:196]
private def totalChargeAmount(
ratePlanChargePairs: Seq[RatePlanChargePair]
): Either[DataExtractionFailure, BigDecimal] = {
def price(ratePlanChargePair: RatePlanChargePair): Either[DataExtractionFailure, Option[BigDecimal]] =
ZuoraPricing
.pricing(ratePlanChargePair.chargeFromProduct, ratePlanChargePair.chargeFromSubscription.currency)
.flatMap(_.price)
.filter(_ > 0) match {
case None => Right(None)
case Some(price) =>
adjustedForBillingPeriod(
price,
ratePlanChargePair.chargeFromSubscription.billingPeriod,
ratePlanChargePair.chargeFromProduct.billingPeriod
).map(Some(_))
.left
.map(e =>
DataExtractionFailure(
s"Failed to calculate amount of rate plan charge ${ratePlanChargePair.chargeFromSubscription.number}: $e"
)
)
}
val discountPercentageOrFailure = {
val discounts = ratePlanChargePairs.flatMap(_.chargeFromSubscription.discountPercentage.filter(_ > 0))
if (discounts.length > 1) Left(DataExtractionFailure("Subscription has more than one discount"))
else Right(discounts.headOption)
}
val prices = ratePlanChargePairs.map(price)
for {
discountPercentage <- discountPercentageOrFailure
_ <- prices.collectFirst { case Left(e) => e }.toLeft(())
} yield applyDiscountAndThenSum(