<%@ LANGUAGE = JavaScript %>
<% /*
     $Revision$
     $Id$

     File:          opdr_close_confirm.asp.asp
     Description:   Meldt een specifieke opdracht af, eventueel met optie afmeldtijdstip in te vullen
                    ('alle opdrachten van een melding' gebeurt in mld_close_confirm.asp)
     Parameters:
         opdr_key   Opdracht key van de opdracht die moet worden afgemeld
     Context:
     Note:          A Rechtstreeks vanuit overzicht opdrachten
                      LET OP: in multi-mode wordt dit aangeroepen via $.post en doen we geen interactie
                              er wordt dan ook geen opmerking gevraagd
                    B Rechtstreeks vanuit showmode opdracht

*/
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/iface.inc" -->
<!-- #include file="../Shared/calendar.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="mld_flexkenmerk.inc" -->
<!-- #include file="mld.inc" -->
<%

FCLTHeader.Requires({ plugins: ["suggest", "jQuery", "kenmerk"] });

// Als de opdrachten niet sequentieel uitgevoerd moeten worden, dan wordt er ook geen onderbroken opdracht gevonden.
var hltopdr = mld.gethltopdrachten(opdr_key_arr[0]);
var reqStatusEmptyMelding = [];
var reqStatusEmptyOpdr = [];
var ingesloten = [];
var result = {};
var maychangeopm = false;
var vraag_sluitmelding = false;

if (opdr_key_arr.length == 1)
{
  // Haal de gegevens van de opdracht op.
  var this_opdr = mld.func_enabled_opdracht(opdr_key_arr[0]); // wat mag ik zoal op deze opdracht
  var mld_opdr = this_opdr.mld_opdr;
  var kosten_verplicht_afm = mld_opdr.tonen_totaal && (mld_opdr.typeopdr_kosten_verplicht & 2 || (mld_opdr.typeopdr_kosten_verplicht == 0 && mld_opdr.opdrkosten_verplicht & 2));
  var opdr_kosten = mld_opdr.t_cost;
//  user.auth_required_or_abort(this_opdr.canClose, L("lcl_mld_opdr_kosten_verpl_afm")); // Dan zijn we vlug klaar.
  user.auth_required_or_abort(!(kosten_verplicht_afm && opdr_kosten == null) && this_opdr.canClose, L("lcl_mld_opdr_kosten_verpl_afm")); // Dan zijn we vlug klaar.

  var sql = "SELECT o.mld_opdr_einddatum"
          + "     , o.mld_melding_key"
          + "     , 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 != null? new Date(oRs("mld_opdr_einddatum").Value) : null;
  var typeopdr_sluitmelding = oRs("mld_typeopdr_sluitmelding").Value;
  oRs.Close();

  // 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 == null || (mld_opdr_einddatum && mld_opdr_einddatum < new Date())), L("lcl_mld_einddatum_to_late_opdr"));
  ingesloten.push(opdr_key_arr[0]);

  if (!maychangeopm && this_opdr.canOpmChange)
    maychangeopm = true; // Ik mag voor de opdracht de opmerking aanpassen

  // Zijn bij deze opdracht alle verplichte kenmerken ingevuld?
  reqStatusEmptyOpdr = mld.getActieKenmerkenOpdr(reqStatusEmptyOpdr, opdr_key_arr[0], {status: 6}); // Opdracht status "Technisch Voltooid(6)"

  // Zijn bij de melding van deze opdracht alle verplichte kenmerken en/of verplicht object ingevuld?
  reqStatusEmptyMelding = mld.getReqStatusEmptyMelding(reqStatusEmptyMelding, mld_key, 5); // Melding status "Afgemeld(5)"

  // 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();

  if (nrOpen == 1 && typeopdr_sluitmelding == 2)
  {
    // Dit is de laatste opdracht bij de melding EN de melding mag na sluiten van de opdracht ook gesloten worden.
    user.anything_todo_or_abort(!reqStatusEmptyMelding.length, reqStatusEmptyMelding.join("<br />"));
  }
  var this_mld = mld.func_enabled_melding(mld_key);  // Wat heb ik zoal aan rechten op deze specifieke melding.
}
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 = this_opdr.mld_opdr;
    var sql = "SELECT o.mld_opdr_einddatum"
            + "  FROM mld_opdr o"
            + "     , mld_typeopdr mto"
            + " WHERE o.mld_typeopdr_key = mto.mld_typeopdr_key"
            + "   AND o.mld_opdr_key = " + opdr_key_arr[i];
    var oRs = Oracle.Execute(sql);
    var mld_opdr_einddatum = oRs("mld_opdr_einddatum").Value != null? new Date(oRs("mld_opdr_einddatum").Value) : null;
    oRs.Close();

    var kosten_verplicht_afm = mld_opdr.tonen_totaal && (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.getActieKenmerkenOpdr(reqStatusEmptyOpdr, opdr_key_arr[i], {status: 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 || mld_opdr_einddatum == null || (mld_opdr_einddatum && mld_opdr_einddatum < new Date())) &&
        this_opdr.canClose &&
        !(kosten_verplicht_afm && opdr_kosten == 0) &&
        !reqStatusEmptyOpdr.length)
    {
      ingesloten.push(opdr_key_arr[i]);

      if (!maychangeopm && this_opdr.canOpmChange)
        maychangeopm = true; // Ik mag voor zeker 1 opdracht de opmerking aanpassen
    }
  }
  vraag_sluitmelding = (ingesloten.length > 1); // Bij meerdere opdrachten sluiten vragen we of de meldingen ook meemoeten
}

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 };
var mld_opdr = mld.mld_opdr_info(ingesloten[0]); // Neem voor informatie de eerste opdracht.
lcl.set_dialect(mld_opdr.opdr_type, "MLD_TYPEOPDR_KEY");

