<% /*
     $Revision$
     $Id$

    File:        bedrijf_list.inc
    Description: Definieert de serverside functie bedrijf_list () die een lijst van bedrijven toont die
                 voldoen aan de gegeven parameters/criteria, binnen de readautorisaties van de user.
    Parameters:  -
    Context:     -

    Note:

*/ %>
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="../Shared/getkenmerksql.inc" -->
<!-- #include file="prs.inc" -->

<%
FCLTHeader.Requires({plugins:["suggest","jQuery"],
                     js: ["jquery-ui.js"]});

function bedrijf_list (pautfunction, params)
{
  var authparams = user.checkAutorisation(pautfunction);

  // AUTORISATIES
  // Ik zoek wat zaken van de huidige gebruiker uit, die gevolgen kunnen hebben voor met name de actions
  // Autorisatie check is al gedaan in prs_perslid_search_list.asp


  // Voor resulttable de globalen zetten; zou nog anders moeten.
  var outputmode = params.outputmode; // print to 0 = screen, 1 = printer, 2 = excel, etc.
  var intern= params.intern;
  var isExtern = (intern == 0);
  var isIntern = (intern == 1);
  var isSysteem = (intern == 2);

  var showall = params.showall;
  var naam = params.naam;
  var levNr = params.levNr;
  var postcode = params.postcode;
  var contactpersoon = params.contactpersoon;
  var plaats = params.plaats;
  var locatie_key = params.locatiekey;
  var gebouw_key = params.gebouwkey;
  var dienst_key = params.dienstkey;
  var reltype_key = params.reltypekey;
  var isLeverancier = params.isLeverancier;
  var isUitvoerende = params.isUitvoerende;
  var isContractant = params.isContractant;
  var isHuurder     = params.isHuurder;
  var isNothing     = params.isNothing;
  var tooningids = params.tooningids;

  // Controleer of er diensten zijn
  var sql = "SELECT prs_dienst_key FROM prs_dienst";
  var oRs = Oracle.Execute(sql);
  var there_is_dienst = false;
  var showexploded = false; // geen diensten of locatie/gebouwen, tenzij een van deze gegeven is (ander veel te veel)
  if (!oRs.eof)
  {
    there_is_dienst=true;
    showexploded = (locatie_key || gebouw_key || dienst_key);
  }
  oRs.Close();
  var canImport = (user.checkAutorisation("WEB_IMPORT", true) != null);
%>
  <html>
    <head>
<%
      FCLTHeader.Generate({ outputmode: outputmode });
%>
    <script>
        function prsEdit(row)
        {
          $(row).addClass("dirty");
          var bedrijf_key = row.getAttribute("ROWKEY");
          url = "appl/prs/prs_bedrijf.asp?bedrijf_key=" + bedrijf_key + "&intern=<% =intern %>";
          FcltMgr.openDetail(url, L("lcl_company") + " " + bedrijf_key);  // TODO
        }

        function prsDelete(rowArray, isMulti)
        {
          FcltMgr.confirm(L("lcl_prs_del_txt_bedrijf"), { autoconfirm: isMulti }, function() {
            var prsData = JSON.parse(rowArray[0].getAttribute("ROWDATA"));
            var data = { level: "B"
                      , key: getKeyString(rowArray)
                      };
            protectRequest.dataToken(data);
            $.post( "../prs/prs_delete.asp"
                  , data
                  , FcltCallbackAndThen(reloadList)
                  , "json"
                  );
          });
        }

        function reloadList(json, textStatus)
        {
          parent.document.forms.u2.submit();
        }
    </script>
    </head>

    <body id="listbody">
<%

    // Fast check to see if we have any listable flex at all, to prevent superfluous column
    var sql = "SELECT "
            + lcl.xsql('k.prs_kenmerk_omschrijving', 'k.prs_kenmerk_key') +" prs_kenmerk_omschrijving  "
            + "     , k.prs_kenmerk_kenmerktype"
            + "  FROM prs_kenmerk k"
            + " WHERE BITAND (prs_kenmerk_inlijst, 1) = 1"
            + "   AND BITAND (prs_kenmerk_systeem, 4) = 0"  // niet als vertrouwelijk
            + "   AND k.prs_kenmerk_niveau = 'B'"
            + "   AND k.prs_kenmerk_verwijder IS NULL";
    var oRs = Oracle.Execute(sql);
    var anyflex = !oRs.eof;
    if (anyflex)
      {
          var multiflex = false;
          var bijlageflex = (oRs("prs_kenmerk_kenmerktype").Value == "M");
          var flexlabel = oRs("prs_kenmerk_omschrijving").Value;
          oRs.MoveNext();
          if (!oRs.Eof)
          {
              multiflex = true;
              flexlabel = L("lcl_flexlist");

              while (!oRs.eof)
              {
                  if (oRs("prs_kenmerk_kenmerktype").Value == "M")
                      bijlageflex = true;
                  oRs.MoveNext();
              }
          }
      }
      oRs.close();

      sql = "SELECT b.prs_bedrijf_key"
          + ",     b.prs_bedrijf_naam"
          + ",     b.prs_bedrijf_bezoek_adres"
          + ",     b.prs_bedrijf_bezoek_plaats"
          + ",     b.prs_bedrijf_contact_persoon"
          + ",     b.prs_bedrijf_naam_upper"
          + ",     b.prs_bedrijf_leverancier"
          + ",     b.prs_bedrijf_uitvoerende"
          + ",     b.prs_bedrijf_contract"
          + ",     b.prs_bedrijf_huurder"
          + ",     b.prs_bedrijf_post_adres"
          + ",     b.prs_bedrijf_post_postcode"
          + ",     b.prs_bedrijf_post_plaats"
          + ",     b.prs_bedrijf_post_land"
          + ",     b.prs_bedrijf_telefoon"
          + ",     b.prs_bedrijf_fax"
          + ",     b.prs_bedrijf_telefoon2"
          + ",     b.prs_bedrijf_email"
          + ",     b.prs_bedrijf_contact_telefoon"
          + ",     b.prs_bedrijf_contact_fax"
          + ",     b.prs_overeenkomst_nr"
          + ",     b.prs_overeenkomst_datum"
          + ",     rt.prs_relatietype_omschrijving"
          + ",     b.prs_leverancier_nr"
          + ",     (SELECT COUNT(*) FROM prs_bedrijfadres pba WHERE pba.prs_bedrijf_key = b.prs_bedrijf_key) cnttech"
          + (anyflex
              ? ", (SELECT LISTAGG("
                + (multiflex ? lcl.xsql("k.prs_kenmerk_omschrijving", "k.prs_kenmerk_key")
                      + " || ':'|| CHR(160) ||"
                    : "")
                + "            CASE"
                + "            WHEN k.prs_kenmerk_kenmerktype = 'R' OR k.prs_kenmerk_kenmerktype = 'r' OR k.prs_kenmerk_kenmerktype = 'S'"
                + "            THEN flx.getdomeinwaarde (k.fac_kenmerkdomein_key, km.prs_kenmerklink_waarde)"
                + "            WHEN k.prs_kenmerk_kenmerktype = 'N'"
                + "             AND k.prs_kenmerk_lengte = 1 "
                + "             AND k.prs_kenmerk_nmin = 0 "
                + "             AND k.prs_kenmerk_nmax = 1 "
                + "             AND (k.prs_kenmerk_dec = 0 OR k.prs_kenmerk_dec IS NULL) "
                + "            THEN DECODE (km.prs_kenmerklink_waarde, "
                + "                         0, "+safe.qL("lcl_check_0")+", "
                + "                         1, "+safe.qL("lcl_check_1")+", "
                + "                         km.prs_kenmerklink_waarde)"
                + "            ELSE km.prs_kenmerklink_waarde"
                + "            END, CHR(13)) "
                + "           WITHIN GROUP (ORDER BY prs_kenmerk_volgnr) "
                + "  FROM prs_kenmerk k, prs_kenmerklink km"
                + " WHERE km.prs_link_key = b.prs_bedrijf_key"
                + "   AND k.prs_kenmerk_key = km.prs_kenmerk_key"
                + "   AND BITAND(k.prs_kenmerk_inlijst,1) = 1"
                + "   AND BITAND(k.prs_kenmerk_systeem,4) = 0"  // niet als vertrouwelijk
                + "   AND k.prs_kenmerk_niveau='B'"
                + "   AND k.prs_kenmerk_verwijder IS NULL"
                + "   AND km.prs_kenmerklink_verwijder IS NULL) flex"
            : "");
      if (showexploded)  // is dit een probleem met de anyflex hierboven?
      {
        sql += ", " + lcl.xsqla('d.prs_dienst_omschrijving', 'd.prs_dienst_key')
             + ",     l.alg_locatie_omschrijving"
             + ",     g.alg_gebouw_naam";
      }

      sql += " FROM prs_bedrijf b, prs_relatietype rt ";

      if (showexploded)
      {
        sql += ",     prs_dienst d"
             + ",     prs_bedrijfdienstlocatie dl"
             + ",     alg_v_aanweziglocatie l"
             + ",     alg_v_aanweziggebouw g";
      }

      sql += " WHERE b.prs_bedrijf_verwijder IS NULL"
           + "   AND b.prs_relatietype_key = rt.prs_relatietype_key(+)";

      if (showexploded)
      {
        sql += "   AND dl.prs_bedrijf_key(+) = b.prs_bedrijf_key"
             + "   AND d.prs_dienst_key(+) = dl.prs_dienst_key"
             + "   AND l.alg_locatie_key(+) = dl.alg_locatie_key"
             + "   AND (   l.alg_locatie_vervaldatum IS NULL"
             + "        OR l.alg_locatie_vervaldatum > SYSDATE)"
             + "   AND g.alg_gebouw_key(+) = dl.alg_gebouw_key"
             + "   AND (   g.alg_gebouw_vervaldatum IS NULL"
             + "        OR g.alg_gebouw_vervaldatum > SYSDATE)"
      }

      if (naam)
        sql+= " AND b.prs_bedrijf_naam_upper LIKE " + safe.quoted_sql_wild("%" + naam + "%");

      if (levNr)
        sql+= " AND b.prs_leverancier_nr LIKE " + safe.quoted_sql_wild("%" + levNr + "%");

      if (contactpersoon)
        sql+= " AND UPPER(b.prs_bedrijf_contact_persoon) LIKE " + safe.quoted_sql_wild("%" + contactpersoon + "%");


      var authparamsEXTREL = user.checkAutorisation("WEB_EXTREL", true);
      var authparamsPRSMAN = user.checkAutorisation("WEB_PRSMAN", true);
      var authparamsRELMAN = user.checkAutorisation("WEB_RELMAN", true);
      var authparamsRELUSE = user.checkAutorisation("WEB_RELUSE", true);
      var authparamsBGTUSE = S("bgt_enabled") == 1 && user.checkAutorisation("WEB_BGTUSE", true);

      var asContactpersoon = authparamsEXTREL && !authparamsRELMAN && !authparamsRELUSE && !authparamsPRSMAN && !authparamsBGTUSE;
      if (asContactpersoon) // een stukje autorisatie, als ik contactpersoon ben dan moet ik het ook van dit bedrijf zijn.
        sql += "    AND b.prs_bedrijf_key IN"
            +  "           (SELECT prs_bedrijf_key"
            +  "              FROM prs_contactpersoon"
            +  "             WHERE prs_perslid_key = " + user_key
            +  "               AND prs_contactpersoon_verwijder IS NULL)"
            + (authparamsEXTREL && authparamsEXTREL.ALGreadlevel > -1
              ? " AND b.mld_adres_key_lev IN (SELECT m.mld_adres_key"
                + "                             FROM mld_v_afleveradres m"
                + "                            WHERE m.alg_locatie_key IN (SELECT alg_locatie_key"
                + "                                                          FROM fac_v_my_locations"
                + "                                                         WHERE prs_perslid_key IN (" + user_key + ")"
                + "                                                           AND niveau = " + authparamsEXTREL.ALGreadlevel + "))"
              : "")

      if (params.cps_prs_key > 0)
        sql+= " AND EXISTS (SELECT 1 FROM prs_contactpersoon pcp WHERE pcp.prs_bedrijf_key = b.prs_bedrijf_key AND pcp.prs_perslid_key = {0})".format(params.cps_prs_key);


      if (postcode)
        sql+= " AND (UPPER(b.prs_bedrijf_bezoek_postcode) LIKE " + safe.quoted_sql_wild("%" + postcode + "%")
              + "    OR UPPER(b.prs_bedrijf_post_postcode) LIKE " + safe.quoted_sql_wild("%" + postcode + "%") + ")";

      if (plaats)
        sql+= " AND (UPPER(b.prs_bedrijf_bezoek_plaats) LIKE " + safe.quoted_sql_wild("%" + plaats + "%")
              + "    OR UPPER(b.prs_bedrijf_post_plaats) LIKE " + safe.quoted_sql_wild("%" + plaats + "%") + ")";

      // Weet dat Of de locatiekey of de gebouwkey ingevuld is (of allebei niet)
      if (locatie_key && !gebouw_key)
        sql+= " AND (dl.alg_locatie_key = " + locatie_key
            + "  OR (dl.alg_locatie_key IS NULL AND dl.alg_gebouw_key IS NULL)"
            + "  OR dl.alg_gebouw_key IN (SELECT alg_gebouw_key FROM alg_gebouw WHERE alg_locatie_key = " + locatie_key + "))";

      if (gebouw_key)
        sql+= " AND (dl.alg_gebouw_key = " + gebouw_key
            + "  OR (dl.alg_gebouw_key IS NULL AND dl.alg_locatie_key IS NULL)"
            + "  OR dl.alg_locatie_key IN (SELECT alg_locatie_key FROM alg_gebouw WHERE alg_gebouw_key = " + gebouw_key + "))";

      if (dienst_key)
        sql+= " AND dl.prs_dienst_key = "+dienst_key;

      if (intern > 0)
        sql+= " AND b.prs_bedrijf_intern = " + intern;
      else
        sql+= " AND (b.prs_bedrijf_intern IS NULL)";

      if (isLeverancier || isUitvoerende || isContractant || isHuurder || isNothing)
      {
        var typeclauses = [];
        if (isLeverancier)
          typeclauses.push("b.prs_bedrijf_leverancier IS NOT NULL");
        if (isUitvoerende)
          typeclauses.push("b.prs_bedrijf_uitvoerende IS NOT NULL");
        if (isContractant)
          typeclauses.push("b.prs_bedrijf_contract IS NOT NULL");
        if (isHuurder)
          typeclauses.push("b.prs_bedrijf_huurder IS NOT NULL");
        if (isNothing)
          typeclauses.push("b.prs_bedrijf_leverancier IS NULL AND b.prs_bedrijf_uitvoerende IS NULL AND b.prs_bedrijf_contract IS NULL AND b.prs_bedrijf_huurder IS NULL");
        sql += " AND ("+ typeclauses.join(" OR ")+ ")";
      }

      if (tooningids)
      {
        sql += " AND b.prs_bedrijf_ingids = 1";
      }

      if (reltype_key)
      {
        sql += " AND b.prs_relatietype_key = " + reltype_key;
      }

      sql += getKenmerkSql("PRS", "b.prs_bedrijf_key");

      sql += " ORDER BY b.prs_bedrijf_naam_upper";
      if (showexploded)
        sql+= ", "+lcl.xsql('prs_dienst_omschrijving', 'd.prs_dienst_key')+", alg_locatie_omschrijving, alg_gebouw_naam";

      /**********************************
       * Callback functies ResultsetTable
       *********************************/
      function fnrowActionEnabler(oRs)
      {
        var data = {};
        data.eDelete = (!user.iamContact() && authparams && (authparams.ALGwritelevel < 9 || authparams.PRSwritelevel < 9));

        return data;
      }

      function fnRol (oRs)
      {
        var res = "";
        if (oRs("prs_bedrijf_leverancier").value == 1)
          res += L("lcl_prs_companies_leverancier").substring(0,1);
        if (oRs("prs_bedrijf_uitvoerende").value == 1)
          res += L("lcl_prs_companies_uitvoerende").substring(0,1);
        if (oRs("prs_bedrijf_contract").value == 1)
          res += L("lcl_prs_companies_contract").substring(0,1);
        if (oRs("prs_bedrijf_huurder").value == 1)
          res += L("lcl_prs_companies_huurder").substring(0,1);
        return res;
      }

      function fncolFlexBijlagen(oRs)
      {
        var flexval = oRs("flex").Value;
        var bijlagen_aantal = 0;
        if (bijlageflex)
        {
            var bedr_key = oRs("prs_bedrijf_key").Value;
            var bijlagen_oms = "";
            var bijlagen_lijst = [];

            var sql = "SELECT k.prs_kenmerk_key, "
                    + lcl.xsql("k.prs_kenmerk_omschrijving", "k.prs_kenmerk_key")
                    + "     , CASE"
                    + "       WHEN BITAND(k.prs_kenmerk_inlijst,1) = 1"
                      + "     THEN 1"
                      + "     ELSE 0"
                    + "       END in_overzicht_tonen"
                    + "  FROM prs_kenmerk k"
                    + " WHERE k.prs_kenmerk_niveau='B'"
                    + "   AND k.prs_kenmerk_kenmerktype = 'M'"
                    + "   AND k.prs_kenmerk_verwijder IS NULL";
            var oRs_k = Oracle.Execute(sql);

            while (!oRs_k.eof)
            {
                if (oRs_k("in_overzicht_tonen").Value == 1)
                {
                    var kenmerk_key = oRs_k("prs_kenmerk_key").Value;
                    var bijlagen_oms = oRs_k("prs_kenmerk_omschrijving").Value;
                    var bestanden = flexProps("PRS", bedr_key, kenmerk_key, "B", {getFiles: true});
                    var km_aantal = bestanden.files.length;
                    for (i=0; i<km_aantal; i++)
                    {
                        bijlagen_lijst.push(bestanden.files[i].name);
                    }
                    bijlagen_aantal += km_aantal;
                }
                oRs_k.MoveNext();
            }

            oRs_k.Close();
        }
        return (flexval ? safe.html(flexval.replace(/\r/g, "\n")+ "\n") : "")
             + ( bijlagen_aantal > 0
               ?   "<span title='" +  safe.htmlattr(bijlagen_lijst.join("\n"))  + "'>"
                 + safe.html(bijlagen_oms) + ": " + bijlagen_aantal
                 + "</span>"
               : ""
               );
      }


      var addurl = "appl/prs/prs_bedrijf.asp?x=x";
      addurl += buildTransitParam(["intern"], params);

      var buttons = []
      if (authparams.PRSwritelevel < 9 && !asContactpersoon)
            buttons.push({ icon: "fa-plus", title: L("lcl_add"), action: "FcltMgr.openDetail('" + addurl + "', '" + safe.jsstring(L("lcl_add")) + "')" });

      var rstitle = (isIntern ? L("lcl_prs_companies_title_int") : isSysteem ? L("lcl_prs_companies_title_sys") : L("lcl_prs_companies_title"));

      var rst = new ResultsetTable({ keyColumn: "prs_bedrijf_key",
                                     sql: sql,
                                     ID: "bedrijftable",
                                     flexModule: "PRS",
                                     flexId: "prs_bedrijf_key",
                                     filterParams: params,
                                     outputmode: outputmode,
                                     title: rstitle,
                                     showAll: showall,
                                     buttons: buttons,
                                     roundtripCode: (canImport ? (isIntern ? "ORGANISATIE" : "EXT_BEDRIJF") : ""),
                                     rowActionEnabler: fnrowActionEnabler
                                    });

      rst.addColumn(new Column({caption: isSysteem ? L("lcl_prs_companies_name_sys") : L("lcl_prs_companies_name"), content: "prs_bedrijf_naam" }));

      if (!isIntern && !isSysteem)
        rst.addColumn(new Column({caption: L("lcl_prs_companies_leverancier_nr"),   content: "prs_leverancier_nr"}));
      if (!isSysteem)
      {
        rst.addColumn(new Column({caption: L("lcl_prs_companies_bezoek_adres"), content: "prs_bedrijf_bezoek_adres" }));
        rst.addColumn(new Column({caption: L("lcl_prs_companies_bezoek_plaats"), content: "prs_bedrijf_bezoek_plaats" }));

          // Als ik een dienst opgeef, laat ik die niet zien, maar toon ik de plaatsen
          // waar die dienst wordt geleverd

          if (showexploded) {
            if (!dienst_key)
            {
              rst.addColumn(new Column({caption: L("lcl_prs_companies_dienst"), content: "prs_dienst_omschrijving" }));
            }
            rst.addColumn(new Column({caption: L("lcl_location"), content: "alg_locatie_omschrijving" }));
            rst.addColumn(new Column({caption: L("lcl_building"), content: "alg_gebouw_naam" }));
          }

          rst.addColumn(new Column({caption: L("lcl_prs_companies_telefoon"),         content: "prs_bedrijf_telefoon"}));

          if (outputmode != 0) // voor printer of naar Excel
          {
            rst.addColumn(new Column({caption: L("lcl_prs_companies_fax"),              content: "prs_bedrijf_fax"}));
            rst.addColumn(new Column({caption: L("lcl_prs_companies_email"),            content: "prs_bedrijf_email"}));
            rst.addColumn(new Column({caption: L("lcl_prs_companies_post_adres"),       content: "prs_bedrijf_post_adres" }));
            rst.addColumn(new Column({caption: L("lcl_prs_companies_post_postcode"),    content: "prs_bedrijf_post_postcode" }));
            rst.addColumn(new Column({caption: L("lcl_prs_companies_post_plaats"),      content: "prs_bedrijf_post_plaats" }));
            rst.addColumn(new Column({caption: L("lcl_prs_companies_post_land"),        content: "prs_bedrijf_post_land" }));
          }

          rst.addColumn(new Column({caption: L("lcl_prs_companies_contact_person"), content: "prs_bedrijf_contact_persoon" }));

          if (outputmode != 0) // voor printer of naar Excel
          {
            rst.addColumn(new Column({caption: L("lcl_prs_companies_contact_telefoon"),   content: "prs_bedrijf_contact_telefoon"}));
            rst.addColumn(new Column({caption: L("lcl_prs_companies_contact_fax"),        content: "prs_bedrijf_contact_fax"}));
            rst.addColumn(new Column({caption: L("lcl_prs_companies_overeenkomst_nr"),    content: "prs_overeenkomst_nr"}));
            rst.addColumn(new Column({caption: L("lcl_prs_companies_overeenkomst_datum"), content: "prs_overeenkomst_datum"}));
            rst.addColumn(new Column({caption: L("prs_relatietype"),                      content: "prs_relatietype_omschrijving"}));
          }

          rst.addColumn(new Column({caption: L("lcl_prs_companies_rol"), content: fnRol }));
      }

      if (user.checkAutorisation("WEB_PRSSYS", true) || user.checkAutorisation("WEB_PRSMGT", true))
        rst.addColumn(new Column({caption: L("lcl_prs_bedrijfadres_title"), content: "cnttech", datatype: "number" }));

      if (anyflex)
      {
        rst.addColumn(new Column({caption: flexlabel, content: fncolFlexBijlagen, colName: "fncolFlexBijlagen" }));
      }

      rst.addAction({action: "prsEdit", caption: L("lcl_edit"), isDefault: true } );
      rst.addAction({action: "prsDelete", caption: L("lcl_delete"), enabler: "eDelete", multi: true, multiOnce: true });

      var cnt = rst.processResultset();
%>
    </body>
  </html>
<%
}
%>
