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

     File:          wp_add.asp
     Description:   Voeg deelreserveringen voor werkplekken toe. Vermeld hierbij eventueel de personen waarvoor deze gereserveerd worden.
     Parameters:    rsv_copy_key    de oorsprinkelijke reservering
                    urole
     Note:
*/ %>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../pda/mobile.inc" -->
<!-- #include file="../pda/iface.inc" -->
<!-- #include file="../Shared/persoonselector.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="../res/res.inc" -->
<%
FCLTHeader.Requires({plugins: ["jQuery"], css: [rooturl+"/appl/res/res.css"]});

var urole = getQParamSafe("urole");
var modal = getQParamInt("modal", 0) == 1;
var qrc = getQParamInt("qrc", 0) != 0;
var isMobile = getQParamInt("ismobile", 0);
var submitting = getQParamInt("submit", 0) == 1;
var rsv_ruimte_key = getQParamInt("rsv_copy_key");
var transitParam = buildTransitParam(["urole", "modal", "rsv_copy_key"]);

var this_disc_key = -1;
var sql = "SELECT MIN(d.res_discipline_key) res_discipline_key"
        + "  FROM (SELECT rd.res_discipline_key"
        + "          FROM res_rsv_deel rsd"
        + "             , res_deel rd"
        + "         WHERE rsd.res_deel_key = rd.res_deel_key"
        + "           AND rsd.res_rsv_ruimte_key = " + rsv_ruimte_key
        + "       ) d"
        + "     , res_disc_params p"
        + "     , fac_v_webgebruiker w"
        + " WHERE d.res_discipline_key = p.res_ins_discipline_key"
        + "   AND d.res_discipline_key = w.ins_discipline_key"
        + "   AND p.res_disc_params_intervals IS NOT NULL"
        + "   AND w.prs_perslid_key = " + user_key;
var oRs = Oracle.Execute(sql);
if (!oRs.eof)
{
  this_disc_key = oRs("res_discipline_key").Value;
}
oRs.Close();

var authRES = user.func_enabled2("RES", { ins_discipline_key: this_disc_key });
user.auth_required_or_abort(authRES.canWrite("WEB_RESUSE"));

