in src/main/scala/com/gu/invoicing/preview/Program.scala [19:36]
def program(input: PreviewInput): PreviewOutput = retryUnsafe {
val PreviewInput(subscriptionName, start, end) = input
val invoiceOwnerAccountId = getInvoiceOwnerAccountId(subscriptionName)
val allRatePlanCharges = getRatePlanCharges(subscriptionName, start)
val paidRatePlanCharges = allRatePlanCharges.filter(_.price > 0.0)
val pastInvoiceItems = getPastInvoiceItems(invoiceOwnerAccountId, subscriptionName, start, end)
val futureInvoiceItems = getFutureInvoiceItems(invoiceOwnerAccountId, subscriptionName, end)
val pastItemsWithTax = pastInvoiceItems.map(addTaxToPastInvoiceItems)
val futureItemsWithTax =
futureInvoiceItems.map(addTaxToFutureInvoiceItems(_, paidRatePlanCharges))
val allItemsWithTax = pastItemsWithTax ++ futureItemsWithTax
val invoiceItems = collectRelevantInvoiceItems(subscriptionName, allItemsWithTax)
val nextInvoiceDate = findNextInvoiceDate(invoiceItems)
val publications = invoiceItems.flatMap(splitInvoiceItemIntoPublications)
val affectedPublications = findAffectedPublicationsWithRange(publications, start, end)
val discountedPubs = affectedPublications.map(applyAnyDiscounts(allRatePlanCharges, _))
PreviewOutput(subscriptionName, nextInvoiceDate, start, end, discountedPubs)
}