/* *This file is part of Adempiere ERP Bazaar *http://www.adempiere.org *Copyright (C) 2006-2008 victor.perez@e-evolution.com, e-Evolution *This program is free software; you can redistribute it and/or *modify it under the terms of the GNU General Public License *as published by the Free Software Foundation; either version 2 *of the License, or (at your option) any later version. * *This program is distributed in the hope that it will be useful, *but WITHOUT ANY WARRANTY; without even the implied warranty of *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *GNU General Public License for more details. * *You should have received a copy of the GNU General Public License *along with this program; if not, write to the Free Software *Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.of * Title: Calculate Paid/Allocated amount in Currency * Description: * Add up total amount paid for for C_Invoice_ID. * Split Payments are ignored. * all allocation amounts converted to invoice C_Currency_ID * round it to the nearest cent * and adjust for CreditMemos by using C_Invoice_v * and for Payments with the multiplierAP (-1, 1) * SELECT C_Invoice_ID, IsPaid, IsSOTrx, GrandTotal, C_Invoice_Paid (C_Invoice_ID, C_Currency_ID, MultiplierAP, DateAcct) FROM C_Invoice_v; -- UPDATE C_Invoice_v1 SET IsPaid = CASE WHEN C_Invoice_Paid(C_Invoice_ID,C_Currency_ID,MultiplierAP,DateAcct)=GrandTotal THEN 'Y' ELSE 'N' END WHERE C_Invoice_ID>1000000 * ************************************************************************/ CREATE OR REPLACE FUNCTION InvoicepaidToDate ( p_C_Invoice_ID IN numeric, p_C_Currency_ID IN numeric, p_MultiplierAP IN numeric, -- DEFAULT 1 p_DateAcct IN timestamp with time zone ) RETURNS numeric AS $BODY$ DECLARE v_Precision NUMERIC := 0; v_Min NUMERIC := 0; v_MultiplierAP numeric := 1; v_PaymentAmt numeric := 0; allocation record; BEGIN SELECT StdPrecision INTO v_Precision FROM C_Currency WHERE C_Currency_ID = p_C_Currency_ID; SELECT 1/10^v_Precision INTO v_Min; -- Default IF (p_MultiplierAP IS NOT NULL) THEN v_MultiplierAP := p_MultiplierAP; END IF; -- Calculate Allocated Amount FOR allocation IN SELECT al.AD_Client_ID, al.AD_Org_ID,al.Amount, al.DiscountAmt, al.WriteOffAmt,a.C_Currency_ID, a.DateTrx FROM C_ALLOCATIONLINE al INNER JOIN C_ALLOCATIONHDR a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID) WHERE al.C_Invoice_ID = p_C_Invoice_ID AND a.IsActive='Y' AND a.DateAcct <= p_DateAcct LOOP v_PaymentAmt := v_PaymentAmt + Currencyconvert(allocation.Amount + allocation.DisCountAmt + allocation.WriteOffAmt, allocation.C_Currency_ID, p_C_Currency_ID, allocation.DateTrx, NULL, allocation.AD_Client_ID, allocation.AD_Org_ID); END LOOP; -- Ignore Rounding IF (v_PaymentAmt > -v_Min AND v_PaymentAmt < v_Min) THEN v_PaymentAmt := 0; END IF; -- Round to currency precision v_PaymentAmt := ROUND(COALESCE(v_PaymentAmt,0), v_Precision); RETURN v_PaymentAmt * v_MultiplierAP; END; $BODY$ LANGUAGE 'plpgsql' STABLE;