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

    File:               res_update_room_drop.asp
    Description:        update een deel-reservering na drag en drop wijziging via planbord
    Parameters:
        rsv_ruimte_key  RES_RSV_RUIMTE to update
        res_ruimte_key  Nieuwe ruimte
        rsv_van         nieuwe begintijd in uren
        rsv_tot         nieuwe eindtijd in uren
    Context:            Modal dialoog vanuit ruimten planbord
    Note:               We zien alleen ruimte reserveringen
                        - R-reservering (met rsv_ruimte_key==>res_opstel_key)
                          Verticaal: We staan toe dat een andere ruimte (res_ruimte) gekozen wordt
                          Horizontaal: Een ander tijdstip staan we niet toe
                                       De begin en eindtijd aanpassen in het planbord kan met de resizable functionaliteit (met <-> aan eind van de balkjes slepen)
*/
%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/iface.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="res.inc" -->
<%
FCLTHeader.Requires({plugins: ["jQuery"],
                          js: []})

var rsv_ruimte_key = getQParamInt("rsv_ruimte_key");
var new_ruimte_key = getQParamInt("res_ruimte_key");
var transitParam = buildTransitParam(["rsv_ruimte_key", "res_ruimte_key", "fres_van", "frsv_tot"]);

var submitting = getQParamInt("submit", 0) == 1;

var this_res = res.func_enabled(rsv_ruimte_key); // Wat heb ik zoal aan rechten op deze specifieke reservering

res.res_set_dialect(rsv_ruimte_key);

sql = "SELECT rrr.res_rsv_ruimte_van"
    + "     , rrr.res_rsv_ruimte_tot"
    + "     , rrr.res_rsv_ruimte_volgnr"
    + "     , rrr.res_reservering_key"
    + "     , rrr.res_status_fo_key"
    + "     , rrr.res_rsv_ruimte_externnr"
    + "     , rrr.res_rsv_ruimte_externnr2"
    + "     , rr.res_ruimte_key"
    + "     , " + lcl.xsqla('rr.res_ruimte_nr', 'rr.res_ruimte_key')
    + "     , rrr.res_activiteit_key"
    + "     , rdp.res_disc_params_preposttime"
    + "     , ra.res_activiteit_ismaster"
    + "     , rr.res_ruimte_extern_id"
    + "  FROM res_rsv_ruimte rrr"
    + "     , res_ruimte_opstelling rro"
    + "     , res_ruimte rr"
    + "     , res_disc_params rdp"
    + "     , res_activiteit ra"
    + " WHERE rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key"
    + "   AND rro.res_ruimte_key = rr.res_ruimte_key"
    + "   AND rr.res_discipline_key = rdp.res_ins_discipline_key"
    + "   AND rrr.res_activiteit_key = ra.res_activiteit_key"
    + "   AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key;
var oRs = Oracle.Execute(sql);
var old_van = new Date(oRs("res_rsv_ruimte_van").value);
var old_tot = new Date(oRs("res_rsv_ruimte_tot").value);
var restxt = oRs("res_reservering_key").value + "/" + oRs("res_rsv_ruimte_volgnr").value;
var old_ruimte_key = oRs("res_ruimte_key").value;
var old_ruimte_oms = oRs("res_ruimte_nr").value;
var act_key = oRs("res_activiteit_key").value;
var prepost_time = oRs("res_disc_params_preposttime").value;
var fo_status = oRs("res_status_fo_key").value;
var old_extern_id = oRs("res_ruimte_extern_id").Value;
var rsv_ruimte_externnr = oRs("res_rsv_ruimte_externnr").Value;
var rsv_ruimte_externnr2 = oRs("res_rsv_ruimte_externnr2").Value;
var isMaster = oRs("res_activiteit_ismaster").value;
// LET OP: De begintijd van het verschoven blokje is met of zonder schoonmaaktijd. En schoonmaaktijd wordt in het planbord niet goed bepaald en is altijd 1 blokje
if (prepost_time > 0 && (fo_status == 1 || fo_status == 2))
{
  // De begintijd van het verschoven blokje (fres_van) is met schoonmaaktijd. Nu tijd van 1 blokje er bij op tellen
  var new_van = old_van.setFloatHours(parseFloat(getQParam("fres_van")) + S("res_h"), S("res_h"));
}
else
{
  // De begintijd van het verschoven blokje (fres_van) is zonder schoonmaaktijd. Geen tijd bij optellen
  var new_van = old_van.setFloatHours(parseFloat(getQParam("fres_van")), S("res_h"));
}
var hours_new_van = new_van.getHours() + new_van.getMinutes()/60 + new_van.getSeconds()/60/60
var hours_new_tot = old_tot.getHours() + old_tot.getMinutes()/60 + old_tot.getSeconds()/60/60 + (new_van.getTime() - old_van.getTime())/1000/60/60
var new_tot = (old_tot).setFloatHours(parseFloat(hours_new_tot), S("res_h"));

