<%@language = "javascript" %>
<% /*
     $Revision$
     $Id$

    File:           ins_inspect_plan.asp
    Description:    Plandatum van inspectie opgeven.
    Parameters:     ins_key (geen verschil).

    Context:        Inline actie ins_list.inc of actie ins_inspect_list
    Note:           Parameter mobile doet niets met navigatie, sluiten enzo, die submit gewoon.
                    Resultaat van een submit is een json object

*/
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="../Shared/calendar.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="ins_flexkenmerksrtcontrole.inc" -->
<!-- #include file="ins.inc" -->

<%
FCLTHeader.Requires({ plugins: ["jQuery", "suggest", "kenmerk"],
                      js: ["jquery.timepicker-table.js"],
                      css: ["timePicker-table.css"] });

var ins_key_arr = getQParamIntArray("ins_keys");
var srtcont_key_arr = getQParamIntArray("srtcont_keys");
var dlsrtcont_key_arr = getQParamIntArray("dlsrtcont_keys");
var multi = ins_key_arr.length > 1;

var tobeplanned = 0;
var ingesloten = [];
var ingeslotensc = [];
var ingeslotendsc = [];
// Bepaal de objecten/delen in de selectie die
// ook echt ingepland kunnen of mogen worden.
for (var i = 0; i < ins_key_arr.length; i++)
{
  var this_ins = ins.func_enabled_deel(ins_key_arr[i]);
  // Als ik mag inspecteren mag ik ook inplannen.
  if (this_ins.canInspect)
  { // Alle Arrays zijn even groot.
    ingesloten.push(ins_key_arr[i]);
    ingeslotensc.push(srtcont_key_arr[i]);
    ingeslotendsc.push(dlsrtcont_key_arr[i]);
   tobeplanned++;
  }
}
user.anything_todo_or_abort(tobeplanned > 0); // We klagen niet over enkele wel en enkele niet

%>

<html class="likemodal">
  <head>
<%  FCLTHeader.Generate(); %>

<%
      var eenheid = -1;
      var scmode = 1; // 0 = Momentmode, 1 = Intervalmode.
      var sctype = -1;
      var info = "";
      sql = "SELECT *"
          + "  FROM (WITH defined_inspect AS (SELECT isc.ins_srtcontrole_key"
          + "                                      , isc.ins_srtcontrole_eenheid"
          + "                                      , isc.ins_srtcontrole_periode"
          + "                                      , isc.ins_srtcontrole_mode"
          + "                                      , id.ins_deel_key"
          + "                                      , isc.ins_srtcontrole_info"
          + "                                      , isc.ins_srtcontrole_type"
          + "                                   FROM ins_deel id"
          + "                                      , ins_srtdeel s"
          + "                                      , ins_srtcontrole isc"
          + "                                  WHERE s.ins_srtdeel_key = id.ins_srtdeel_key"
          + "                                    AND (isc.ins_srtcontrole_niveau = 'S'"
          + "                                     AND isc.ins_srtinstallatie_key = id.ins_srtdeel_key"
          + "                                      OR isc.ins_srtcontrole_niveau = 'G'"
          + "                                     AND isc.ins_srtinstallatie_key = s.ins_srtgroep_key"
          + "                                      OR isc.ins_srtcontrole_niveau = 'D'"
          + "                                     AND isc.ins_srtinstallatie_key = id.ins_discipline_key)"
          + "                                    AND id.ins_deel_key IN (" + ingesloten.join(",") + "))"
          + "        SELECT DISTINCT COALESCE (xcp.ins_srtcontroledl_xcp_eenheid, di.ins_srtcontrole_eenheid) eenheid"
          + "             , di.ins_srtcontrole_info info"
          + "             , di.ins_srtcontrole_mode scmode"
          + "             , di.ins_srtcontrole_type sctype"
          + "          FROM defined_inspect di"
          + "             , ins_srtcontroledl_xcp xcp"
          + "             , ins_deelsrtcontrole idsc"
          + "         WHERE di.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)"
          + "           AND di.ins_deel_key = xcp.ins_deel_key(+)"
          + "           AND di.ins_srtcontrole_key = idsc.ins_srtcontrole_key(+)" // Er kan nog voor de eerste keer geinspecteerd moeten worden.
          + "           AND di.ins_deel_key IN (" + ingesloten.join(",") + ")"
          + "           AND idsc.ins_deel_key(+) IN (" + ingesloten.join(",") + ")"
          + "           AND COALESCE (xcp.ins_srtcontroledl_xcp_periode, di.ins_srtcontrole_periode) > 0"
          + "           AND di.ins_srtcontrole_key IN (" + ingeslotensc.join(",") + ")"
          + "           AND (xcp.ins_srtcontroledl_xcp_eind(+) IS NULL OR xcp.ins_srtcontroledl_xcp_eind(+) > TRUNC(SYSDATE, 'DD'))" + ")";
      var oRs = Oracle.Execute(sql);
      eenheid = oRs("eenheid").Value;
      info = oRs("info").Value;
      scmode = oRs("scmode").Value;
      sctype = oRs("sctype").Value;
      oRs.MoveNext();
      while (!oRs.eof)
      {
        if (eenheid != oRs("eenheid").Value)
          eenheid = -1;
        if (scmode != oRs("scmode").Value)
          scmode = -1;
        if (sctype != oRs("sctype").Value)
        {
          info = "";
          sctype = -1; // Er zijn inspecties met verschillende soort ocntroles. Dan maar -1.
        }
        oRs.MoveNext();
      }
      // Als er meerdere inspecties zijn dan hebben bovenstaande variablen alleen een geldige waarde als het voor alle inspecties hetzelfde is.