var stdmld_arr = [];
var disc_arr = [];
sql = "SELECT DISTINCT std.mld_stdmelding_key"
    + "     , md.ins_discipline_key"
    + "  FROM mld_opdr mo"
    + "     , mld_melding mm"
    + "     , mld_stdmelding std"
    + "     , mld_discipline md"
    + "     , ins_srtdiscipline sd"
    + " WHERE mo.mld_opdr_key IN (" + ingesloten.join(",") + ")"
    + "   AND mm.mld_melding_key = mo.mld_melding_key"
    + "   AND mm.mld_stdmelding_key = std.mld_stdmelding_key"
    + "   AND std.mld_ins_discipline_key = md.ins_discipline_key"
    + "   AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key";
oRs = Oracle.Execute(sql);
while (!oRs.eof)
{
  stdmld_arr.push(oRs("mld_stdmelding_key").Value);
  disc_arr.push(oRs("ins_discipline_key").Value);
  oRs.MoveNext();
}
oRs.Close();
%>
<html>
  <head>
<%  FCLTHeader.Generate(); %>

      <script type="text/javascript">

        function mld_cancel()
        {
          FcltMgr.closeDetail(window, { cancel: true } );
        }

        async function mld_close(close)
        {
          if (!await validateForm("u2"))
            return false;

          // Zijn er opdrachtkenmerken die alleen verplicht zijn bij het afmelden en niet zijn ingevuld?
          // Test only with multi-mode
          if (<%=reqStatusEmptyOpdr.length%> != 0 && <%=opdr_key_arr.length%> != 1)
          {
            FcltMgr.alert("<%=safe.jsstring(reqStatusEmptyOpdr.join('\n'))%>");
            return false;
          }

          // Alleen vergeten verplichte kenmerken en/of verplicht object vermelden als die er zijn en aangevinkt is dat de melding evt. afgemeld moet worden.
          // Voorwaarde "aantal nog openstaande opdrachten = 1" kan niet ivm batchmode.
          if ($("#mld_close").is(":checked") && (<%=reqStatusEmptyMelding.length%> != 0))
          {
            FcltMgr.alert("<%=safe.jsstring(reqStatusEmptyMelding.join('\n'))%>");
            return false;
          }

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

          return true; // disable button
        }

        function PasteFromSelectbox()
        {
          if ($("#stdopmerk :selected").val() > -1)
          {
            $("#opdr_opm").focus();
            var PastedText = $("#stdopmerk :selected")[0].getAttribute("afmeldtekstoms");
            $("#opdr_opm").val($("#opdr_opm").val() + ($("#opdr_opm").val() != ""? "\n" : "") + PastedText);
          }
        }

        $(function()
        {
          $("#opdr_opm").focus();
          PasteFromSelectbox();
        });

      </script>
  </head>

  <body class="fclt-modal" id="mod_opdrclose">
    <% MODAL_START(); %>
    <form id="closeform" name="closeform" action="opdr_close_save.asp?opdr_key=<%=opdr_key_arr.join(",")%>" method="post">