sql = "SELECT " + lcl.xsqla('rr.res_ruimte_nr', 'rr.res_ruimte_key')
    + "     , rdp.res_disc_params_maxduur"
    + "     , rr.res_ruimte_min_duur"
    + "     , rr.res_ruimte_begintijdblok"
    + "     , rr.res_ruimte_eindtijdblok"
    + "     , rr.res_ruimte_extern_id"
    + "  FROM res_ruimte rr"
    + "     , res_disc_params rdp"
    + " WHERE rr.res_discipline_key = rdp.res_ins_discipline_key"
    + "   AND rr.res_ruimte_key = " + new_ruimte_key;
var oRs = Oracle.Execute(sql);
var new_ruimte_oms = oRs("res_ruimte_nr").value;
var max_hours = oRs("res_disc_params_maxduur").value;
var min_duur = oRs("res_ruimte_min_duur").Value || 0;
var res_blok_van = oRs("res_ruimte_begintijdblok").Value;
var res_blok_tot = oRs("res_ruimte_eindtijdblok").Value;
var extern_id = oRs("res_ruimte_extern_id").Value;
oRs.Close();

sql = "SELECT f.fac_functie_key"
    + " FROM fac_functie f "
    + " WHERE f.fac_functie_code IN ('WEB_RESFOF', 'WEB_RESBOF')";
var oRs = Oracle.Execute(sql);
var fac_functie_key_arr = [];
while (!oRs.eof)
{
  fac_functie_key_arr.push(oRs("fac_functie_key").value);
  oRs.moveNext();
}
oRs.Close();

// Ik kan deze nieuwe ruimte reserveren als aan de volgende voorwaarden zijn voldaan:
// 1) Ik heb enige schrijfrechten voor 'WEB_RESUSE', 'WEB_RESFOF', 'WEB_RESBOF' of 'WEB_RESBAC'
// 2) De ruimte kan voor de gekozen activiteit gekozen worden
// 3) Er moet een ruimte opstelling gedefinieerd zijn voor de ruimte.
sql = "SELECT DISTINCT rr.res_ruimte_key"
    + " FROM (SELECT res_ruimte_key"
    + "         FROM res_ruimte_opstelling"
    + "       GROUP BY res_ruimte_key) opstel_bez"
    + "     , res_ruimte rr"
    + "     , fac_v_webgebruiker md"
    + " WHERE rr.res_ruimte_key = opstel_bez.res_ruimte_key"
    + "   AND rr.res_discipline_key = md.ins_discipline_key"
    + "   AND md.prs_perslid_key = " + user_key
    + "   AND md.fac_functie_key IN (" + fac_functie_key_arr.join(",") + ")"
    + "   AND md.fac_gebruiker_alg_level_write < 9"
    + "   AND md.fac_gebruiker_prs_level_write < 9"
    + "   AND rr.res_ruimte_key = " + new_ruimte_key
    + "   AND EXISTS (SELECT res_activiteit_key"
    + "                 FROM res_activiteitdiscipline rad"
    + "                WHERE rad.res_discipline_key = rr.res_discipline_key"
    + "                  AND rad.res_activiteit_key = " + act_key + ")";
    //ORDER BY rg.res_ruimte_nr
var oRs = Oracle.Execute(sql);
var can_reserve_newroom = !oRs.eof;