if (submitting)
{
    protectRequest.validateToken();

    var host_key = getFParamInt("colx", -1);
    var werkplek_key = getFParamInt("wplx", -1);

    if (werkplek_key > 0)
    { // Nieuwe res_rsv_ruimte_key ophalen
      var sql = "SELECT res_s_res_rsv_ruimte_key.nextval FROM DUAL";
      var oRs = Oracle.Execute(sql);
      var nextkey = oRs(0).Value;
      oRs.Close();
      // Eerst de deelreservering aanmaken...
      var sql = "INSERT INTO res_rsv_ruimte"
              + "( res_rsv_ruimte_key"
              + ", res_reservering_key"
              + ", res_rsv_ruimte_volgnr"
              + ", res_rsv_ruimte_omschrijving"
              + ", res_rsv_ruimte_opmerking"
              + ", alg_ruimte_key"
              + ", res_ruimte_opstel_key"
              + ", mld_opdr_key"
              + ", res_rsv_ruimte_van"
              + ", res_rsv_ruimte_tot"
              + ", prs_kostenplaats_key"
              + ", res_rsv_ruimte_host_key"
              + ", res_activiteit_key"
              + ", res_status_fo_key"
              + ", res_status_bo_key"
              + ", res_rsv_ruimte_kosten_klant"
              + ", res_rsv_ruimte_contact_key"
              + ", res_rsv_ruimte_cvab_mode"
              + ", res_rsv_ruimte_telefoon"
              + ", res_rsv_ruimte_extern_meeting"
              + ")"
              + " SELECT " + nextkey
              + "      , r.res_reservering_key"
              + "      , (SELECT MAX(COALESCE(a.res_rsv_ruimte_volgnr, 0)) + 1"
                      + "   FROM res_rsv_ruimte a"
                      + "  WHERE a.res_reservering_key = r.res_reservering_key"
                      + ")"
              + "      , r.res_rsv_ruimte_omschrijving"
              + "      , r.res_rsv_ruimte_opmerking"
              + "      , (SELECT ins_alg_ruimte_key"  // Ruimte van extra werkplek ophalen
                      + "   FROM res_deel r"          // (hoeft niet hetzelfde te zijn als
                      + "      , ins_deel i"          // de ruimte van oorspronkelijke werkplek).
                      + "  WHERE r.res_ins_deel_key = i.ins_deel_key"
                      + "    AND r.res_deel_key = " + werkplek_key
                      + ")"
              + "      , r.res_ruimte_opstel_key"
              + "      , r.mld_opdr_key"
              + "      , r.res_rsv_ruimte_van"
              + "      , r.res_rsv_ruimte_tot"
              + "      , r.prs_kostenplaats_key"
              + "      , " +  (host_key > 0 ? host_key : "r.res_rsv_ruimte_host_key")
              + "      , r.res_activiteit_key"
              + "      , r.res_status_fo_key"
              + "      , r.res_status_bo_key"
              + "      , r.res_rsv_ruimte_kosten_klant"
              + "      , r.res_rsv_ruimte_contact_key"
              + "      , r.res_rsv_ruimte_cvab_mode"
              + "      , r.res_rsv_ruimte_telefoon"
              + "      , r.res_rsv_ruimte_extern_meeting"
              + "   FROM res_rsv_ruimte r"
              + "  WHERE r.res_rsv_ruimte_key = " + rsv_ruimte_key;
      var err = Oracle.Execute(sql, true);
      if (err.friendlyMsg)
        abort_with_warning(err.friendlyMsg + "\n\n\n");
      // ...en dan de werkplek zelf reserveren.
      var sql_wpl = "INSERT INTO res_rsv_deel"
                  + "( res_deel_key"
                  + ", res_rsv_deel_aantal"
                  + ", res_status_bo_key"
                  + ", res_rsv_ruimte_key"
                  + ", res_rsv_deel_van"
                  + ", res_rsv_deel_tot"
                  + ") "
                  + " SELECT " + werkplek_key
                    + "      , 1"
                    + "      , res_status_bo_key"
                    + "      , " + nextkey
                    + "      , res_rsv_deel_van"
                    + "      , res_rsv_deel_tot"
                    + "  FROM res_rsv_deel"
                    + " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key;
      var err = Oracle.Execute(sql_wpl, true);
      if (err.friendlyMsg)
        abort_with_warning(err.friendlyMsg + "\n\n\n");
      //
      shared.trackaction("RESNEW", nextkey);
    }

    var sql_upd = "UPDATE res_rsv_ruimte"
                + "   SET res_rsv_ruimte_bezoekers ="
                        + " (SELECT COUNT(*)"
                        + "    FROM res_rsv_ruimte rsv_r"
                        + "       , res_rsv_deel   rsv_d"
                        + "   WHERE rsv_r.res_rsv_ruimte_key = rsv_d.res_rsv_ruimte_key"
                        + "     AND res_reservering_key = (SELECT res_reservering_key"
                                                        + "  FROM res_rsv_ruimte"
                                                        + "  WHERE res_rsv_ruimte_key = " + rsv_ruimte_key
                                                        + ")"
                        + " )"
                + " WHERE res_reservering_key ="
                        + " (SELECT res_reservering_key"
                        + "    FROM res_rsv_ruimte"
                        + "   WHERE res_rsv_ruimte_key = " + rsv_ruimte_key
                        + " )";
    var err = Oracle.Execute(sql_upd, true);
    if (err.friendlyMsg)
      abort_with_warning(err.friendlyMsg + "\n\n\n");

    submitting = 0; // Ga door naar het overzicht gekozen werkplekken om eventueel nog een extra werkplek te reserveren.
} // end submitting


// Gegevens van hoofdreservering
// De ruimte-coordinaat wordt berekend aan de hand van het zwaartepunt van de (nog) reserveerbare werkplekken.
// Indien een x- en/of y-coordinaat van een werkplek niet bekend is wordt de hele werkplek niet meegenomen in de berekening.
// Als er geen werplekken met coordinaten zijn dan heeft de ruimte ook geen coordinaten (=NULL).
// Om werkplekken te sorteren op basis van nabijheid wordt de afstand tussen de gekozen werkplek en de andere ruimten bepaald
// en binnen dezelfde ruimte de afstand tussen de reeds gekozen werkplek en de overige werkplekken.
var rrr = {};
var sql = "SELECT rsv_r.res_reservering_key"
        + "     , rsv_r.res_rsv_ruimte_volgnr"
        + "     , ar.alg_ruimte_key"
        + "     , ar.alg_verdieping_key"
        + "     , rsv_r.res_rsv_ruimte_van"
        + "     , rsv_r.res_rsv_ruimte_tot"
        + "     , disc.ins_discipline_omschrijving"
        + "     , rd.res_discipline_key"
        + "     , rd.res_deel_omschrijving"
        + "     , act.res_srtactiviteit_key"
        + "     , insd.ins_deel_DWGX"
        + "     , insd.ins_deel_DWGY"
        + "     , z.ins_ruimte_x"
        + "     , z.ins_ruimte_y"
        + "  FROM res_rsv_ruimte        rsv_r"
        + "     , res_rsv_deel          rsv_d"
        + "     , res_v_aanwezigdeel    rd"
        + "     , res_disc_params       rdp"
        + "     , alg_v_aanwezigruimte  ar"
        + "     , res_activiteit        act"
        + "     , res_deel              resd"
        + "     , ins_deel              insd"
        + "     , res_discipline        disc"
        + "     , (" + res.getRuimteXY_sql() + ") z"
        + " WHERE rsv_r.res_rsv_ruimte_key = rsv_d.res_rsv_ruimte_key"
        + "   AND rsv_r.alg_ruimte_key = ar.alg_ruimte_key"
        + "   AND rsv_d.res_deel_key = rd.res_deel_key"
        + "   AND rd.res_discipline_key = rdp.res_ins_discipline_key"
        + "   AND rsv_r.res_activiteit_key = act.res_activiteit_key"
        + "   AND rsv_d.res_deel_key = resd.res_deel_key"
        + "   AND resd.res_ins_deel_key = insd.ins_deel_key"
        + "   AND rd.res_discipline_key = disc.ins_discipline_key"
        + "   AND insd.ins_alg_ruimte_key = z.ins_alg_ruimte_key"
        + "   AND rdp.res_ins_discipline_key = z.res_discipline_key"
        + "   AND rsv_r.res_rsv_ruimte_key = " + rsv_ruimte_key;