<%
      var nu = new Date;
      if (ingesloten.length == 1)
      {
        var ttl = L("lcl_mld_opdr_number") + " " + (mld_opdr.srtdiscprefix||"") + mld_opdr.mld_key + "/" + mld_opdr.mld_opdr_bedrijfopdr_volgnr;
      } else {
        var ttl = L("lcl_mld_opdr_close");
      }

      MODAL_BLOCK_START("mldClose", ttl, { icon: "fa-flag-checkered" });

      // Calendar boven de opmerking houden zodat genoeg ruimte voor uitklappen
      FCLTcalendar("date_from",
                   { datum    : nu,
                     label    : L("lcl_opdr_closeafwijk"),
                     maxPast  : (ingesloten.length == 1? mld_opdr.typeopdr_afmeldmarge : 0),
                     maxFuture: 0,
                     timeField: true,
                     timeStep : 30, // fixed half uur. Je mag eventueel wel iets anders intikken
                     startTime: S("res_t1"),
                     endTime  : S("res_t2"),
                     readonly : ingesloten.length > 1 || mld_opdr.typeopdr_afmeldmarge == 0, // Datum is niet wijzigbaar bij bulk acties
                     required : true
                   });

      var sql_from_t = "  FROM mld_afmeldtekst"
                     + " WHERE ((mld_stdmelding_key IN (" + stdmld_arr.join(",") + ") )"
                     + "    OR (mld_stdmelding_key IS NULL AND mld_ins_discipline_key IN (" + disc_arr.join(",") + ") )"
                     + "    OR (mld_stdmelding_key IS NULL AND mld_ins_discipline_key IS NULL))"
                     + "   AND BITAND(mld_afmeldtekst_usefor, 4) = 4";
      var sql = "SELECT COUNT(*) aantal "
              + sql_from_t;
      var oRs = Oracle.Execute(sql);
      var aantal_teksten = oRs("aantal").Value;
      oRs.Close();
      if (aantal_teksten > 0)
      {

        sql = "SELECT mld_afmeldtekst_key"
            + "     , " + lcl.xsqla('mld_afmeldtekst_naam', 'mld_afmeldtekst_key')
            + "     , " + lcl.xsql('mld_afmeldtekst_omschrijving', 'mld_afmeldtekst_key') + " afmeldtekstoms"
            + "     , 2 src"
            + sql_from_t;

        FCLTselector("stdopmerk",
                     sql,
                     { label: L("lcl_mld_inf_std_opm"),
                       initKey: -1,
                       emptyOption: (S("mld_sel_single_closingtext")==2 && aantal_teksten==1 ? null : ""),
                       extraParamValue: "afmeldtekstoms",
                       onChange: "PasteFromSelectbox()"
                     });
      }

      RWTEXTAREATR("opdr_opm",
                   "fldtxt" + (mld_opdr.typeopdr_afhandeling == 1? " required" : ""),
                   L("lcl_mld_inf_Opmerking"),
                   (ingesloten.length > 1? "" : mld_opdr.opdr_opmerking),
                   {html: "rows='8'", readonly: !maychangeopm});

      if (vraag_sluitmelding)
      {
        %><tr><td colspan="2">
            <% CHECKBOX("fldcheck", "mld_close"); %>
            <label for="mld_close"><%=L("lcl_mld_mld_close_try")%></label>
          </td></tr>
        <%
      }
      if (hltopdr.aantal == 1)
      {
        %><tr><td colspan="2">
            <% CHECKBOX("fldcheck", "mld_hlt"); %>
            <label for="mld_hlt"><%=L("lcl_mld_opdr_cont").format(hltopdr.opdracht)%></label>
          </td></tr>
        <%
      }
     %><input type='hidden' name='orgdate' value='<%=nu.getTime()%>'><%
      MODAL_BLOCK_END();

      // Show required, and missing, confirm flex-properties at order-confirm.
      // multi-action is not supported currently (alext)
      if (opdr_key_arr.length == 1)
      {
        generateFlexKenmerkBlock({ opdr_key: mld_opdr.opdr_key,
                                   opdr_type: mld_opdr.opdr_type,
                                   opdr_type_org: mld_opdr.opdr_type,
                                   opdr_status: mld_opdr.opdr_status,
                                   mld_key: mld_opdr.mld_key,
                                   stdm_arr: [mld_opdr.stdm_key], // Stdmelding
                                   close: true,
                                   act_key: -1,
                                   reado: (!(this_opdr.canFlexChange || this_opdr.canChangeARFlex)? "1" : null),
                                   prs_key: user_key, // Perslid key, wordt alleen gebruikt als geldt (!kenmerk_search && !multiMode)
                                   showConfidential: this_opdr.canViewConfidential
                                 });
      }
      var buttons =  [ {title: L("lcl_close"), icon: "fa-fclt-save", action: "mld_close()", singlepress: true, id: "btn_close_submit", importance: 1 },
                       {title: L("lcl_cancel"), icon: "fa-fclt-cancel", action: "mld_cancel()", importance: 3 } ];
      SIMPLE_BLOCK_START();
        CreateButtons(buttons);
      SIMPLE_BLOCK_END();
      IFACE.FORM_END();
%>
    </form>
    <% MODAL_END(); %>
  </body>
</html>

<% ASPPAGE_END(); %>