var badmsg = "";
if (old_ruimte_key != new_ruimte_key)
{   // Kon onbedoeld nog gebeuren als de reservering niet exact op de S("res_h") blokjes viel
    var bTimeChanged = false;
}
else
{
    var bTimeChanged = old_van.getHours() != new_van.getHours() || old_van.getMinutes() != new_van.getMinutes();
}

if (!this_res.canChange)
  badmsg = L("lcl_res_no_auth_change"); // "Geen autorisatie voor het wijzigen van de ruimte";
else if (!can_reserve_newroom)
  badmsg = L("lcl_res_select_diff_room"); // "Er moet wel een andere ruimte gekozen worden dan de huidige waarde";
else if (bTimeChanged && (hours_new_van < S("res_t1") || hours_new_tot > S("res_t2")))
  badmsg = L("lcl_res_time_out_limit"); // "De gekozen tijd valt buiten de grenzen";
else if (!bTimeChanged && old_ruimte_key == new_ruimte_key)
  badmsg = L("lcl_res_no_changes"); // "Geen aanpassingen";
else if (isMaster)
  badmsg = L("lcl_res_reado_parts"); // "U kunt bepaalde onderdelen niet zelf aanpassen"

var duration_hours = (new_tot - new_van) / 1000/60/60;
if (!badmsg)
{
  // Controle op maximale tijdsduur reservering.
  if ((max_hours > 0) && (max_hours < duration_hours))
  {
    badmsg = L("lcl_res_bad_maxperiod").format(max_hours);
  }
}
if (!badmsg)
{
    // Is voldaan aan de minimale reserveringsduur.
    if (duration_hours < min_duur)
        badmsg = L("lcl_res_room_min_duration").format(min_duur);
}
if (!badmsg)
{
  // "CV" ook altijd controleren
  var max_duration_err = res.max_duration_cv(rsv_ruimte_key, duration_hours);
  if (max_duration_err.err)
    badmsg = max_duration_err.message;
}

//user.auth_required_or_abort(this_res.canChange && can_reserve_newroom); // Je krijgt al de melding lcl_res_no_auth_change via badmsg en je mag de gegevens gewoon zien (leesrechten heb je al). Met deze regel hier krijg je een lelijke niet leesbare foutmelding in modal scherm.
%>

<html>
  <head>
