<% /*
     $Revision$
     $Id$
*/ %>

<%
bez =
{
    getgebouwterrein_sql:
        function (bez_afspraak_begin, bez_afspraak_eind, locatie_key)
        {
          // Wat zijn voor mij geldige terreinen?
            // JGL: Onderstaande joint alg_v_aanwezigterreinsector terwijl die ook
            //       al in  alg_v_allonrgoed_gegevens zit. Die heeft helaas
            //       t.prs_afdeling_key (nog) niet

            var sql_terr = "SELECT alg_terreinsector_key"
                         + "  FROM alg_v_aanwezigterreinsector t WHERE 1=1";
            var pafparams = user.checkAutorisation("WEB_BEZPAF", true);
            var autlevel = 9;
            if (pafparams)
            {
                autlevel = pafparams.PRSwritelevel;
            }
            if (autlevel == 9)
            {
                sql_terr += " AND t.prs_afdeling_key is null"; // efficient
            }
            else if (autlevel > 0)
            {
                sql_terr += " AND (t.prs_afdeling_key is null or t.prs_afdeling_key IN "
                          + "    (SELECT prs_afdeling_key FROM prs_v_afdeling_familie a"
                          + "      WHERE a.prs_afdeling_elder_key IN"
                          + "        (SELECT aa.prs_afdeling_elder_key"
                          + "           FROM prs_v_afdeling_familie aa"
                          + "          WHERE aa.prs_afdeling_key = " + user.prs_afdeling_key()
                          + "            AND aa.niveau = " + autlevel + ")))";
            }
            else if (autlevel == 0)
            {
                sql_terr += " AND (t.prs_afdeling_key is null or t.prs_afdeling_key IN (SELECT a.prs_afdeling_key"
                          + " FROM prs_v_afdeling a"
                          + " WHERE a.prs_bedrijf_key = " + user.afdeling().prs_bedrijf_key() + " ))";
            }

          var preposttime = "(SELECT COALESCE(rdp.res_disc_params_preposttime, 0) / 24"
                          + "  FROM res_disc_params rdp"
                          + " WHERE rdp.res_ins_discipline_key = " + S("vis_parking_key") + ")";

          return   " SELECT park.alg_type"
                 + ", park.alg_gebouw_key"
                 + ", park.gebouw_naam"
                 + ", park.alg_terreinsector_key"
                 + ", park.terreinsector_naam"
                 + ", park.alg_onroerendgoed_omschrijving"
                 + ", COUNT (park.alg_gebouw_key) aantalr"
                 + ", COUNT (park.alg_terreinsector_key) aantalt"
                 + ", COUNT (park.reserved) bezet"
                 + ", CASE park.alg_type"
                   + " WHEN 'R'"
                   + " THEN COUNT (park.alg_gebouw_key) - COUNT (park.reserved)"
                   + " ELSE COUNT (park.alg_terreinsector_key) - COUNT (park.reserved)"
                   + " END vrij"
                 + " FROM"
                   + " (SELECT org.alg_type"
                   + ", org.alg_gebouw_key"
                   + ", org.alg_gebouw_code || ' ' || org.alg_gebouw_naam gebouw_naam"
                   + ", org.alg_terreinsector_key"
                   + ", org.alg_terreinsector_code || ' ' || org.alg_terreinsector_naam terreinsector_naam"
                   + ", org.alg_onroerendgoed_omschrijving"
                   + ", (SELECT MIN (rd.res_deel_key)"
                     + " FROM res_v_aanwezigrsv_deel rd"
                     + " WHERE d.res_deel_key = rd.res_deel_key"
                     + " AND rd.res_rsv_deel_van BETWEEN TRUNC(" + bez_afspraak_begin.toSQL(true) + ")"
                       + " AND " + bez_afspraak_eind.toSQL(true) + " - 1 / 1440 + " + preposttime
                     + " AND rd.res_rsv_deel_tot BETWEEN"
                       + " " + bez_afspraak_begin.toSQL(true) + " + 1 / 1440 - " + preposttime
                       + " AND TRUNC(" + bez_afspraak_begin.toSQL(true) + ")" + " + 1"
                       + " AND rd.res_rsv_deel_van < " + bez_afspraak_eind.toSQL(true) + " - 1 / 1440 + " + preposttime
                       + " AND rd.res_rsv_deel_tot > " + bez_afspraak_begin.toSQL(true) + " + 1 / 1440 - " + preposttime
                       + " AND d.res_discipline_key = " + S("vis_parking_key") + ") reserved"
                   + " FROM res_v_aanwezigdeel d"
                   + ", ins_deel id"
                   + ", alg_v_allonrgoed_gegevens org"
                   + " WHERE d.res_ins_deel_key = id.ins_deel_key"
                   + " AND id.ins_alg_ruimte_key = org.alg_onroerendgoed_keys"
                   + (locatie_key > -1
                     ? " AND id.ins_alg_locatie_key = " + locatie_key
                     : "")
                   + " AND (org.alg_type = 'R'"
                    + "     OR (org.alg_type = 'T' AND org.alg_terreinsector_key IN (" + sql_terr + ")))"
                   // Is de parkeerplaats reserveerbaar op de begindag. Meerdaagse parkeerplaatsen worden niet ondersteund.
                   // (bits & (2^(dow-1))) = (2^(dow-1))
                   + " AND BITAND(d.res_deel_beschikbaar_bits,"
                   + "            POWER(2,"
                   + "                  (fac.getweekdaynum(TRUNC(" + bez_afspraak_begin.toSQL(true) + ")) - 1))) ="
                   + "     POWER(2, (fac.getweekdaynum(TRUNC (" + bez_afspraak_begin.toSQL(true) + ")) - 1))"
                   + " AND d.res_discipline_key = " + S("vis_parking_key") + ") park"
                 + " GROUP BY park.alg_type"
                 + ", park.alg_gebouw_key"
                 + ", park.gebouw_naam"
                 + ", park.alg_terreinsector_key"
                 + ", park.terreinsector_naam"
                 + ",  park.alg_onroerendgoed_omschrijving"
                 + " ORDER BY terreinsector_naam, gebouw_naam";
        },

    bez_prkinfo:
        function(loc_key, bez_afspraak_begin, bez_afspraak_eind)
        {
            var  gebtersql = bez.getgebouwterrein_sql(bez_afspraak_begin, bez_afspraak_eind, loc_key);
            var oRs = Oracle.Execute(gebtersql);

            var prk_bezet = 0;
            var prk_vrij = 0;
            var prk_array = [];
            while (!oRs.eof)
            {
              prk_bezet += parseInt(oRs("bezet").Value, 10);
              prk_vrij += parseInt(oRs("vrij").Value, 10);
              var alg_type = oRs("alg_type").Value;
              prk_array.push({key: (alg_type == "R"? oRs("alg_gebouw_key").Value : oRs("alg_terreinsector_key").Value),
                              naam: (alg_type == "R"? oRs("gebouw_naam").Value : oRs("terreinsector_naam").Value) + " [" + (parseInt(oRs("vrij").Value, 10) > 0? parseInt(oRs("vrij").Value, 10) + " - " + L("lcl_bez_vrij") : L("lcl_bez_vol")) + "]",
                              bezet: parseInt(oRs("bezet").Value, 10),
                              vrij: parseInt(oRs("vrij").Value, 10)
                             });
              oRs.MoveNext();
            }
            result = {prk_aantal: prk_bezet + prk_vrij,
                      prk_bezet: prk_bezet,
                      prk_vrij: prk_vrij,
                      prk_array: prk_array};

            return result;
        },

    deleteAfspraak:
        function _deleteAfspraak(pAfspr_key)
        {
          var sql = "DELETE FROM bez_afspraak"
              + " WHERE bez_afspraak_key = " + pAfspr_key;
          Oracle.Execute(sql);
        },

    // Verwijder afspraak als geen enkele bezoeker over.
    cleanAfspraak:
        function _cleanAfspraak(pAfspr_key)
        {
            var sql = "SELECT count(*)"
                    + "  FROM bez_bezoekers b"
                    + " WHERE b.bez_afspraak_key = " + pAfspr_key;
            var oRs = Oracle.Execute(sql);

            var count_bez = oRs(0).Value;

            var deleted = false;
            if (count_bez == 0)
            {
              bez.deleteAfspraak(pAfspr_key);
              deleted = true;
            }
            oRs.Close();
            return deleted
        },

    deleteBezoekers:
        function _deleteBezoekers(pBez_key, clean)
        {
          var lmessage;
          // Gooi een bezoeker weg. Als het de enige is, dan wordt de
          // afspraak ook verwijderd, anders niet
          sql = "SELECT b.bez_afspraak_key"
              + "  FROM bez_bezoekers b"
              + " WHERE b.bez_bezoekers_key = " + pBez_key;
          oRs = Oracle.Execute(sql);
          // Extra controle tbv nogmaals deleten van een zojuist gedelete
          if (!oRs.eof)
          {
              var afspr_key = oRs(0).Value;
              // delete parking place is done by database cascade constraint
              sql = "DELETE FROM bez_bezoekers"
                  + " WHERE bez_bezoekers_key = " + pBez_key;
              Oracle.Execute(sql);

              if (clean)
                var afspr_deleted = bez.cleanAfspraak(afspr_key);
          } else {
             lmessage = L("lcl_bez_already_deleted");
          }
          return lmessage;
        },

    trackafspraakupdate:
        // Let op: dit moet wellicht niet altijd (aangeroepen na save)
        function (bez_key, ptxt)
        {
            shared.trackaction("BEZUPD", bez_key, ptxt);
        },

    func_enabled_parkeerplaats: // Wat mag ik op parkeerplaatsen?
        function _func_enabled_parkeerplaats()
        {
            var authparams = user.checkAutorisation("WEB_BEZPRK", true);
            return { canWritePrk: authparams && authparams.PRSwritelevel < 9 && authparams.ALGwritelevel < 9 }
        },

    bez_afspraak_info:
        function _bez_afspraakinfo(afspr_key)
        {
            var sql = "SELECT ba.prs_perslid_key invoerder_key"
                    + "     , ba.bez_afspraak_gastheer gastheer"
                    + "     , ba.bez_afspraak_telefoonnr"
                    + "     , ba.bez_afspraak_datum"
                    + "     , ba.bez_afspraak_eind"
                    + "     , ba.bez_actie_key actie_key"
                    + "     , ba.bez_afspraak_ruimte"
                    + "     , ba.bez_afspraak_opmerking"
                    + "     , " + lcl.xsqla('x.bez_actie_omschrijving', 'x.bez_actie_key')
                    + "     , ba.alg_locatie_key locatie_key"
                    + "     , ba.alg_onrgoed_keys alg_onrg_key"
                    + "     , ba.bez_afspraak_host_key gastheer_key"
                    + "     , ba.bez_afspraak_contact_key contact_key"
                    + "     , ba.res_rsv_ruimte_key"
                    + "     , " + S("prs_pers_string") + " aanvrager"
                    + "     , rrr.res_reservering_key"
                    + "     , rrr.res_rsv_ruimte_volgnr"
                    + "     , rrr.res_rsv_ruimte_omschrijving"
                    + "     , rr.res_ruimte_extern_id"
                    + "  FROM bez_afspraak ba"
                    + "     , prs_perslid p"
                    + "     , bez_actie x"
                    + "     , res_rsv_ruimte rrr"
                    + "     , res_ruimte_opstelling ro"
                    + "     , res_ruimte rr"
                    + " WHERE ba.bez_afspraak_contact_key = p.prs_perslid_key"
                    + "   AND ba.bez_actie_key = x.bez_actie_key(+)"
                    + "   AND ba.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key(+)"
                    + "   AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key(+)"
                    + "   AND ro.res_ruimte_key = rr.res_ruimte_key(+)"
                    + "   AND ba.bez_afspraak_key = " + afspr_key;
            var oRs = Oracle.Execute(sql);
            if (oRs.Eof)
             shared.record_not_found("<!--" + afspr_key + "-->");

            var result = { invoerder_key: oRs("invoerder_key").Value,
                           gastheer: oRs("gastheer").Value,
                           contact_key: oRs("contact_key").Value,
                           aanvrager: oRs("aanvrager").Value,
                           telf_nr: oRs("bez_afspraak_telefoonnr").Value,
                           bez_afspraak_datum: new Date(oRs("bez_afspraak_datum").Value),
                           bez_afspraak_eind: new Date(oRs("bez_afspraak_eind").Value),
                           actie_key: oRs("actie_key").Value,
                           ruimte: oRs("bez_afspraak_ruimte").Value,
                           opm: oRs("bez_afspraak_opmerking").Value,
                           actie_omschrijving: oRs("bez_actie_omschrijving").Value,
                           locatie_key: oRs("locatie_key").Value,
                           alg_onrg_key: oRs("alg_onrg_key").Value,
                           res_rsv_ruimte_key: oRs("res_rsv_ruimte_key").Value,
                           gastheer_key: oRs("gastheer_key").Value,
                           res_reservering_key: oRs("res_reservering_key").Value,
                           res_rsv_ruimte_volgnr: oRs("res_rsv_ruimte_volgnr").Value,
                           res_rsv_ruimte_omschrijving: oRs("res_rsv_ruimte_omschrijving").Value,
                           res_ruimte_extern: oRs("res_ruimte_extern_id").Value != null
                          };
            oRs.Close();

            if (S("vis_afspraak_onrgoed_uses_keys") == 1)
            {
              var sql = "SELECT aor.alg_gebouw_key"
                      + "     , aor.alg_verdieping_key"
                      + "     , aor.alg_ruimte_key"
                      + "     , aor.alg_type"
                      + "     , alg_gebouw_beginuur"
                      + "     , alg_gebouw_einduur"
                      + "  FROM alg_v_allonroerendgoed aor"
                      + "     , alg_gebouw g"
                      + " WHERE aor.alg_gebouw_key = g.alg_gebouw_key"
                      + "   AND aor.alg_onroerendgoed_keys = " + result.alg_onrg_key
                      + "   AND aor.alg_locatie_key = " + result.locatie_key;

              var oRs = Oracle.Execute(sql);

              if (!oRs.eof)
              {
                result.gebouw_key = oRs("alg_gebouw_key").Value;
                result.verdieping_key = oRs("alg_verdieping_key").Value;
                result.ruimte_key = oRs("alg_ruimte_key").Value;
                result.onrg_type = oRs("alg_type").Value;
                result.gebouw_beginuur = oRs("alg_gebouw_beginuur").Value || -1;
                result.gebouw_einduur = oRs("alg_gebouw_einduur").Value || -1;
              }
              else
              {
                result.gebouw_key = -1;
                result.verdieping_key = -1;
                result.ruimte_key = -1;
                result.onrg_type = "L";
                result.gebouw_beginuur = -1;
                result.gebouw_einduur = -1;
              }
              oRs.Close();
            }
            return result;
        },

    func_enabled_afspraak: // Wat mag ik zoal op deze specifieke afspraak?
        function _func_enabled_afspraak(afspr_key)
        {   // initialisatie voor als afspr_key = -1
            var host_key = user_key;
            var contact_key = user_key;
            var alg_key = -1;
            var rsv_ruimte_key = -1;
            var aantaldone = 0;
            var aantalnotout = 0;

            if (afspr_key > 0)
            {
                var sql = "SELECT a.bez_afspraak_host_key"
                        + "     , a.bez_afspraak_contact_key"
                        + "     , a.alg_onrgoed_keys"
                        + "     , a.prs_perslid_key"
                        + "     , a.res_rsv_ruimte_key"
                        + "     , SUM (CASE WHEN b.bez_bezoekers_done IS NOT NULL THEN 1 ELSE 0 END) aantaldone"
                        + "     , SUM (CASE WHEN b.bez_bezoekers_out IS NULL THEN 1 ELSE 0 END) aantalnotout"
                        + "  FROM bez_afspraak a"
                        + "     , bez_bezoekers b"
                        + " WHERE a.bez_afspraak_key = b.bez_afspraak_key(+)" // vanuit PDA hebben we eventjes een afspraak
                        + "   AND a.bez_afspraak_key = " + afspr_key          // zonder bezoekers-->outer join
                        + " GROUP BY a.bez_afspraak_host_key"
                        + "        , a.bez_afspraak_contact_key"
                        + "        , a.alg_onrgoed_keys"
                        + "        , a.prs_perslid_key"
                        + "        , a.res_rsv_ruimte_key";
                var oRs = Oracle.Execute(sql);
                if (oRs.eof)
                    shared.record_not_found("<!--" + afspr_key + "-->");

                host_key = oRs("bez_afspraak_host_key").Value;
                contact_key = oRs("bez_afspraak_contact_key").Value;
                alg_key = oRs("alg_onrgoed_keys").Value;
                rsv_ruimte_key = oRs("res_rsv_ruimte_key").Value;
                aantaldone = oRs("aantaldone").Value;
                aantalnotout = oRs("aantalnotout").Value;
                oRs.Close();
            }
            var bresult = user.func_enabled("BEZ",
                                            -1, // discipline key
                                            alg_key,
                                            contact_key,
                                            false, // pessimist
                                            false); // isOptional

            // Kan ik afspraken zien en maken
            bresult.canWritePrk = bresult.canWrite("WEB_BEZPRK");
            bresult.canWritePaf = bresult.canWrite("WEB_BEZPAF");
            // Als alle bezoekers zijn uitgecheckt, dan mag de afspraak niet meer gewijzigd worden.
            bresult.canChange   = (bresult.canWrite("WEB_BEZFOF") || bresult.canWrite("WEB_BEZBOF") || bresult.canWrite("WEB_BEZUSE")) && aantalnotout > 0;
            // Als er bezoekers zijn binnen geboekt, dan mag de afspraak niet meer verwijderd worden.
            bresult.canDelete   = (bresult.canWrite("WEB_BEZFOF") || bresult.canWrite("WEB_BEZBOF") || bresult.canWrite("WEB_BEZUSE")) && aantaldone == 0;

            // Als er parkeerplaatsen aanzitten die PAF nodig hebben gelden soms andere regels
            sql = "SELECT count(*) aantal"
                + "  FROM bez_bezoekers b"
                + "     , res_rsv_deel rrd"
                + "     , res_deel rd"
                + "     , ins_deel id"
                + "     , alg_v_aanwezigterreinsector t"
                + " WHERE b.bez_bezoekers_key = rrd.bez_bezoekers_key"
                + "   AND rrd.res_deel_key = rd.res_deel_key"
                + "   AND rd.res_ins_deel_key = id.ins_deel_key"
                + "   AND id.ins_alg_ruimte_key = t.alg_terreinsector_key"
                + "   AND id.ins_alg_ruimte_type = 'T'"
                + "   AND t.prs_afdeling_key IS NOT NULL"
                + "   AND bez_afspraak_key = " + afspr_key
            var oRs = Oracle.Execute(sql);
            bresult.nrPAF = oRs("aantal").Value;
            oRs.Close();
            // Beetje grof: als de FO voor jou PAF parkeerplaatsen heeft geregeld terwijl
            //              je zelf geen PAF rechten hebt laten we je meer niet wijzigen.
            //              Ander zou je indirect de parkeerplaats langer kunnen claimen.
            if (!bresult.canWritePaf && bresult.nrPAF > 0)
              bresult.canChange = false;

            // Bij extern ingevoerde reserveringen mogen we de bezoekers niet veranderen.
            if (rsv_ruimte_key > 0)
            {
             var res_ruimte_extern_id = null;
             sql = "SELECT rr.res_ruimte_extern_id"
                 + "  FROM res_rsv_ruimte rrr"
                 + "     , res_ruimte_opstelling ro"
                 + "     , res_ruimte rr"
                 + " WHERE rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key"
                 + "   AND ro.res_ruimte_key = rr.res_ruimte_key"
                 + "   AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key;
              var oRs = Oracle.Execute(sql);
              var res_ruimte_extern_id = !oRs.Eof && oRs("res_ruimte_extern_id").Value;
              oRs.Close();
              bresult.canChange = !res_ruimte_extern_id; // Als extern dan niet te wijzigen.
            }

            bresult.canWriteAny  = bresult.canWrite("WEB_BEZFOF")  || bresult.canWrite("WEB_BEZBOF")  || bresult.canWrite("WEB_BEZUSE");
            bresult.canWriteFOF  = bresult.canWrite("WEB_BEZFOF");
            bresult.canWriteBOF  = bresult.canWrite("WEB_BEZBOF");

            bresult.canReadAny  = bresult.canRead("WEB_BEZFOF")  || bresult.canRead("WEB_BEZBOF")  || bresult.canRead("WEB_BEZUSE");
            bresult.canReadFOF  = bresult.canRead("WEB_BEZFOF");
            bresult.canReadBOF  = bresult.canRead("WEB_BEZBOF");

            bresult.canBadge = bresult.canRead("WEB_BEZBOF");
            bresult.canCheckInOut = bresult.canWrite("WEB_BEZBOF");
            bresult.canContact = bresult.canWrite("WEB_BEZBOF") || bresult.canWrite("WEB_BEZUSE");

            bresult.canReadFEOnly = false;
            if (    bresult.canReadAny
                && !bresult.canRead("WEB_BEZFOF")
                && !bresult.canRead("WEB_BEZBOF")
               )
            {
              bresult.canReadFEOnly = true;
              if (   contact_key != user_key
                  && host_key != user_key
                  && !user.isCollega(contact_key)
                  && !user.isCollega(host_key)
                 )
              {
                bresult.canReadAny = false;
              }
            }
            bresult.canChange &= bresult.canReadAny; // Dat is toch wel het minste

            return bresult;
        },
    default_actie: function ()
    {
      var actie_key = -1;
      // Is er een default actie.
      var sql = "SELECT bez_actie_key"
              + "  FROM bez_actie"
              + " WHERE bez_actie_verwijder IS NULL"
              + "   AND bez_actie_default = 1";
      var oRs = Oracle.Execute(sql);
      if (!oRs.eof)
        actie_key = oRs("bez_actie_key").Value;
      oRs.Close()
      return actie_key;
    }

}
%>