diff --git a/APPL/INS/ins_edit_inspect.asp b/APPL/INS/ins_edit_inspect.asp index e39f2f2448..7c2d06b086 100644 --- a/APPL/INS/ins_edit_inspect.asp +++ b/APPL/INS/ins_edit_inspect.asp @@ -332,7 +332,7 @@ user.anything_todo_or_abort(tobehandled > 0); // We klagen niet over enkele wel FcltMgr.closeDetail(window, { cancel: true } ); } -<% if (insClose) +<% if (insClose || insEdit) { %> function onChangeDeelsrtcdatum(id) { @@ -537,7 +537,7 @@ user.anything_todo_or_abort(tobehandled > 0); // We klagen niet over enkele wel var dag_na_lastinspectdatum; var aantal_dmj_eenheid; var minDate = aanmaakdatum; // Als er nog geen inspecties zijn geweest dan is de aanmaakdatum de minimale datum. - if (!oRs.eof) + if (!oRs.eof && oRs("lastinspectdatum").Value) { lastinspectdatum = new Date(oRs("lastinspectdatum").Value); // Kan uiterlijk vandaag zijn. dag_na_lastinspectdatum = new Date(oRs("dag_na_lastinspectdatum").Value); // Kan uiterlijk morgen zijn. @@ -623,12 +623,89 @@ user.anything_todo_or_abort(tobehandled > 0); // We klagen niet over enkele wel readonly: true, suppressEmpty: true }); + var maxDate = new Date(); if (insClose || (insEdit && typeof inspect_data.deelsrtcontrole_datum != null)) + { + var dmj_eenheid; + // Voor gereed gemelde(5) en afgeronde(6) inspecties geldt een ander minDate en maxDate. + if (dsc_is_afgemeld) // Er geldt dan insEdit en !insClose. Als insClose dan is de status < 5. + { // Inspectie is Gereed gemeld(5) of Afgerond(6). Datum mag ik nog aanpassen. + // Wijzigen in status Afgerond(6) mag alleen als je INSMSU rechten (canMsuEdit) hebt. + // !multi en ins_deelsrtcontrole_key is bekend. + + // Zoek 1 dag na inspectiedatum van de voorgaande inspectie. + // Bij alleen uren inspecties de laatste uitvoerdatum tonen als minimale datum, anders een dag later. + // Vooralsnog kan inspectiedatum niet aangepast worden als de eenheid uren(0) is (readonly). + sql = "SELECT MAX(idsc.ins_deelsrtcontrole_datum) lastinspectdatum" + + " , MAX(idsc.ins_deelsrtcontrole_datum + 1) dag_na_lastinspectdatum" + + " , CASE" + + " WHEN COALESCE(xcp.ins_srtcontroledl_xcp_eenheid, isc.ins_srtcontrole_eenheid) != 0" // Geen tijd eenheid maar dag, maand of jaar. + + " THEN 1" // Dag, maand of jaar. + + " ELSE 0" // Tijd. + + " END dmj_eenheid" + + " FROM ins_deelsrtcontrole idsc" + + " , ins_srtcontrole isc" + + " , ins_srtcontroledl_xcp xcp" + + " WHERE idsc.ins_srtcontrole_key = isc.ins_srtcontrole_key" + + " AND idsc.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)" + + " AND idsc.ins_deel_key = xcp.ins_deel_key(+)" + + " AND COALESCE(xcp.ins_srtcontroledl_xcp_periode, isc.ins_srtcontrole_periode) > 0" + + " AND idsc.ins_deel_key IN (" + ingesloten[0] + ")" + + " AND idsc.ins_srtcontrole_key IN (" + ingeslotensc[0] + ")" + + " AND ins_deelsrtcontrole_key < " + ingeslotendsc[0] + + " GROUP BY isc.ins_srtcontrole_mode" + + " , xcp.ins_srtcontroledl_xcp_eenheid" + + " , isc.ins_srtcontrole_eenheid"; + var oRs = Oracle.Execute(sql); + if (!oRs.eof) + { + lastinspectdatum = new Date(oRs("lastinspectdatum").Value); // Kan uiterlijk vandaag zijn. + dag_na_lastinspectdatum = new Date(oRs("dag_na_lastinspectdatum").Value); // Kan uiterlijk morgen zijn. + dmj_eenheid = oRs("dmj_eenheid").Value; + minDate = dmj_eenheid? dag_na_lastinspectdatum : lastinspectdatum; + } + else + minDate = aanmaakdatum; + + // Zoek 1 dag voor inspectiedatum van de volgende inspectie. + // Bij alleen uren inspecties de eerste uitvoerdatum tonen als minimale datum, anders een dag eerder. + // Vooralsnog kan inspectiedatum niet aangepast worden als de eenheid uren(0) is (readonly). + sql = "SELECT MIN(idsc.ins_deelsrtcontrole_datum) firstinspectdatum" + + " , MIN(idsc.ins_deelsrtcontrole_datum - 1) dag_voor_firstinspectdatum" + + " , CASE" + + " WHEN COALESCE(xcp.ins_srtcontroledl_xcp_eenheid, isc.ins_srtcontrole_eenheid) != 0" // Geen tijd eenheid maar dag, maand of jaar. + + " THEN 1" // Dag, maand of jaar. + + " ELSE 0" // Tijd. + + " END dmj_eenheid" + + " FROM ins_deelsrtcontrole idsc" + + " , ins_srtcontrole isc" + + " , ins_srtcontroledl_xcp xcp" + + " WHERE idsc.ins_srtcontrole_key = isc.ins_srtcontrole_key" + + " AND idsc.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)" + + " AND idsc.ins_deel_key = xcp.ins_deel_key(+)" + + " AND COALESCE(xcp.ins_srtcontroledl_xcp_periode, isc.ins_srtcontrole_periode) > 0" + + " AND idsc.ins_deel_key IN (" + ingesloten[0] + ")" + + " AND idsc.ins_srtcontrole_key IN (" + ingeslotensc[0] + ")" + + " AND ins_deelsrtcontrole_key > " + ingeslotendsc[0] + + " GROUP BY isc.ins_srtcontrole_mode" + + " , xcp.ins_srtcontroledl_xcp_eenheid" + + " , isc.ins_srtcontrole_eenheid"; + oRs = Oracle.Execute(sql); + if (!oRs.eof) + { + firstinspectdatum = new Date(oRs("firstinspectdatum").Value); // Kan uiterlijk vandaag zijn. + dag_voor_firstinspectdatum = new Date(oRs("dag_voor_firstinspectdatum").Value); // Kan uiterlijk morgen zijn. + dmj_eenheid = oRs("dmj_eenheid").Value; + maxDate = dmj_eenheid? dag_voor_firstinspectdatum : firstinspectdatum; + } + // else maxDate = new Date(); + oRs.Close(); + } FCLTcalendar("deelsrtcontrole_datum", { label: L("lcl_ins_controle_datum"), datum: inspect_data.deelsrtcontrole_datum? inspect_data.deelsrtcontrole_datum : new Date(), minDate: minDate, - maxDate: new Date(), + maxDate: maxDate, required: true, trclass: "invoerinsp", timeField: true, @@ -639,9 +716,12 @@ user.anything_todo_or_abort(tobehandled > 0); // We klagen niet over enkele wel onChangeTime: "onChangeDeelsrtcdatum('T')", // Als de inspectie vervallen is moet je alleen nog de lopende inspecties kunnen gereed melden en afronden. De datum moet je dan ook nog kunnen invullen. readonly: ((vervallen && !(vervallen && (ins_deelsrtcontrole_status == 0 || ins_deelsrtcontrole_status == 2))) || - insEdit || - (dsc_is_afgemeld && (hours > 0 || minutes > 0)? true : false)) + (dsc_is_afgemeld && dmj_eenheid == 0) || // Als eenheid in uren(0) is, dan mag de uitvoerdatum/inspectiedatum niet aangepast worden als inspectie is gereed gemeld(5) of afgerond(6). + (insEdit && ins_deelsrtcontrole_status == 6 && !canMsuEdit) || + inspect_data.deelsrtcontrole_datum < aanmaakdatum + ) }); + } sql = "SELECT ins_controlemode_key" + " , " + lcl.xsqla('ins_controlemode_oms', 'ins_controlemode_key') diff --git a/APPL/INS/ins_inspect_save.asp b/APPL/INS/ins_inspect_save.asp index 7e750728c8..adb7d613df 100644 --- a/APPL/INS/ins_inspect_save.asp +++ b/APPL/INS/ins_inspect_save.asp @@ -57,6 +57,8 @@ else if (savemode == "E") abort_with_warning(L("lcl_ins_allow_multi_edit")); deelsrtcont_key = getFParamInt("deelsrtcont_key"); // Specifieke inspectie die gewijzigd is. + deelsrtcontrole_datum = getFParamDate("deelsrtcontrole_datum", new Date); // Datum kan ook aangepast worden. + var getDeelsrtcontroleDate = Request.Form("deelsrtcontrole_datum").count > 0; // Was de inspectiedatum te wijzigen } var warning = ""; @@ -78,6 +80,7 @@ for (var i = 0; i < ins_key_arr.length; i++) + " , COALESCE (xcp.ins_srtcontroledl_xcp_eenheid, di.ins_srtcontrole_eenheid) eenheid" + " , di.ins_srtcontrole_mode" + " , idsc.ins_deelsrtcontrole_status" + + " , di.ins_deel_aanmaak" + " FROM ins_v_defined_inspect di" + " , ins_srtcontroledl_xcp xcp" + " , ins_deelsrtcontrole idsc" @@ -98,6 +101,7 @@ for (var i = 0; i < ins_key_arr.length; i++) // Waarden moeten aanwezig zijn. Mocht dat niet zo zijn dan is er iets fout. var ins_srtcontrole_mode = oRs("ins_srtcontrole_mode").Value; var ins_deelsrtcontrole_status = oRs("ins_deelsrtcontrole_status").Value != null? oRs("ins_deelsrtcontrole_status").Value : -1; // Als er nog geen inspectie is geweest is de status -1. + var ins_deel_aanmaak = new Date(oRs("ins_deel_aanmaak").Value); var eenheid = oRs("eenheid").Value; var ins_deelsrtcontrole_datum_max = oRs("ins_deelsrtcontrole_datum").Value; var ins_deelsrtcontrole_key = oRs("ins_deelsrtcontrole_key").Value; @@ -155,13 +159,96 @@ for (var i = 0; i < ins_key_arr.length; i++) } if (savemode == "E") // Wijzigen. - { // Het mag niet de eerste inspectie zijn en de laatste inspectie mag niet verwerkt zijn. + { if (!this_ins.canInspEdit) { // Ik heb geen Edit rechten. continue; } else dlsrtcont_key = ins_deelsrtcontrole_key; + + // De uitvoerdatum/inspectiedatum moet vallen tussen de uitvoerdatum/inspectiedatum van de vorige en volgende inspectie. + // De edit mode zorgt ervoor dat er alleen juiste inspectiedatums gekozen kunnen worden, maar het is goed dat het hier ook nog getest wordt. + var aanmaakdatum = ins_deel_aanmaak; + var minDate = new Date(); + var maxDate = new Date(); + if (ins_deelsrtcontrole_status >= 5 && getDeelsrtcontroleDate) + { + // Zoek 1 dag na inspectiedatum van de voorgaande inspectie. + // Bij alleen uren inspecties de laatste uitvoerdatum tonen als minimale datum, anders een dag later. + // Vooralsnog kan inspectiedatum niet aangepast worden als de eenheid uren(0) is (readonly). + sql = "SELECT MAX(idsc.ins_deelsrtcontrole_datum) lastinspectdatum" + + " , MAX(idsc.ins_deelsrtcontrole_datum + 1) dag_na_lastinspectdatum" + + " , CASE" + + " WHEN COALESCE(xcp.ins_srtcontroledl_xcp_eenheid, isc.ins_srtcontrole_eenheid) != 0" // Geen tijd eenheid maar dag, maand of jaar. + + " THEN 1" // Dag, maand of jaar. + + " ELSE 0" // Tijd. + + " END dmj_eenheid" + + " FROM ins_deelsrtcontrole idsc" + + " , ins_srtcontrole isc" + + " , ins_srtcontroledl_xcp xcp" + + " WHERE idsc.ins_srtcontrole_key = isc.ins_srtcontrole_key" + + " AND idsc.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)" + + " AND idsc.ins_deel_key = xcp.ins_deel_key(+)" + + " AND COALESCE(xcp.ins_srtcontroledl_xcp_periode, isc.ins_srtcontrole_periode) > 0" + + " AND idsc.ins_deel_key IN (" + ins_key_arr[i] + ")" + + " AND idsc.ins_srtcontrole_key IN (" + srtcont_key_arr[i] + ")" + + " AND ins_deelsrtcontrole_key < " + dlsrtcont_key + + " GROUP BY isc.ins_srtcontrole_mode" + + " , xcp.ins_srtcontroledl_xcp_eenheid" + + " , isc.ins_srtcontrole_eenheid"; + var oRs = Oracle.Execute(sql); + if (!oRs.eof) + { + lastinspectdatum = new Date(oRs("lastinspectdatum").Value); // Kan uiterlijk vandaag zijn. + dag_na_lastinspectdatum = new Date(oRs("dag_na_lastinspectdatum").Value); // Kan uiterlijk morgen zijn. + dmj_eenheid = oRs("dmj_eenheid").Value; + minDate = dmj_eenheid? dag_na_lastinspectdatum : lastinspectdatum; + } + else + minDate = aanmaakdatum; + + // Zoek 1 dag voor inspectiedatum van de volgende inspectie. + // Bij alleen uren inspecties de eerste uitvoerdatum tonen als minimale datum, anders een dag eerder. + // Vooralsnog kan inspectiedatum niet aangepast worden als de eenheid uren(0) is (readonly). + sql = "SELECT MIN(idsc.ins_deelsrtcontrole_datum) firstinspectdatum" + + " , MIN(idsc.ins_deelsrtcontrole_datum - 1) dag_voor_firstinspectdatum" + + " , CASE" + + " WHEN COALESCE(xcp.ins_srtcontroledl_xcp_eenheid, isc.ins_srtcontrole_eenheid) != 0" // Geen tijd eenheid maar dag, maand of jaar. + + " THEN 1" // Dag, maand of jaar. + + " ELSE 0" // Tijd. + + " END dmj_eenheid" + + " FROM ins_deelsrtcontrole idsc" + + " , ins_srtcontrole isc" + + " , ins_srtcontroledl_xcp xcp" + + " WHERE idsc.ins_srtcontrole_key = isc.ins_srtcontrole_key" + + " AND idsc.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)" + + " AND idsc.ins_deel_key = xcp.ins_deel_key(+)" + + " AND COALESCE(xcp.ins_srtcontroledl_xcp_periode, isc.ins_srtcontrole_periode) > 0" + + " AND idsc.ins_deel_key IN (" + ins_key_arr[i] + ")" + + " AND idsc.ins_srtcontrole_key IN (" + srtcont_key_arr[i] + ")" + + " AND ins_deelsrtcontrole_key > " + dlsrtcont_key + + " GROUP BY isc.ins_srtcontrole_mode" + + " , xcp.ins_srtcontroledl_xcp_eenheid" + + " , isc.ins_srtcontrole_eenheid"; + oRs = Oracle.Execute(sql); + if (!oRs.eof) + { + firstinspectdatum = new Date(oRs("firstinspectdatum").Value); // Kan uiterlijk vandaag zijn. + dag_voor_firstinspectdatum = new Date(oRs("dag_voor_firstinspectdatum").Value); // Kan uiterlijk morgen zijn. + dmj_eenheid = oRs("dmj_eenheid").Value; + maxDate = dmj_eenheid? dag_voor_firstinspectdatum : firstinspectdatum; + } + //else //maxDate = new Date(); + oRs.Close(); + + // Eenheid is in dagen dus afronden op middennacht is ok. Er moet minstens een dag verschil in zitten. + // minDate of maxDate mag ook nog. + if (deelsrtcontrole_datum.midnight().getTime() < minDate.midnight().getTime() || deelsrtcontrole_datum.midnight().getTime() > maxDate.midnight().getTime()) + { // De uitvoerdatum/inspectiedatum valt niet tussen de uitvoerdatum/inspectiedatum van de vorige en volgende inspectie. + continue; + } + } } ingesloten.push({ins_key: ins_key_arr[i], srtcont_key: srtcont_key_arr[i], dlsrtcont_key: dlsrtcont_key, @@ -579,10 +666,13 @@ else if (savemode == "E") } else { - var fields = [ { dbs: "ins_deelsrtcontrole_plandatum", typ: "datetime", frm: "plandatum", track: L("lcl_opdr_plandate") }, - { dbs: "ins_deelsrtcontrole_opmerking", typ: "varchar", frm: "opmerk", track: L("lcl_remark"), len: 2000 } + var fields = [ { dbs: "ins_deelsrtcontrole_plandatum", typ: "datetime", frm: "plandatum", track: L("lcl_opdr_plandate") }, + { dbs: "ins_deelsrtcontrole_opmerking", typ: "varchar", frm: "opmerk", track: L("lcl_remark"), len: 2000 } ]; + if (getDeelsrtcontroleDate) + fields.push( { dbs: "ins_deelsrtcontrole_datum", typ: "datetime", val: deelsrtcontrole_datum, track: L("lcl_ins_controle_datum") } ); + if (canMsuEdit) fields.push( { dbs: "ins_controlemode_key", typ: "key", frm: "sel_controlemode", track: L("lcl_ins_controle_mode"), foreign: "ins_controlemode" } );