283 lines
13 KiB
Plaintext
283 lines
13 KiB
Plaintext
<%@ LANGUAGE = JavaScript %>
|
|
<% /*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: opdr_close_save.asp
|
|
Description: Het echte sluiten van een opdracht, zonder interactie
|
|
Parameters:
|
|
opdr_key Opdracht key van de opdracht die moet worden afgemeld
|
|
Context:
|
|
Note: A Rechtstreeks vanuit opdr_close_confirm.asp
|
|
B in multi-mode wordt dit aangeroepen via $.post en doen we geen interactie
|
|
er wordt dan ook geen opmerking gevraagd
|
|
C Vanuit Pda/order.asp
|
|
|
|
*/
|
|
var JSON_Result = true;
|
|
var opdr_key_arr = getQParamIntArray("opdr_key");
|
|
if (opdr_key_arr.length)
|
|
var LOCKED_USER_OK = { "xmlnode": "opdracht", "key": opdr_key_arr[0] };
|
|
%>
|
|
<!-- #include file="../Shared/common.inc" -->
|
|
<!-- #include file="../Shared/json2.js" -->
|
|
<!-- #include file="../Shared/save2db.inc" -->
|
|
<!-- #include file="mld.inc" -->
|
|
<%
|
|
|
|
function mldClose(sluitmelding, ingesloten)
|
|
{
|
|
if (sluitmelding == 1)
|
|
{
|
|
var mld_close = (Request.Form("mld_close").count == 1); // Die ook?
|
|
var ismobile = getFParamInt("mobile", 0) == 1; // Meld ik de opdracht met mijn mobile af?
|
|
|
|
if (ismobile)
|
|
sluitmelding = 2; // // Via mobile afmelden nooit vragen maar gewoon melding afmelden (FSN#26329).
|
|
|
|
if (ingesloten.length > 1) // Vraag is al geweest
|
|
{
|
|
if (mld_close)
|
|
sluitmelding = 2; // yepe
|
|
else
|
|
sluitmelding = 0; // nope
|
|
}
|
|
}
|
|
return sluitmelding;
|
|
}
|
|
|
|
function writeOpdrOpmToMld()
|
|
{ // Afhandelingtekst van de opdracht automatisch kopiëren naar de melding.
|
|
var sql = "SELECT mld_melding_opmerking"
|
|
+ " FROM mld_melding"
|
|
+ " WHERE mld_melding_key = " + mld_opdr.mld_key;
|
|
var oRs = Oracle.Execute(sql);
|
|
var new_opm = (oRs("mld_melding_opmerking").Value || "") + "\n" + L("lcl_mld_final_remark") + ":\n" + opdr_opm;
|
|
var fields = [ { dbs: "mld_melding_opmerking", typ: "varchar", val: new_opm, track: L("lcl_mld_inf_Opmerking"), len: 4000 } ];
|
|
var mldUpd = buildTrackingUpdate("mld_melding", " mld_melding_key = " + mld_opdr.mld_key, fields);
|
|
oRs = Oracle.Execute(mldUpd.sql);
|
|
if (mldUpd.trackarray.length)
|
|
mld.trackmeldingupdate(mld_opdr.mld_key, L("lcl_mld_is_mldupd") + "\n" + mldUpd.trackarray.join("\n"));
|
|
}
|
|
|
|
var mld_hlt = (Request.Form("mld_hlt").count == 1);
|
|
var result = {};
|
|
var ingesloten = [];
|
|
var reqStatusEmptyMelding = [];
|
|
var reqStatusEmptyOpdr = [];
|
|
|
|
if (opdr_key_arr.length == 1)
|
|
{
|
|
var this_opdr = mld.func_enabled_opdracht(opdr_key_arr[0]); // wat mag ik zoal op deze opdracht
|
|
var mld_opdr = mld.mld_opdr_info(opdr_key_arr[0]);
|
|
var kosten_verplicht_afm = mld_opdr.typeopdr_matchtype != 4 && (mld_opdr.typeopdr_kosten_verplicht & 2 || (mld_opdr.typeopdr_kosten_verplicht == 0 && mld_opdr.opdrkosten_verplicht & 2));
|
|
var opdr_kosten = mld_opdr.t_cost;
|
|
|
|
// Zijn bij deze opdracht alle verplichte kenmerken ingevuld?
|
|
reqStatusEmptyOpdr = mld.getReqStatusEmptyOpdr(reqStatusEmptyOpdr, opdr_key_arr[0], 6); // Opdracht status "Technisch Voltooid(6)"
|
|
|
|
user.auth_required_or_abort(!(kosten_verplicht_afm && opdr_kosten == null) && this_opdr.canClose && !reqStatusEmptyOpdr.length, L("lcl_mld_opdr_kosten_verpl_afm")); // Dan zijn we vlug klaar.
|
|
|
|
var sql = "SELECT o.mld_melding_key"
|
|
+ " , o.mld_opdr_einddatum"
|
|
+ " , mto.mld_typeopdr_sluitmelding"
|
|
+ " FROM mld_opdr o"
|
|
+ " , mld_typeopdr mto"
|
|
+ " WHERE o.mld_typeopdr_key = mto.mld_typeopdr_key"
|
|
+ " AND o.mld_opdr_key = " + opdr_key_arr[0];
|
|
var oRs = Oracle.Execute(sql);
|
|
var mld_key = oRs("mld_melding_key").value;
|
|
var mld_opdr_einddatum = oRs("mld_opdr_einddatum").value;
|
|
var typeopdr_sluitmelding = oRs("mld_typeopdr_sluitmelding").value;
|
|
oRs.Close();
|
|
|
|
// Hoeveel opdrachten staan er open bij deze melding.
|
|
var sql = "SELECT COUNT(mld_opdr_key) nrOpen"
|
|
+ " FROM mld_opdr o"
|
|
+ " WHERE o.mld_melding_key = " + mld_key
|
|
+ " AND o.mld_statusopdr_key NOT IN (1, 6, 7, 9)";
|
|
var oRs = Oracle.Execute(sql);
|
|
var nrOpen = oRs("nrOpen").Value;
|
|
oRs.Close();
|
|
|
|
ingesloten.push(opdr_key_arr[0]);
|
|
var sluitmelding = mldClose(typeopdr_sluitmelding, ingesloten);
|
|
|
|
if (nrOpen == 1 && sluitmelding)
|
|
{
|
|
// Zijn bij de melding van deze opdracht alle verplichte kenmerken ingevuld?
|
|
// Alleen te controleren als melding na afsluiten van de opdracht ook gesloten wordt.
|
|
var this_mld = mld.func_enabled_melding(mld_key); // Wat heb ik zoal aan rechten op deze specifieke melding.
|
|
if (this_mld.canClose)
|
|
reqStatusEmptyMelding = mld.getReqStatusEmptyMelding(reqStatusEmptyMelding, mld_key, 5); // Melding status "Afgemeld(5)"
|
|
}
|
|
user.anything_todo_or_abort(!reqStatusEmptyMelding.length, reqStatusEmptyMelding.join("<br />"));
|
|
// Als Setting S("mld_ord_afmeld_future") niet is gezet: Opdrachten waarvan de einddatum in de toekomst ligt mogen niet worden afgemeld.
|
|
user.auth_required_or_abort((S("mld_ord_afmeld_future") == 1 || (mld_opdr_einddatum < new Date())) && this_opdr.canClose, L("lcl_mld_einddatum_to_late_opdr"));
|
|
}
|
|
else
|
|
{
|
|
// Bepaal de opdrachten in de selectie die
|
|
// ook echt afgemeld kunnen of mogen worden.
|
|
for (var i = 0; i < opdr_key_arr.length; i++)
|
|
{
|
|
var this_opdr = mld.func_enabled_opdracht(opdr_key_arr[i]); // wat mag ik zoal op deze opdracht
|
|
var mld_opdr = mld.mld_opdr_info(opdr_key_arr[i]);
|
|
var sql = "SELECT mld_opdr_einddatum"
|
|
+ " FROM mld_opdr o"
|
|
+ " WHERE o.mld_opdr_key = " + opdr_key_arr[i];
|
|
var oRs = Oracle.Execute(sql);
|
|
|
|
var kosten_verplicht_afm = mld_opdr.typeopdr_matchtype != 4 && (mld_opdr.typeopdr_kosten_verplicht & 2 || (mld_opdr.typeopdr_kosten_verplicht == 0 && mld_opdr.opdrkosten_verplicht & 2));
|
|
var opdr_kosten = mld_opdr.t_cost;
|
|
|
|
// Zijn bij deze opdracht alle verplichte kenmerken ingevuld?
|
|
reqStatusEmptyOpdr = mld.getReqStatusEmptyOpdr(reqStatusEmptyOpdr, opdr_key_arr[i], 6); // Opdracht status "Technisch Voltooid(6)"
|
|
|
|
// Als Setting S("mld_ord_afmeld_future") niet is gezet (0): Opdrachten waarvan de einddatum in de toekomst ligt mogen niet worden afgemeld.
|
|
if ((S("mld_ord_afmeld_future") == 1 || (oRs("mld_opdr_einddatum").Value < new Date())) &&
|
|
this_opdr.canClose &&
|
|
!(kosten_verplicht_afm && opdr_kosten == 0) &&
|
|
!reqStatusEmptyOpdr.length)
|
|
{
|
|
ingesloten.push(opdr_key_arr[i]);
|
|
}
|
|
oRs.Close();
|
|
// Mbv mld_close en mld_typeopdr_sluitmelding weet ik of de melding ook moet worden gesloten na de laatste opdracht,
|
|
// maar op dit punt is nog niet met zekerheid vast te stellen of dit ook de laatste opdracht is.
|
|
// Het heeft dus geen zin om hier te controleren of alle verplichte kenmerken bij de melding zijn ingevuld.
|
|
}
|
|
}
|
|
user.anything_todo_or_abort(ingesloten.length > 0); // We klagen niet over enkele wel en enkele niet
|
|
var result = { opdr_key: ingesloten.join(","), message: "", success: false, canCloseMld: false };
|
|
|
|
for (var i = 0; i < ingesloten.length; i++)
|
|
{
|
|
var mld_opdr = mld.mld_opdr_info(ingesloten[i]);
|
|
lcl.set_dialect(mld_opdr.opdr_type, "MLD_TYPEOPDR_KEY");
|
|
|
|
var this_opdr = mld.func_enabled_opdracht(ingesloten[i]); // wat mag ik zoal op deze opdracht
|
|
if (this_opdr.canOpmChange)
|
|
{
|
|
var opdr_opm = getFParam("opdr_opm", "");
|
|
result.opdr_opm = opdr_opm;
|
|
if (ingesloten.length > 1) // Bulk
|
|
{
|
|
var sql = "SELECT mld_opdr_opmerking"
|
|
+ " FROM mld_opdr o"
|
|
+ " WHERE o.mld_opdr_key = " + ingesloten[i];
|
|
oRs = Oracle.Execute(sql);
|
|
var opm = (oRs("mld_opdr_opmerking").Value? oRs("mld_opdr_opmerking").Value + "\n":"") + opdr_opm;
|
|
oRs.Close();
|
|
}
|
|
else
|
|
var opm = opdr_opm;
|
|
var fields = [ { dbs: "mld_opdr_opmerking", typ: "varchar", val: opm, track: L("lcl_mld_inf_Opmerking") } ];
|
|
|
|
// Als de behandelaar leeg is en een user van het INTERNE bedrijf meldt de opdracht af, dan de user_key als behandelaar (prs_perslid_key) zetten.
|
|
if (mld_opdr.uitv_type == 'B' && mld_opdr.uitv_intern && mld_opdr.contactpers_key == -1)
|
|
fields.push({ dbs: "prs_perslid_key", typ: "key", val: user_key, track: L("lcl_mld_behandelaar"), foreign: "prs_perslid" });
|
|
else if (mld_opdr.uitv_type == 'B' && !mld_opdr.uitv_intern && mld_opdr.contactpersuitv_key == null)
|
|
{ // Is de user een extern contactpersoon van het uitvoerende externe bedrijf? Dan deze invullen als contactpersoon.
|
|
var sql = "SELECT prs_contactpersoon_key"
|
|
+ " FROM prs_contactpersoon"
|
|
+ " WHERE prs_contactpersoon_verwijder IS NULL"
|
|
+ " AND prs_bedrijf_key = " + mld_opdr.uitvoerende_key
|
|
+ " AND prs_perslid_key = " + user_key;
|
|
var oRs = Oracle.Execute(sql);
|
|
if (!oRs.eof)
|
|
// User is contactpersoon van het uitvoerende externe bedrijf.
|
|
fields.push({ dbs: "prs_contactpersoon_key", typ: "key", val: oRs("prs_contactpersoon_key").Value, track: L("lcl_contact_pers"), foreign: "prs_contactpersoon" });
|
|
oRs.Close();
|
|
}
|
|
|
|
var mldUpd = buildTrackingUpdate("mld_opdr", "mld_opdr_key = " + ingesloten[i], fields);
|
|
}
|
|
|
|
var def_date = new Date();
|
|
var afmelddatum = getFParamDate("date_from", def_date);
|
|
var orgdate = getFParamDate("orgdate", def_date);
|
|
|
|
var formattedID = "";
|
|
if ((mldUpd && mldUpd.trackarray.length) ||
|
|
((mld_opdr.typeopdr_afmeldmarge > 0 && ingesloten.length == 1) && (afmelddatum.getTime() != orgdate.getTime())))
|
|
{
|
|
var ins_srtdiscipline_prefix = mld.mld_prefix(mld_opdr.mld_key);
|
|
formattedID = ins_srtdiscipline_prefix + mld_opdr.mld_key + "/" + mld_opdr.volgnr;
|
|
}
|
|
|
|
if (mldUpd && mldUpd.trackarray.length)
|
|
{
|
|
Oracle.Execute(mldUpd.sql);
|
|
mld.trackopdrachtupdate(ingesloten[i], L("lcl_ord_is_ordupdtrack").format(formattedID) + "\n" + mldUpd.trackarray.join("\n"));
|
|
}
|
|
|
|
// Zetten van de status en afhandelen van de tracking van het afmelden (close).
|
|
mld.setopdrachtstatus(ingesloten[i], 6); // Technisch voltooid (TV) (Afgemeld)
|
|
if (mld_opdr.typeopdr_afmeldmarge > 0 && ingesloten.length == 1) // Datum is niet wijzigbaar bij bulk acties
|
|
{
|
|
if (afmelddatum.getTime() != orgdate.getTime())
|
|
{ // Antidateren voor SLA rapportages.
|
|
var sql = "BEGIN fac.backtrackaction('ORDAFM', " + ingesloten[i] + ", " + user_key + ", " + afmelddatum.toSQL(true) +"); END;"
|
|
Oracle.Execute(sql);
|
|
// Wel even tracken
|
|
mld.trackopdrachtupdate(ingesloten[i], L("lcl_ord_is_ordupdtrack").format(formattedID) + "\n" + L("lcl_opdr_closeafwijk") + L("lcl_trackto") + toDateTimeString(afmelddatum));
|
|
}
|
|
}
|
|
|
|
var sluitmelding = mldClose(mld_opdr.typeopdr_sluitmelding, ingesloten);
|
|
result.mld_key = mld_opdr.mld_key;
|
|
|
|
mld.updatemeldingstatus(mld_opdr.mld_key, 0);
|
|
|
|
if (sluitmelding > 0 && mld_opdr.typeopdr_isofferte == 0) // misschien melding nu ook? Bij offertes melding nooit automatisch afmelden of de vraag weergeven
|
|
{ // Zijn er niet-afgemelde opdrachten bij dezelfde melding?
|
|
sql = "SELECT COUNT(*) aantal"
|
|
+ " FROM mld_opdr o1"
|
|
+ " WHERE o1.mld_melding_key = " + mld_opdr.mld_key
|
|
+ " AND o1.mld_statusopdr_key NOT IN (1, 6, 7, 9)";
|
|
oRs = Oracle.Execute(sql);
|
|
var nn = oRs("aantal").Value;
|
|
oRs.Close();
|
|
if (nn == 0) // Het was de laatste opdracht van de melding die nog niet afgemeld is
|
|
{
|
|
reqStatusEmptyMelding = mld.getReqStatusEmptyMelding(reqStatusEmptyMelding, mld_opdr.mld_key, 5); // Melding status "Afgemeld(5)"
|
|
if (reqStatusEmptyMelding.length == 0) // Alle verplichte kenmerkeb zijn ingevuld
|
|
{
|
|
// Mag ik dan ook de melding afmelden?
|
|
var this_mld = mld.func_enabled_melding(mld_opdr.mld_key);
|
|
result.canCloseMld = this_mld.canClose; // ondervangt ook de situatie dat hij al is afgemeld.
|
|
if (result.canCloseMld && (sluitmelding == 2)) // Autoclose mld
|
|
{
|
|
mld.setmeldingstatus(mld_opdr.mld_key, 5);
|
|
// Handle workflow actions for completion:
|
|
mld.nextworkflowstep(mld_opdr.mld_key, 1); // 1 = completed
|
|
result.canCloseMld = false; // want hij is net afgemeld.
|
|
writeOpdrOpmToMld();
|
|
}
|
|
else if (!result.canCloseMld && S("mld_add_mldopmerk_on_opdrclose") == 1 && opdr_opm != "")
|
|
{ // Afhandelingtekst van de opdracht automatisch kopiëren naar de melding.
|
|
writeOpdrOpmToMld();
|
|
}
|
|
}
|
|
// else: Als result.canCloseMld == true dan is sluitmelding == 1 en dan wordt alsnog de vraag gesteld of melding ook moet worden gesloten via callback functie
|
|
}
|
|
}
|
|
|
|
// Zijn er bijbehorende facturen die al zijn ingevoerd met de status "Ingevoerd(2)" die nog geapproved moeten worden?
|
|
mld.autoapprovefactuur(ingesloten[i]);
|
|
|
|
if (mld_hlt)
|
|
{ // Er is 1 onderbroken opdracht die hervat moet worden. Dit doen we door een "ORDRSM" tracking op de opdracht te doen.
|
|
// Haal de onderbroken opdracht weer op.
|
|
var hltopdr = mld.gethltopdrachten(opdr_key_arr[0]);
|
|
// De onderbroken opdracht weer hervatten.
|
|
shared.trackaction("ORDRSM", hltopdr.opdr_key);
|
|
Oracle.Execute("UPDATE mld_opdr SET mld_opdr_halted = 0 WHERE mld_opdr_key = " + hltopdr.opdr_key);
|
|
}
|
|
}
|
|
result.success = true;
|
|
|
|
Response.Write(JSON.stringify(result));
|
|
Response.End;
|
|
%> |