From 8ca3887d64acecf9c651d3bf6ac2d4b295194a34 Mon Sep 17 00:00:00 2001 From: kontro Date: Fri, 2 Feb 2007 18:31:07 +0000 Subject: [PATCH] Feature request: [ 1614574 ] Port sqlj functions to pl/pgsql Contribution made by Gavin Dunse. To be tested. Thanks Gavin! --- .../functions/C_Invoice_Discount.sql | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 db/ddlutils/postgresql/functions/C_Invoice_Discount.sql diff --git a/db/ddlutils/postgresql/functions/C_Invoice_Discount.sql b/db/ddlutils/postgresql/functions/C_Invoice_Discount.sql new file mode 100644 index 0000000000..ff244d7cd6 --- /dev/null +++ b/db/ddlutils/postgresql/functions/C_Invoice_Discount.sql @@ -0,0 +1,87 @@ +/* + *This file is part of Adempiere ERP Bazaar + *http://www.adempiere.org + * + *Copyright (C) 2007 Gavin Dunse + *Copyright (C) 1999-2006 ComPiere, inc + * + *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 + */ + +/* + * Calculate Payment Discount Amount + * - Calculate discountable amount (i.e. with or without tax) + * - Calculate and return payment discount + */ + +CREATE OR REPLACE FUNCTION invoiceDiscount ( + IN NUMERIC, -- $1 C_Invoice_ID + IN TIMESTAMP WITH TIME ZONE, -- $2 PayDate + IN NUMERIC -- $3 C_InvoicePaySchedule_ID +) RETURNS NUMERIC AS +$$ + DECLARE + v_Amount NUMERIC; + v_IsDiscountLineAmt CHAR(1); + v_GrandTotal NUMERIC; + v_TotalLines NUMERIC; + v_C_PaymentTerm_ID NUMERIC; + v_DocDate TIMESTAMP WITH TIME ZONE; + v_PayDate TIMESTAMP WITH TIME ZONE; + v_IsPayScheduleValid CHAR(1); + + BEGIN + SELECT CURRENT_DATE INTO v_PayDate; + SELECT ci.IsDiscountLineAmt, i.GrandTotal, i.TotalLines, i.C_PaymentTerm_ID, i.DateInvoiced, i.IsPayScheduleValid + INTO v_IsDiscountLineAmt, v_GrandTotal, v_TotalLines, v_C_PaymentTerm_ID, v_DocDate, v_IsPayScheduleValid + FROM AD_ClientInfo AS ci, C_Invoice AS i + WHERE ci.AD_Client_ID=i.AD_Client_ID + AND i.C_Invoice_ID=p_C_Invoice_ID; + IF FOUND THEN + /* What Amount is the Discount Base? */ + IF (v_IsDiscountLineAmt = 'Y') THEN + v_Amount := v_TotalLines; + ELSE + v_Amount := v_GrandTotal; + END IF; + + /* Anything to discount? */ + IF (v_Amount = 0) THEN + RETURN 0; + END IF; + IF (p_PayDate IS NOT NULL) THEN + v_PayDate := p_PayDate; + END IF; + + /* Valid Payment Schedule */ + IF (v_IsPayScheduleValid='Y' AND p_C_InvoicePaySchedule_ID > 0) THEN + SELECT COALESCE(MAX(DiscountAmt),0) + INTO v_Amount + FROM C_InvoicePaySchedule + WHERE C_InvoicePaySchedule_ID=p_C_InvoicePaySchedule_ID + AND DiscountDate <= v_PayDate; + + RETURN v_Amount; + END IF; + /* return discount amount */ + RETURN paymentTermDiscount (v_Amount, 0, v_C_PaymentTerm_ID, v_DocDate, p_PayDate); + ELSE + RETURN -1; + /* RAISE EXCEPTION 'Some error'*/ + /* RETURN NULL */ + END IF; + END; +$$ LANGUAGE plpgsql; +