var oRs = Oracle.Execute(sql);
if (!oRs.eof)
{
  lcl.set_dialect(oRs("res_srtactiviteit_key").Value, "RES_SRTACTIVITEIT_KEY");
  var rrr = { rsv: { reservering_key: oRs("res_reservering_key").Value
                   , reservering_volgnr: oRs("res_rsv_ruimte_volgnr").Value
                   , rsv_ruimte_key: rsv_ruimte_key
                   , disc_oms: oRs("ins_discipline_omschrijving").Value
                   , discipline_key: oRs("res_discipline_key").Value
                   , verdieping_key: oRs("alg_verdieping_key").Value
                   , ruimte_key: oRs("alg_ruimte_key").Value
                   , van: new Date(oRs("res_rsv_ruimte_van").Value)
                   , tot: new Date(oRs("res_rsv_ruimte_tot").Value)
                   , x: oRs("ins_ruimte_x").Value
                   , y: oRs("ins_ruimte_y").Value
                   }
            , wp: { deel_oms: oRs("res_deel_omschrijving").Value
                  , x: oRs("ins_deel_DWGX").Value
                  , y: oRs("ins_deel_DWGY").Value
                  }
            }
}
oRs.Close();

// Aantal werplekken nog beschikbaar.
var sql = "SELECT COUNT(*) aantal"
        + "  FROM ("+ res.getNearestWP_sql(rsv_ruimte_key, rrr) + ")";
var oRs = Oracle.Execute(sql);
var aantal_wp_beschikbaar = oRs("aantal").Value;
oRs.Close();
%>

<html>
  <head>
<% FCLTMHeader.Generate({title: L("lcl_mobile_reserveringen")}); %>
    <style>
<%  if (modal)
    { // Voorkom te groot scherm als modal popup
%>
      .ui-mobile,.ui-mobile .ui-page {min-height:100px}
<%  } %>
    </style>

    <script type='text/javascript'>
      var modal = <%=modal ? 1 : 0%>;

      async function wpl_submit()
      {
        document.activeElement.blur(); // trigger laatste onChanges

        if (!await validateForm("u2"))
            return false;

        document.forms.wp_add.submit();
      }

      function btn_ready()
      {
        if (modal == 1)
        {
          FcltMgr.closeDetail(window, { cancel: true });
        }
        else
        {
          window.location.href = "Facilitor.asp";
        }
      }
    </script>
  </head>

  <body class="resruimte" id="res_copy_wpbody">
<%