%>
    <script type="text/javascript">
      var eenheid = -1;

      function ins_submit()
      {
        // Controle verplichte velden.
        if (!validateForm("u2"))
          return false;

        // Controleren voor uren inspectie of plandatum niet in het verleden ligt.
        // Dit kan alleen voorkomen bij uren omdat de uren voor vandaag de hele dag ingevuld kunnen worden.
        // Bij dagen, maanden en jaren eenheid kan vandaag niet ingevuld worden. Alleen vanaf morgen kan ingevuld worden.
        if (eenheid == 0 && new Date(parseInt($("#plandatum").val())) <= new Date())
        {
          alert(L("lcl_ins_controle_not_past")); // Plandatum mag niet in het verleden liggen!
          return false;
        }

        $.post($("form[name=u2]")[0].action, $("[name=u2]").serialize(), FcltCallbackClose, "json");
      }

      function ins_cancel()
      {
          FcltMgr.closeDetail(window, { cancel: true } );
      }
    </script>
  </head>

  <body id="editbody" class="likemodal">
<%  var buttons =  [{title: L("lcl_submit"), icon: "opslaan.png", action:"ins_submit()"},
                    {title: L("lcl_cancel"), icon: "undo.png", action: "ins_cancel()"}];
    var titletext;
    switch(sctype)
    {
      case 1:  titletext = L("lcl_ins_srtcontrole_insp"); break;
      case 2:  titletext = L("lcl_ins_srtcontrole_repl"); break;
      case 3:  titletext = L("lcl_ins_srtcontrole_cert"); break;
      default: titletext = L("lcl_menu_ins_controle"); break;
    }
    IFRAMER_HEADER(titletext, buttons);
%>
    <form name="u2" action="ins_inspect_save.asp?ins_keys=<%=ingesloten.join(",")%>&srtcont_key_arr=<%=ingeslotensc.join(",")%>&dlsrtcont_key_arr=<%=ingeslotendsc.join(",")%>" method="post">
      <input type="hidden" name="ins_keys" id="ins_keys" value="<%=ingesloten.join(",")%>">
      <input type="hidden" name="srtcont_key_arr" id="srtcont_key_arr" value="<%=ingeslotensc.join(",")%>">
      <input type="hidden" name="dlsrtcont_key_arr" id="dlsrtcont_key_arr" value="<%=ingeslotendsc.join(",")%>">
