FSN#30010 API2: Factuur api / webservice voor facturen
svn path=/Website/trunk/; revision=22419
This commit is contained in:
@@ -310,6 +310,12 @@ api2 = {
|
|||||||
return wheres;
|
return wheres;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Als er voor een veldnaam een alias moet worden gebruikt, doe het dan op deze manier.
|
||||||
|
sqlfield_alias: function _sqlfield_alias(model, field)
|
||||||
|
{
|
||||||
|
return model.aliasprefix + (field.dbs == model.primary ? field.dbs : field.name);
|
||||||
|
},
|
||||||
|
|
||||||
// Bepaal bij een GET welke velden op te halen
|
// Bepaal bij een GET welke velden op te halen
|
||||||
sqlfields: function _sqlfields(params, model)
|
sqlfields: function _sqlfields(params, model)
|
||||||
{
|
{
|
||||||
@@ -329,16 +335,17 @@ api2 = {
|
|||||||
if (field.sql)
|
if (field.sql)
|
||||||
{
|
{
|
||||||
if (model.aliasprefix)
|
if (model.aliasprefix)
|
||||||
dbs = model.aliasprefix + dbs;
|
dbs = model.aliasprefix + field.name;
|
||||||
selects.push(field.sql + " AS " + dbs);
|
selects.push(field.sql + " AS " + dbs);
|
||||||
}
|
}
|
||||||
else if (dbs)
|
else if (dbs)
|
||||||
{
|
{
|
||||||
|
// veldnamen moeten gelijk zijn bij het ophalen. Zie ook: sql2jsonval
|
||||||
if (dbs.indexOf(".") < 0)
|
if (dbs.indexOf(".") < 0)
|
||||||
{
|
{
|
||||||
dbs = model.table + "." + dbs;
|
dbs = model.table + "." + dbs;
|
||||||
if (model.aliasprefix)
|
if (model.aliasprefix)
|
||||||
dbs += " AS " + model.aliasprefix + field.dbs;
|
dbs += " AS " + api2.sqlfield_alias(model, field);
|
||||||
}
|
}
|
||||||
selects.push(dbs);
|
selects.push(dbs);
|
||||||
}
|
}
|
||||||
@@ -553,7 +560,10 @@ __Log("newval="+newval);
|
|||||||
if (field.val instanceof Function)
|
if (field.val instanceof Function)
|
||||||
var val = field.val(oRs, field, model);
|
var val = field.val(oRs, field, model);
|
||||||
else if (field.dbs.indexOf(".") < 0)
|
else if (field.dbs.indexOf(".") < 0)
|
||||||
var val = oRs(model.aliasprefix + field.dbs).Value;
|
{
|
||||||
|
var sqlfieldname = (model.aliasprefix ? api2.sqlfield_alias(model, field) : field.dbs);
|
||||||
|
var val = oRs(sqlfieldname).Value;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
var val = oRs(field.dbs.split(".")[1]).Value;
|
var val = oRs(field.dbs.split(".")[1]).Value;
|
||||||
if (field.typ == "date" && (val != null))
|
if (field.typ == "date" && (val != null))
|
||||||
@@ -644,7 +654,6 @@ __Log("newval="+newval);
|
|||||||
continue;
|
continue;
|
||||||
record[field.name] = val;
|
record[field.name] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params.include && model.includes)
|
if (params.include && model.includes)
|
||||||
{
|
{
|
||||||
for (var i in params.include) // welke includes worden opgevraagd?
|
for (var i in params.include) // welke includes worden opgevraagd?
|
||||||
|
|||||||
27
APPL/API2/api_invoicelines.asp
Normal file
27
APPL/API2/api_invoicelines.asp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<%@ language = "JavaScript" %>
|
||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: api_invoicelines.asp
|
||||||
|
|
||||||
|
Description: FIN_FACTUURREGEL API
|
||||||
|
Parameters:
|
||||||
|
Context: Door een remote systeem (geen persoon) om info uit FACILITOR te halen aan te roepen
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
*/
|
||||||
|
DOCTYPE_Disable = true;
|
||||||
|
ANONYMOUS_Allowed = 1; // Eigenlijk niet waar. We regelen echter alles zelf
|
||||||
|
THIS_FILE = "appl/api/api_invoicelines.asp";
|
||||||
|
|
||||||
|
// Session("logging")=1;
|
||||||
|
|
||||||
|
%>
|
||||||
|
<!-- #include file="../Shared/common.inc" -->
|
||||||
|
<!-- #include file="../Shared/json2.js" -->
|
||||||
|
<!-- #include file="./api2.inc" -->
|
||||||
|
<!-- #include file="./model_invoicelines.inc" -->
|
||||||
|
<%
|
||||||
|
api2.process(model_invoicelines);
|
||||||
|
%>
|
||||||
27
APPL/API2/api_invoices.asp
Normal file
27
APPL/API2/api_invoices.asp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<%@ language = "JavaScript" %>
|
||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: api_invoices.asp
|
||||||
|
|
||||||
|
Description: FIN_FACTUUR API
|
||||||
|
Parameters:
|
||||||
|
Context: Door een remote systeem (geen persoon) om info uit FACILITOR te halen aan te roepen
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
*/
|
||||||
|
DOCTYPE_Disable = true;
|
||||||
|
ANONYMOUS_Allowed = 1; // Eigenlijk niet waar. We regelen echter alles zelf
|
||||||
|
THIS_FILE = "appl/api/api_invoices.asp";
|
||||||
|
|
||||||
|
// Session("logging")=1;
|
||||||
|
|
||||||
|
%>
|
||||||
|
<!-- #include file="../Shared/common.inc" -->
|
||||||
|
<!-- #include file="../Shared/json2.js" -->
|
||||||
|
<!-- #include file="./api2.inc" -->
|
||||||
|
<!-- #include file="./model_invoices.inc" -->
|
||||||
|
<%
|
||||||
|
api2.process(model_invoices);
|
||||||
|
%>
|
||||||
27
APPL/API2/api_issues.asp
Normal file
27
APPL/API2/api_issues.asp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<%@ language = "JavaScript" %>
|
||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: api_issues.asp
|
||||||
|
|
||||||
|
Description: MLD_MELDING API
|
||||||
|
Parameters:
|
||||||
|
Context: Door een remote systeem (geen persoon) om info uit FACILITOR te halen aan te roepen
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
*/
|
||||||
|
DOCTYPE_Disable = true;
|
||||||
|
ANONYMOUS_Allowed = 1; // Eigenlijk niet waar. We regelen echter alles zelf
|
||||||
|
THIS_FILE = "appl/api/api_issues.asp";
|
||||||
|
|
||||||
|
// Session("logging")=1;
|
||||||
|
|
||||||
|
%>
|
||||||
|
<!-- #include file="../Shared/common.inc" -->
|
||||||
|
<!-- #include file="./api2.inc" -->
|
||||||
|
<!-- #include file="../Shared/json2.js" -->
|
||||||
|
<!-- #include file="./model_issues.inc" -->
|
||||||
|
<%
|
||||||
|
api2.process(model_issues);
|
||||||
|
%>
|
||||||
230
APPL/API2/model_invoicelines.inc
Normal file
230
APPL/API2/model_invoicelines.inc
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: model_invoicelines.inc
|
||||||
|
|
||||||
|
Description: Factuurregel model. Dit bestand heeft niets met interfacing te maken
|
||||||
|
maar werkt uitsluitend op JSON-data
|
||||||
|
Parameters:
|
||||||
|
Context:
|
||||||
|
|
||||||
|
Notes: TODO: autorisaties voor scope=fo|bo
|
||||||
|
TODO on demand: PUT/POST/DELETE
|
||||||
|
*/
|
||||||
|
|
||||||
|
%>
|
||||||
|
<!-- #include file="../Shared/discxalg3d.inc"-->
|
||||||
|
<!-- #include file="../fin/fin.inc" -->
|
||||||
|
<%
|
||||||
|
|
||||||
|
model_invoicelines =
|
||||||
|
{
|
||||||
|
module: "FIN",
|
||||||
|
table: "fin_factuurregel",
|
||||||
|
primary: "fin_factuurregel_key",
|
||||||
|
records_name: "invoicelines",
|
||||||
|
record_name: "invoiceline",
|
||||||
|
fields: [{ name: "id", dbs: "fin_factuurregel_key", typ: "key", filter: "exact" },
|
||||||
|
{ name: "name", dbs: "fin_factuurregel_omschrijving", typ: "varchar", track: L("lcl_descr"), filter: "like" },
|
||||||
|
{ name: "line", dbs: "fin_factuurregel_nr", typ: "number" },
|
||||||
|
{ name: "total", dbs: "fin_factuurregel_totaal", typ: "float", track: L("lcl_fin_total_sum_exBTW") },
|
||||||
|
{ name: "vat", dbs: "fin_factuurregel_btw", typ: "float", track: L("lcl_fin_total_sum_inBTW") },
|
||||||
|
{ name: "reference", dbs: "fin_factuurregel_referentie", typ: "varchar", track: L("lcl_location"), filter: "like" },
|
||||||
|
{ name: "vatvalue", dbs: "fin_btwtabelwaarde_key", typ: "key", foreign: "fin_btwtabelwaarde", track: L("lcl_fin_btwtarief"), filter: "exact" },
|
||||||
|
{ name: "costtype", dbs: "prs_kostensoort_key", typ: "key", foreign: "prs_kostensoort", track: L("lcl_shared_charge_type"), filter: "exact" }
|
||||||
|
// niet terug linken{ name: "factuur", dbs: "fin_factuur_key", typ: "key", foreign: "fac_factuur", filter: "exact" }
|
||||||
|
],
|
||||||
|
|
||||||
|
_pre_analyze_fields: function (params, jsondata) /* analyseer inkomende jsondata, common voor PUT en POST */
|
||||||
|
{
|
||||||
|
delete jsondata.line; // factuurregelnummer niet door de gebruiker laten zetten.
|
||||||
|
},
|
||||||
|
|
||||||
|
_analyze_fields: function (fields, params, jsondata) /* analyseer inkomende data, common voor PUT en POST */
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
_validate_fields: function (fields, params, jsondata) /* valideer fields, alle constraints die niet door de database worden afgevangen */
|
||||||
|
{
|
||||||
|
// Als er geen bedrag en omschrijving is ingevuld, dan de factuurregel verwijderen of niet toevoegen
|
||||||
|
},
|
||||||
|
|
||||||
|
_synchronize_totals_sql: function (factuur_key)
|
||||||
|
{
|
||||||
|
// Redundante info bijwerken. Door dat hier te doen hebben we redelijk consistentie-garantie.
|
||||||
|
var sql = " UPDATE fin_factuur ff"
|
||||||
|
+ " SET fin_factuur_totaal = (SELECT SUM(fin_factuurregel_totaal)"
|
||||||
|
+ " FROM fin_factuurregel fr"
|
||||||
|
+ " WHERE fr.fin_factuur_key = ff.fin_factuur_key)"
|
||||||
|
+ " , fin_factuur_totaal_btw = (SELECT SUM(fin_factuurregel_btw)"
|
||||||
|
+ " FROM fin_factuurregel fr"
|
||||||
|
+ " WHERE fr.fin_factuur_key = ff.fin_factuur_key)"
|
||||||
|
+ " WHERE fin_factuur_key = " + factuur_key;
|
||||||
|
return sql;
|
||||||
|
},
|
||||||
|
|
||||||
|
_renumber_invoicelines_sql: function (factuur_key)
|
||||||
|
{
|
||||||
|
// Regels hernummeren zodat ze weer opeenvolgend zijn.
|
||||||
|
var sql = "UPDATE fin_factuurregel"
|
||||||
|
+ " SET fin_factuurregel_nr = ROWNUM"
|
||||||
|
+ " WHERE fin_factuur_key = " + factuur_key;
|
||||||
|
return sql;
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
REST_GET: function _GET(params)
|
||||||
|
{
|
||||||
|
var scope = getQParamSafe("scope", "fe");
|
||||||
|
var autfunction = { fe : "WEB_FINUSE", fo : "WEB_FINFOF", bo : "WEB_FINBOF" } [scope];
|
||||||
|
params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch
|
||||||
|
var query = api2.sqlfields(params, model_invoicelines );
|
||||||
|
|
||||||
|
var parentexists = ["f.fin_factuur_verwijder IS NULL"];
|
||||||
|
|
||||||
|
if (scope == "fe")
|
||||||
|
{
|
||||||
|
parentexists.push("f.prs_perslid_key_user=" + user_key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: disc3d conditie voor de geldendende autfunction toevoegen
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!params.filter.id)
|
||||||
|
{
|
||||||
|
parentexists.push("fin_factuur_datum > SYSDATE - 30");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parentexists.length)
|
||||||
|
{
|
||||||
|
var sqlparent = " EXISTS (SELECT 1"
|
||||||
|
+ " FROM fin_factuur f"
|
||||||
|
+ " WHERE f.fin_factuur_key = fin_factuurregel.fin_factuur_key"
|
||||||
|
+ " AND " + parentexists.join(" AND ") + ")";
|
||||||
|
query.wheres.push(sqlparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
var wheres = api2.sqlfilter(params, model_invoicelines);
|
||||||
|
query.wheres = query.wheres.concat(wheres);
|
||||||
|
|
||||||
|
var sql = "SELECT " + query.selects.join(", ")
|
||||||
|
+ " FROM " + query.tables.join(", ")
|
||||||
|
+ " WHERE " + query.wheres.join(" AND " )
|
||||||
|
+ " ORDER BY fin_factuurregel_nr";
|
||||||
|
var json = api2.sql2json (params, sql, model_invoicelines );
|
||||||
|
|
||||||
|
return json;
|
||||||
|
},
|
||||||
|
|
||||||
|
REST_PUT: function (params, jsondata, the_key) /* update invoiceline */
|
||||||
|
{
|
||||||
|
var finregel_key = the_key;
|
||||||
|
|
||||||
|
model_invoicelines._pre_analyze_fields(params, jsondata);
|
||||||
|
var fields = api2.update_fields(params, model_invoicelines, jsondata); // Build updater
|
||||||
|
model_invoicelines._analyze_fields(fields, params, jsondata);
|
||||||
|
model_invoicelines._validate_fields(fields, params, jsondata);
|
||||||
|
//
|
||||||
|
var sql = "SELECT fin_factuur_key"
|
||||||
|
+ " FROM fin_factuurregel"
|
||||||
|
+ " WHERE fin_factuurregel_key = " + finregel_key;
|
||||||
|
var oRs = Oracle.Execute(sql);
|
||||||
|
var fin_factuur_key = oRs("fin_factuur_key").value;
|
||||||
|
oRs.Close();
|
||||||
|
|
||||||
|
var wheres = [" fin_factuurregel_key = " + finregel_key];
|
||||||
|
var finUpd = buildTrackingUpdate("fin_factuurregel", wheres.join(" AND " ), fields, { noValidateToken: true });
|
||||||
|
|
||||||
|
var sql = "BEGIN "
|
||||||
|
+ finUpd.sql + ";"
|
||||||
|
+ model_invoicelines._synchronize_totals_sql(fin_factuur_key) + ";"
|
||||||
|
+ "END;";
|
||||||
|
var err = Oracle.Execute(sql, true);
|
||||||
|
if (err.friendlyMsg)
|
||||||
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
|
||||||
|
return { key: finregel_key };
|
||||||
|
},
|
||||||
|
|
||||||
|
REST_POST: function (params, jsondata, parent_key) /* new invoiceline */
|
||||||
|
{
|
||||||
|
params.isNew = true;
|
||||||
|
var trackarray = [];
|
||||||
|
var factuur_key = parent_key;
|
||||||
|
var this_fin = fin.func_enabled_factuur(factuur_key); // Wat heb ik zoal aan rechten op deze specifieke factuur
|
||||||
|
|
||||||
|
model_invoicelines._pre_analyze_fields(params, jsondata);
|
||||||
|
var fields = api2.update_fields(params, model_invoicelines, jsondata); // Build updater
|
||||||
|
model_invoicelines._analyze_fields(fields, params, jsondata);
|
||||||
|
model_invoicelines._validate_fields(fields, params, jsondata);
|
||||||
|
|
||||||
|
// Zet volgnummer van de nieuwe factuurregel.
|
||||||
|
var sql = "SELECT MAX(fin_factuurregel_nr) volgnr"
|
||||||
|
+ " FROM fin_factuurregel"
|
||||||
|
+ " WHERE fin_factuur_key = " + factuur_key;
|
||||||
|
var oRs = Oracle.Execute(sql);
|
||||||
|
var volgnr = oRs("volgnr").value + 1;
|
||||||
|
oRs.Close();
|
||||||
|
|
||||||
|
fields.push({ dbs: "fin_factuur_key", typ: "key", val: factuur_key });
|
||||||
|
fields.push({ dbs: "fin_factuurregel_key", typ: "key", seq: "fin_s_fin_factuurregel_key" });
|
||||||
|
fields.push({ dbs: "fin_factuurregel_nr", typ: "number", val: volgnr });
|
||||||
|
|
||||||
|
var finIns = buildInsert("fin_factuurregel", fields, { noValidateToken: true });
|
||||||
|
var factuurregel_key = finIns.sequences["fin_factuurregel_key"];
|
||||||
|
|
||||||
|
var sql = "BEGIN "
|
||||||
|
+ finIns.sql + ";"
|
||||||
|
+ model_invoicelines._synchronize_totals_sql(factuur_key) + ";"
|
||||||
|
+ "END;";
|
||||||
|
var err = Oracle.Execute(sql, true);
|
||||||
|
if (err.friendlyMsg)
|
||||||
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
|
||||||
|
// Tracking toevoegen.
|
||||||
|
trackarray.push(L("lcl_fin_invoicerow_add") + ": " + safe.quoted_sql(jsondata.name) + "/" + jsondata.total);
|
||||||
|
shared.trackaction("FINNEW", factuur_key, trackarray.join("\n"));
|
||||||
|
|
||||||
|
//
|
||||||
|
params.isNew = false; // Voorkom dat een volgende invoicelines ook een insert wordt.
|
||||||
|
return { key: factuurregel_key };
|
||||||
|
},
|
||||||
|
|
||||||
|
REST_DELETE: function (params, the_key) /* delete invoiceline */
|
||||||
|
{
|
||||||
|
var trackarray = [];
|
||||||
|
var factuurregel_key = the_key;
|
||||||
|
|
||||||
|
var sql = "SELECT fin_factuur_key"
|
||||||
|
+ " , fin_factuurregel_omschrijving"
|
||||||
|
+ " , fin_factuurregel_totaal"
|
||||||
|
+ " FROM fin_factuurregel"
|
||||||
|
+ " WHERE fin_factuurregel_key = " + factuurregel_key;
|
||||||
|
var oRs = Oracle.Execute(sql);
|
||||||
|
var factuur_key = oRs("fin_factuur_key").value;
|
||||||
|
var desc = oRs("fin_factuurregel_omschrijving").value;
|
||||||
|
var total = oRs("fin_factuurregel_totaal").value;
|
||||||
|
oRs.Close();
|
||||||
|
|
||||||
|
var this_fin = fin.func_enabled_factuur(factuur_key);
|
||||||
|
user.auth_required_or_abort(this_fin.canDelete);
|
||||||
|
|
||||||
|
// Alleen bij voldoende rechten op de factuur kan een factuurregel worden verwijderd.
|
||||||
|
trackarray.push(L("lcl_fin_regel_del") + ": " + safe.quoted_sql(desc) + "/" + total);
|
||||||
|
|
||||||
|
fin.deleteFactuurregel(factuurregel_key);
|
||||||
|
|
||||||
|
var sql = "BEGIN "
|
||||||
|
+ model_invoicelines._synchronize_totals_sql(factuur_key) + ";"
|
||||||
|
+ model_invoicelines._renumber_invoicelines_sql(factuur_key) + ";"
|
||||||
|
+ "END;"
|
||||||
|
var err = Oracle.Execute(sql, true);
|
||||||
|
if (err.friendlyMsg)
|
||||||
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
else
|
||||||
|
shared.trackaction("FINDEL", factuurregel_key, trackarray.join("\n"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%>
|
||||||
189
APPL/API2/model_invoices.inc
Normal file
189
APPL/API2/model_invoices.inc
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: model_invoices.inc
|
||||||
|
|
||||||
|
Description: Factuur model. Dit bestand heeft niets met interfacing te maken
|
||||||
|
maar werkt uitsluitend op JSON-data
|
||||||
|
Parameters:
|
||||||
|
Context:
|
||||||
|
|
||||||
|
Notes: TODO: definitieve naamgeving bepalen
|
||||||
|
TODO: autorisaties voor scope=fo|bo
|
||||||
|
TODO on demand: PUT/POST/DELETE
|
||||||
|
*/
|
||||||
|
|
||||||
|
%>
|
||||||
|
<!-- #include file="../Shared/discxalg3d.inc"-->
|
||||||
|
<!-- #include file="../fin/fin.inc" -->
|
||||||
|
<!-- #include file="./model_invoicelines.inc"-->
|
||||||
|
<%
|
||||||
|
|
||||||
|
model_invoices =
|
||||||
|
{
|
||||||
|
module: "FIN",
|
||||||
|
table: "fin_factuur",
|
||||||
|
primary: "fin_factuur_key",
|
||||||
|
records_name: "invoices",
|
||||||
|
record_name: "invoice",
|
||||||
|
|
||||||
|
// Dit zijn voorlopige namen! Weet niet zeker of dit factuur_nr (intern/extern?) de juist is als name
|
||||||
|
fields: [{ name: "id", dbs: "fin_factuur_key", typ: "key", filter: "exact" },
|
||||||
|
{ name: "invoicedate", dbs: "fin_factuur_datum", typ: "datetime", track: L("lcl_fin_findate") },
|
||||||
|
// uitvoerende
|
||||||
|
// referentietype
|
||||||
|
// referentie
|
||||||
|
// { name: "invoicenr", dbs: "fin_factuur_nr", typ: "varchar", track: L("lcl_fin_invoice_nr_extern"), filter: "exact" },
|
||||||
|
{ name: "name", dbs: "fin_factuur_nr", typ: "varchar", track: L("lcl_fin_invoice_nr_extern"), filter: "exact" },
|
||||||
|
{ name: "order", dbs: "mld_opdr_key", typ: "key", foreign: "mld_opdr" },
|
||||||
|
{ name: "contract", dbs: "cnt_contract_key", typ: "key", foreign: "cnt_contract" },
|
||||||
|
{ name: "besorder", dbs: "bes_bestelopdr_key", typ: "key", foreign: "bes_bestelopdr" },
|
||||||
|
{ name: "total", dbs: "fin_factuur_totaal", typ: "float", track: L("lcl_fin_totaal_bedrag") },
|
||||||
|
{ name: "vat", dbs: "fin_factuur_totaal_btw", typ: "float", track: L("lcl_fin_totaal_bedrag_btw") },
|
||||||
|
{ name: "status", dbs: "fin_factuur_statuses_key", typ: "key", foreign: fin.getfinstatustext, track: L("lcl_fin_fin_status"), filter: "exact" },
|
||||||
|
{ name: "month", dbs: "fin_factuur_boekmaand", typ: "varchar", track: L("lcl_fin_divide_period"), filter: "exact" },
|
||||||
|
{ name: "reference", dbs: "fin_factuur_debiteur_nr", typ: "varchar", track: L("lcl_fin_debtor_nr"), filter: "exact" },
|
||||||
|
// budgethouder via kostenplaats
|
||||||
|
// kostenplaats via het gerefereerde item
|
||||||
|
{ name: "costtype", dbs: "prs_kostensoort_key", typ: "key", foreign: "prs_kostensoort", track: L("lcl_shared_charge_type"), filter: "exact" },
|
||||||
|
{ name: "contact", dbs: "prs_perslid_key_user", typ: "key", foreign: "prs_perslid", track: L("lcl_mld_name"), filter: "exact" },
|
||||||
|
{ name: "remark", dbs: "fin_factuur_opmerking", typ: "varchar", track: L("lcl_fin_remark") }
|
||||||
|
],
|
||||||
|
includes: {"invoicelines": { model: model_invoicelines,
|
||||||
|
joinfield: "fin_factuur_key"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_pre_analyze_fields: function (params, jsondata) /* analyseer inkomende jsondata, common voor PUT en POST */
|
||||||
|
{
|
||||||
|
// De factuurbedragen worden berekend uit de factuurregels. Eventuele waarden die hier gezet zijn negeren.
|
||||||
|
delete jsondata.total;
|
||||||
|
delete jsondata.vat;
|
||||||
|
|
||||||
|
// Status van 3 (foute import) moet bij saven op 2 worden gezet.
|
||||||
|
var fin_status_key = jsondata.invoice.status;
|
||||||
|
if (fin_status_key == 3) fin_status_key = 2;
|
||||||
|
|
||||||
|
// Status 6 (Akkoord) moet bij saven op 2 (Ingevoerd) worden gezet. Factuur dient indien nodig weer gefiatteerd te worden.
|
||||||
|
if (fin_status_key == 6) fin_status_key = 2;
|
||||||
|
|
||||||
|
jsondata.invoice.status = fin_status_key;
|
||||||
|
},
|
||||||
|
|
||||||
|
_analyze_fields: function (fields, params, jsondata) /* analyseer inkomende data, common voor PUT en POST */
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
_validate_fields: function (fields, params, jsondata) /* valideer fields, alle constraints die niet door de database worden afgevangen */
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
REST_GET: function _GET(params)
|
||||||
|
{
|
||||||
|
var scope = getQParamSafe("scope", "fe");
|
||||||
|
var autfunction = { fe : "WEB_FINUSE", fo : "WEB_FINFOF", bo : "WEB_FINBOF" } [scope];
|
||||||
|
params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch
|
||||||
|
|
||||||
|
// TODO: Add authorization
|
||||||
|
var query = api2.sqlfields(params, model_invoices );
|
||||||
|
query.wheres.push("fin_factuur_verwijder IS NULL");
|
||||||
|
|
||||||
|
if (scope == "fe")
|
||||||
|
{
|
||||||
|
query.wheres.push("prs_perslid_key_user=" + user_key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: disc3d conditie voor de geldendende autfunction toevoegen
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!params.filter.id)
|
||||||
|
{
|
||||||
|
query.wheres.push("fin_factuur_datum > SYSDATE - 30"); // ff beperken tot recente stuff
|
||||||
|
}
|
||||||
|
var wheres = api2.sqlfilter(params, model_invoices);
|
||||||
|
query.wheres = query.wheres.concat(wheres);
|
||||||
|
|
||||||
|
var sql = "SELECT " + query.selects.join(", ")
|
||||||
|
+ " FROM " + query.tables.join(", ")
|
||||||
|
+ " WHERE " + query.wheres.join(" AND " )
|
||||||
|
+ " ORDER BY fin_factuur_key";
|
||||||
|
var json = api2.sql2json (params, sql, model_invoices );
|
||||||
|
|
||||||
|
return json;
|
||||||
|
},
|
||||||
|
|
||||||
|
REST_PUT: function (params, jsondata, the_key) /* update call */
|
||||||
|
{
|
||||||
|
var fin_key = the_key;
|
||||||
|
model_invoices._pre_analyze_fields(params, jsondata);
|
||||||
|
var fields = api2.update_fields(params, model_invoices, jsondata); // Build updater
|
||||||
|
model_invoices._analyze_fields(fields, params, jsondata);
|
||||||
|
model_invoices._validate_fields(fields, params, jsondata);
|
||||||
|
//
|
||||||
|
var wheres = [" fin_factuur_key = " + fin_key];
|
||||||
|
wheres.push(user_key + " = prs_perslid_key_user"); // Altijd fe vooralnog
|
||||||
|
var finUpd = buildTrackingUpdate("fin_factuur", wheres.join(" AND " ), fields, { noValidateToken: true });
|
||||||
|
var err = Oracle.Execute(finUpd.sql, true);
|
||||||
|
if (err.friendlyMsg)
|
||||||
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
|
||||||
|
var fintrack = api2.process_includes(params, model_invoices, jsondata, the_key);
|
||||||
|
|
||||||
|
// update nog tracken
|
||||||
|
if (fin_key > 0)
|
||||||
|
{
|
||||||
|
shared.trackaction("FINUPD",
|
||||||
|
fin_key,
|
||||||
|
L("lcl_fin_is_finupdtrack").format(fin_key) + (finUpd.trackarray.length > 0? "\n" : "") + finUpd.trackarray.join("\n"));
|
||||||
|
};
|
||||||
|
|
||||||
|
return { key: fin_key };
|
||||||
|
},
|
||||||
|
|
||||||
|
REST_POST: function (params, jsondata) /* new invoice */
|
||||||
|
{
|
||||||
|
params.isNew = true;
|
||||||
|
model_invoices._pre_analyze_fields(params, jsondata);
|
||||||
|
var fields = api2.update_fields(params, model_invoices, jsondata); // Build updater
|
||||||
|
model_invoices._analyze_fields(fields, params, jsondata);
|
||||||
|
model_invoices._validate_fields(fields, params, jsondata);
|
||||||
|
|
||||||
|
fields.push({ dbs: "fin_factuur_key", typ: "key", seq: "fin_s_fin_factuur_key" });
|
||||||
|
var finIns = buildInsert("fin_factuur", fields, { noValidateToken: true} );
|
||||||
|
var factuur_key = finIns.sequences["fin_factuur_key"];
|
||||||
|
|
||||||
|
var sql = "BEGIN "
|
||||||
|
+ finIns.sql +";"
|
||||||
|
+ "END;";
|
||||||
|
|
||||||
|
var err = Oracle.Execute(sql, true);
|
||||||
|
if (err.friendlyMsg)
|
||||||
|
abort_with_warning(err.friendlyMsg);
|
||||||
|
|
||||||
|
var fintrack = api2.process_includes(params, model_invoices, jsondata, factuur_key);
|
||||||
|
|
||||||
|
shared.trackaction("FINNEW", factuur_key);
|
||||||
|
|
||||||
|
return { key: factuur_key };
|
||||||
|
},
|
||||||
|
|
||||||
|
REST_DELETE: function (params, the_key) /* delete invoice */
|
||||||
|
{
|
||||||
|
var factuur_key = params.filter.id;
|
||||||
|
|
||||||
|
var this_fin = fin.func_enabled_factuur(factuur_key);
|
||||||
|
user.auth_required_or_abort(this_fin.canDelete);
|
||||||
|
if (this_fin.canDelete) // Dubbel op: bij canDelete=false komt hij hier niet meer.
|
||||||
|
{
|
||||||
|
// Verwijderdatum van de factuur zetten en niet fysiek verwijderen
|
||||||
|
var sql = "UPDATE fin_factuur"
|
||||||
|
+ " SET fin_factuur_verwijder = SYSDATE"
|
||||||
|
+ " WHERE fin_factuur_verwijder IS NULL"
|
||||||
|
+ " AND fin_factuur_key = " + factuur_key;
|
||||||
|
oRs = Oracle.Execute(sql);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%>
|
||||||
142
APPL/API2/model_issues.inc
Normal file
142
APPL/API2/model_issues.inc
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
<% /*
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
File: model_issues.inc
|
||||||
|
|
||||||
|
Description: Melding model. Dit bestand heeft niets met interfacing te maken
|
||||||
|
maar werkt uitsluitend op JSON-data
|
||||||
|
Parameters:
|
||||||
|
Context:
|
||||||
|
|
||||||
|
Notes: TODO: definitieve naamgeving bepalen
|
||||||
|
TODO: autorisaties voor scope=fo|bo
|
||||||
|
TODO on demand: PUT/POST/DELETE
|
||||||
|
TODO floor referentie levert id/code ipv id/name. Waar zit dat??
|
||||||
|
*/
|
||||||
|
|
||||||
|
%>
|
||||||
|
<!-- #include file="../Shared/discxalg3d.inc"-->
|
||||||
|
<!-- #include file="../mld/mld.inc" -->
|
||||||
|
<!-- #include file="model_objects.inc"-->
|
||||||
|
<!-- #include file="model_notes.inc"-->
|
||||||
|
<%
|
||||||
|
|
||||||
|
model_issues =
|
||||||
|
{
|
||||||
|
module: "MLD",
|
||||||
|
table: "mld_melding",
|
||||||
|
primary: "mld_melding_key",
|
||||||
|
records_name: "issues",
|
||||||
|
record_name: "issue",
|
||||||
|
fields: [{ name: "id", dbs: "mld_melding_key", typ: "key", filter: "exact" },
|
||||||
|
{ name: "name", dbs: "mld_melding_id", typ: "varchar", sql: "ins_srtdiscipline.ins_srtdiscipline_prefix||mld_melding_key", filter: "exact" },
|
||||||
|
{ name: "contact", dbs: "prs_perslid_key", typ: "key", foreign: "prs_perslid", track: L("lcl_mld_name"), filter: "exact" },
|
||||||
|
{ name: "requestor", dbs: "prs_perslid_key_voor", typ: "key", foreign: "prs_perslid", track: L("lcl_mld_call_for"), filter: "exact" },
|
||||||
|
{ name: "issuedate", dbs: "mld_melding_datum", typ: "datetime", track: L("lcl_mld_date_time")},
|
||||||
|
{ name: "enddate", dbs: "mld_melding_einddatum", typ: "datetime", track: L("lcl_mld_enddate")},
|
||||||
|
{ name: "issuetype", dbs: "mld_stdmelding_key", typ: "varchar", foreign: "mld_stdmelding", track: L("lcl_complain"), filter: "exact" },
|
||||||
|
{ name: "description", dbs: "mld_melding_omschrijving", typ: "varchar", track: L("lcl_descr"), filter: "like" },
|
||||||
|
{ name: "remark", dbs: "mld_melding_opmerking", typ: "varchar", track: L("lcl_remark")},
|
||||||
|
{ name: "status", dbs: "mld_melding_status", typ: "key", foreign: mld.getmldstatustext, track: L("lcl_status"), filter: "exact" },
|
||||||
|
{ name: "account", dbs: "prs_kostenplaats_key", typ: "key", foreign: "prs_kostenplaats", track: L("lcl_account"), filter: "exact" },
|
||||||
|
{ name: "handler", dbs: "mld_melding_behandelaar_key", typ: "key", foreign: "prs_perslid", track: L("lcl_mld_behandelaar"), filter: "exact" },
|
||||||
|
{ name: "location", dbs: "mld_alg_locatie_key", typ: "key", foreign: "alg_locatie", track: L("lcl_location"), filter: "exact" },
|
||||||
|
{ name: "building", dbs: "alg_v_allonroerendgoed.alg_gebouw_key", typ: "key", foreign: "alg_gebouw", track: L("lcl_building"), filter: "exact" },
|
||||||
|
{ name: "floor", dbs: "alg_v_allonroerendgoed.alg_verdieping_key", typ: "key", foreign: "alg_verdieping", track: L("lcl_floor"), filter: "exact" },
|
||||||
|
{ name: "room", dbs: "alg_v_allonroerendgoed.alg_ruimte_key", typ: "key", foreign: "alg_ruimte", track: L("lcl_room"), filter: "exact" },
|
||||||
|
{ name: "terrain", dbs: "alg_v_allonroerendgoed.alg_terreinsector_key", typ: "key", foreign: "alg_terreinsector", track: L("lcl_room"), filter: "exact" }
|
||||||
|
],
|
||||||
|
includes: {
|
||||||
|
"objects": {
|
||||||
|
model: model_objects,
|
||||||
|
joinfield: "ins_deel_key",
|
||||||
|
single_only: false,
|
||||||
|
joinfunction: function (params)
|
||||||
|
{
|
||||||
|
return "ins_deel_key IN (SELECT ins_deel_key FROM mld_melding_object WHERE mld_melding_object.mld_melding_key = mld_melding.mld_melding_key AND mld_melding_object_verwijder IS NULL)";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notes": { // TODO
|
||||||
|
//model: model_notes,
|
||||||
|
joinfield: "ins_deel_key",
|
||||||
|
single_only: false,
|
||||||
|
joinfunction: function (params)
|
||||||
|
{
|
||||||
|
/* gaat uit dat die wordt geimplementeerd met een view fac_v_notes (module, key, columns....) */
|
||||||
|
return "module='MLD' AND fac_v_notes.key = mld_melding.mld_melding_key";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
REST_GET: function _GET(params)
|
||||||
|
{
|
||||||
|
var scope = getQParamSafe("scope", "fe");
|
||||||
|
var autfunction = { fe : "WEB_MLDUSE", fo : "WEB_MLDFOF", bo : "WEB_MLDBOF", mi : "WEB_MLDBAC" } [scope];
|
||||||
|
params.authparams = user.checkAutorisation(autfunction, null, null, true);
|
||||||
|
// Hier kom je niet terecht als bovenstaande autorisatiecheck niet tot succes leidt.
|
||||||
|
|
||||||
|
// TODO: Add authorization
|
||||||
|
var query = api2.sqlfields(params, model_issues );
|
||||||
|
|
||||||
|
if (scope == "fe")
|
||||||
|
{
|
||||||
|
query.wheres.push("prs_perslid_key=" + user_key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: disc3d conditie voor de geldendende autfunction toevoegen
|
||||||
|
// TODO: disc3d conditie voor de geldendende autfunction toevoegen
|
||||||
|
// TODO: disc3d conditie voor de geldendende autfunction toevoegen
|
||||||
|
// TODO: disc3d conditie voor de geldendende autfunction toevoegen
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!params.filter.id)
|
||||||
|
{
|
||||||
|
query.wheres.push("mld_melding_datum > SYSDATE - 30"); // ff beperken tot recente stuff
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we need the prefix for the name */
|
||||||
|
query.tables.push("mld_stdmelding");
|
||||||
|
query.wheres.push("mld_melding.mld_stdmelding_key = mld_stdmelding.mld_stdmelding_key");
|
||||||
|
query.tables.push("ins_tab_discipline");
|
||||||
|
query.wheres.push("mld_stdmelding.mld_ins_discipline_key = ins_tab_discipline.ins_discipline_key");
|
||||||
|
query.tables.push("ins_srtdiscipline");
|
||||||
|
query.wheres.push("ins_tab_discipline.ins_srtdiscipline_key = ins_srtdiscipline.ins_srtdiscipline_key");
|
||||||
|
|
||||||
|
query.tables.push("alg_v_allonroerendgoed");
|
||||||
|
query.wheres.push("mld_alg_onroerendgoed_keys = alg_v_allonroerendgoed.alg_onroerendgoed_keys(+)");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var wheres = api2.sqlfilter(params, model_issues);
|
||||||
|
query.wheres = query.wheres.concat(wheres);
|
||||||
|
|
||||||
|
var sql = "SELECT " + query.selects.join(", ")
|
||||||
|
+ " FROM " + query.tables.join(", ")
|
||||||
|
+ " WHERE " + query.wheres.join(" AND " )
|
||||||
|
+ " ORDER BY mld_melding_key";
|
||||||
|
|
||||||
|
var json = api2.sql2json (params, sql, model_issues );
|
||||||
|
|
||||||
|
return json;
|
||||||
|
},
|
||||||
|
_analyze_fields: function (fields, params, jsondata) /* analyseer inkomende data, common voor PUT en POST */
|
||||||
|
{
|
||||||
|
},
|
||||||
|
_validate_fields: function (fields, params, jsondata) /* valideer fields, alle constraints die niet door de database worden afgevangen */
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
REST_PUT: function (params, jsondata, the_key) /* update call */
|
||||||
|
{
|
||||||
|
},
|
||||||
|
REST_POST: function (params, jsondata) /* new call */
|
||||||
|
{
|
||||||
|
},
|
||||||
|
|
||||||
|
REST_DELETE: function (params, jsondata, the_key) /* delete call */
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%>
|
||||||
Reference in New Issue
Block a user