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