<%  FCLTHeader.Generate()

    var blok_van = new Date();
    var blok_tot = new Date();
    var middag_blok = false;
    if (res_blok_van && res_blok_tot) // middag blokkade aanwezig
    {
        blok_van.setTime(new_van.midnight().getTime()+ res_blok_van*3600*1000);
        blok_tot.setTime(new_tot.midnight().getTime()+ res_blok_tot*3600*1000);
        var middag_blok = !(new_tot < blok_van || new_van > blok_tot);
    }

    if (middag_blok)
    {
        err = { friendlyMsg: L("lcl_res_mid_block") };
%>    <script>
        FcltMgr.alert("<%=safe.jsstring(err.friendlyMsg)%>");
        FcltMgr.closeDetail(window, { refresh: true });
      </script>
<%  Response.End;
    }

    if (submitting)
    {
      var opstel = getFParamInt("opstel");
      user.auth_required_or_abort(this_res.canChange && can_reserve_newroom);

      if (badmsg == "")
      {
          var fields =  [ {dbs: "res_ruimte_opstel_key", typ: "key", frm: "opstel"} ];
          if (bTimeChanged)
          { // Gewijzigde tijd ook opslaan
            fields.push( {dbs: "res_rsv_ruimte_van", typ: "datetime", val: new_van} );
            fields.push( {dbs: "res_rsv_ruimte_tot", typ: "datetime", val: new_tot} );
          }
          sql = buildUpdate("res_rsv_ruimte", fields) + " res_rsv_ruimte_key = " + rsv_ruimte_key;
          var check_fail_sql = "";
          if (S("res_fe_allow_dirty") != 1 && this_res.canChangeFEOnly || extern_id) // Ook Externe reserveringen mogen niet dirty worden
          {
            check_fail_sql = " if res.dirty_level_all(" + rsv_ruimte_key + ") <> 0 then"
                           + "    raise_application_error (-20001, "+safe.quoted_sql(L("lcl_res_fe_no_dirty"))+");"
                           + " end if;"
          }
          // Nu de echte update.
          // Daarbij ook diverse controles/ updates uitvoeren op 'andere zaken'
          sql = "BEGIN "
              + sql + ";"
              + "  res.set_ruimte_dirty (" + rsv_ruimte_key + "); " // Zelf dirty geworden?
              + "  res.set_ruimtes_clean (" + old_van.toSQL() + "); " // Anderen 'clean' geworden
              + "  res.follow_artikel (" + rsv_ruimte_key + ", " + old_van.toSQL(true) + ", " + old_tot.toSQL(true) + "); " // catering mee verplaatsen
              + "  res.follow_deel (" + rsv_ruimte_key + ", " + old_van.toSQL(true) + ", " + old_tot.toSQL(true) + "); " // objecten mee verplaatsen
              + "  res.follow_afspraak (" + rsv_ruimte_key + ", " + S("res_copy_to_bez") + "); " // bezoekers mee verplaatsen
              + check_fail_sql
              + "END;";
          var err = Oracle.Execute(sql, true);
      }
      else
        err = { friendlyMsg: badmsg }

      if (err.friendlyMsg)
      {
%>      <script>
          FcltMgr.alert("<%=safe.jsstring(err.friendlyMsg)%>");
        </script>
<%    }
      else
      {
        var tracking_text = "";
        if (bTimeChanged) {
          tracking_text = L("lcl_res_track_room_time_shifted_from")
                        + toDateTimeString(old_van) + "-" + toTimeString(old_tot)
                        + L("lcl_res_track_room_time_shifted_to")
                        + toDateTimeString(new_van) + "-" + toTimeString(new_tot);
        } else {
          tracking_text = L("lcl_res_track_room_shifted_from")
                        + old_ruimte_oms
                        + L("lcl_res_track_room_shifted_to")
                        + new_ruimte_oms;
        }
        shared.trackaction("RESUPD", rsv_ruimte_key, tracking_text);

        if ((old_extern_id != null || extern_id != null) && (S("msgraph_sync_level") & 6) && this_res.canWriteExtern) {
            var DEZE = this;
            var hook = hookfunc.gethook("utils/exchange/res_to_graph.wsc");
            var newExternal = rsv_ruimte_externnr == null && rsv_ruimte_externnr2 == null; // Nooit verzonden, wel een externe ruimte
            hook.initialize({
                DEZE: DEZE,
                custabspath: Server.MapPath(custpath)
            });
            var params = {};
            if (old_extern_id != extern_id) {
              params.old_extern_id = old_extern_id
            }
            hook.resToGraph(rsv_ruimte_key, (newExternal ? "C" : "U"), { "old_extern_id": old_extern_id });
            hook = null;
        }

        var sql = "SELECT res_rsv_ruimte_dirtlevel"
                + "  FROM res_rsv_ruimte"
                + " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
        oRs = Oracle.Execute(sql);
        var message = "";
        if (oRs("res_rsv_ruimte_dirtlevel").Value & res.dirtlevel.ruimte.notavailable)
        {
          message = L("lcl_res_dirtyroom");
        }
        else
        { // Als ruimte al dirty is hoeft deel niet meer gecontroleerd te worden.
          var sql = "SELECT MAX(res_rsv_deel_dirtlevel) deel_dirtlevel"
                  + "  FROM res_rsv_deel"
                  + " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
          oRs = Oracle.Execute(sql);
          if (oRs("deel_dirtlevel").Value & res.dirtlevel.deel.notavailable)
          {
            message = L("lcl_res_dirtyobject");
          }
        }
        if (message)
        {
%>        <script>
            FcltMgr.alert("<%=safe.jsstring(message)%>");
          </script>
<%      }
      }
%>    <script type="text/javascript">
        FcltMgr.closeDetail(window, { refresh: true });
      </script>
<%    Response.End;
    }
