<% /*
     $Revision$
     $Id$

    File:        opdr_uren_list.inc
    Description: Definieert de serverside functie opdr_uren_list() die een lijst van urenbesteding
                 in weken toont die voldoen aan de gegeven parameters/criteria.
                 Zoals altijd wordt hierbij wel autorisatie betrokken,
    Parameters:  -
    Context:     -
    Note:        -
*/ %>

<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->

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

function opdr_uren_list (pautfunction, params)
{

  // De functie checkAutorisation(autfunction) geeft een Response.End indien er geen autorisatie voor autfunction wordt gevonden
  var authparams = user.checkAutorisation(pautfunction);

  // AUTORISATIES

  var urole = params.urole;

  // Voor resulttable de globalen zetten; zou ng anders moeten.
  var outputmode = params.outputmode; // print to 0 = screen, 1 = printer, 2 = excel, etc.
  var print = (outputmode == 1 || outputmode == 5);
  var excel = (outputmode == 2 || outputmode == 6);
  var showall = params.showall;
  var handler_key = params.handler_key;

%>
  <html>
    <head>
<%
      FCLTHeader.Generate({ outputmode: params.outputmode });
%>
<script>
    function opdr_uren_edit(row)
    {
      $(row).addClass('dirty');
      var opdrData = eval("(" + row.getAttribute("ROWDATA") + ")");
      var url = "appl/mld/opdr_edit_uren.asp?urole=<%=urole%>"
              + (opdrData.prs_key ? "&prs_key="+opdrData.prs_key : "")
              + "&datefrom=" + opdrData.datefrom;

      FcltMgr.openDetail(url, L("lcl_mld_ord_weeklijst") + opdrData.week);
    }

    function opdr_uren_goed(rowArray, isMulti)
    {
      var prsKeyString = getKeyString(rowArray);
      var datumString = "";
      for (var i = 0; i < rowArray.length; i++)
      {
        var opdrData = eval("(" + rowArray[i].getAttribute("ROWDATA") + ")");
        datumString += ((datumString == "") ? "" : ",") + opdrData.datefrom;
      }

      FcltMgr.confirm(L("lcl_mlduren_approve"), { autoconfirm: isMulti }, function() {
          var data = {
              prs_key: prsKeyString,
              datum: datumString,
              done: 3
          };
          <% protectRequest.dataToken("data"); %>
          $.post("opdr_edit_uren_save.asp?urole=<%=urole%>&done=3",
              data,
              FcltCallbackAndThen(function() {
                  parent.doSubmit();
              }),
              "json");
      });
    }
</script>
    </head>

    <body id="listbody">
<%
    var datefrom = new Date(params.dateto);
    datefrom.setDate(datefrom.getDate()-S("mld_uren_weeks_back")*7+1); // tot S("mld_uren_weeks_back") weken daarvoor

    // Queries vaak apart gedefinieerd omdat anders de outer-join syntax niet werd geaccepteerd

    // Alle (recente) mogelijke weken
    var weekSQL = "SELECT TO_CHAR ("+datefrom.toSQL()+" - 1 + 7*LEVEL, 'IYYY-IW') week,"
                + "       TRUNC ("+datefrom.toSQL()+" - 1 + 7*LEVEL, 'IW') startdatum"
                + "  FROM  DUAL"
                + " WHERE ("+datefrom.toSQL()+" - 1 + 7*LEVEL) <=" + params.dateto.toSQL()
                + " CONNECT BY LEVEL <= 13*7";

    // Alle mogelijke uitvoerenden (mensen die MLDORD schrijfrechten hebben)
    // waarbij ikzelf MLD_UURxxx leesrechten heb op dezelfde discipline

    // Normaal gesproken doen we niet zo aan losse keys ophalen maar bij UWVA ging de query
    // van meer dan 60 seconde (onwerkbaar) naar minder dan 1 seconde. De moeite waard.
    var oRs = Oracle.Execute("SELECT fac_functie_key FROM fac_functie WHERE fac_functie_code = 'WEB_MLDORD'");
    var mldord_key = oRs("fac_functie_key").Value;

    var uitvSQL = "SELECT DISTINCT f.prs_perslid_key"
                + "  FROM fac_v_webgebruiker f,"      // persoon met urenbriefje
                + "       fac_v_webgebruiker fzelf"  // ikzelf
                + " WHERE f.fac_functie_key = " + mldord_key
                + "   AND f.fac_gebruiker_prs_level_read <9"
                + "   AND f.fac_gebruiker_alg_level_read <9"
                + "   AND fzelf.fac_functie_key = " + authparams.autfunctionkey
                + "   AND fzelf.fac_gebruiker_prs_level_read <9"
                + "   AND fzelf.fac_gebruiker_alg_level_read <9"
                + "   AND fzelf.prs_perslid_key = " + user_key;

    if (urole=="fe")
        uitvSQL += "  AND f.prs_perslid_key = " + user_key;
    else
    {
        uitvSQL += "  AND f.ins_discipline_key = fzelf.ins_discipline_key"; // UURFOF en UURBOF hebben nauwkeurig minlevel
        if (handler_key)
            uitvSQL += "  AND f.prs_perslid_key = " + handler_key;
        if (params.disc_key > 0)
            uitvSQL += "  AND f.ins_discipline_key = " + params.disc_key;
    }

     // Alle uitvoerenden maal alle recente weken
    var uitvweekSQL
                = "SELECT weeknummers.week,"
                + "       weeknummers.startdatum,"
                + "       uitv.prs_perslid_key,"
                + "       (SELECT prs_perslid_naam_full"
                + "          FROM prs_v_perslid_fullnames_all pf"
                + "         WHERE pf.prs_perslid_key = uitv.prs_perslid_key) naam"
                + "  FROM ("+uitvSQL+") uitv, "
                + "       ("+weekSQL+") weeknummers"
                + " ORDER BY weeknummers.startdatum DESC";

    // Alle mogelijke opdrachten met begin/einddatum
    var opdrSQL = "SELECT mld_opdr_key,"
                + "       mo.mld_opdr_datumbegin,"
                + "       TRUNC(mo.mld_opdr_einddatum) mld_opdr_einddatum,"
                + "       mld_opdr_uren,"
                + "       mo.mld_uitvoerende_keys"
                + "  FROM mld_opdr mo, "
                + "       mld_typeopdr mto"
                + " WHERE mo.mld_typeopdr_key = mto.mld_typeopdr_key"
                + "   AND mo.mld_statusopdr_key IN (4, 5, 6, 7, 8, 9)" // minstens gefiatteerd
                + "   AND mto.mld_typeopdr_matchtype = 3"; // uren per week

    // Alle uitvoerenden maal alle recente weken met uren die ze hadden moeten boeken
    var uitvweekopdrSQL
                = "SELECT uitv.week,"
                + "       uitv.startdatum,"
                + "       uitv.prs_perslid_key,"
                + "       uitv.naam,"
                + "       SUM(mld_opdr_uren) planuren"
                + "  FROM ("+uitvweekSQL+") uitv "
                + "  LEFT OUTER JOIN ("+opdrSQL+") opdrachten"
                + "          ON (opdrachten.mld_opdr_datumbegin+0) <= startdatum+6" // AAIT#24062 de +0 voorkomt dat hij index mld_i_mld_opdr11 pakt. Killing voor performance
                + "         AND opdrachten.mld_opdr_einddatum >= startdatum"
                + "         AND COALESCE(fac.gettrackingdate('ORDAFM', mld_opdr_key), startdatum) >= startdatum" // hij was *toen* nog niet afgemeld
                + "         AND opdrachten.mld_uitvoerende_keys = prs_perslid_key"
                + " GROUP BY uitv.week, uitv.startdatum, uitv.prs_perslid_key, naam"
                + " ORDER BY uitv.startdatum DESC";

    // Ingevulde uren gesommeerd per opdracht per persoon per week, productief en improductief
    var weekurenSQL
                = "SELECT TO_CHAR (u.mld_opdr_uren_datum, 'IYYY-IW') week,"
                + "       u.mld_opdr_key, "
                + "       u.prs_perslid_key, "
                + "       SUM(u.mld_opdr_uren_besteed) opdr_uren_besteed,"
                + "       0 opdr_uren_improductief,"
                + "       MIN(u.mld_opdr_uren_status)  min_status,"
                + "       MAX(u.mld_opdr_uren_status)  max_status"
                + "  FROM mld_opdr_uren u"
                + " WHERE u.mld_opdr_key IS NOT NULL"
                + " GROUP BY u.mld_opdr_key, u.prs_perslid_key, TO_CHAR (u.mld_opdr_uren_datum, 'IYYY-IW')"
                + " UNION ALL"
                + " SELECT TO_CHAR (u.mld_opdr_uren_datum, 'IYYY-IW') week,"
                + "       u.mld_opdr_key, "
                + "       u.prs_perslid_key, "
                + "       0 opdr_uren_besteed,"
                + "       SUM(u.mld_opdr_uren_besteed) opdr_uren_improductief,"
                + "       MIN(u.mld_opdr_uren_status)  min_status,"
                + "       MAX(u.mld_opdr_uren_status)  max_status"
                + "  FROM mld_opdr_uren u"
                + " WHERE u.mld_opdr_key IS NULL"
                + " GROUP BY u.mld_opdr_key, u.prs_perslid_key, TO_CHAR (u.mld_opdr_uren_datum, 'IYYY-IW')";

    // Matchen tegen de opdracht uren
    // mld_typeopdr_matchtype = 3 hoeft hier niet meer: als er uren geboekt zijn tonen we ze altijd
    var opdrurenSQL
                = "SELECT week,"
                + "       u.mld_opdr_key,"
                + "       u.prs_perslid_key,"
                + "       opdr_uren_besteed,"
                + "       opdr_uren_improductief,"
                + "       opdr_uren_besteed+opdr_uren_improductief opdr_uren_totaal,"
                + "       min_status,"
                + "       max_status,"
                + "       (case when opdr_uren_besteed = mld_opdr_uren "
                + "              and u.prs_perslid_key = mo.mld_uitvoerende_keys"
                + "             THEN 1 ELSE 0 END) perfectmatch"
                + "  FROM (" + weekurenSQL + ") u, mld_opdr mo"
                + " WHERE u.mld_opdr_key = mo.mld_opdr_key(+)";
    if (params.opdrnr)
       opdrurenSQL += "   AND mo.mld_melding_key = " + params.opdrnr;

    // Nu per persoon en week nog sommeren over alle opdrachten
    var urenSQL = "SELECT week,"
                + "       SUM(opdr_uren_besteed) opdr_uren_besteed,"
                + "       SUM(opdr_uren_improductief) opdr_uren_improductief,"
                + "       SUM(opdr_uren_totaal) opdr_uren_totaal,"
                + "       MIN(min_status)  min_status,"
                + "       MAX(max_status)  max_status,"
                + "       MIN(perfectmatch) min_perfectmatch,"
                + "       prs_perslid_key"
                + "  FROM ("+opdrurenSQL+") weekuren"
                + " GROUP BY prs_perslid_key, week";

    // Als geen handler ingegeven dan echt alleen weken tonen waar uren geboekt zijn.
    if (!handler_key)
        var outer = "";
    else
        var outer = "(+)";

    var stats = [];
    if (params.st_urenNot) {stats.push(0); outer="(+)"}
    if (params.st_urenNew) stats.push(1);
    if (params.st_urenBusy) stats.push(2);
    if (params.st_urenAfm) stats.push(3);
    if (params.st_urenVer) stats.push(4);
    var allSQL  = "SELECT uitvweek.week,"
                + "       uitvweek.startdatum,"
                + "       planuren,"
                + "       opdr_uren_besteed,"
                + "       opdr_uren_improductief,"
                + "       opdr_uren_totaal,"
                + "       min_status,"
                + "       max_status,"
                + "       uitvweek.prs_perslid_key,"
                + "       uitvweek.naam,"
                + "       min_perfectmatch"
                + "  FROM ("+uitvweekopdrSQL+") uitvweek, "
                + "       ("+urenSQL+") uren"
                + " WHERE uren.week"+outer+" = uitvweek.week"
                + "   AND uren.prs_perslid_key(+) = uitvweek.prs_perslid_key"
                + (stats.length?"   AND COALESCE(min_status,0) IN ("+stats.join(",")+")":"")
                + " ORDER BY uitvweek.startdatum DESC";

// TODO: Binnen mijn scope als ik het niet zelf ben

    var buttons=[];
    if (false)
    {
      var addurl = "appl/mld/opdr_uren.asp" ;
      buttons.push({ icon: "plus.png", title: L("lcl_add"), action: "FcltMgr.openDetail('" + addurl + "', '" + L("lcl_add") + "')" });
    }

      function fnrowData(oRs)
      {
        var prs_key = oRs("prs_perslid_key").Value;
        var datefrom = new Date(oRs("startdatum").Value).getTime();
        var week = oRs("week").Value;

        var data = {prs_key: prs_key, week: week, datefrom: datefrom };
        return JSON.stringify(data);
      }

      function fnrowActionEnabler(oRs)
      {
        var stat = oRs("min_status").Value;
        var data = { eGoedkeur: stat < 3 }; // nog niet goedgekeurd
        return data;
      }


      var urenProd = 0;
      var urenImprod = 0;
      var urenTotal = 0;
      function fnsummaryCalc(oRs)
      {
        urenProd += oRs("opdr_uren_besteed").value;
        urenImprod += oRs("opdr_uren_improductief").value;
        urenTotal += oRs("opdr_uren_totaal").value;
      }

      function fnsummaryShow(rowNum)
      {
        return " " + L("lcl_hours_prod") + ": " + urenProd.toFixed(2) + " + " + " " + L("lcl_hours_improd") + ": " + urenImprod.toFixed(2)  + " = " + L("lcl_hours_total") + ": " + urenTotal.toFixed(2);
      }

      function fnrowClass(oRs)
      {
        if (oRs("min_perfectmatch").Value == 0)
            return "notperfect";

        // dek af dat er nog helemaal geen uren zijn geboekt
        if (oRs("planuren").Value != oRs("opdr_uren_besteed").Value)
            return "notperfect";

        return "";
      }

      function fnColMinstatus(oRs)
      {
          var p =oRs("min_status").value;
          var ps = [ L("lcl_mld_uren_status_1"), L("lcl_mld_uren_status_2"), L("lcl_mld_uren_status_3"), L("lcl_mld_uren_status_4")][p-1];
          return ps;
      }

      var rst = new ResultsetTable({ keyColumn: "prs_perslid_key",
                                     ID: "opdrurentable",
                                     sql: allSQL,
                                     outputmode: outputmode,
                                     title: L("lcl_mld_ord_weeklijsten"),
                                     rowClass: fnrowClass,
                                     rowData: fnrowData,
                                     rowActionEnabler: fnrowActionEnabler,
                                     summaryCalc: fnsummaryCalc,
                                     summaryShow: fnsummaryShow,
                                     showAll: showall,
                                     buttons: buttons
                                  });

      if (!handler_key)
         rst.addColumn(new Column({caption: L("lcl_handler"), content: "naam"}));
      rst.addColumn(new Column({caption: L("lcl_mld_week"), content: "week", xdatatype: "date"}));
      rst.addColumn(new Column({caption: L("lcl_from"), content: "startdatum", datatype: "date"}));
      rst.addColumn(new Column({caption: L("lcl_mlduren_planned"), content: "planuren", datatype:"float"}));
      rst.addColumn(new Column({caption: L("lcl_hours_prod"), content: "opdr_uren_besteed", datatype:"float"}));
      rst.addColumn(new Column({caption: L("lcl_hours_improd"), content: "opdr_uren_improductief", datatype:"float"}));
      rst.addColumn(new Column({caption: L("lcl_hours_total"), content: "opdr_uren_totaal", datatype:"float" }));
      rst.addColumn(new Column({caption: L("lcl_status"), content: fnColMinstatus}));

      rst.addAction({ action: "opdr_uren_edit", caption: L("lcl_details"), isDefault: true });
      // PF: kan me ookm nog voorstellen dat voor FO een multi-actie Weeksluiten wenselijk is
      if (!params.opdrnr && urole == "bo")
        rst.addAction({ action: "opdr_uren_goed", caption: L("lcl_mlduren_approve"), enabler: "Egoedkeur", multi: true, multiOnce: true });

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