in src/main/scala/InvoiceHelper.scala [20:50]
def collectAdjustments(accountId: String, invoices: List[Invoice]): String \/ List[InvoiceItemAdjustment] = {
val adjustments = invoices.map { invoice =>
val positiveCharges = invoice.invoiceItems.filter(_.chargeAmount > 0)
val negativeCharges = invoice.invoiceItems.filter(_.chargeAmount < 0)
val chargeAdjustments = {
val chargeTuples = positiveCharges.zipAll(negativeCharges.map(discount => Some(discount)), positiveCharges.maxBy(_.chargeAmount), None)
chargeTuples.map { chargeAndDiscount => buildChargeAdjustment(invoice, chargeAndDiscount._1, chargeAndDiscount._2) }
}
val taxQuery = getTaxationItemDetails(accountId, invoice)
taxQuery match {
case \/-(taxationItems) => {
val positiveTaxAmounts = taxationItems.filter(taxItem => taxItem.taxAmount > 0)
val negativeTaxAmounts = taxationItems.filter(taxItem => taxItem.taxAmount < 0)
val taxAdjustments = {
if (positiveTaxAmounts.nonEmpty) {
val taxTuples = positiveTaxAmounts.zipAll(negativeTaxAmounts.map(taxDiscount => Some(taxDiscount)), positiveTaxAmounts.maxBy(_.taxAmount), None)
taxTuples.map { taxChargeAndDiscount => buildTaxAdjustment(invoice, taxChargeAndDiscount._1, taxChargeAndDiscount._2) }
} else List()
}
val allAdjustments = taxAdjustments ++ chargeAdjustments
allAdjustments.right
}
case -\/(error) => {
s"Failed to obtain tax adjustment details: $error".left
}
}
}
val failures = adjustments.collect { case -\/(error) => error }
val allAdjustments = adjustments.collect { case \/-(adjustment) => adjustment }.flatten
if (failures.isEmpty) allAdjustments.right else s"Failed when gathering adjustments: $failures".left
}