def program()

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