diff --git a/db/ddlutils/postgresql/functions/C_Base_Convert.sql b/db/ddlutils/postgresql/functions/C_Base_Convert.sql new file mode 100644 index 0000000000..20a90fe774 --- /dev/null +++ b/db/ddlutils/postgresql/functions/C_Base_Convert.sql @@ -0,0 +1,34 @@ +CREATE OR REPLACE FUNCTION currencybase( + IN NUMERIC, -- $1 p_Amount + IN INTEGER, -- $2 p_C_CurrencyFrom_ID + IN TIMESTAMP WITH TIME ZONE, -- $3 p_ConversionDate + IN INTEGER, -- $4 p_AD_Client_ID + IN INTEGER -- $5 p_AD_Org_ID +) RETURNS NUMERIC +AS $$ + DECLARE + currency_to INTEGER; + BEGIN + IF $1 IS NULL OR $2 IS NULL THEN + RETURN NULL; + END IF; + + IF $1 = 0 THEN + RETURN 0; + END IF; + /*Finds out org's default currency*/ + SELECT ac.C_Currency_ID + INTO currency_to + FROM AD_ClientInfo AS ci + INNER JOIN C_AcctSchema AS ac + ON (ci.C_AcctSchema1_ID = ac.C_AcctSchema_ID) + WHERE ci.AD_Client_ID = $4; + IF currency_to IS NULL THEN + RETURN NULL; + END IF; + IF $2 = currency_to THEN + RETURN $1; + END IF; + RETURN currencyconvert($1, $2, currency_to, $3,0,$4,$5); + END; +$$ LANGUAGE plpgsql; diff --git a/db/ddlutils/postgresql/functions/C_Currency_Convert.sql b/db/ddlutils/postgresql/functions/C_Currency_Convert.sql new file mode 100644 index 0000000000..8f6a007e96 --- /dev/null +++ b/db/ddlutils/postgresql/functions/C_Currency_Convert.sql @@ -0,0 +1,28 @@ + +CREATE OR REPLACE FUNCTION currencyconvert( + IN NUMERIC, -- $1 amount to convert + IN INTEGER, -- $2 from currency id + IN INTEGER, -- $3 to currency id + IN TIMESTAMP WITH TIME ZONE, -- $4 conversion date + IN INTEGER, -- $5 conversion type id + IN INTEGER, -- $6 client id + IN INTEGER -- $7 org id +) RETURNS numeric AS +$$ + DECLARE + rate NUMERIC; + BEGIN + IF $1 IS NULL OR $2 IS NULL OR $3 IS NULL THEN + RETURN NULL; + END IF; + IF $1 = 0 OR $2 = $3 THEN + RETURN $1; + END IF; + rate := currencyrate($2,$3,$4,$5,$6,$7); + IF rate IS NULL THEN + RETURN NULL; + END IF; + RETURN currencyround((rate * $1), $3, FALSE); + END; +$$ LANGUAGE plpgsql; + diff --git a/db/ddlutils/postgresql/functions/C_Currency_Rate.sql b/db/ddlutils/postgresql/functions/C_Currency_Rate.sql new file mode 100644 index 0000000000..20796b34e9 --- /dev/null +++ b/db/ddlutils/postgresql/functions/C_Currency_Rate.sql @@ -0,0 +1,40 @@ +CREATE OR REPLACE FUNCTION currencyrate( + IN INTEGER, -- $1 currency from id + IN INTEGER, -- $2 currency to id + IN timestamp with time zone, -- $3 conversiondate + IN INTEGER, -- $4 conversiontype id + IN INTEGER, -- $5 client id + IN INTEGER -- $6 org id +) RETURNS NUMERIC AS +$$ + DECLARE + conversion_type_id INTEGER; + conversion_date DATE; + rate NUMERIC; + BEGIN + IF $1 = $2 THEN + RETURN 1; + END IF; + conversion_type_id = COALESCE($4, 0); + conversion_date = CAST($3 AS DATE); + rate = NULL; + IF conversion_type_id = 0 THEN + SELECT C_ConversionType_ID + INTO conversion_type_id + FROM C_ConversionType + WHERE IsDefault = 'Y' AND AD_Client_ID IN (0, $5); + END IF; + SELECT t.MultiplyRate + INTO rate + FROM C_Conversion_Rate AS t + WHERE t.C_Currency_ID = $1 + AND t.C_Currency_To = $2 + AND date_trunc('day',t.ValidFrom) <= $3 + AND date_trunc('day',t.ValidTo) >= $3 + AND t.AD_Client_ID IN (0,$5) + AND t.AD_Org_ID IN (0, $6) + ORDER BY AD_Client_ID DESC, AD_Org_ID DESC, ValidFrom DESC + LIMIT 1; + return rate; + END; +$$ LANGUAGE plpgsql; diff --git a/db/ddlutils/postgresql/functions/C_Currency_Round.sql b/db/ddlutils/postgresql/functions/C_Currency_Round.sql new file mode 100644 index 0000000000..4055e9c1ba --- /dev/null +++ b/db/ddlutils/postgresql/functions/C_Currency_Round.sql @@ -0,0 +1,27 @@ +CREATE OR REPLACE FUNCTION currencyround ( + IN NUMERIC, -- $1 amount + IN INTEGER, -- $2 Currency_ID + IN BOOLEAN -- $3 Costing +) RETURNS NUMERIC AS +$$ + DECLARE + precision INTEGER; + BEGIN + IF $1 IS NULL OR $2 IS NULL THEN + RETURN $1; + END IF; + IF COALESCE($3,FALSE) THEN + SELECT t.CostingPrecision + INTO precision + FROM C_Currency AS t + WHERE C_Currency_ID = $2; + ELSE + SELECT t.stdprecision + INTO precision + FROM C_Currency AS t + WHERE C_Currency_ID = $2; + END IF; + RETURN ROUND($1, precision); + END; +$$ LANGUAGE plpgsql; +