/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.util.*;
import java.math.BigDecimal;
import org.ofbiz.entity.*;
import org.ofbiz.base.util.*;
import org.ofbiz.base.util.collections.*;
import org.ofbiz.accounting.invoice.*;
import org.ofbiz.accounting.payment.*;
import java.text.DateFormat;
import java.text.*;
import java.text.NumberFormat;

// @param GenericValue invoice - The Invoice entity to find payment applications for
if (!invoice) return;

invoiceApplications = [];  // to pass back to the screen with payment applications added
// retrieve related applications with null itemnumber
invoiceAppls = invoice.getRelated("PaymentApplication", [invoiceItemSeqId : null], null, false);
invoiceAppls.each { invoiceAppl ->
    itemmap = [:];
    itemmap.invoiceId = invoiceAppl.invoiceId;
    itemmap.invoiceItemSeqId = invoiceAppl.invoiceItemSeqId;
    itemmap.total = InvoiceWorker.getInvoiceTotal(invoice);
    itemmap.paymentApplicationId = invoiceAppl.paymentApplicationId;
    itemmap.paymentId = invoiceAppl.paymentId;
    itemmap.billingAccountId = invoiceAppl.billingAccountId;
    itemmap.taxAuthGeoId = invoiceAppl.taxAuthGeoId;
    itemmap.amountToApply = invoiceAppl.amountApplied;
    itemmap.amountApplied = invoiceAppl.amountApplied;
    invoiceApplications.add(itemmap);
}


// retrieve related applications with an existing itemnumber
invoice.getRelated("InvoiceItem", null, null, false).each { item ->
    BigDecimal itemTotal = null;
    if (item.amount != null) {
          if (!item.quantity) {
              itemTotal = item.getBigDecimal("amount");
          } else {
              itemTotal = item.getBigDecimal("amount").multiply(item.getBigDecimal("quantity"));
          }
    }
    // get relation payment applications for every item(can be more than 1 per item number)
    item.getRelated("PaymentApplication", null, null, false).each { paymentApplication ->
        itemmap = [:];
        itemmap.putAll(item);
        itemmap.total = NumberFormat.getInstance(locale).format(itemTotal);
        itemmap.paymentApplicationId = paymentApplication.paymentApplicationId;
        itemmap.paymentId = paymentApplication.paymentId;
        itemmap.toPaymentId = paymentApplication.toPaymentId;
        itemmap.amountApplied = paymentApplication.getBigDecimal("amountApplied");
        itemmap.amountToApply = paymentApplication.getBigDecimal("amountApplied");
        itemmap.billingAccountId = paymentApplication.billingAccountId;
        itemmap.taxAuthGeoId = paymentApplication.taxAuthGeoId;
        invoiceApplications.add(itemmap);
    }
}
if (invoiceApplications) context.invoiceApplications = invoiceApplications;