<%    BLOCK_START("insMultiEdit", L("lcl_ins_schedule"))
        var status_str = "";
        if (ingeslotendsc.join(",").search("-2") < 0)
        { // Allemaal bestaande inspecties met de status Gepland(0).
          var sql = "SELECT ins_deelsrtcontrole_status"
                  + "  FROM ins_deelsrtcontrole"
                  + " WHERE ins_deelsrtcontrole_key = " + ingeslotendsc[0];
          var oRs = Oracle.Execute(sql);
          status_str = ins.getinsstatustext(oRs("ins_deelsrtcontrole_status").Value);
        }

        if (!multi)
        { // Inspecteren van één object met één of meerdere soortcontroles
          var sql = "SELECT *"
                  + "  FROM (WITH defined_inspect AS (SELECT id.ins_srtdeel_key srtdeel_key"
                  + "                                      , isc.ins_srtcontrole_key"
                  + "                                      , isc.ins_srtcontrole_omschrijving"
                  + "                                      , isc.ins_srtcontrole_info"
                  + "                                      , isc.ins_srtcontrole_eenheid"
                  + "                                      , isc.ins_srtcontrole_periode"
                  + "                                      , isc.ins_srtcontrole_eind"
                  + "                                      , id.ins_deel_key"
                  + "                                   FROM ins_deel id"
                  + "                                      , ins_srtdeel s"
                  + "                                      , ins_srtcontrole isc"
                  + "                                  WHERE s.ins_srtdeel_key = id.ins_srtdeel_key"
                  + "                                    AND (isc.ins_srtcontrole_niveau = 'S'"
                  + "                                         AND isc.ins_srtinstallatie_key = id.ins_srtdeel_key"
                  + "                                      OR isc.ins_srtcontrole_niveau = 'G'"
                  + "                                         AND isc.ins_srtinstallatie_key = s.ins_srtgroep_key"
                  + "                                      OR isc.ins_srtcontrole_niveau = 'D'"
                  + "                                         AND isc.ins_srtinstallatie_key = id.ins_discipline_key)"
                  + "                                    AND id.ins_deel_key = " + ingesloten[0] + ")"
                  + "      SELECT di.ins_srtcontrole_key"
                  + "           , " + lcl.xsqla('di.ins_srtcontrole_omschrijving', 'di.ins_srtcontrole_key')
                  + "           , di.ins_srtcontrole_info info"
                  + "           , COALESCE(xcp.ins_srtcontroledl_xcp_eenheid, di.ins_srtcontrole_eenheid) eenheid"
                  + "           , ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key, 1) nextcyclusdate"
                  + "           , fac.getdatemillisec(ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key, 1)) nextcyclusdatems"
                  + "           , fac.getdatemillisec(ins.nextcyclusdate(di.ins_deel_key, di.ins_srtcontrole_key)) nextcyclusdatems_n"
                  + "        FROM defined_inspect di"
                  + "           , ins_srtcontroledl_xcp xcp"
                  + "       WHERE di.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)"
                  + "         AND di.ins_deel_key = xcp.ins_deel_key(+)"
                  + "         AND di.ins_deel_key IN (" + ingesloten[0] + ")"
                  + "         AND COALESCE (xcp.ins_srtcontroledl_xcp_periode, di.ins_srtcontrole_periode) > 0"
                  + "         AND (COALESCE (xcp.ins_srtcontroledl_xcp_eind, di.ins_srtcontrole_eind) >= TRUNC(SYSDATE, 'DD')"
                  + "              OR COALESCE (xcp.ins_srtcontroledl_xcp_eind, di.ins_srtcontrole_eind) IS NULL)"
                  + "       AND di.ins_srtcontrole_key = " + ingeslotensc[0]
                  + "       GROUP BY di.ins_srtcontrole_key"
                  + "              , di.ins_srtcontrole_omschrijving"
                  + "              , di.ins_srtcontrole_info"
                  + "              , di.ins_srtcontrole_eenheid"
                  + "              , di.ins_srtcontrole_periode"
                  + "              , di.ins_deel_key"
                  + "              , xcp.ins_srtcontroledl_xcp_eenheid"
                  //+ "      HAVING COUNT(*) = " + 1 // Als multi dan alleen de inspecties die voor *alle* objecten gelden
                  + ")";

          FCLTselector("sel_srtcontrole_show",
                       sql,
                       { label: L("lcl_ins_controle"),
                         initKey: ingeslotensc[0],
                         emptyOption: L("lcl_select_srtcontrole"),
                         readonly: true, // dan wordtie niet gesubmit
                         required: true,
                         extraParamValue: "eenheid, info, nextcyclusdatems, nextcyclusdatems_n",
                         extraParamValueInit: "-1, , 0, 0"
                        });
%>
          <input type="hidden" name="sel_srtcontrole" id="sel_srtcontrole" value="<%=ingeslotensc[0]%>">
<%

          ROTEXTAREATR("fldtxt", L("lcl_ins_info"), info, {html: "rows='3'", trclass: "invoerinsp", id: "srtcontrole_info", suppressEmpty: true });
        }

        // Status tonen.
        var params = {};
        if (!multi && ingeslotendsc[0] > 0)
        {
          params = { infoPointer: { Url: "appl/shared/status_info.asp?insc_key=" + ingeslotendsc[0] + "&urole=bo",
                                    Title: L("lcl_status_details") + " " + ingeslotendsc[0]
                                  }
                   }
        }
        ROFIELDTR("fld", L("lcl_ins_status"), status_str, params);


        // Men mag alleen een inspectie-uitvoerdatum invoeren die later is dan de laatste plandatum.
        // Bij multi ook de laatste plandatum bepalen.
        // Bij alleen uren inspecties de laatste uitvoerdatum tonen als minimale datum, anders een dag later.
        sql = "SELECT MAX(idsc.ins_deelsrtcontrole_datum) lastinspectdatum"
            + "     , MAX(idsc.ins_deelsrtcontrole_datum + 1) dag_na_lastinspectdatum"
            + "     , SUM (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) aantal_dmj_eenheid"
            //+ "     , isc.ins_srtcontrole_type"
            + "  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"
            + (insplan
              ? "   AND idsc.ins_deelsrtcontrole_status IN (5, 6)"
              : "")
            + "   AND idsc.ins_deel_key IN (" + ingesloten.join(",") + ")"
            + "   AND idsc.ins_srtcontrole_key IN (" + ingeslotensc.join(",") + ")"
            + " GROUP BY isc.ins_srtcontrole_mode";
            //+ "        ,ins_srtcontrole_type";
        var oRs = Oracle.Execute(sql);
        var lastinspectdatum;
        var dag_na_lastinspectdatum;
        var aantal_dmj_eenheid;
        var minDate = new Date();
        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.
          aantal_dmj_eenheid = oRs("aantal_dmj_eenheid").Value;
          minDate = aantal_dmj_eenheid? dag_na_lastinspectdatum : lastinspectdatum;
          if (insPlan && minDate < new Date())
            minDate = new Date();
