Feature request: [ 1614574 ] Port sqlj functions to pl/pgsql
Functions from org.compiere.sql.PaymentTerm Warning: Untested and badly documented.
This commit is contained in:
parent
f7dcef1009
commit
8457f75c4f
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
*This file is part of Adempiere ERP Bazaar
|
||||
*http://www.adempiere.org
|
||||
*
|
||||
*Copyright (C) 2006 Timo Kontro
|
||||
*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
|
||||
*/
|
||||
|
||||
SET search_path = adempiere, pg_catalog;
|
||||
|
||||
CREATE OR REPLACE FUNCTION paymenttermdiscount
|
||||
(
|
||||
NUMERIC, --$1 amount
|
||||
IN INTEGER, --$2 Currency ID
|
||||
IN INTEGER, --$3 Payment term id
|
||||
IN TIMESTAMP WITH TIME ZONE, --$4 document date
|
||||
IN TIMESTAMP WITH TIME ZONE --$5 payment date
|
||||
)
|
||||
RETURNS NUMERIC AS $$
|
||||
DECLARE
|
||||
discount NUMERIC;
|
||||
discount1 NUMERIC;
|
||||
discount2 NUMERIC;
|
||||
discount1date DATE;
|
||||
discount2date DATE;
|
||||
add1date NUMERIC;
|
||||
add2date NUMERIC;
|
||||
isnextbd BOOLEAN;
|
||||
payDate DATE;
|
||||
BEGIN
|
||||
IF $1 IS NULL OR $2 IS NULL OR $4 IS NULL THEN
|
||||
RETURN 0;
|
||||
END IF;
|
||||
|
||||
IF $5 IS NULL THEN
|
||||
payDate := current_date;
|
||||
ELSE
|
||||
payDate := CAST($5 AS DATE);
|
||||
END IF;
|
||||
|
||||
discount1date := CAST($4 AS Date);
|
||||
discount2date := discount1date;
|
||||
|
||||
SELECT
|
||||
(discount1date + t.discountdays + t.gracedays),
|
||||
(discount2date + t.discountdays2 + t.gracedays),
|
||||
t.discount,
|
||||
t.discount2,
|
||||
(t.isnextbusinessday = 'Y')
|
||||
INTO
|
||||
discount1date,
|
||||
discount2date,
|
||||
discount1,
|
||||
discount2,
|
||||
isnextbd
|
||||
FROM c_paymentterm AS t
|
||||
WHERE c_paymentterm_id=p_C_PaymentTerm_ID;
|
||||
|
||||
--this checks only weekdays should check holidays too
|
||||
IF isnextbd THEN
|
||||
SELECT
|
||||
CASE EXTRACT(DOW FROM discount1date)
|
||||
WHEN 0 THEN (discount1date + 1) --sunday => monday
|
||||
WHEN 6 THEN (discount1date + 2) --saturday => monday
|
||||
ELSE discount1date
|
||||
END
|
||||
INTO discount1date;
|
||||
|
||||
SELECT
|
||||
CASE extract(DOW FROM discount2date)
|
||||
WHEN 0 THEN (discount2date + 1)
|
||||
WHEN 6 THEN (discount2date + 2)
|
||||
ELSE discount2date
|
||||
END
|
||||
INTO discount2date;
|
||||
END IF;
|
||||
|
||||
IF payDate < discount1date THEN --Would <= be better than = ?
|
||||
RETURN currencyround(((p_amount * discount1) / 100), $2, FALSE);
|
||||
ELSIF payDate < discount2date THEN
|
||||
RETURN currencyround(((p_amount * discount2) / 100), $2, FALSE);
|
||||
ELSE
|
||||
RETURN 0;
|
||||
END IF;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
*This file is part of Adempiere ERP Bazaar
|
||||
*http://www.adempiere.org
|
||||
*
|
||||
*Copyright (C) 2006 Timo Kontro
|
||||
*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
|
||||
*/
|
||||
|
||||
SET search_path = adempiere, pg_catalog;
|
||||
|
||||
CREATE OR REPLACE FUNCTION paymenttermduedate(
|
||||
IN INTEGER, -- $1 payment term id
|
||||
IN TIMESTAMP WITH TIME ZONE -- $2 document date
|
||||
) RETURNS TIMESTAMP WITH TIME ZONE AS
|
||||
$$
|
||||
DECLARE
|
||||
due_date TIMESTAMP WITH TIME ZONE;
|
||||
fixed BOOLEAN;
|
||||
monthOffset INTEGER;
|
||||
monthCutOff INTEGER;
|
||||
netDays INTEGER;
|
||||
monthDay INTEGER;
|
||||
BEGIN
|
||||
IF $1 IS NULL OR $2 IS NULL THEN
|
||||
RETURN 0;
|
||||
END IF;
|
||||
SELECT (t.isDueFixed = 'Y'), t.fixMonthOffset, t.fixMonthCutoff,
|
||||
t.netdays, t.FixMonthDay
|
||||
INTO fixed, monthOffset, monthCutOff, netDays, monthDay
|
||||
FROM C_PaymentTerm AS t WHERE t.C_PaymentTerm_ID = $1;
|
||||
IF fixed THEN
|
||||
--we check if montCutOff is bigger than number of days in month.
|
||||
IF monthCutOff > 28 THEN -- if smaller than days in february no need for further checks.
|
||||
-- montCutOff should not be greater than number of days in month.
|
||||
monthCutOff := LEAST(
|
||||
EXTRACT(DAY FROM (date_trunc('month', $2) + INTERVAL '1 month' - INTERVAL '1 day'))
|
||||
,monthCutOff);
|
||||
END IF;
|
||||
IF monthCutOff < EXTRACT(DAY FROM $2) THEN
|
||||
monthOffset := COALESCE(monthOffset,0) + 1;
|
||||
END IF;
|
||||
due_date := date_trunc('month', $2) + (INTERVAL '1 month' * monthOffset);
|
||||
|
||||
IF monthDay > 28 THEN
|
||||
--monthDay should not be greater than number of days in month.
|
||||
monthDay := LEAST(
|
||||
EXTRACT(DAY FROM (due_date + INTERVAL '1 month' - INTERVAL '1 days'))
|
||||
,monthDay);
|
||||
END IF;
|
||||
due_date := due_date + INTERVAL '1 day' * (monthDay -1);
|
||||
ELSE
|
||||
due_date := $2 + (INTERVAL '1 day' * netDays);
|
||||
END IF;
|
||||
RETURN due_date;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
*This file is part of Adempiere ERP Bazaar
|
||||
*http://www.adempiere.org
|
||||
*
|
||||
*Copyright (C) 2006 Timo Kontro
|
||||
*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
|
||||
*/
|
||||
|
||||
SET search_path = adempiere, pg_catalog;
|
||||
|
||||
CREATE OR REPLACE FUNCTION paymenttermduedays(
|
||||
IN INTEGER, -- $1 payment term id
|
||||
IN TIMESTAMP WITH TIME ZONE, -- $2 document date
|
||||
IN TIMESTAMP WITH TIME ZONE -- $3 paydate
|
||||
) RETURNS INTEGER AS
|
||||
$$
|
||||
DECLARE
|
||||
due_date TIMESTAMP WITH TIME ZONE;
|
||||
BEGIN
|
||||
due_date := paymenttermduedate($1,$2);
|
||||
|
||||
IF due_date IS NULL THEN
|
||||
RETURN 0;
|
||||
END IF;
|
||||
|
||||
RETURN CAST(EXTRACT(DAY FROM (due_date - $3)) AS INTEGER);
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
Loading…
Reference in New Issue