%>
    <script type="text/javascript">
      async function res_submit()
      {
        if (!await validateForm("u2"))
            return false;

        document.u2.submit();
      }
    </script>

  </head>
  <body class="fclt-modal" id="mod_resupdateroom">
    <% MODAL_START(); %>
    <form name="u2"
          action="res_update_room_drag.asp?submit=1<%=transitParam%>"
          target="hidFrameSubmit"
          method="post">

<%    MODAL_BLOCK_START("", L("lcl_res_frame_ruimte"), { icon: "fa-map-marker" });
      sql = "SELECT rr.res_rsv_ruimte_key"
          + "     , rr.res_rsv_ruimte_omschrijving"
          + "     , rr.res_rsv_ruimte_van"
          + "     , rr.res_rsv_ruimte_tot"
          + "     , rr.res_reservering_key"
          + "     , rr.res_rsv_ruimte_volgnr"
          + "     , rr.res_ruimte_opstel_key"
          + " FROM  res_rsv_ruimte rr"
          + " WHERE rr.res_rsv_ruimte_key = " + rsv_ruimte_key;
      var oRs = Oracle.Execute(sql);

      if (badmsg != "") { %>
            <tr><td colspan="2"><div class="warning"><%=badmsg%></div></td></tr>
<%    }

      ROFIELDTR("fldresnum", L("lcl_reservation"), oRs("res_reservering_key").Value + "/" + oRs("res_rsv_ruimte_volgnr").Value);
      ROFIELDTR("flddatechange", L("lcl_from"), toDateTimeString(oRs("res_rsv_ruimte_van").value) + (bTimeChanged? " ==> " +  toDateTimeString(new_van) : ""));
      ROFIELDTR("flddatechange", L("lcl_to"), toDateTimeString(oRs("res_rsv_ruimte_tot").value) + (bTimeChanged? " ==> " +  toDateTimeString(new_tot) : ""));
      ROFIELDTR("fldresdesc", L("lcl_descr"), oRs("res_rsv_ruimte_omschrijving").value || "-");
      ROFIELDTR("fldresroomchange", L("lcl_room"), old_ruimte_oms + (old_ruimte_key != new_ruimte_key? "\n==> " +  new_ruimte_oms : ""));
      oRs.Close();

      sql = "SELECT rro.res_ruimte_opstel_key"
          + "     , ro.res_opstelling_omschrijving"
          + "     , COALESCE (rro.res_ruimte_opstel_default, 0)"
          + "     , ro.res_opstelling_volgnr"
          + "  FROM res_ruimte_opstelling rro"
          + "     , res_opstelling ro"
          + " WHERE rro.res_opstelling_key = ro.res_opstelling_key"
          + "   AND rro.res_ruimte_key = " + new_ruimte_key
          + " ORDER BY COALESCE (rro.res_ruimte_opstel_default, 0)"
          + "     ,    res_opstelling_volgnr";
      oRs = Oracle.Execute(sql);
      ROFIELDTR("fldopstel", L("lcl_config"), oRs("res_opstelling_omschrijving").value);
%>    <input type="hidden" id="opstel" name="opstel" value="<%=oRs('res_ruimte_opstel_key').value%>"> <%
      MODAL_BLOCK_END();
IFACE.FORM_END();
%>
    </form>
    <iframe src="../Shared/empty.html"
            onload="iface.button.enable('btn_res_submit')";
            name="hidFrameSubmit"
            style="display:none"></iframe>
<%
    var buttons = [];
    if (badmsg == "")
      buttons.push({ title: L("lcl_submit"), action: "res_submit()", singlepress: true, id:"btn_res_submit", importance: 1, icon: "fa-fclt-save" });
    buttons.push({ title: L("lcl_cancel"), action: "FcltMgr.closeDetail(window, { cancel: true } )", importance: 3, icon: "fa-fclt-cancel"});
    SIMPLE_BLOCK_START();
      CreateButtons(buttons);
    SIMPLE_BLOCK_END();
%>
<script>
  $(function() {
    $("td span").each(function() {
      $(this).html($(this).html().replace('==&gt;', '<i class="fal fa-fw fa-arrow-right"></i>'));
    });
  });
</script>
<% MODAL_END(); %>
  </body>
</html><% ASPPAGE_END(); %>
