TWYN#52102 meer/minderwerk verrekenen uit reserve

svn path=/Website/trunk/; revision=36861
This commit is contained in:
Erik Groener
2018-02-07 08:35:43 +00:00
parent f6c86eae36
commit 1efdaec61e
2 changed files with 187 additions and 64 deletions

View File

@@ -236,7 +236,14 @@ function model_mld_opdr()
"typ": "check0",
"defaultvalue": 0,
"filter": "exact"
}
},
"_is_clone": {
"dbs": "",
"label": "Is kopie",
"typ": "number",
"defaultvalue": 0,
"hidden_fld": true
}
};
this.fields = object_merge({}, fields_main_1, (S("bgt_enabled") ? fields_bgt_1 : {}), fields_main_2);
@@ -251,8 +258,10 @@ function model_mld_opdr()
}
}
this.hook_pre_edit = function (obj, fld)
this.hook_pre_edit = function (obj, fld, scf_params)
{
obj._is_clone = getQParamInt("scf_clone", 0);
var mld_opdr_id = (obj._is_clone == 1 ? getQParamInt("id", -1) : obj.id);
var btw_data = {};
if (obj.id > -1 || obj.ordernr_sort)
{
@@ -260,7 +269,7 @@ function model_mld_opdr()
fld.ordernr.readonly = true;
}
if (obj.id > -1)
if (mld_opdr_id > -1)
{
var sql = "SELECT s.prs_kostensoort_btw"
+ " , f.fin_btwtabelwaarde_perc"
@@ -269,7 +278,7 @@ function model_mld_opdr()
+ " , fin_btwtabelwaarde f"
+ " WHERE s.fin_btwtabelwaarde_key = f.fin_btwtabelwaarde_key"
+ " AND o.prs_kostensoort_key = s.prs_kostensoort_key"
+ " AND o.mld_opdr_key = " + obj.id;
+ " AND o.mld_opdr_key = " + mld_opdr_id;
var oRs = Oracle.Execute(sql);
if (!oRs.eof)
{
@@ -293,16 +302,17 @@ function model_mld_opdr()
this.hook_pre_post = function(params, obj)
{
var parent_key = getQParamInt("id", -1);
var isclone = (obj._is_clone == 1);
if (!obj.sequence && obj.sequence!=0)
abort_with_warning("Vul een volgnummer voor het contract in.");
var v_costtype = (obj.costtype ? obj.costtype : getQParamInt("costtype", -1));
var v_costtype = (isclone ? obj.costtype.id : obj.costtype);
checkAanwezigBudget(v_costtype);
if (parent_key > -1) // Bij kopie van opdracht geen nieuw nummer genereren.
if (isclone) // Bij kopie van opdracht geen nieuw nummer genereren.
{
// Vul het contractnummer van het oorspronkelijke contract in.
var parent_key = getQParamInt("id", -1);
var sql = "SELECT o.mld_opdr_ordernr"
+ " FROM mld_opdr o"
+ " WHERE o.mld_opdr_key = " + parent_key;
@@ -333,18 +343,33 @@ function model_mld_opdr()
// Nieuw contract, dus volgnummer is altijd uniek hierbinnen.
}
checkBudgetoverschrijding(obj.id, obj.costtype, obj.amount, obj.vat);
var v_budget = getBudget(v_costtype);
if (obj.additional == 0)
{
var v_datamutatie = checkBudgetoverschrijding(obj.id, v_budget, obj.amount, obj.vat);
insertMutatie( v_datamutatie, "AO" );
}
else
{
insertMutatie( { budget_res_key: v_budget.budget_res_key
, bedrag_exc: -1 * obj.amount
, bedrag_btw: -1 * obj.vat
, budget_srt_key: v_budget.budget_srt_key
}
, "MW"
);
}
}
this.hook_pre_put = function(params, obj, key)
{
var v_costtype = (obj.costtype ? obj.costtype : getQParamInt("costtype", -1) );
checkAanwezigBudget(v_costtype);
// Is de combinatie projectnummer/volgnummer nog steeds uniek?
// Is de combinatie opdrachtnummer/volgnummer nog steeds uniek?
var sql = "SELECT p.bgt_project_key"
+ " , o.prs_kostensoort_key"
+ " , o.mld_opdr_ordernr"
+ " , o.mld_opdr_meerwerk"
+ " , o.mld_opdr_kosten"
+ " , o.mld_opdr_kosten_btw"
+ " FROM bgt_project p"
+ " , bgt_kostenrubriek r"
+ " , prs_kostensoortgrp g"
@@ -357,29 +382,74 @@ function model_mld_opdr()
+ " AND o.mld_opdr_key = " + key;
var oRs = Oracle.Execute(sql);
var v_ordernr = oRs("mld_opdr_ordernr").Value;
var v_meerwerk = oRs("mld_opdr_meerwerk").Value;
var v_project_key = oRs("bgt_project_key").Value;
var v_cur_costtype_key = oRs("prs_kostensoort_key").Value;
var v_cur_bedrag = oRs("mld_opdr_kosten").Value;
var v_cur_btwbedrag = oRs("mld_opdr_kosten_btw").Value;
oRs.Close();
checkUniekContractnummer(key, v_project_key, v_ordernr, obj.sequence);
if (v_cur_costtype_key != v_costtype)
{ // contract verplaatsen naar ander kostensoort
checkBudgetoverschrijding(obj.id, v_cur_costtype_key, 0, 0); // bedrag van deze kostensoort verwijderen
checkBudgetoverschrijding(-1, v_costtype, obj.amount, obj.vat); // (aangepast) bedrag aan nieuwe kostensoort toevoegen
// facturen krijgen ook nieuwe kostensoort.
var sql = "UPDATE fin_factuur"
+ " SET prs_kostensoort_key = " + v_costtype
+ " WHERE mld_opdr_key = " + key;
Oracle.Execute(sql);
}
else
var v_costtype = (obj.costtype ? obj.costtype : v_cur_costtype_key);
checkAanwezigBudget(v_costtype);
// Budget bijwerken als gevolg van meer-minderwerk.
if (obj.additional == 1 || v_meerwerk == 1)
{
checkBudgetoverschrijding(obj.id, v_costtype, obj.amount, obj.vat);
// Boek eerst het oude bedrag terug.
var v_budget_old = getBudget(v_cur_costtype_key);
insertMutatie( { budget_res_key: v_budget_old.budget_res_key
, budget_srt_key: v_budget_old.budget_srt_key
, bedrag_exc: v_cur_bedrag
, bedrag_btw: v_cur_btwbedrag
}
, "MW"
);
if (obj.additional == 1)
{
// Boek het nieuwe bedrag naar het (nieuwe) kostensoort.
var v_budget_new = getBudget(v_costtype);
insertMutatie( { budget_res_key: v_budget_new.budget_res_key
, budget_srt_key: v_budget_new.budget_srt_key
, bedrag_exc: -1 * obj.amount
, bedrag_btw: -1 * obj.vat
}
, "MW"
);
}
}
// Controle op overschrijden van budget.
if (obj.additional == 0)
{
if (v_cur_costtype_key != v_costtype)
{ // contract verplaatsen naar ander kostensoort
var v_budget_old = getBudget(v_cur_costtype_key);
var v_datamutatie = checkBudgetoverschrijding(obj.id, v_budget_old, 0, 0); // bedrag van deze kostensoort verwijderen
insertMutatie( v_datamutatie, "AO" );
var v_budget_new = getBudget(v_costtype);
var v_datamutatie = checkBudgetoverschrijding(-1, v_budget_new, obj.amount, obj.vat); // (aangepast) bedrag aan nieuwe kostensoort toevoegen
insertMutatie( v_datamutatie, "AO" );
// facturen krijgen ook nieuwe kostensoort.
var sql = "UPDATE fin_factuur"
+ " SET prs_kostensoort_key = " + v_costtype
+ " WHERE mld_opdr_key = " + key;
Oracle.Execute(sql);
}
else
{
var v_budget_new = getBudget(v_costtype);
var v_datamutatie = checkBudgetoverschrijding(obj.id, v_budget_new, obj.amount, obj.vat);
insertMutatie( v_datamutatie, "AO" );
}
}
}
this.hook_pre_delete = function(params, key)
{
var sql = "SELECT MAX(o.prs_kostensoort_key) kostensoort"
+ " , MAX(o.mld_opdr_meerwerk) meerwerk"
+ " , COUNT(f.fin_factuur_key) aantal"
+ " FROM mld_opdr o"
+ " , fin_factuur f"
@@ -388,12 +458,28 @@ function model_mld_opdr()
var oRs = Oracle.Execute(sql);
var aantal_facturen = oRs("aantal").Value;
var prs_kostensoort = oRs("kostensoort").Value;
var meerwerk = oRs("meerwerk").Value;
oRs.Close();
if (aantal_facturen > 0)
abort_with_warning("Verwijder eerst de facturen bij dit contract.");
// Eerst proberen of er automatisch terug geboekt moet worden doot bedrag te muteren naar 0.
checkBudgetoverschrijding(key, prs_kostensoort, 0, 0);
// Eerst proberen of er automatisch terug geboekt moet worden door bedrag te muteren naar 0.
var v_budget_old = getBudget(prs_kostensoort);
if (meerwerk)
{
insertMutatie( { budget_res_key: v_budget_old.budget_res_key
, bedrag_exc: v_budget_old.bedrag_exc
, bedrag_btw: v_budget_old.bedrag_btw
, budget_srt_key: v_budget_old.budget_srt_key
}
, "MW"
);
}
else
{
var v_datamutatie = checkBudgetoverschrijding(key, v_budget_old, 0, 0);
insertMutatie( v_datamutatie, "AO" );
}
}
@@ -418,6 +504,38 @@ function model_mld_opdr()
};
}
function getBudget(data_costtype)
{
var sql = "SELECT MAX(b.bgt_budget_key) budget_s"
+ " , MAX(c.bgt_budget_key) budget_r"
+ " , MAX(COALESCE(b.bgt_budget_bedrag, 0)) budget_exc"
+ " , MAX(COALESCE(b.bgt_budget_btwbedrag, 0)) budget_btw"
+ " FROM bgt_budget b"
+ " , bgt_budgetmutatie m"
+ " , (SELECT r.bgt_project_key"
+ " , bgt_budget_key"
+ " FROM bgt_budget r"
+ " WHERE r.bgt_budget_isreserve = 1"
+ " ) c"
+ " WHERE b.bgt_project_key = c.bgt_project_key(+)"
+ " AND b.prs_kostensoort_key = " + data_costtype;
var oRs = Oracle.Execute(sql);
var budget_key_res = oRs("budget_r").Value;
var budget_key_srt = oRs("budget_s").Value;
var budget_exc = oRs("budget_exc").Value;
var budget_btw = oRs("budget_btw").Value;
oRs.Close();
if (budget_key_res == null)
abort_with_warning("Er is geen budget met kenmerk 'reserve' aanwezig voor dit project");
else
return { budget_res_key: budget_key_res
, budget_srt_key: budget_key_srt
, costtype_key: data_costtype
, bedrag_exc: budget_exc
, bedrag_btw: budget_btw
};
}
function checkUniekContractnummer(p_contract_key, p_project_key, p_contractnr, p_volgnr)
{
var sql = "SELECT count(*) aantal"
@@ -454,30 +572,8 @@ function model_mld_opdr()
abort_with_warning("Maak eerst een budget aan voor deze kostensoort voordat er contracten aan gekoppeld worden.");
}
function checkBudgetoverschrijding(data_id, data_costtype, data_amount, data_vat)
function checkBudgetoverschrijding(data_id, data_budget, data_amount, data_vat)
{
var sql = "SELECT MAX(b.bgt_budget_key) budget_s"
+ " , MAX(c.bgt_budget_key) budget_r"
+ " , MAX(COALESCE(b.bgt_budget_bedrag, 0)) budget_exc"
+ " , MAX(COALESCE(b.bgt_budget_btwbedrag, 0)) budget_btw"
+ " FROM bgt_budget b"
+ " , bgt_budgetmutatie m"
+ " , (SELECT r.bgt_project_key"
+ " , bgt_budget_key"
+ " FROM bgt_budget r"
+ " WHERE r.bgt_budget_isreserve = 1"
+ " ) c"
+ " WHERE b.bgt_project_key = c.bgt_project_key(+)"
+ " AND b.prs_kostensoort_key = " + data_costtype;
var oRs = Oracle.Execute(sql);
var budget_key_res = oRs("budget_r").Value;
var budget_key_srt = oRs("budget_s").Value;
var budget_exc = oRs("budget_exc").Value;
var budget_btw = oRs("budget_btw").Value;
oRs.Close();
if (budget_key_res == null)
abort_with_warning("Er is geen budget met kenmerk 'reserve' aanwezig voor dit project");
var amount_old_exc = 0;
var amount_old_btw = 0;
if (data_id > -1)
@@ -485,7 +581,7 @@ function model_mld_opdr()
var sql = "SELECT COALESCE(t.mld_opdr_kosten, 0) amount_old_exc"
+ " , COALESCE(t.mld_opdr_kosten_btw, 0) amount_old_btw"
+ " FROM mld_opdr t"
+ " WHERE t.prs_kostensoort_key = " + data_costtype
+ " WHERE t.prs_kostensoort_key = " + data_budget.costtype_key
+ " AND t.mld_opdr_key = " + data_id;
var oRs = Oracle.Execute(sql);
amount_old_exc = oRs("amount_old_exc").Value;
@@ -495,7 +591,7 @@ function model_mld_opdr()
var sql = "SELECT SUM(o.mld_opdr_kosten) amount_total_exc"
+ " , SUM(o.mld_opdr_kosten_btw) amount_total_btw"
+ " FROM mld_opdr o"
+ " WHERE o.prs_kostensoort_key = " + data_costtype;
+ " WHERE o.prs_kostensoort_key = " + data_budget.costtype_key;
var oRs = Oracle.Execute(sql);
var amount_sum_exc = oRs("amount_total_exc").Value;
var amount_sum_btw = oRs("amount_total_btw").Value;
@@ -509,7 +605,7 @@ function model_mld_opdr()
+ " AND b1.bgt_project_key = b2.bgt_project_key"
+ " AND m1.bgt_budget_key_van = b2.bgt_budget_key"
+ " AND m1.bgt_budget_Key_naar = b1.bgt_budget_key"
+ " AND b1.prs_kostensoort_key = " + data_costtype;
+ " AND b1.prs_kostensoort_key = " + data_budget.costtype_key;
var oRs = Oracle.Execute(sql);
var reserve_exc = oRs("reserve_exc").Value;
var reserve_btw = oRs("reserve_btw").Value;
@@ -521,7 +617,7 @@ function model_mld_opdr()
if (amount_old_exc < data_amount)
{
// verhoging contractwaarde exc
var overschot_exc = budget_exc - amount_sum_exc - (data_amount - amount_old_exc);
var overschot_exc = data_budget.bedrag_exc - amount_sum_exc - (data_amount - amount_old_exc);
bedrag_exc = (overschot_exc < 0 ? overschot_exc : 0);
}
else
@@ -534,7 +630,7 @@ function model_mld_opdr()
if (amount_old_btw < data_vat)
{
// verhoging contractwaarde btw
var overschot_btw = budget_btw - amount_sum_btw - (data_vat - amount_old_btw);
var overschot_btw = data_budget.bedrag_btw - amount_sum_btw - (data_vat - amount_old_btw);
bedrag_btw = (overschot_btw < 0 ? overschot_btw : 0);
}
else
@@ -544,8 +640,35 @@ function model_mld_opdr()
bedrag_btw = -1 * (overschot_btw > 0 ? reserve_btw : (data_vat - amount_old_btw) );
}
if (bedrag_exc != 0 || bedrag_btw != 0)
return { budget_res_key: data_budget.budget_res_key
, bedrag_exc: bedrag_exc
, bedrag_btw: bedrag_btw
, budget_srt_key: data_budget.budget_srt_key
};
}
function insertMutatie(data_mutatie, mutatie_code)
{
if (data_mutatie.bedrag_exc != 0 || data_mutatie.bedrag_btw != 0)
{
var sql = "SELECT prs_kostensoort_altcode"
+ " FROM prs_kostensoort"
+ " WHERE prs_kostensoort_key = "
+ " (SELECT MIN(prs_kostensoort_key)"
+ " FROM bgt_budget"
+ " WHERE bgt_budget_key = " + data_mutatie.budget_srt_key
+ " )";
var oRs = Oracle.Execute(sql);
var v_costtype_code = oRs("prs_kostensoort_altcode").Value;
oRs.Close();
var mutatie_omschr = "";
switch (mutatie_code)
{
case "AO": mutatie_omschr = "AO Automatische overboeking"; break;
case "MW": mutatie_omschr = "MW Meer-, minderwerk van " + v_costtype_code; break;
}
var sql_m = "INSERT INTO bgt_budgetmutatie"
+ "( bgt_budgetmutatie_datum"
+ ", bgt_budgetmutatie_omschrijving"
@@ -559,14 +682,14 @@ function model_mld_opdr()
+ ", bgt_budgetmutatie_reserve"
+ ") VALUES"
+ "( SYSDATE"
+ ", 'AO Automatische overboeking'"
+ ", " + safe.quoted_sql(mutatie_omschr)
+ ", " + user_key
+ ", " + budget_key_res
+ ", " + bedrag_exc
+ ", " + bedrag_btw
+ ", " + budget_key_srt
+ ", " + (-1 * bedrag_exc)
+ ", " + (-1 * bedrag_btw)
+ ", " + data_mutatie.budget_res_key
+ ", " + data_mutatie.bedrag_exc
+ ", " + data_mutatie.bedrag_btw
+ ", " + data_mutatie.budget_srt_key
+ ", " + (-1 * data_mutatie.bedrag_exc)
+ ", " + (-1 * data_mutatie.bedrag_btw)
+ ", 1"
+ ")";
Oracle.Execute(sql_m);

View File

@@ -133,7 +133,7 @@ function change_groep()
}
function change_soort()
{
var v_budgetproject = (typeof $("#budgetproject").val() == "undefined" ? (typeof budgetproject == "undefined" ? -1 : budgetproject) : $("#budgetproject").val() );
var bproject_key = (typeof $("#budgetproject").val() == "undefined" ? (typeof budgetproject == "undefined" ? -1 : budgetproject) : $("#budgetproject").val() );
var kplaats_key = -1;
var btw_perc = 0;
if ($("#costtype").val() != -1 )
@@ -141,7 +141,7 @@ function change_soort()
kplaats_key = $("#costtype option:selected").attr("kpn_key");
btw_perc = parseFloat($("#costtype option:selected").attr("perc_btw").replace(/,/g,"."));
}
fill_plaatsselector("KP", project_key, kplaats_key);
fill_plaatsselector("KP", bproject_key, kplaats_key);
if ($("#amount").val() && btw_perc != kostensoort_btw)
{