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

cnt = { setcontractstatus:
           function (cnt_key, cnt_status_key)
           {
             // Deze zet de status en doet dan bijpassende tracking en notificatie
             var sql = "BEGIN cnt.setcontractstatus(" + cnt_key + ", " + cnt_status_key + ", " + user_key + "); END;"
             Oracle.Execute(sql);
             // zou leuk zijn om true of false op te leveren naar gelang de status echt anders is geworden
           },

        trackcontractgoedkeuren:
           function (cnt_key, ptxt)
           {
               shared.trackaction("CNTFIT", cnt_key, ptxt);
           },

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

        trackcontractverwijderen:
           function (cnt_key, ptxt)
           {
               shared.trackaction("CNTDEL", cnt_key, ptxt);
           },

        getCntLocationsSql:
           function ()
           {
             // Alleen personen met rechten op de locaties van de contracten mogen goedkeuren.
             // Daarvoor hebben we de locatie van de contracten nodig.
             // LET OP: - type 4 (algemeen / generiek) zit er niet in.
             return " SELECT cp.cnt_contract_key"
                  + "      , cp.cnt_alg_plaats_key alg_locatie_key"
                  + "   FROM cnt_contract_plaats cp"
                  + "  WHERE cnt_alg_plaats_code = 'L'"
                  + " UNION ALL"
                  + " SELECT cp.cnt_contract_key"
                  + "      , g.alg_locatie_key"
                  + "   FROM cnt_contract_plaats cp, alg_gebouw g"
                  + "  WHERE cnt_alg_plaats_code = 'G'"
                  + "    AND cp.cnt_alg_plaats_key = g.alg_gebouw_key"
                  + " UNION ALL"
                  + " SELECT cp.cnt_contract_key"
                  + "      , t.alg_locatie_key"
                  + "   FROM cnt_contract_plaats cp, alg_terreinsector t"
                  + "  WHERE cnt_alg_plaats_code = 'T'"
                  + "    AND cp.cnt_alg_plaats_key = t.alg_terreinsector_key"
                  + " UNION ALL"
                  + " SELECT co.cnt_contract_key"
                  + "      , d.ins_alg_locatie_key"
                  + "   FROM cnt_contract_object co"
                  + "      , ins_deel d"
                  + "  WHERE co.cnt_ins_deel_key = d.ins_deel_key"
                  + "    AND d.ins_alg_locatie_key IS NOT NULL"
                  + " UNION ALL"
                  + " SELECT co.cnt_contract_key"
                  + "      , g.alg_locatie_key"
                  + "   FROM cnt_contract_onrgoed co"
                  + "      , alg_gebouw g"
                  + "      , alg_verdieping v"
                  + "      , alg_ruimte r"
                  + " WHERE co.alg_onrgoed_niveau = 'R'"
                  + "   AND co.alg_onrgoed_key = r.alg_ruimte_key"
                  + "   AND r.alg_verdieping_key = v.alg_verdieping_key"
                  + "   AND v.alg_gebouw_key = g.alg_gebouw_key"
                  + " UNION ALL"
                  + " SELECT co.cnt_contract_key"
                  + "      , t.alg_locatie_key"
                  + "   FROM cnt_contract_onrgoed co, alg_terreinsector t"
                  + "  WHERE co.alg_onrgoed_niveau = 'T'"
                  + "    AND co.alg_onrgoed_key = t.alg_terreinsector_key";
           },

        getCntApprovers:
           function (cnt_key)
           { //  Ontvanger(s) = eerste, tweede, derde, vierde of vijfde fiatteur(s). Deze hebben WEB_CNTGO1, WEB_CNTGO2, WEB_CNTGO3, WEB_CNTGO4 en/of WEB_CNTGO5 rechten.
             var approver_arr = [];
             // Tot welk bedrag is er al goedgekeurd.
             var sql = "SELECT cnt_contract_approved"
                     + "     , cnt_contract_kosten"
                     + "  FROM cnt_contract c"
                     + " WHERE cnt_contract_key = " + cnt_key;
             var oRs = Oracle.Execute(sql);
             var kosten = oRs("cnt_contract_kosten").Value? oRs("cnt_contract_kosten").Value : 0;
             var approved = oRs("cnt_contract_approved").Value? oRs("cnt_contract_approved").Value : -1;
             oRs.Close();

             var functie_code;
             if (kosten <= S("cnt_contract_limit1")) // Dit eerst testen i.v.m. Ter goedkeuring. Verder moet sowieso goedgekeurd worden.
               return []; // Het bedrag is lager als de eerste limiet. Het contract hoeft niet goed gekeurd te worden, dus een lege fiatteurs array teruggeven.
             else if ((S("cnt_approval_all") == 0 && approved <= S("cnt_contract_limit1")) || (S("cnt_approval_all") == 1 && kosten <= S("cnt_contract_limit2")))
               functie_code = "WEB_CNTGO1";
             else if ((S("cnt_approval_all") == 0 && approved <= S("cnt_contract_limit2")) || (S("cnt_approval_all") == 1 && kosten <= S("cnt_contract_limit3")))
               functie_code = "WEB_CNTGO2";
             else if ((S("cnt_approval_all") == 0 && approved <= S("cnt_contract_limit3")) || (S("cnt_approval_all") == 1 && kosten <= S("cnt_contract_limit4")))
               functie_code = "WEB_CNTGO3";
             else if ((S("cnt_approval_all") == 0 && approved <= S("cnt_contract_limit4")) || (S("cnt_approval_all") == 1 && kosten <= S("cnt_contract_limit5")))
               functie_code = "WEB_CNTGO4";
             else if ((S("cnt_approval_all") == 0 && approved <= S("cnt_contract_limit5")) || (S("cnt_approval_all") == 1 && kosten > S("cnt_contract_limit5")))
               functie_code = "WEB_CNTGO5";
             else return []; // Het goedgekeurde bedrag zit al boven de vijfde limiet. Geen approval meer nodig.

             // Alleen personen met rechten op de locaties van de contracten mogen goedkeuren.
             // Daarvoor hebben we de locatie van de contracten nodig.
             var sql_cntloc = cnt.getCntLocationsSql();


             // Bepaal de fiatteurs.
             // De functiekey apart bepalen is 15x sneller
             sql = "SELECT fac_functie_key FROM fac_functie WHERE fac_functie_code = " + safe.quoted_sql(functie_code);
             oRs = Oracle.Execute(sql);
             var functie_key = oRs("fac_functie_key").Value;

             // De ALGwritelevel (niveau) van de te bepalen goedkeurders weet ik niet.
             // Dat moet dus in de query zelf opgevraagd worden.
             var AlGwritelevel_GOE = "SELECT COALESCE (MIN (fac_gebruiker_alg_level_write), 9) awrite"
                                   + "  FROM fac_v_webgebruiker w"
                                   + " WHERE w.prs_perslid_key = g.prs_perslid_key"
                                   + "   AND w.fac_functie_key IN (" + functie_key + ")";

             sql = "SELECT DISTINCT g.prs_perslid_key"
                 + "  FROM fac_functie f"
                 + "     , fac_v_webgebruiker g"
                 + "     , cnt_contract c"
                 + "     , (" + sql_cntloc + ") cntloc"
                 + " WHERE g.fac_functie_key = " + functie_key
                 + "   AND g.ins_discipline_key = c.ins_discipline_key"
                 + "   AND c.cnt_contract_key = " + cnt_key
                 + "   AND c.cnt_contract_key = cntloc.cnt_contract_key(+)"
                 // Als AlGwritelevel_GOE > -1 is dan moet de contract locatie(s) binnen de locatie scope van de goedkeurders zitten.
                 + "   AND (cntloc.alg_locatie_key IN (SELECT alg_locatie_key FROM fac_v_my_locations"
                 + "                                    WHERE prs_perslid_key = g.prs_perslid_key"
                 + "                                      AND niveau = (" + AlGwritelevel_GOE + "))"
                 // Op contracten zonder locatie(s) heeft iedereen rechten.
                 + "        OR cntloc.alg_locatie_key IS NULL"
                 // Heeft een goedkeurder alle CNTGOX rechten dan hoef je niet naar locatie(s) te kijken.
                 + "        OR (" + AlGwritelevel_GOE + ") = -1)";
             oRs = Oracle.Execute(sql);
             while(!oRs.eof)
             {
               approver_arr.push(oRs("prs_perslid_key").Value); // Fiatteur.
               oRs.MoveNext();
             }
             oRs.Close();
             return approver_arr;
           },

        getcntstatustext:
           function (p)
           {
             var statustekst = "??";
             var s = parseInt(p, 10);
             switch (s) {
                 case 0: { statustekst = (S("cnt_contract_approval") == 1? L("lcl_cnt_active_approval") : L("lcl_cnt_active")); break; }
                 case 1: { statustekst = L("lcl_cnt_inactive"); break; }
                 case 2: { statustekst = L("lcl_cnt_new"); break; }
                 case 3: { statustekst = L("lcl_cnt_forapproval"); break; }
             }
             if (Session("logging")>0)
               statustekst += " (" + String(p) + ")";
             return statustekst;
           },

        // return the right sql-condition for the given phases
        getfaseconditionsql:
           function (p)
           {
              var fasesql = "";
              var addOr = " AND (";
              if (p.cntffutu)
              {
                fasesql = " AND (SYSDATE < c.cnt_contract_looptijd_van";
                addOr = " OR ";
              }
              if (p.cntfact)
              {
                fasesql += addOr + " (SYSDATE BETWEEN c.cnt_contract_looptijd_van"
                       + " AND cnt.cnt_getRappeldatum(c.cnt_contract_key))";
                addOr = " OR ";
              }
              if (p.cntfrap)
              {
                fasesql += addOr + " (SYSDATE"
                       + " BETWEEN cnt.cnt_getRappeldatum(c.cnt_contract_key)"
                       + " AND cnt.cnt_getOpzegdatum(c.cnt_contract_key))";
                addOr = " OR ";
              }
              if (p.cntfopz)
              {
                fasesql += addOr + " (SYSDATE - 1"
                       + " BETWEEN cnt.cnt_getOpzegdatum(c.cnt_contract_key) - 1"
                       +  " AND c.cnt_contract_looptijd_tot)";
                addOr = " OR ";
              }
              if (p.cntfverl)
              {
                fasesql += addOr + " SYSDATE > c.cnt_contract_looptijd_tot";
                addOr = " OR ";
              }
              if (addOr == " OR ")
              {
                fasesql += ")";
              }
              return fasesql;
           },

        findSenderForNotifications: function (cnt_key)
        {
          var sql = "SELECT MAX (cd.ins_discipline_email) email"
                  + "  FROM cnt_contract c"
                  + "     , cnt_discipline cd"
                  + " WHERE c.ins_discipline_key = cd.ins_discipline_key"
                  + "   AND c.cnt_contract_key = " + cnt_key;
          var oRs = Oracle.Execute(sql);
          var lsender = oRs("email").Value;
          oRs.Close();
          if (lsender == null)
          {
            sql = "SELECT MAX(email) email"
                + "  FROM (SELECT l.alg_locatie_email email"
                + "          FROM cnt_contract_plaats"
                + "             , alg_locatie l"
                + "         WHERE cnt_alg_plaats_key = l.alg_locatie_key"
                + "           AND cnt_alg_plaats_code = 'L'"
                + "           AND cnt_contract_plaats_verwijder IS NULL"
                + "           AND cnt_contract_key = " + cnt_key
                + "        UNION"
                + "        SELECT l.alg_locatie_email email"
                + "          FROM cnt_contract_plaats"
                + "             , alg_locatie l"
                + "             , alg_gebouw g"
                + "         WHERE cnt_alg_plaats_code = 'G'"
                + "           AND cnt_alg_plaats_key = g.alg_gebouw_key"
                + "           AND g.alg_locatie_key = l.alg_locatie_key"
                + "           AND cnt_contract_plaats_verwijder IS NULL"
                + "           AND cnt_contract_key = " + cnt_key
                + "        UNION"
                + "        SELECT l.alg_locatie_email email"
                + "          FROM cnt_contract_plaats"
                + "             , alg_locatie l"
                + "             , alg_terreinsector t"
                + "         WHERE cnt_alg_plaats_code = 'T'"
                + "           AND cnt_alg_plaats_key = t.alg_terreinsector_key"
                + "           AND t.alg_locatie_key = l.alg_locatie_key"
                + "           AND cnt_contract_plaats_verwijder IS NULL"
                + "           AND cnt_contract_key = " + cnt_key + ")";
            oRs = Oracle.Execute(sql);
            lsender = oRs("email").Value;
            oRs.Close();
          }
          return lsender;
        },


        //// Levert de "Contract ##KEY## (##LEV##/##OMSCH##) is goedgekeurd" en
        //// "Uw goedkeuring wordt verzocht voor contract ##KEY## (##LEV##/##OMSCH##)" op.
        sendNeedApprovalNotifications: function (cnt_key, approver_arr)
        {
          if (approver_arr == null || approver_arr.length == 0)
              return false;

          // These notifications are now sent on behalf of the system, what might be the local FM organisation
          var lsender = cnt.findSenderForNotifications(cnt_key);

          // notify approver by message & mail as configured in fac_srtnotificatie with CNTAPP
          // putnotificationsrtprio doet geen vertaling van ##LEV##/##OMSCH## (notify_tracking zou dat wel doen) dus doen we het hier zelf maar.
          var omssql = "SELECT fac_srtnotificatie_oms"
                     + "  FROM fac_srtnotificatie"
                     + " WHERE fac_srtnotificatie_code = 'CNTAPP'";
          var oRs = Oracle.Execute(omssql);
          var oms = oRs("fac_srtnotificatie_oms").Value;
          oRs.Close();

          for (var i = 0; i < approver_arr.length; i++)
          { // Alle fiatteurs een notificatie sturen.
            Oracle.Execute("BEGIN fac.putnotificationsrtprio(NULL, "
                            + approver_arr[i]
                            + ", 'CNTAPP', "
                            + cnt_key
                            + ", cnt.sprintf(" + safe.quoted_sql(oms) + ", " + cnt_key + "), "
                            + "  NULL, NULL, NULL, NULL, 2, "
                            + (lsender? safe.quoted_sql(lsender) : "NULL") + "); END;");
          }

          var sql = "SELECT COUNT(prs_perslid_naam_full) aantal_fiatteurs FROM prs_v_perslid_fullnames_all WHERE prs_perslid_key IN (" + approver_arr.join(",") + ")";
          var oRs = Oracle.Execute(sql);
          var aantal_fiatteurs = oRs("aantal_fiatteurs").Value;
          oRs.Close();
          return L("lcl_cnt_regapprove").format(aantal_fiatteurs);
        },

        cnt_get_afdeling:
          function _cnt_get_afdeling(afd_key) {
            sql = "SELECT " + S("prs_dep_string") + " afdeling"
                + " FROM prs_v_afdeling d"
                + " WHERE d.prs_afdeling_key = " + afd_key;
            var oRs = Oracle.Execute(sql);

            var afdeling = oRs("afdeling").Value;
            oRs.Close();

            var result = { afd_key: afd_key,
                           afdeling: afdeling };

            return result;
          },

        cnt_contract_info: // deze functie mettertijd uitbreiden
           function (cnt_key)
           {
              var sql = "SELECT cnt.cnt_contract_status(cc.cnt_contract_looptijd_van"
                        + "                           , cnt.cnt_getRappeldatum(cc.cnt_contract_key)"
                        + "                           , cnt.cnt_getOpzegdatum(cc.cnt_contract_key)"
                        + "                           , cc.cnt_contract_looptijd_tot) fase_actief"
                        + "     , cc.cnt_contract_status"
                        + "     , cc.cnt_contract_versie"
                        + "     , cc.cnt_contract_kosten"
                        + "     , cc.cnt_contract_termijnkosten"
                        + "     , cc.cnt_contract_termijntermijn"
                        + "     , (SELECT " + lcl.xsqla('cnt_termijn_omschrijving', 'cnt_termijn_key')
                          + "        FROM cnt_termijn"
                          + "       WHERE cnt_termijn_key = cc.cnt_contract_termijntermijn) termijntermijn_oms"
                        + "     , cnt.termijnjaarfactor(cc.cnt_contract_termijntermijn) termijnjaarfactor"
                        + "     , cc.cnt_contract_approved"
                        + "     , COALESCE(cc.cnt_contract_verlenging, -1) cnt_contract_verlenging"
                        + "     , cc.cnt_contract_nummer"
                        + "     , cc.cnt_contract_nummer_intern"
                        + "     , cc.cnt_contract_omschrijving"
                        + "     , cc.cnt_contract_opmerking"
                        + "     , cc.cnt_contract_document"
                        + "     , cc.cnt_contract_korting"
                        + "     , cc.cnt_contract_uurloon"
                        + "     , cc.cnt_contract_looptijd_van"
                        + "     , cc.cnt_contract_looptijd_tot"
                        + "     , cc.prs_contactpersoon_key"
                        + "     , cc.cnt_contract_verwijder"
                        + "     , cc.cnt_contract_locked_user_key"
                        + "     , cc.cnt_contract_locked_date"
                        + "     , cc.bes_bestelopdr_key"
                        + "     , cc.cnt_contract_opzegtermijn"
                        + "     , (SELECT " + lcl.xsqla('cnt_termijn_omschrijving', 'cnt_termijn_key')
                          + "        FROM cnt_termijn"
                          + "       WHERE cnt_termijn_key = cc.cnt_contract_opzegtermijn) opzegtermijn_oms"
                        + "     , cnt.cnt_getOpzegdatum(cc.cnt_contract_key) opzegdatum"
                        + "     , cc.cnt_contract_rappeltermijn"
                        + "     , (SELECT " + lcl.xsqla('cnt_termijn_omschrijving', 'cnt_termijn_key')
                          + "        FROM cnt_termijn"
                          + "       WHERE cnt_termijn_key = cc.cnt_contract_rappeltermijn) rappeltermijn_oms"
                        + "     , cnt.cnt_getRappeldatum(cc.cnt_contract_key) rappeldatum"
                        + "     , cc.cnt_prs_bedrijf_key"
                        + "     , (SELECT prs_bedrijf_naam"
                          + "        FROM prs_bedrijf"
                          + "       WHERE prs_bedrijf_key = cc.cnt_prs_bedrijf_key) bedrijf_naam"
                        + "     , cc.cnt_prs_perslid_key"
                        + "     , (SELECT prs_perslid_naam_full"
                          + "        FROM prs_v_perslid_fullnames_all pf"
                          + "       WHERE pf.prs_perslid_key = cc.cnt_prs_perslid_key) perslid_naam"
                        + "     , cc.prs_dienst_key"
                        + "     , (SELECT " + lcl.xsqla('prs_dienst_omschrijving', 'prs_dienst_key')
                          + "        FROM prs_dienst"
                          + "       WHERE prs_dienst_key = cc.prs_dienst_key) dienst_omschrijving"
                        + "     , cc.cnt_prs_afdeling_key"
                        + "     , (SELECT " + S("prs_dep_string")
                          + "        FROM prs_v_afdeling d"
                          + "       WHERE d.prs_afdeling_key = cc.cnt_prs_afdeling_key) afdeling_naam"
                        + "     , cc.prs_afdeling_key_eig"
                        + "     , (SELECT " + S("prs_dep_string")
                          +"         FROM prs_v_afdeling d"
                          + "       WHERE d.prs_afdeling_key = cc.prs_afdeling_key_eig) afdeling_naam_eig"
                        + "     , cc.prs_perslid_key_beh"
                        + "     , (SELECT prs_perslid_naam_full"
                          + "        FROM prs_v_perslid_fullnames_all pf"
                          + "       WHERE pf.prs_perslid_key = cc.prs_perslid_key_beh) perslid_naam_beh"
                        + "     , cc.prs_perslid_key_eig"
                        + "     , (SELECT prs_perslid_naam_full"
                          + "        FROM prs_v_perslid_fullnames_all pf"
                          + "       WHERE pf.prs_perslid_key = cc.prs_perslid_key_eig) perslid_naam_eig"
                        + "     , cc.ins_discipline_key"
                        + "     ," + lcl.xsqla('cs.ins_discipline_omschrijving','cs.ins_discipline_key')
                        + "     , cc.prs_kostenplaats_key"
                        + "     , (SELECT " + S("prs_kpn_string")
                          + "        FROM prs_kostenplaats k "
                          + "       WHERE k.prs_kostenplaats_key = cc.prs_kostenplaats_key) kostenplaats_naam"
                        + "     , cc.prs_kostensoort_key"
                        + "     , (SELECT prs_kostensoort_oms || '-' || " + lcl.xsqla('prs_kostensoort_opmerking', 'prs_kostensoort_key')
                          + "        FROM prs_kostensoort"
                          + "       WHERE prs_kostensoort_key = COALESCE(cc.prs_kostensoort_key, cs.prs_kostensoort_key)) kostensoort_naam"
                        + "     , dp.cnt_srtcontract_type"
                        + "     , cc.cnt_contract_mantel_key"
                        + "     , mc.cnt_contract_nummer_intern mantelcontractnummer"
                        + "     , (SELECT COUNT(*) FROM cnt_contract_plaats ccp WHERE ccp.cnt_contract_key = cc.cnt_contract_key) nnScope"
                        + "     , bdp.bes_disc_params_contract"
                        + "  FROM cnt_contract cc"
                        + "     , cnt_discipline cs"
                        + "     , cnt_disc_params dp"
                        + "     , cnt_contract mc"
                        + "     , bes_disc_params bdp"
                        + " WHERE cc.ins_discipline_key = cs.ins_discipline_key"
                        + "   AND cc.ins_discipline_key = dp.cnt_ins_discipline_key"
                        + "   AND cc.cnt_contract_mantel_key = mc.cnt_contract_key (+)"
                        + "   AND cc.ins_discipline_key = bdp.bes_disc_params_cnt_disckey(+)"
                        + "   AND cc.cnt_contract_key = " + cnt_key;
              var oRs = Oracle.Execute(sql);
              var result = { fase_actief: oRs("fase_actief").Value,
                             contract_status: oRs("cnt_contract_status").Value,
                             contract_status_str: cnt.getcntstatustext(oRs("cnt_contract_status").Value),
                             versie: oRs("cnt_contract_versie").Value,
                             kosten: oRs("cnt_contract_kosten").Value? oRs("cnt_contract_kosten").Value : 0,
                             termijnkosten: oRs("cnt_contract_termijnkosten").Value,
                             termijntermijn: oRs("cnt_contract_termijntermijn").Value,
                             termijntermijn_oms: oRs("termijntermijn_oms").Value,
                             termijnjaarfactor: oRs("termijnjaarfactor").Value,
                             approved: oRs("cnt_contract_approved").Value? oRs("cnt_contract_approved").Value : 0,
                             verlenging: oRs("cnt_contract_verlenging").Value,
                             nummer: oRs("cnt_contract_nummer").Value,
                             nummer_intern: oRs("cnt_contract_nummer_intern").Value,
                             omschrijving: oRs("cnt_contract_omschrijving").Value,
                             opmerking: oRs("cnt_contract_opmerking").Value,
                             document: oRs("cnt_contract_document").Value,
                             korting: oRs("cnt_contract_korting").Value,
                             uurloon: oRs("cnt_contract_uurloon").Value,
                             looptijd_van: new Date(oRs("cnt_contract_looptijd_van").Value),
                             looptijd_tot: new Date(oRs("cnt_contract_looptijd_tot").Value),
                             contactpersoon_key: oRs("prs_contactpersoon_key").Value,
                             verwijderdatum: oRs("cnt_contract_verwijder").Value,
                             locked_user_key: oRs("cnt_contract_locked_user_key").value,
                             locked_date: new Date(oRs("cnt_contract_locked_date").value),
                             bestelopdr_key: oRs("bes_bestelopdr_key").Value,
                             opzegtermijn: oRs("cnt_contract_opzegtermijn").Value,
                             opzegtermijn_oms: oRs("opzegtermijn_oms").Value,
                             opzegdatum: new Date(oRs("opzegdatum").Value),
                             rappeltermijn: oRs("cnt_contract_rappeltermijn").Value,
                             rappeltermijn_oms: oRs("rappeltermijn_oms").Value,
                             rappeldatum: new Date(oRs("rappeldatum").Value),
                             bedrijf_key: oRs("cnt_prs_bedrijf_key").Value,
                             bedrijf_naam: oRs("bedrijf_naam").Value,
                             perslid_key: oRs("cnt_prs_perslid_key").Value,
                             perslid_naam: oRs("perslid_naam").Value,
                             prs_dienst_key: oRs("prs_dienst_key").Value,
                             dienst_omschrijving: oRs("dienst_omschrijving").Value,
                             afdeling_key: oRs("cnt_prs_afdeling_key").Value,
                             afdeling_naam: oRs("afdeling_naam").Value,
                             afdeling_key_eig:  oRs("prs_afdeling_key_eig").Value,
                             afdeling_naam_eig: oRs("afdeling_naam_eig").Value,
                             perslid_key_beh: oRs("prs_perslid_key_beh").Value,
                             perslid_naam_beh: oRs("perslid_naam_beh").Value,
                             perslid_key_eig: oRs("prs_perslid_key_eig").Value,
                             perslid_naam_eig: oRs("perslid_naam_eig").Value,
                             discipline_key: oRs("ins_discipline_key").Value,
                             discipline_omschrijving: oRs("ins_discipline_omschrijving").Value,
                             prs_kostenplaats_key: oRs("prs_kostenplaats_key").Value,
                             kostenplaats_naam: oRs("kostenplaats_naam").Value,
                             prs_kostensoort_key: oRs("prs_kostensoort_key").Value,
                             kostensoort_naam: oRs("kostensoort_naam").Value,
                             srtcontract_type: oRs("cnt_srtcontract_type").Value,
                             mantel_key: oRs("cnt_contract_mantel_key").Value,
                             mantelcontractnummer: oRs("mantelcontractnummer").Value,
                             nnScope: oRs("nnScope").Value,
                             isAbonnement: oRs("bes_disc_params_contract").Value == 1
                           };
              oRs.Close()

              if (result.locked_user_key)
              {
                var expire = new Date;
                expire.setMinutes(expire.getMinutes() - S("mld_locked_expire"));
                if (result.locked_date < expire)
                { // In de database laten we het lock gewoon staan ter analyse achteraf welke locks niet worden vrijgegeven.
                  result.locked_user_key = null;
                  result.locked_date = null;
                }
              }

              return result;
           },

       getvervangentext:
           // Lever de string behorend bij prioriteit p
           function (p) {
              var ps = "??";
              switch (p) {
                  case -1: { ps = L("lcl_unknown"); break; }
                  case  0: { ps = L("lcl_No"); break; }
                  case  1: { ps = L("lcl_Yes"); break; }
              }
              return ps;
           },

        func_enabled_contract: // Wat mag ik zoal op dit specifiek contract?
          function _func_enabled_contract(pcnt_contract_key, cnt_info) // cnt_info mag je optioneel alvast meegeven
          {
            if (!cnt_info)
              cnt_info = cnt.cnt_contract_info(pcnt_contract_key); // Haal gegevens van het contract op.

            // Alleen personen met rechten op de locaties van de contracten mogen goedkeuren.
            // Daarvoor hebben we de locatie van de contracten nodig.
            var sql_cntloc = cnt.getCntLocationsSql();
            var sql_loc = "SELECT alg_locatie_key"
                        + "  FROM (" + sql_cntloc + ") cntloc"
                        + " WHERE cntloc.cnt_contract_key = " + pcnt_contract_key;
            var oRs_loc = Oracle.Execute(sql_loc);
            var loc_arr = [];
            while (!oRs_loc.eof)
            {
              var ors_loc_key = oRs_loc("alg_locatie_key").Value;
              if (ors_loc_key) // Geen lege waarden toevoegen!
                loc_arr.push(ors_loc_key);
              oRs_loc.MoveNext();
            }

            // Als een contract geen locaties heeft dan heb je alle rechten op dat contract.
            var cresult = user.func_enabled2("CNT",
                                                { ins_discipline_key: cnt_info.discipline_key,
                                                  loc_key: loc_arr,
                                                  prs_key: user_key, // key_eig, // TODO: Vind de juiste perslid. Je hebt prs_afdeling_key_eig
                                                  checkOptimistic: false, // checkOptimistic
                                                  isOptional: true
                                                });
            var actief = cnt_info.contract_status == 0;
            var inactief = cnt_info.contract_status == 1;
            var nieuw = cnt_info.contract_status == 2;
            var terGoedkeuring = cnt_info.contract_status == 3;
            var isVerlengbaar = (new Date(cnt_info.opzegdatum) > new Date() && (cnt_info.verlenging < 0 || (cnt_info.verlenging & 2) != 2)); // bit 2 hoog = niet verlengbaar
            cresult.cnt_info = cnt_info; // teruggeven
            cresult.mijncontract = cnt_info.perslid_key_beh == user_key || cnt_info.perslid_key_eig == user_key;

            cresult.canMANread = cresult.canRead("WEB_CNTMAN");
            cresult.canMANwrite = cresult.canWrite("WEB_CNTMAN");
            cresult.canUSEread = cresult.canRead("WEB_CNTUSE") || cresult.mijncontract;
            cresult.canUSEwrite = cresult.canWrite("WEB_CNTUSE");
            cresult.canReadAny = cresult.canUSEread || cresult.canMANread;

            cresult.canGoedkeur1 = cresult.canWrite("WEB_CNTGO1") &&                                                   // Heb ik de rechten om goed te keuren op dit niveau 1?
                                   terGoedkeuring &&                                                                   // Moet het contract gekeurd worden (juiste status)
                                   ((S("cnt_approval_all") == 0 && cnt_info.kosten >= S("cnt_contract_limit1")) ||     // Zijn de kosten hoger als de limiet
                                    (S("cnt_approval_all") == 1 && cnt_info.kosten <= S("cnt_contract_limit2"))) &&    // Zijn de kosten onder mijn limiet om volledig goed te keuren
                                   cnt_info.approved <= S("cnt_contract_limit1");                                      // Welke goedkeur? 1, 2 of 3?
            cresult.canGoedkeur2 = cresult.canWrite("WEB_CNTGO2") &&
                                   terGoedkeuring &&
                                   // Setting cnt_approval_all is
                                   // 0: Het approved bedrag is eigen bestellimiet of vorige goedkeur niveau rechten heb ik al (dan direct niveau hoger)
                                   // 1: Het approved bedrag is kleiner of gelijk aan eigen bestellimiet
                                   ((S("cnt_approval_all") == 0 && cnt_info.kosten >= S("cnt_contract_limit2") && (cnt_info.approved == S("cnt_contract_limit2") || cresult.canGoedkeur1)) ||
                                    (S("cnt_approval_all") == 1 && cnt_info.kosten <= S("cnt_contract_limit3") && cnt_info.approved <= S("cnt_contract_limit2")));
            cresult.canGoedkeur3 = cresult.canWrite("WEB_CNTGO3") &&
                                   terGoedkeuring &&
                                   ((S("cnt_approval_all") == 0 && cnt_info.kosten >= S("cnt_contract_limit3") && (cnt_info.approved == S("cnt_contract_limit3") || cresult.canGoedkeur2)) ||
                                    (S("cnt_approval_all") == 1 && cnt_info.kosten <= S("cnt_contract_limit4") && cnt_info.approved <= S("cnt_contract_limit3")));
            cresult.canGoedkeur4 = cresult.canWrite("WEB_CNTGO4") &&
                                   terGoedkeuring &&
                                   ((S("cnt_approval_all") == 0 && cnt_info.kosten >= S("cnt_contract_limit4") && (cnt_info.approved == S("cnt_contract_limit4") || cresult.canGoedkeur3)) ||
                                    (S("cnt_approval_all") == 1 && cnt_info.kosten <= S("cnt_contract_limit5") && cnt_info.approved <= S("cnt_contract_limit4")));
            cresult.canGoedkeur5 = cresult.canWrite("WEB_CNTGO5") &&
                                   terGoedkeuring &&
                                   ((S("cnt_approval_all") == 0 && cnt_info.kosten >= S("cnt_contract_limit5") && (cnt_info.approved == S("cnt_contract_limit5") || cresult.canGoedkeur4)) ||
                                    (S("cnt_approval_all") == 1 && cnt_info.kosten > S("cnt_contract_limit5") && cnt_info.approved <= S("cnt_contract_limit5"))) &&
                                   cnt_info.kosten > cnt_info.approved;
            cresult.forApproval = nieuw && cresult.canUSEwrite;
            cresult.canReject = cresult.canGoedkeur1 || cresult.canGoedkeur2 || cresult.canGoedkeur3 || cresult.canGoedkeur4 || cresult.canGoedkeur5;

            // Ik mag in principe alleen de allernieuwste versie splitten of bewerken
            var csql = "SELECT cnt.getnieuwsteversiekey(" + pcnt_contract_key + ") newkey FROM DUAL";
            var coRs = Oracle.Execute(csql);
            var newestkey = coRs("newkey").Value;
            coRs.Close();
            // Met CNTMAN rechten kan men alleen de laatste versie van een contract wijzigen.
            // Met CNTMSU rechten kan men alle versies van een contract wijzigen ook oudere versies (volgens AAEN#20694).
            // Met CNTMSU rechten kan je een contract inactiveren (sluiten)
            // Met CNTMSU (Super user) mag je dus net iets meer als met CNTMAN rechten.
            // Als het approve mechanisme actief is (S("cnt_contract_approval") == 1) dan kan ik ook met CNTUSE rechten wijzigen. Daarna volgt altijd nog het goedkeuren.
            // PAS OP!!!: CNTMSU is disciplineloos dus niet in cresult! Daardoor zijn cresult.canWrite("WEB_CNTMSU") en cresult.canRead("WEB_CNTMSU") altijd false.
            // Van een abonnement contract kan nooit een nieuwe versie worden gemaakt.

            // Met welke rechten mogen welke acties uitgevoerd worden?
            // Voor status 2 en 3 is het approval mechanisme actief en geldt AUTOMATISCH cnt_contract_approval = 1.
            // Voor de helderheid mag je met CNTMAN rechten niets in de status Nieuw(2) en Ter goedkeuring(3).
            // Cijfers 0 t/m 3 zijn statussen, Nieuwste = Alleen bij de nieuwste versie, approval = Setting cnt_contract_approval.
            //                        CNTUSE                                                   CNTMAN                                 CNTMSU
            // Splitsen:              (0, 3) + approval = 1 + nieuwste                         (0, 1) + nieuwste                      ---
            // Wijzigen alg geg:      (2, 3) + nieuwste                                        (0, 1) + nieuwste                      cnt_inactivate_mode = 0, CNTMAN + (cnt_inactivate_mode = 1)
            //          flex:         (0, 2, 3) + approval = 1 + >=100 + nieuwste              (0, 1) + nieuwste + <=100              ---
            // Wijzigen abo:          ((0 + beheerder), 2, 3) + verlengbaar                    0 + verlengbaar                        ---
            // Delete fase 0:         2, 3                                                     (0, 1)                                 cnt_inactivate_mode = 0
            //        fase 1 t/m 4:   2, 3                                                      ---                                   ---
            // Inactivate/Sluiten     CNTMSU + 0 +  cnt_inactivate_mode = 0                    CNTMSU + 0 + cnt_inactivate_mode = 1   Zie kolomen CNTUSE en CNTMAN

            var haveCNTMSUrights = user.checkAutorisation("WEB_CNTMSU", true) != null; // Pas op: disciplineloos dus niet in cresult!
            cresult.canChangeFlex = (((actief || inactief) && cresult.canMANwrite) ||
                                     ((!inactief) && S("cnt_contract_approval") == 1 && cresult.canUSEwrite)) &&
                                    (pcnt_contract_key == newestkey);
            cresult.canSplit = cresult.canChangeFlex &&
                               !cnt_info.isAbonnement &&
                               !nieuw;
            var canChangeAbonnement = cnt_info.isAbonnement &&
                                       isVerlengbaar &&
                                       ((actief && cresult.canMANwrite) ||
                                        (cresult.mijncontract && actief) ||
                                        ((nieuw || terGoedkeuring) && cresult.canUSEwrite));
            cresult.canChange = (cresult.canChangeFlex && !cnt_info.isAbonnement) ||
                                (haveCNTMSUrights && (S("cnt_inactivate_mode") == 0 || (S("cnt_inactivate_mode") == 1 && cresult.canMANwrite))) ||
                                canChangeAbonnement;
            cresult.canChangeAlg = cresult.canChange &&
                                   !(actief && cresult.canUSEwrite && !cresult.canMANwrite && !haveCNTMSUrights); // Alleen nog status Actief(0) uitsluiten bij ALLEEN CNTUSE rechten (zie overzicht hierboven).
            cresult.canChangeKosten = (cresult.canMANwrite ||
                                       ((nieuw || terGoedkeuring) && cresult.canUSEwrite)) &&
                                      !cnt_info.isAbonnement;
            if (S("cnt_scopeverdeling") == 1 && cnt_info.nnScope > 0)
                cresult.canChangeKosten = false; // Invullen doe je bij de scope verdeling
            // Inactiveren contract met WEB_CNTMAN/WEB_CNTUSE read rechten and WEB_CNTMSU rechten (cnt_inactivate_mode = 0) of met extra WEB_CNTMAN write rechten (cnt_inactivate_mode = 1)
            cresult.canInactivate = (cresult.canUSEread || cresult.canMANread) &&
                                    haveCNTMSUrights &&
                                    (S("cnt_inactivate_mode") == 0 || (S("cnt_inactivate_mode") == 1 && cresult.canMANwrite)) &&
                                    actief;
            // Ik kan verlengen als het een abonnement contract betreft, als ik de contract beheerder (cnt_info.perslid_key_beh) ben en als ik WEB_CNTUSE of WEB_CNTMAN schrijf rechten heb.
            // MGE: als ik contractbeheerder ben heb ik toch automatisch WEB_CNTUSE rechten?
            cresult.canVerlengen = canChangeAbonnement;
            cresult.canReadNotes = (cresult.canUSEread || cresult.canMANread);
            cresult.canWriteNotes = cresult.canReadNotes;

            cresult.canDelete = ((nieuw || terGoedkeuring) && cresult.canUSEwrite);
            if (cnt_info.fase_actief == 0)  // Nu - Ingangsdatum (voor Ingangsdatum)
              cresult.canDelete = cresult.canDelete ||
                                  ((actief || inactief) && cresult.canMANwrite) ||
                                  (haveCNTMSUrights && S("cnt_inactivate_mode") == 0);

            var sql = "SELECT count(*)"
                    + "  FROM fin_factuur"
                    + " WHERE fin_factuur_verwijder IS NULL"
                    + "   AND cnt_contract_key = " + pcnt_contract_key;
            var oRs = Oracle.Execute(sql);
            cresult.hasFactuur = (oRs(0).value > 0);
            oRs.Close();
            cresult.canDelete = cresult.canDelete && !cresult.hasFactuur; // Contracten met facturen mogen nooit verwijderd worden.

            return cresult;
          },

        func_enabled_cnt: // Wat mag ik zoal voor deze specifieke discipline?
          function _func_enabled_cnt(pdiscipline_key)
          {
            var cresult = user.func_enabled2("CNT",
                                             { ins_discipline_key: pdiscipline_key,
                                               alg_key: -1, // Er is nog geen contract key bekend en dus ook geen loc_key/alg_key. Anders was cnt.func_enabled_contract(cnt_key) wel aangeroepen.
                                               prs_key: user_key, // key_eig, // TODO: Vind de juiste perslid. Je hebt prs_afdeling_key_eig
                                               checkOptimistic: false, // checkOptimistic
                                               isOptional: true
                                             });

            cresult.canMANread = cresult.canRead("WEB_CNTMAN");
            cresult.canMANwrite = cresult.canWrite("WEB_CNTMAN");
            cresult.canUSEread = cresult.canRead("WEB_CNTUSE") || cresult.mijncontract;
            cresult.canUSEwrite = cresult.canWrite("WEB_CNTUSE");
            cresult.canReadAny = cresult.canUSEread || cresult.canMANread;

            return cresult;
          },


        getcntmutatiestatustext:
          function(p)
          {
            var statustekst = "??";
            switch (p) { // grofweg op volgorde timeline
                case 0: { statustekst = L("lcl_cnt_mutatie_vervallen"); break; }
                case 1: { statustekst = L("lcl_cnt_mutatie_open"); break; }
                case 2: { statustekst = L("lcl_cnt_mutatie_concept"); break; }
                case 3: { statustekst = L("lcl_cnt_mutatie_ontvangen_ok"); break; }
                case 4: { statustekst = L("lcl_cnt_mutatie_ontvangen_nok"); break; }
                case 5: { statustekst = L("lcl_cnt_mutatie_voltooid"); break; }
                case 6: { statustekst = L("lcl_cnt_mutatie_geexporteerd"); break; }
            }
            if (Session("logging") > 0)
              statustekst += " (" + String(p) + ")";
            return statustekst;
          },

          lock: function (cnt_key)
          {
            var sql = "UPDATE cnt_contract"
                    + "   SET cnt_contract_locked_user_key = " + user_key
                    + "     , cnt_contract_locked_date = SYSDATE"
                    + " WHERE cnt_contract_key = " + cnt_key;
            Oracle.Execute(sql);
          },

          unlock: function (cnt_key)
          {
            var sql = "UPDATE cnt_contract"
                    + "   SET cnt_contract_locked_user_key = NULL"
                    + "     , cnt_contract_locked_date = SYSDATE"
                    + " WHERE cnt_contract_key = " + cnt_key
                    + "   AND cnt_contract_locked_user_key = " + user_key; // Alleen als we zelf het lock hadden
            Oracle.Execute(sql);
          },

        getLocationSql:
          function(select_loc_keys, alias)
          { // De select_loc_keys parameter is een SELECT string: SELECT alg_locatie_key FROM alg_locatie xx WHERE UPPER (xx.alg_locatie_omschrijving) LIKE '%XXXXXXXXXX%'.
            sql = " cnt_contract.cnt_contract_key IN (SELECT cnt_contract_key"
                + "                                     FROM cnt_v_aanwezigcontract_plaats"
                + "                                    WHERE (cnt_alg_plaats_code = 'L'"
                + "                                           AND cnt_alg_plaats_key IN (" + select_loc_keys + "))"
                + "                                       OR ((cnt_alg_plaats_code = 'G'"
                + "                                            AND cnt_alg_plaats_key IN (SELECT alg_gebouw_key"
                + "                                                                         FROM alg_v_aanweziggebouw"
                + "                                                                        WHERE alg_locatie_key IN (" + select_loc_keys + ")))"
                + "                                        OR (cnt_alg_plaats_code = 'T'"
                + "                                            AND cnt_alg_plaats_key IN (SELECT alg_terreinsector_key"
                + "                                                                         FROM alg_v_aanwezigterreinsector"
                + "                                                                        WHERE alg_locatie_key IN (" + select_loc_keys + "))))"
                + "                                   UNION"
                + "                                   SELECT cnt_contract_key"
                + "                                     FROM cnt_v_aanwezigcontract_object co"
                + "                                        , ins_v_aanwezigdeel ad"
                + "                                    WHERE cnt_ins_deel_key = ad.ins_deel_key"
                + "                                      AND ad.ins_alg_locatie_key IN (" + select_loc_keys + ")"
                + "                                   UNION"
                + "                                   SELECT cnt_contract_key"
                + "                                     FROM cnt_v_contract_locatie_geg cl"
                + "                                    WHERE alg_locatie_key IN (" + select_loc_keys + "))";

            return sql;
          }

      }

%>
