private[autoCancel] def applyCreditBalances()

in handlers/zuora-callout-apis/src/main/scala/com/gu/autoCancel/AutoCancel.scala [76:97]


  private[autoCancel] def applyCreditBalances(applyCreditBalance: (String, Double, String) => ClientFailableOp[Unit])(
      subToCancel: SubscriptionNumber,
      invoices: Seq[ItemisedInvoice],
      comment: String,
  ): ClientFailableOp[Unit] = {
    invoices
      .map(invoice =>
        invoice.invoiceItems.length match {
          case 0 => GenericError(s"Invoice ${invoice.id} has no items")
          case 1 => applyCreditBalance(invoice.id, invoice.balance, comment)
          case _ =>
            invoice.invoiceItems.filter(_.subscriptionName == subToCancel.value) match {
              case Nil => GenericError(s"Invoice ${invoice.id} isn't for subscription $subToCancel")
              case items =>
                val amount = items.map(item => item.chargeAmount + item.taxAmount).sum
                applyCreditBalance(invoice.id, amount, comment)
            }
        },
      )
      .collectFirst { case failure: ClientFailure => failure }
      .getOrElse(ClientSuccess(()))
  }