953 lines
40 KiB
C++
953 lines
40 KiB
C++
<% /*
|
||
$Revision$
|
||
$Id$
|
||
|
||
File: model_mld_opdr.inc
|
||
|
||
Description: Model voor mld_opdr
|
||
|
||
Context:
|
||
|
||
Notes:
|
||
*/
|
||
%>
|
||
<!-- #include file="../api2/model_fin_factuur.inc" -->
|
||
<!-- #include file="./model_custom_fields.inc"-->
|
||
<!-- #include file="./model_mld_kenmerk.inc"-->
|
||
<!-- #include file="../bgt/bgt_tools.inc" -->
|
||
<%
|
||
|
||
function model_mld_opdr()
|
||
{
|
||
this.records_name = "orders";
|
||
this.record_name = "order";
|
||
this.table = "mld_opdr";
|
||
this.primary = "mld_opdr_key";
|
||
this.autfunction = S("bgt_enabled")==1?"WEB_BGTORD":"WEB_ORDBOF";
|
||
this.record_title = L("lcl_fin_mld_opdr");
|
||
this.records_title = L("lcl_fin_opdrachten");
|
||
|
||
var fields_main_1 = {};
|
||
var fields_main_2 = {};
|
||
var fields_bgt_1 = {};
|
||
|
||
fields_main_1 = {
|
||
"id": {
|
||
"dbs": "mld_opdr_key",
|
||
"label": L("lcl_key"),
|
||
"typ": "key",
|
||
"hidden_fld": true,
|
||
"required": true,
|
||
"filter": "exact",
|
||
"seq": "mld_s_mld_opdr_key"
|
||
}
|
||
};
|
||
|
||
if (S("bgt_enabled"))
|
||
{
|
||
fields_bgt_1 = {
|
||
"budgetdiscipline": {
|
||
"dbs": "bgt_project.ins_discipline_key",
|
||
"label": L("bgt_discipline_omschrijving"),
|
||
"typ": "key",
|
||
"required": true,
|
||
"foreign": bgt_budgetdiscipline_foreign(),
|
||
"showtransit": true
|
||
},
|
||
"budgetproject": {
|
||
"dbs": "bgt_project.bgt_project_key",
|
||
"label": L("bgt_project_omschrijving"),
|
||
"typ": "key",
|
||
"required": true,
|
||
"foreign": bgt_budgetproject_foreign(),
|
||
"delayload": true,
|
||
"showtransit": true
|
||
},
|
||
"budgetcostcategory": {
|
||
"dbs": "bgt_kostenrubriek.bgt_kostenrubriek_key",
|
||
"label": L("bgt_kostenrubriek_oms"),
|
||
"typ": "key",
|
||
"required": true,
|
||
"foreign": bgt_budgetcostcategory_foreign(),
|
||
"delayload": true,
|
||
"showtransit": true,
|
||
"multiedit" : true
|
||
},
|
||
"costtypegroup": {
|
||
"dbs": "prs_kostensoortgrp.prs_kostensoortgrp_key",
|
||
"label": L("prs_kostensoortgrp_key"),
|
||
"typ": "key",
|
||
"required": true,
|
||
"foreign": bgt_costtypegroup_foreign(),
|
||
"delayload": true,
|
||
"showtransit": true,
|
||
"multiedit" : true
|
||
},
|
||
"costtype": {
|
||
"dbs": "prs_kostensoort_key",
|
||
"label": L("prs_kostensoort_key"),
|
||
"typ": "key",
|
||
"required": true,
|
||
"foreign": bgt_costtype_foreign(),
|
||
"delayload": true,
|
||
"showtransit": true,
|
||
"multiedit" : true
|
||
},
|
||
"estimate": {
|
||
"dbs": "estimate",
|
||
"sql": "(BGT.getRaming(mld_opdr.mld_opdr_key, 0, NULL, NULL))",
|
||
"sqlshow": true,
|
||
"hidden_fld": true,
|
||
"label": "Raming",
|
||
"typ": "float",
|
||
"iscurrency": true,
|
||
"total": true
|
||
},
|
||
"contracted": {
|
||
"dbs": "contracted",
|
||
"sql": "(BGT.getGecontracteerd(mld_opdr.mld_opdr_key, 0, NULL, NULL))",
|
||
"sqlshow": true,
|
||
"hidden_fld": true,
|
||
"label": L("bgt_gecontracteerd"),
|
||
"typ": "float",
|
||
"iscurrency": true,
|
||
"total": true
|
||
},
|
||
"invoiced": {
|
||
"dbs": "mld_opdr_gefactureerd",
|
||
"sql": "(BGT.getGefactureerd(mld_opdr.mld_opdr_key, 0, NULL, NULL))",
|
||
"label": L("bgt_facturen"),
|
||
"typ": "float",
|
||
"readonly": true,
|
||
"sqlshow": true,
|
||
"iscurrency": true,
|
||
"total": true
|
||
},
|
||
"tobeinvoiced": {
|
||
"dbs": "mld_opdr_tefactureren",
|
||
"sql": "(BGT.getTefactureren(mld_opdr.mld_opdr_key, 0, NULL, NULL))",
|
||
"label": L("bgt_facturentogo"),
|
||
"typ": "float",
|
||
"readonly": true,
|
||
"sqlshow": true,
|
||
"iscurrency": true,
|
||
"total": true
|
||
}
|
||
};
|
||
}
|
||
|
||
fields_main_2 = {
|
||
"company": {
|
||
"dbs": "mld_uitvoerende_keys",
|
||
"label": L("lcl_ord_company"),
|
||
"typ": "key",
|
||
"foreign": bgt_company_foreign(),
|
||
"showtransit": true
|
||
},
|
||
"reference": {
|
||
"dbs": "mld_opdr_id",
|
||
"label": L("lcl_opdr_id"),
|
||
"typ": "varchar",
|
||
"showtransit": true
|
||
},
|
||
"ordernr_sort": {
|
||
"dbs": "mld_opdr_ordernr_int",
|
||
"label": L("bgt_opdr_ordernr"),
|
||
"sql": "fac.safe_to_number(mld_opdr_ordernr)",
|
||
"typ": "number",
|
||
"readonly": true
|
||
},
|
||
"ordernr": {
|
||
"dbs": "mld_opdr_ordernr",
|
||
"label": L("bgt_opdr_ordernr"),
|
||
"typ": "varchar",
|
||
"hidden_fld": true
|
||
},
|
||
"sequence": {
|
||
"dbs": "mld_opdr_bedrijfopdr_volgnr",
|
||
"label": L("lcl_ins_volgnr"),
|
||
"typ": "number",
|
||
"defaultvalue": 0
|
||
},
|
||
"account": {
|
||
"dbs": "prs_kostenplaats_key",
|
||
"label": L("bgt_budget_account"),
|
||
"typ": "key",
|
||
"foreign": bgt_account_foreign(),
|
||
"showtransit": true
|
||
},
|
||
"description": {
|
||
"dbs": "mld_opdr_omschrijving",
|
||
"label": L("lcl_descr"),
|
||
"typ": "varchar"
|
||
},
|
||
"startdate_range": {
|
||
"dbs": "mld_opdr_datumbegin_range",
|
||
"sql": "mld_opdr_datumbegin",
|
||
"label": L("bgt_contractdatum"),
|
||
"typ": "date"
|
||
},
|
||
"startdate": {
|
||
"dbs": "mld_opdr_datumbegin",
|
||
"label": L("bgt_contractdatum"),
|
||
"typ": "date",
|
||
"filter": "exact",
|
||
"showtransit": true
|
||
},
|
||
"amount": {
|
||
"dbs": "mld_opdr_kosten",
|
||
"label": L("bgt_gecontracteerd"),
|
||
"typ": "float",
|
||
"iscurrency": true,
|
||
"total": true
|
||
},
|
||
"vat": {
|
||
"dbs": "mld_opdr_kosten_btw",
|
||
"label": L("lcl_mld_opdr_btw"),
|
||
"typ": "float",
|
||
"iscurrency": true,
|
||
"total": true
|
||
},
|
||
"amountincl": {
|
||
"dbs": "mld_opdr_kosten_incl",
|
||
"sql": "mld_opdr_kosten + mld_opdr_kosten_btw",
|
||
"label": L("lcl_fin_total_sum"),
|
||
"typ": "float",
|
||
"readonly": true,
|
||
"sqlshow": true,
|
||
"iscurrency": true,
|
||
"total": true,
|
||
"defaultvalue": "0",
|
||
"clone": false
|
||
},
|
||
"status": {
|
||
"dbs": "mld_statusopdr_key",
|
||
"label": L("lcl_mld_opdr_status"),
|
||
"typ": "key",
|
||
"foreign": bgt_orderstatus_foreign(),
|
||
"defaultvalue": 5
|
||
},
|
||
"owner": {
|
||
"dbs": "prs_perslid_key",
|
||
"label": L("lcl_obj_owner"),
|
||
"typ": "key",
|
||
"hidden_fld": true,
|
||
"foreign": "PRS_PERSLID"
|
||
},
|
||
"issueordertype": {
|
||
"dbs": "mld_typeopdr_key",
|
||
"label": L("mld_typeopdr_typeopdr_key"),
|
||
"typ": "key",
|
||
"defaultvalue": "5",
|
||
"hidden_fld": true
|
||
},
|
||
"module": {
|
||
"dbs": "mld_opdr_module",
|
||
"label": "module",
|
||
"typ": "varchar",
|
||
"defaultvalue": "MLD",
|
||
"hidden_fld": true
|
||
},
|
||
"additional": {
|
||
"dbs": "mld_opdr_meerwerk",
|
||
"label": L("lcl_mld_opdr_meerwerk"),
|
||
"typ": "check0",
|
||
"defaultvalue": 0,
|
||
"filter": "exact"
|
||
},
|
||
"remark": {
|
||
"dbs": "mld_opdr_opmerking",
|
||
"label": L("lcl_remark"),
|
||
"typ": "memo"
|
||
},
|
||
"_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);
|
||
|
||
|
||
|
||
this.includes= {
|
||
"custom_fields" : {
|
||
"model": new model_custom_fields(this, new model_mld_kenmerk('O', { internal: true }), { pNiveau: "O" }),
|
||
"joinfield": "flexparentkey",
|
||
"enable_update": true
|
||
}
|
||
}
|
||
|
||
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)
|
||
{
|
||
fld.ordernr.hidden_fld = false;
|
||
fld.ordernr.readonly = true;
|
||
}
|
||
|
||
if (mld_opdr_id > -1)
|
||
{
|
||
var sql = "SELECT s.prs_kostensoort_btw"
|
||
+ " , f.fin_btwtabelwaarde_perc"
|
||
+ " FROM mld_opdr o"
|
||
+ " , prs_kostensoort s"
|
||
+ " , 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 = " + mld_opdr_id;
|
||
var oRs = Oracle.Execute(sql);
|
||
if (!oRs.eof)
|
||
{
|
||
btw_data.btw_inc = oRs("prs_kostensoort_btw").Value;
|
||
btw_data.btw_val = oRs("fin_btwtabelwaarde_perc").Value || "0";
|
||
}
|
||
oRs.Close();
|
||
|
||
/*
|
||
#TWYN#53173
|
||
De bestaande knop "Kopi<70>ren" is komen te vervallen. Daarvoor in de plaats zijn twee nieuwe knoppen toegevoegd: "Nieuwe opdracht" en "nieuwe subopdracht".
|
||
Bij een nieuwe subopdracht is het opdrachtnummer gelijk aan die van de opdracht van waaruit gekopieerd wordt en is niet te wijzigen. Het volgnummer staat standaard op volgnr(max+1).
|
||
if (obj._is_clone == 2)) // nieuw subcontract: bepaal hoogste volgnummer bij dit contract, en vul deze alvast in.
|
||
{
|
||
var sql = "SELECT COALESCE(MAX(s.mld_opdr_bedrijfopdr_volgnr), 0) + 1 volgnr"
|
||
+ " FROM mld_opdr s"
|
||
+ " WHERE s.mld_opdr_ordernr ="
|
||
+ " (SELECT m.mld_opdr_ordernr"
|
||
+ " FROM mld_opdr m"
|
||
+ " WHERE m. mld_opdr_key = " + mld_opdr_id
|
||
+ " )";
|
||
var oRs = Oracle.Execute(sql);
|
||
obj.sequence = oRs("volgnr").Value;
|
||
oRs.Close();
|
||
}
|
||
*/
|
||
}
|
||
|
||
%>
|
||
<script>
|
||
var btw_data = <%=JSON.stringify(btw_data)%>;
|
||
<% if (obj.budgetdiscipline) { %> var budgetdiscipline = "<%=obj.budgetdiscipline.id%>"; <% } %>
|
||
<% if (obj.budgetproject) { %> var budgetproject = "<%=obj.budgetproject.id%>"; <% } %>
|
||
<% if (obj.budgetcostcategory) { %> var budgetcostcategory = "<%=obj.budgetcostcategory.id%>"; <% } %>
|
||
<% if (obj.costtypegroup) { %> var costtypegroup = "<%=obj.costtypegroup.id%>"; <% } %>
|
||
<% if (obj.costtype) { %> var costtype = "<%=obj.costtype.id%>"; <% } %>
|
||
<% if (obj.company) { %> var company = "<%=obj.company.id%>"; <% } %>
|
||
<% if (obj.account) { %> var account = "<%=obj.account.id%>"; <% } %>
|
||
</script>
|
||
<%
|
||
}
|
||
|
||
this.hook_pre_multi_edit = function (obj, fld, scf_params)
|
||
{
|
||
var keys = getQParamIntArray("id");
|
||
var budgetproject = -1;
|
||
var budgetcostcategory = -1;
|
||
var costtypegroup = -1;
|
||
var sql = " SELECT kp.bgt_project_key,"
|
||
+ " COUNT (DISTINCT (kr.bgt_kostenrubriek_key)) rubrieken,"
|
||
+ " COUNT (DISTINCT (kg.prs_kostensoortgrp_key)) groepen"
|
||
+ " FROM mld_opdr ko,"
|
||
+ " prs_kostensoort ks,"
|
||
+ " prs_kostensoortgrp kg,"
|
||
+ " bgt_kostenrubriek kr,"
|
||
+ " bgt_project kp"
|
||
+ " WHERE ko.mld_opdr_key IN (" + keys.join(",") + ")"
|
||
+ " AND ko.prs_kostensoort_key = ks.prs_kostensoort_key"
|
||
+ " AND ks.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key"
|
||
+ " AND kg.bgt_kostenrubriek_key = kr.bgt_kostenrubriek_key"
|
||
+ " AND kr.bgt_project_key = kp.bgt_project_key"
|
||
+ " GROUP BY kp.bgt_project_key";
|
||
var oRs = Oracle.Execute(sql);
|
||
if (!oRs.eof)
|
||
{
|
||
budgetproject = oRs("bgt_project_key").Value;
|
||
var rubrieken = oRs("rubrieken").Value;
|
||
var groepen = oRs("groepen").Value;
|
||
oRs.moveNext();
|
||
if (!oRs.eof)
|
||
abort_with_warning("Error: Meerdere (deel)projecten geselecteerd.");
|
||
else if (rubrieken == 1)
|
||
{
|
||
sql = " SELECT DISTINCT (kr.bgt_kostenrubriek_key)"
|
||
+ " FROM mld_opdr ko,"
|
||
+ " prs_kostensoort ks,"
|
||
+ " prs_kostensoortgrp kg,"
|
||
+ " bgt_kostenrubriek kr"
|
||
+ " WHERE ko.mld_opdr_key IN (" + keys.join(",") + ")"
|
||
+ " AND ko.prs_kostensoort_key = ks.prs_kostensoort_key"
|
||
+ " AND ks.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key"
|
||
+ " AND kg.bgt_kostenrubriek_key = kr.bgt_kostenrubriek_key";
|
||
oRs = Oracle.Execute(sql);
|
||
budgetcostcategory = oRs("bgt_kostenrubriek_key").Value;
|
||
if (groepen == 1)
|
||
{
|
||
sql = " SELECT DISTINCT (kg.prs_kostensoortgrp_key)"
|
||
+ " FROM mld_opdr ko,"
|
||
+ " prs_kostensoort ks,"
|
||
+ " prs_kostensoortgrp kg"
|
||
+ " WHERE ko.mld_opdr_key IN (" + keys.join(",") + ")"
|
||
+ " AND ko.prs_kostensoort_key = ks.prs_kostensoort_key"
|
||
+ " AND ks.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key";
|
||
oRs = Oracle.Execute(sql);
|
||
costtypegroup = oRs("prs_kostensoortgrp_key").Value
|
||
}
|
||
}
|
||
}
|
||
oRs.Close();
|
||
%>
|
||
<script type="text/javascript">
|
||
var budgetproject = <%=(budgetproject)%>;
|
||
var budgetrubriek_overrule = <%=(budgetcostcategory)%>;
|
||
var kostensoortgroep_overrule = <%=(costtypegroup)%>;
|
||
</script>
|
||
<%
|
||
}
|
||
|
||
this.hook_pre_post = function(params, obj)
|
||
{
|
||
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 = (typeof obj.costtype == "object" ? obj.costtype.id : obj.costtype);
|
||
checkAanwezigBudget(v_costtype);
|
||
|
||
/*
|
||
TWYN#53173 : waarschijnlijk pas met 2018.1
|
||
obj._is_clone=1 --> nieuwe (hoofd) opdracht
|
||
obj._is_clone=2 --> nieuwe sub-opdracht
|
||
*/
|
||
if (isclone) // Bij kopie van opdracht geen nieuw nummer genereren.
|
||
{
|
||
var v_project_key = (typeof obj.budgetproject == "object" ? obj.budgetproject.id : obj.budgetproject);
|
||
// 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;
|
||
var oRs = Oracle.Execute(sql);
|
||
obj.ordernr = oRs("mld_opdr_ordernr").Value;
|
||
oRs.Close();
|
||
// Kopie contract. Volgnummer moet uniek zijn binnen dit contractnummer.
|
||
checkUniekContractnummer(-1, v_project_key, obj.ordernr, obj.sequence);
|
||
}
|
||
else
|
||
{
|
||
// Genereer een uniek volgnummer binnen het project voor een nieuwe opdracht.
|
||
var prj_key = (obj.budgetproject ? obj.budgetproject : project_key);
|
||
var sql = "SELECT COALESCE(MAX(TO_NUMBER(o.mld_opdr_ordernr)), 0) + 1 new_ordernr"
|
||
+ " FROM bgt_project p"
|
||
+ " , bgt_kostenrubriek r"
|
||
+ " , prs_kostensoortgrp g"
|
||
+ " , prs_kostensoort s"
|
||
+ " , mld_opdr o"
|
||
+ " WHERE p.bgt_project_key = r.bgt_project_key"
|
||
+ " AND r.bgt_kostenrubriek_key = g.bgt_kostenrubriek_key"
|
||
+ " AND g.prs_kostensoortgrp_key = s.prs_kostensoortgrp_key"
|
||
+ " AND s.prs_kostensoort_key = o.prs_kostensoort_key"
|
||
+ " AND p.bgt_project_key = " + prj_key;
|
||
var oRs = Oracle.Execute(sql);
|
||
obj.ordernr = oRs("new_ordernr").Value;
|
||
oRs.Close();
|
||
// Nieuw contract, dus volgnummer is altijd uniek hierbinnen.
|
||
}
|
||
|
||
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"
|
||
);
|
||
}
|
||
}
|
||
|
||
// Tijdelijke oplossing tbv TWYN#52149
|
||
// Uiteindelijk moeten alle multiacties via de reguliere "hook_pre" en "hook_post" gaan (FCLT#54487)
|
||
this.hook_pre_multi_put = function(params, obj, key)
|
||
{
|
||
this.hook_pre_put(params, obj, key);
|
||
}
|
||
|
||
// Deze hook is al multi-ready gemaakt (accepteert een leeg obj)
|
||
this.hook_pre_put = function(params, obj, key)
|
||
{
|
||
// 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"
|
||
+ " , o.mld_opdr_bedrijfopdr_volgnr"
|
||
+ " FROM bgt_project p"
|
||
+ " , bgt_kostenrubriek r"
|
||
+ " , prs_kostensoortgrp g"
|
||
+ " , prs_kostensoort s"
|
||
+ " , mld_opdr o"
|
||
+ " WHERE p.bgt_project_key = r.bgt_project_key"
|
||
+ " AND r.bgt_kostenrubriek_key = g.bgt_kostenrubriek_key"
|
||
+ " AND g.prs_kostensoortgrp_key = s.prs_kostensoortgrp_key"
|
||
+ " AND s.prs_kostensoort_key = o.prs_kostensoort_key"
|
||
+ " 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;
|
||
var v_cur_sequence = oRs("mld_opdr_bedrijfopdr_volgnr").Value;
|
||
oRs.Close();
|
||
|
||
// Sommige waarden worden in multiedit niet meegestuurd, deze hier specifiek setten als zijnde de oude waarde
|
||
var id = obj.id || key;
|
||
var new_sequence = obj.sequence || v_cur_sequence;
|
||
var new_additional = obj.additional || v_meerwerk;
|
||
var new_amount = obj.amount || v_cur_bedrag;
|
||
var new_vat = obj.vat || v_cur_btwbedrag;
|
||
|
||
checkUniekContractnummer(key, v_project_key, v_ordernr, new_sequence);
|
||
|
||
var v_costtype = (obj.costtype ? obj.costtype : v_cur_costtype_key);
|
||
checkAanwezigBudget(v_costtype);
|
||
|
||
// Budget bijwerken als gevolg van meer-minderwerk.
|
||
if (new_additional == 1 || v_meerwerk == 1)
|
||
{
|
||
// 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 (new_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 * new_amount
|
||
, bedrag_btw: -1 * new_vat
|
||
}
|
||
, "MW"
|
||
);
|
||
}
|
||
|
||
}
|
||
|
||
// Controle op overschrijden van budget.
|
||
if (v_cur_costtype_key != v_costtype)
|
||
{ // Heeft dit contract ook nog subcontracten
|
||
|
||
var sql = "SELECT so.mld_opdr_key"
|
||
+ " , so.prs_kostensoort_key"
|
||
+ " , so.mld_opdr_kosten"
|
||
+ " , so.mld_opdr_kosten_btw"
|
||
+ " FROM mld_opdr co"
|
||
+ " , mld_opdr so"
|
||
+ " , bgt_v_project_full cp"
|
||
+ " , bgt_v_project_full sp"
|
||
+ " WHERE co.prs_kostensoort_key = cp.prs_kostensoort_key"
|
||
+ " AND so.prs_kostensoort_key = sp.prs_kostensoort_key"
|
||
+ " AND co.mld_opdr_ordernr = so.mld_opdr_ordernr"
|
||
+ " AND cp.bgt_project_key = sp.bgt_project_key"
|
||
+ " AND co.mld_opdr_key = " + key;
|
||
var oRs = Oracle.Execute(sql);
|
||
while (!oRs.eof)
|
||
{
|
||
var v_cur_opdr_key = oRs("mld_opdr_key").Value;
|
||
//
|
||
if (v_cur_opdr_key != key)
|
||
{
|
||
var v_opdr_exc = 0;
|
||
var v_opdr_btw = 0;
|
||
var v_budget = getBudget(v_cur_costtype_key);
|
||
var v_datamutatie = checkBudgetoverschrijding(v_cur_opdr_key, v_budget, v_opdr_exc, v_opdr_btw); // contractbedrag van deze kostensoort verwijderen
|
||
insertMutatie( v_datamutatie, "AO" );
|
||
//
|
||
v_opdr_exc = (v_cur_opdr_key == key ? new_amount : oRs("mld_opdr_kosten").Value);
|
||
v_opdr_btw = (v_cur_opdr_key == key ? new_vat : oRs("mld_opdr_kosten_btw").Value);
|
||
v_budget = getBudget(v_costtype);
|
||
v_datamutatie = checkBudgetoverschrijding(-1, v_budget, v_opdr_exc, v_opdr_btw); // (aangepast) bedrag aan nieuwe kostensoort toevoegen
|
||
insertMutatie( v_datamutatie, "AO" );
|
||
//
|
||
// subcontracten veranderen van kostensoort
|
||
var sql = "UPDATE mld_opdr"
|
||
+ " SET prs_kostensoort_key = " + v_costtype
|
||
+ " WHERE mld_opdr_key = " + v_cur_opdr_key;
|
||
Oracle.Execute(sql);
|
||
//
|
||
// facturen van subcontracten krijgen ook nieuwe kostensoort.
|
||
var sql = "UPDATE fin_factuur"
|
||
+ " SET prs_kostensoort_key = " + v_costtype
|
||
+ " WHERE mld_opdr_key = " + v_cur_opdr_key;
|
||
Oracle.Execute(sql);
|
||
}
|
||
oRs.MoveNext();
|
||
}
|
||
oRs.Close();
|
||
|
||
/* Alleen het huidige contract */
|
||
// contract verplaatsen naar ander kostensoort
|
||
var v_budget_old = getBudget(v_cur_costtype_key);
|
||
var v_datamutatie = checkBudgetoverschrijding(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, new_amount, new_vat); // (aangepast) bedrag aan nieuwe kostensoort toevoegen
|
||
insertMutatie( v_datamutatie, "AO" );
|
||
// facturen van opdracht waarop gezocht is krijgen ook nieuwe kostensoort.
|
||
var sql = "UPDATE fin_factuur"
|
||
+ " SET prs_kostensoort_key = " + v_costtype
|
||
+ " WHERE mld_opdr_key = " + key;
|
||
Oracle.Execute(sql);
|
||
// De opdracht zelf wordt nu aangepast.
|
||
|
||
}
|
||
else
|
||
{
|
||
var v_budget_new = getBudget(v_costtype);
|
||
var v_datamutatie = checkBudgetoverschrijding(id, v_budget_new, new_amount, new_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"
|
||
+ " , MAX(mld_opdr_kosten) contract_exc"
|
||
+ " , MAX(mld_opdr_kosten_btw) contract_btw"
|
||
+ " , COUNT(f.fin_factuur_key) aantal"
|
||
+ " FROM mld_opdr o"
|
||
+ " , fin_factuur f"
|
||
+ " WHERE o.mld_opdr_key = f.mld_opdr_key(+)"
|
||
+ " AND o.mld_opdr_key = " + key;
|
||
var oRs = Oracle.Execute(sql);
|
||
var aantal_facturen = oRs("aantal").Value;
|
||
var prs_kostensoort = oRs("kostensoort").Value;
|
||
var meerwerk = oRs("meerwerk").Value == 1;
|
||
var contract_exc = oRs("contract_exc").Value;
|
||
var contract_btw = oRs("contract_btw").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 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: contract_exc
|
||
, bedrag_btw: contract_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" );
|
||
}
|
||
}
|
||
|
||
|
||
var gparams = {};
|
||
if (S("bgt_enabled") == 1)
|
||
{
|
||
gparams = {
|
||
GET: {
|
||
tables: [
|
||
"prs_kostensoort",
|
||
"prs_kostensoortgrp",
|
||
"bgt_kostenrubriek",
|
||
"bgt_project"
|
||
],
|
||
wheres: [
|
||
"mld_opdr.prs_kostensoort_key = prs_kostensoort.prs_kostensoort_key",
|
||
"prs_kostensoort.prs_kostensoortgrp_key = prs_kostensoortgrp.prs_kostensoortgrp_key",
|
||
"prs_kostensoortgrp.bgt_kostenrubriek_key = bgt_kostenrubriek.bgt_kostenrubriek_key",
|
||
"bgt_kostenrubriek.bgt_project_key = bgt_project.bgt_project_key"
|
||
]
|
||
}
|
||
};
|
||
|
||
var v_budgetdiscipline = getQParamInt("budgetdiscipline", -1);
|
||
if (v_budgetdiscipline == -1)
|
||
{
|
||
gparams.GET.tables.push("ins_tab_discipline");
|
||
gparams.GET.wheres.push("bgt_project.ins_discipline_key = ins_tab_discipline.ins_discipline_key");
|
||
gparams.GET.wheres.push(
|
||
"bgt_project.ins_discipline_key IN"
|
||
+ " (SELECT w.ins_discipline_key"
|
||
+ " FROM fac_v_webgebruiker w"
|
||
+ " , ins_tab_discipline d"
|
||
+ " WHERE w.ins_discipline_key = d.ins_discipline_key"
|
||
+ " AND w.prs_perslid_key = " + user_key
|
||
+ " AND (w.fac_gebruiker_prs_level_read<9 OR w.fac_gebruiker_alg_level_read<9)"
|
||
+ " AND d.ins_discipline_module = 'BGT'"
|
||
+ " AND d.ins_discipline_verwijder IS NULL"
|
||
+ " )"
|
||
);
|
||
}
|
||
}
|
||
|
||
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"
|
||
+ " FROM bgt_project p"
|
||
+ " , bgt_kostenrubriek r"
|
||
+ " , prs_kostensoortgrp g"
|
||
+ " , prs_kostensoort s"
|
||
+ " , mld_opdr o"
|
||
+ " WHERE p.bgt_project_key = r.bgt_project_key"
|
||
+ " AND r.bgt_kostenrubriek_key = g.bgt_kostenrubriek_key"
|
||
+ " AND g.prs_kostensoortgrp_key = s.prs_kostensoortgrp_key"
|
||
+ " AND s.prs_kostensoort_key = o.prs_kostensoort_key"
|
||
+ " AND p.bgt_project_key = " + p_project_key
|
||
+ " AND o.mld_opdr_ordernr = " + safe.quoted_sql(p_contractnr)
|
||
+ " AND o.mld_opdr_bedrijfopdr_volgnr = " + p_volgnr
|
||
+ (p_contract_key != -1 ? " AND o.mld_opdr_key <> " + p_contract_key : "");
|
||
var oRs = Oracle.Execute(sql);
|
||
var uniek_contractnr = (oRs("aantal").Value == 0);
|
||
oRs.Close();
|
||
if (!uniek_contractnr)
|
||
abort_with_warning("Contractnummer {0}.{1} bestaat al in dit project.".format(p_contractnr, p_volgnr));
|
||
}
|
||
|
||
function checkAanwezigBudget(p_kostensoort_key)
|
||
{
|
||
// kostensoort moet een budget hebben, anders mag er geen contract aan gekoppeld worden.
|
||
var sql = "SELECT count(*) aantal"
|
||
+ " FROM bgt_budget"
|
||
+ " WHERE prs_kostensoort_key = " + p_kostensoort_key;
|
||
var oRs = Oracle.Execute(sql);
|
||
var heeft_budget = oRs("aantal").Value == 1;
|
||
oRs.Close();
|
||
if (!heeft_budget)
|
||
{
|
||
if (false) // Budget niet automatisch aanmaken.
|
||
{
|
||
abort_with_warning("Maak eerst een budget aan voor deze kostensoort voordat er contracten aan gekoppeld worden.");
|
||
}
|
||
else
|
||
{
|
||
var sql_ins = "INSERT INTO bgt_budget"
|
||
+ "( ins_discipline_key"
|
||
+ ", bgt_project_key"
|
||
+ ", bgt_kostenrubriek_key"
|
||
+ ", prs_kostensoortgrp_key"
|
||
+ ", prs_kostensoort_key"
|
||
+ ", bgt_budget_bedrag"
|
||
+ ", bgt_budget_btwbedrag"
|
||
+ ", bgt_budget_isreserve"
|
||
+ ") SELECT ins_discipline_key"
|
||
+ " , bgt_project_key"
|
||
+ " , bgt_kostenrubriek_key"
|
||
+ " , prs_kostensoortgrp_key"
|
||
+ " , prs_kostensoort_key"
|
||
+ " , 0"
|
||
+ " , 0"
|
||
+ " , 0"
|
||
+ " FROM bgt_v_project_full"
|
||
+ " WHERE prs_kostensoort_key = " + p_kostensoort_key;
|
||
Oracle.Execute(sql_ins);
|
||
}
|
||
}
|
||
}
|
||
|
||
function checkBudgetoverschrijding(data_id, data_budget, data_amount, data_vat)
|
||
{
|
||
var amount_old_exc = 0;
|
||
var amount_old_btw = 0;
|
||
if (data_id > -1)
|
||
{
|
||
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_budget.costtype_key
|
||
+ " AND t.mld_opdr_key = " + data_id;
|
||
var oRs = Oracle.Execute(sql);
|
||
amount_old_exc = oRs("amount_old_exc").Value;
|
||
amount_old_btw = oRs("amount_old_btw").Value;
|
||
oRs.Close();
|
||
}
|
||
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_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;
|
||
oRs.Close();
|
||
var sql = "SELECT SUM(m1.bgt_budget_bedrag_van) reserve_exc"
|
||
+ " , SUM(m1.bgt_budget_btwbedrag_van) reserve_btw"
|
||
+ " FROM bgt_budget b1"
|
||
+ " , bgt_budget b2"
|
||
+ " , bgt_budgetmutatie m1"
|
||
+ " WHERE b2.bgt_budget_isreserve = 1"
|
||
+ " 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_budget.costtype_key;
|
||
var oRs = Oracle.Execute(sql);
|
||
var reserve_exc = oRs("reserve_exc").Value;
|
||
var reserve_btw = oRs("reserve_btw").Value;
|
||
oRs.Close();
|
||
//
|
||
var bedrag_exc = 0;
|
||
var bedrag_btw = 0;
|
||
|
||
if (amount_old_exc < data_amount)
|
||
{
|
||
// verhoging contractwaarde 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
|
||
{
|
||
// verlaging contractwaarde exc
|
||
var overschot_exc = reserve_exc - (data_amount - amount_old_exc);
|
||
bedrag_exc = -1 * (overschot_exc > 0 ? reserve_exc : (data_amount - amount_old_exc) );
|
||
}
|
||
//
|
||
if (amount_old_btw < data_vat)
|
||
{
|
||
// verhoging contractwaarde 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
|
||
{
|
||
// verlaging contractwaarde btw
|
||
var overschot_btw = reserve_btw - (data_vat - amount_old_btw);
|
||
bedrag_btw = -1 * (overschot_btw > 0 ? reserve_btw : (data_vat - amount_old_btw) );
|
||
}
|
||
|
||
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_soort)
|
||
{
|
||
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 = "";
|
||
var mutatie_code = "";
|
||
switch (mutatie_soort)
|
||
{
|
||
case "AO": mutatie_omschr = "AO Automatische overboeking";
|
||
mutatie_code = "A";
|
||
break;
|
||
case "MW": mutatie_omschr = "MW Meer-, minderwerk van " + v_costtype_code;
|
||
mutatie_code = "W";
|
||
break;
|
||
}
|
||
|
||
var sql_m = "INSERT INTO bgt_budgetmutatie"
|
||
+ "( bgt_budgetmutatie_datum"
|
||
+ ", bgt_budgetmutatie_omschrijving"
|
||
+ ", prs_perslid_key" // not null!
|
||
+ ", bgt_budget_key_van"
|
||
+ ", bgt_budget_bedrag_van"
|
||
+ ", bgt_budget_btwbedrag_van"
|
||
+ ", bgt_budget_key_naar"
|
||
+ ", bgt_budget_bedrag_naar"
|
||
+ ", bgt_budget_btwbedrag_naar"
|
||
+ ", bgt_budgetmutatie_reserve"
|
||
+ ", bgt_budgetmutatie_code"
|
||
+ ") VALUES"
|
||
+ "( SYSDATE"
|
||
+ ", " + safe.quoted_sql(mutatie_omschr)
|
||
+ ", " + user_key
|
||
+ ", " + 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"
|
||
+ ", " + safe.quoted_sql(mutatie_code)
|
||
+ ")";
|
||
Oracle.Execute(sql_m);
|
||
}
|
||
}
|
||
|
||
|
||
this.REST_GET = generic_REST_GET(this, gparams);
|
||
this.REST_PUT = generic_REST_PUT(this);
|
||
var autparams = user.checkAutorisation(this.autfunction);
|
||
var canWrite = (autparams.PRSwritelevel < 9 && autparams.ALGwritelevel < 9);
|
||
if (canWrite)
|
||
{
|
||
this.REST_POST = generic_REST_POST(this);
|
||
this.REST_DELETE = generic_REST_DELETE(this);
|
||
}
|
||
}
|
||
%> |