def collectAdjustments()

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
  }