in src/main/scala/com/gu/invoicing/invoice/Impl.scala [87:119]
def getPaymentMethod(
invoiceId: String,
invoices: List[Invoice],
payments: List[Payment],
paymentMethods: List[PaymentMethod],
): Option[PaymentMethod] = {
val paymentMethodIdByInvoiceId: Map[String, String] =
payments.flatMap { payment =>
payment.paidInvoices
.tap(v =>
assert(
v.length == 1,
s"Payment should be associated with only one invoice: ${payment.spy}",
),
)
.headOption
.map { _.invoiceId -> payment.paymentMethodId }
}.toMap
val paymentMethodById: Map[String, PaymentMethod] =
paymentMethods.map(paymentMethod => paymentMethod.Id -> paymentMethod).toMap
val paymentMethodByInvoiceId: Map[String, Option[PaymentMethod]] =
invoices.map { invoice =>
paymentMethodIdByInvoiceId
.get(invoiceId) match { // invoice might not be (yet) associated with payment
case Some(paymentMethodId) => invoice.id -> paymentMethodById.get(paymentMethodId)
case None => invoice.id -> None
}
}.toMap
paymentMethodByInvoiceId(invoiceId)
}