def getPaymentMethod()

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