/* * 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 org.apache.ofbiz.accounting.invoice.* import org.apache.ofbiz.accounting.payment.* import org.apache.ofbiz.base.util.UtilNumber import org.apache.ofbiz.base.util.collections.* import org.apache.ofbiz.entity.condition.EntityCondition import org.apache.ofbiz.entity.condition.EntityOperator paymentId = parameters.paymentId payment = from("Payment").where("paymentId", paymentId).queryOne() decimals = UtilNumber.getBigDecimalScale("invoice.decimals") rounding = UtilNumber.getBigDecimalRoundingMode("invoice.rounding") exprList = [EntityCondition.makeCondition("partyId", EntityOperator.EQUALS, payment.partyIdFrom), EntityCondition.makeCondition("partyIdFrom", EntityOperator.EQUALS, payment.partyIdTo)] partyCond = EntityCondition.makeCondition(exprList, EntityOperator.AND) exprList1 = [EntityCondition.makeCondition("statusId", EntityOperator.EQUALS, "INVOICE_APPROVED"), EntityCondition.makeCondition("statusId", EntityOperator.EQUALS, "INVOICE_SENT"), EntityCondition.makeCondition("statusId", EntityOperator.EQUALS, "INVOICE_READY"), EntityCondition.makeCondition("statusId", EntityOperator.EQUALS, "INVOICE_RECEIVED")] statusCond = EntityCondition.makeCondition(exprList1, EntityOperator.OR) currCond = EntityCondition.makeCondition("currencyUomId", EntityOperator.EQUALS, payment.currencyUomId) actualCurrCond = EntityCondition.makeCondition("currencyUomId", EntityOperator.EQUALS, payment.actualCurrencyUomId) topCond = EntityCondition.makeCondition([partyCond, statusCond, currCond], EntityOperator.AND) topCondActual = EntityCondition.makeCondition([partyCond, statusCond, actualCurrCond], EntityOperator.AND) //retrieve invoices for the related parties which have not been (fully) applied yet and which have the same currency as the payment invoices = select("invoiceId", "invoiceTypeId", "currencyUomId", "description", "invoiceDate") .from("Invoice") .where(topCond) .orderBy("invoiceDate") .queryList() context.invoices = getInvoices(invoices, false) //retrieve invoices for the related parties which have not been (fully) applied yet and which have the same originalCurrency as the payment invoices = select("invoiceId", "invoiceTypeId", "currencyUomId", "description", "invoiceDate") .from("Invoice") .where(topCondActual) .orderBy("invoiceDate") .queryList() context.invoicesOtherCurrency = getInvoices(invoices, true) List getInvoices(List invoices, boolean actual) { if (invoices) { invoicesList = [] // to pass back to the screeen list of unapplied invoices paymentApplied = PaymentWorker.getPaymentApplied(payment) paymentToApply = payment.getBigDecimal("amount").setScale(decimals,rounding).subtract(paymentApplied) if (actual && payment.actualCurrencyAmount) { paymentToApply = payment.getBigDecimal("actualCurrencyAmount").setScale(decimals,rounding).subtract(paymentApplied) } invoices.each { invoice -> invoiceAmount = InvoiceWorker.getInvoiceTotal(invoice).setScale(decimals,rounding) invoiceApplied = InvoiceWorker.getInvoiceApplied(invoice).setScale(decimals,rounding) invoiceToApply = invoiceAmount.subtract(invoiceApplied) if (invoiceToApply.signum() == 1) { invoiceMap = [:] invoiceMap.putAll(invoice) invoiceMap.amount = invoiceAmount invoiceMap.description = invoice.description invoiceMap.amountApplied = invoiceApplied if (paymentToApply.compareTo(invoiceToApply) < 0 ) { invoiceMap.amountToApply = paymentToApply } else { invoiceMap.amountToApply = invoiceToApply } invoicesList.add(invoiceMap) } } return invoicesList } }