Files
Facilitor/APPL/API2/model_mld_opdr.inc
Erik Groener f2c0f39ed0 FSN#39055 BCS/2000 functionaliteit in FACILITOR - customization
svn path=/Website/branches/v2017.2/; revision=36422
2017-12-20 12:43:11 +00:00

579 lines
23 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(),
"showtransit": true
},
"budgetcostcategory": {
"dbs": "bgt_kostenrubriek.bgt_kostenrubriek_key",
"label": L("bgt_kostenrubriek_oms"),
"typ": "key",
"required": true,
"foreign": bgt_budgetcostcategory_foreign(),
"showtransit": true
},
"costtypegroup": {
"dbs": "prs_kostensoortgrp.prs_kostensoortgrp_key",
"label": L("prs_kostensoortgrp_key"),
"typ": "key",
"required": true,
"foreign": bgt_costtypegroup_foreign(),
"showtransit": true
},
"costtype": {
"dbs": "prs_kostensoort_key",
"label": L("prs_kostensoort_key"),
"typ": "key",
"required": true,
"foreign": bgt_costtype_foreign(),
"showtransit": true
}
};
}
fields_main_2 = {
"company": {
"dbs": "mld_uitvoerende_keys",
"label": L("lcl_ord_company"),
"typ": "key",
"foreign": bgt_company_foreign()
},
"reference": {
"dbs": "mld_opdr_id",
"label": L("lcl_opdr_id"),
"typ": "varchar"
},
"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()
},
"description": {
"dbs": "mld_opdr_omschrijving",
"label": L("lcl_descr"),
"typ": "varchar"
},
"startdate": {
"dbs": "mld_opdr_datumbegin",
"label": L("bgt_contractdatum"),
"typ": "date"
},
"estimate": {
"dbs": "estimate",
"sql": "CASE WHEN mld_statusopdr_key=10 THEN mld_opdr_kosten END",
"sqlshow": true,
"hidden_fld": true,
"label": "Raming",
"typ": "float",
"iscurrency": true,
"total": true
},
"contracted": {
"dbs": "contracted",
"sql": "CASE WHEN mld_statusopdr_key<>10 THEN mld_opdr_kosten END",
"sqlshow": true,
"hidden_fld": true,
"label": L("bgt_gecontracteerd"),
"typ": "float",
"iscurrency": true,
"total": 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
},
"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
},
"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"
}
};
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)
{
var btw_data = {};
if (obj.id > -1 || obj.ordernr_sort)
{
fld.ordernr.hidden_fld = false;
fld.ordernr.readonly = true;
}
if (obj.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 = " + obj.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();
}
%>
<script type="text/javascript">
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%>"; <% } %>
</script>
<%
}
this.hook_pre_post = function(params, obj)
{
var parent_key = getQParamInt("id", -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));
checkAanwezigBudget(v_costtype);
if (parent_key > -1) // Bij kopie van opdracht geen nieuw nummer genereren.
{
// Vul het contractnummer van het oorspronkelijke contract in.
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, obj.budgetproject.id, 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.
}
checkBudgetoverschrijding(obj.id, obj.costtype, obj.amount, obj.vat);
}
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?
var sql = "SELECT p.bgt_project_key"
+ " , o.prs_kostensoort_key"
+ " , o.mld_opdr_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 o.mld_opdr_key = " + key;
var oRs = Oracle.Execute(sql);
var v_ordernr = oRs("mld_opdr_ordernr").Value;
var v_project_key = oRs("bgt_project_key").Value;
var v_cur_costtype_key = oRs("prs_kostensoort_key").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
{
checkBudgetoverschrijding(obj.id, v_costtype, obj.amount, obj.vat);
}
}
this.hook_pre_delete = function(params, key)
{
var sql = "SELECT MAX(o.prs_kostensoort_key) kostensoort"
+ " , 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;
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);
}
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"
]
}
};
}
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)
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)
{
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)
{
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
+ " 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_costtype;
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_costtype;
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 = budget_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 = budget_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) );
}
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"
//2017.3 + ", bgt_budgetmutatie_reserve"
+ ") VALUES"
+ "( SYSDATE"
+ ", 'AO Automatische overboeking'"
+ ", " + user_key
+ ", " + budget_key_res
+ ", " + bedrag_exc
+ ", " + bedrag_btw
+ ", " + budget_key_srt
+ ", " + (-1 * bedrag_exc)
+ ", " + (-1 * bedrag_btw)
//2017.3 + ", 1"
+ ")";
Oracle.Execute(sql_m);
}
this.REST_GET = generic_REST_GET(this, gparams);
this.REST_POST = generic_REST_POST(this);
this.REST_PUT = generic_REST_PUT(this);
this.REST_DELETE = generic_REST_DELETE(this);
}
%>