%>
          <script type="text/javascript">
            var lastinspectdatum = new Date(<%=lastinspectdatum.getTime()%>);
          </script>
<%
        }
        else
        {
%>
          <script type="text/javascript">
            var lastinspectdatum = null;
          </script>
<%
        }

        if (!multi && ingeslotendsc[0] > 0)
        {
          var sql = "SELECT ins_deelsrtcontrole_opmerking"
                  + "     , ins_deelsrtcontrole_plandatum"
                  + "  FROM ins_deelsrtcontrole"
                  + " WHERE ins_deelsrtcontrole_key = " + ingeslotendsc[0];
          var oRs = Oracle.Execute(sql);
          inspect_data = {deelsrtcontrole_opmerking: oRs("ins_deelsrtcontrole_opmerking").Value,
                          deelsrtcontrole_plandatum: (oRs("ins_deelsrtcontrole_plandatum").Value != null? new Date(oRs("ins_deelsrtcontrole_plandatum").Value) : null)}
          // Als de tijd van de datum NIET middennacht (00:00) is dan mag je de datum niet wijzigen. Daarom tijd bepalen voor FCLTcalendar.
          // Wijzigen zet datum op middennacht wat problemen met een constraint kan geven.
          var hours = inspect_data.deelsrtcontrole_plandatum.getHours();
          var minutes = inspect_data.deelsrtcontrole_plandatum.getMinutes();
        }
        else
        {
          inspect_data = {deelsrtcontrole_plandatum: new Date(),
                          srtcontrole_opmerking: ""};
        }

        FCLTcalendar("plandatum",
                     { label: L("lcl_opdr_plandate"),
                       datum: inspect_data.deelsrtcontrole_plandatum,
                       minDate: minDate,
                       required : true, // Initeel hidden. Dan niet verplicht.
                       timeField: true,
                       timeStep: 60,
                       startTime: 0,
                       endTime: 23.75,
                       readonly: false // In status "Ingepland(0)" is de plandatum altijd nog aan te passen.
                     });

        RWTEXTAREATR("opmerk", "fldremark", L("lcl_remark"), inspect_data.srtcontrole_opmerking, {html: "rows='8'", trclass: "invoerinsp", maxlength: 2000});
%>
        <script type="text/javascript">
          //var nextinspectdatum = new Date(< %=nextinspectdatum.getTime()% >);

          // In de interval mode moet de tijd bij de respijtdatum altijd invulbaar zijn.
          // In de moment mode moet de tijd bij de plandatum alleen invulbaar zijn als de eenheid in uren(0) is.
          eenheid = <%=eenheid%>;
          var scmode = <%=scmode%>;
          if (scmode == 0 && eenheid != 0)
            $("#time_from_plandatum").hide();
        </script>
<%
      BLOCK_END();
%>
        </td>
      </tr>
      <tr>
        <td>
<%
      if (!multi)
      {
        BLOCK_START("insFlex2", L("lcl_ins_additional_details")); //block over gehele breedte
        %><div id='insFlexList'><% // Wrapper div voor dynamisch herladen

          generateFlexKenmerkBlock({deelsrtcontrole_key: (!multi && ingeslotendsc[0] > 0? ingeslotendsc[0] : null),
                                    srtcontrole_key: ingeslotensc[0],
                                    reado: false,
                                    flexcolumns: 1
                                  });
        %></div><%
        BLOCK_END();
      }

      IFACE.FORM_END();
%>
    </form>
  </body>
</html>
