CREATE OR REPLACE FUNCTION invoicePaid ( p_C_Invoice_ID NUMERIC, p_C_Currency_ID NUMERIC, p_MultiplierAP NUMERIC -- DEFAULT 1 ) RETURNS numeric AS $body$ /************************************************************************* * The contents of this file are subject to the Compiere License. You may * obtain a copy of the License at http://www.compiere.org/license.html * Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either * express or implied. See the License for details. Code: Compiere ERP+CRM * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved. * * converted to postgreSQL by Karsten Thiemann (Schaeffer AG), * kthiemann@adempiere.org ************************************************************************* *** * 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) * * * Test: SELECT C_Invoice_ID, IsPaid, IsSOTrx, GrandTotal, invoicePaid (C_Invoice_ID, C_Currency_ID, MultiplierAP) FROM C_Invoice_v; * ************************************************************************/ DECLARE v_Precision NUMERIC := 0; v_Min NUMERIC := 0; v_MultiplierAP NUMERIC := 1; v_PaymentAmt NUMERIC := 0; ar 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 ar IN SELECT a.AD_Client_ID, a.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' LOOP v_PaymentAmt := v_PaymentAmt + currencyConvert(ar.Amount + ar.DisCountAmt + ar.WriteOffAmt, ar.C_Currency_ID, p_C_Currency_ID, ar.DateTrx, null, ar.AD_Client_ID, ar.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;