private def totalChargeAmount()

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(