in handlers/zuora-callout-apis/src/main/scala/com/gu/autoCancel/AutoCancel.scala [41:74]
private def executeCancel(requests: Requests, dryRun: Boolean)(acRequest: AutoCancelRequest): ApiGatewayOp[Unit] = {
val AutoCancelRequest(accountId, subToCancel, cancellationDate) = acRequest
logger.info(
s"Attempting to perform auto-cancellation on account: $accountId for subscription: ${subToCancel.value}",
)
val zuoraUpdateCancellationReasonF =
if (dryRun) ZuoraUpdateCancellationReason.dryRun(requests) _ else ZuoraUpdateCancellationReason(requests) _
val zuoraCancelSubscriptionF =
if (dryRun) ZuoraCancelSubscription.dryRun(requests) _ else ZuoraCancelSubscription(requests) _
val zuoraGetInvoiceTransactionsF =
if (dryRun) ZuoraGetInvoiceTransactions.dryRun(requests) _ else ZuoraGetInvoiceTransactions(requests) _
val zuoraTransferToCreditBalanceF =
if (dryRun) TransferToCreditBalance.dryRun(requests) _ else TransferToCreditBalance(requests) _
val zuoraApplyCreditBalanceF = if (dryRun) ApplyCreditBalance.dryRun(requests) _ else ApplyCreditBalance(requests) _
val zuoraOp = for {
_ <- zuoraUpdateCancellationReasonF(subToCancel).withLogging("updateCancellationReason")
cancellationResponse <- zuoraCancelSubscriptionF(subToCancel, cancellationDate).withLogging("cancelSubscription")
invoiceTransactionSummary <- zuoraGetInvoiceTransactionsF(accountId)
unbalancedInvoices <- UnbalancedInvoices.fromSummary(
accountId,
invoiceTransactionSummary,
cancellationResponse.invoiceId,
)
creditTransferAmount = -unbalancedInvoices.negativeInvoice.balance
_ <- zuoraTransferToCreditBalanceF(cancellationResponse.invoiceId, creditTransferAmount, "Auto-cancellation")
.withLogging("transferToCreditBalance")
_ <- applyCreditBalances(zuoraApplyCreditBalanceF)(
subToCancel,
unbalancedInvoices.unpaidInvoices,
"Auto-cancellation",
).withLogging("applyCreditBalance")
} yield ()
zuoraOp.toApiGatewayOp("AutoCancel failed")
}