if (!submitting)
{
    // Scherm met informatie over de werkplekreservering van de gebruiker
    // en de eventuele overige werkplekken die erbij gereserveerd zijn.
    // Van hieruit kan men naar het extra werkplek toegevoegen, en komt daarna ook weer hier terug.
    PAGE_START({id: "page-1-" + rsv_ruimte_key});
      HEADER ({title: L('lcl_res_my_reservation'), back:!qrc, home: !qrc});
      CONTENT_START({ pclass: "breathe dont-break-out" });
        // Gegevens eigen reservering.
        CONTAINER_START();
          var res_nr = rrr.rsv.reservering_key + "/" + rrr.rsv.reservering_volgnr;
          if (isMobile) {
            var res_url = rooturl + "/appl/pda/reservering.asp?urole=" + urole + "&rsv_ruimte_key=" + rsv_ruimte_key;
            var result = '<a href="' + res_url + '">' + res_nr + '</a>';
          } else {
            var res_url = rooturl + "/?u=reservering&k=" + rsv_ruimte_key;
            var result = '<a href="' + res_url + '" target="_blank" rel="noopener noreferrer">' + res_nr + '</a>';
          }
%>        <label><%=L("lcl_res_number")%></label>
          <div><%=result%></div>
          <label><%=L("lcl_date")%></label>
          <div><%=toDateString(rrr.rsv.van, true)%></div>
          <label><%=L("lcl_time")%></label>
          <div><%=(toTimeString(rrr.rsv.van) + " - " + toTimeString(rrr.rsv.tot))%></div>
<%
        CONTAINER_END();

        CONTAINER_START();
          // werkplek en naam persoon van extra reservering
          Response.Write('<label>' + L("lcl_res_reserved_workplace") + '</label>');
          var sql = "SELECT (SELECT prs_perslid_naam_friendly"
                          + "  FROM prs_v_perslid_fullnames pf"
                          + " WHERE pf.prs_perslid_key = rsv_r.res_rsv_ruimte_host_key"
                          + ") host"
                  + "     , rd.res_deel_omschrijving  werkplek"
                  + "  FROM res_rsv_ruimte rsv_r"
                  + "     , res_rsv_deel   rsv_d"
                  + "     , res_deel       rd"
                  + "     , ins_deel       id"
                  + " WHERE rsv_r.res_rsv_ruimte_key = rsv_d.res_rsv_ruimte_key"
                  + "   AND rsv_d.res_deel_key = rd.res_deel_key"
                  + "   AND rd.res_ins_deel_key = id.ins_deel_key"
                  + "   AND rsv_r.res_reservering_key = (SELECT res_reservering_key"
                                                      + "  FROM res_rsv_ruimte"
                                                      + " WHERE res_rsv_ruimte_key = " + rsv_ruimte_key
                                                      + ")"
                  + " ORDER BY rsv_r.res_rsv_ruimte_volgnr";
          var oRs = Oracle.Execute(sql);
          var itsme = true;

%>        <table class="w-100"><%
          while (!oRs.eof) {
%>          <tr<%=itsme ? ' class="italic bold"' : ''%>>
              <td><%=safe.html(oRs("werkplek").Value)%></td>
              <td><%=safe.html(oRs("host").Value)%></td>
            </tr><%
            itsme = false;
            oRs.MoveNext();
          }
%>        </table><%

          oRs.CLose();
        CONTAINER_END();

        CONTROLGROUP_START({ horizontal: false });
          if (aantal_wp_beschikbaar > 0)
          {
            BUTTON( L("lcl_res_werkplek_add").format(rrr.rsv.disc_oms)
                  , { id: "uitnodiging"
                    , linkid: "#page-2-"+rsv_ruimte_key
                    , icon: "fa-plus"
                    , singlepress: true
                    });
          }
          BUTTON( L("lcl_pda_ready")
                , { click: "btn_ready()"
                  , icon: "fa-check"
                  , singlepress: true
                  });
        CONTROLGROUP_END();
      CONTENT_END();
      FOOTER();
    PAGE_END();


    // Scherm voor het selecteren van de extra werkplek en persoon waarvoor bestemd.
    PAGE_START({id: "page-2-" + rsv_ruimte_key});
      HEADER ({title: L('lcl_res_my_reservation'), back:!qrc, home: !qrc});
      CONTENT_START();
        FORM_START("wp_add", {action: "wp_add.asp?submit=1" + transitParam, method: "post"});
            var similarWP_sql = res.getNearestWP_sql(rsv_ruimte_key, rrr);
            FCLTselector( "wplx"
                        , similarWP_sql
                        , { label: L("lcl_workplace")
                          , required: true
                          , mobile: true
                          }
                        );
            var autlevel = urole == "fe" ? (("WEB_RESUSE" in authRES._funcodes) ? authRES._funcodes["WEB_RESUSE"].PRSwritelevel : 9)
                                         : (("WEB_RESFOF" in authRES._funcodes) ? authRES._funcodes["WEB_RESFOF"].PRSwritelevel : 9);
            FCLTpersoonselector( "colx"
                               , "sgPerson"
                               , { label: L("lcl_res_reserve_for")
                                 , autlevel: autlevel
                                 , mobile: true
                                 , embedded: true
                                 }
                               );

          CONTROLGROUP_START({ horizontal: false });
              BUTTON( L("lcl_submit")
                    , { click: "wpl_submit()"
                      , icon: "fa-fclt-save"
                      , singlepress: true
                      });

          CONTROLGROUP_END();
        IFACE.FORM_END();
        FORM_END();
      CONTENT_END();
      FOOTER();
    PAGE_END();
}   // end !submitting
    PDA_PAGE_END();
%>
  </body>
</html>
<% ASPPAGE_END(); %>