Files
Facilitor/APPL/MLD/opdr_uren_list.inc
Jos Groot Lipman 0460eb8480 FSN#40989 BONS Performance uren_lijst fiatteren
svn path=/Website/branches/v2017.1/; revision=34341
2017-06-19 11:31:55 +00:00

352 lines
16 KiB
C++

<% /*
$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.beginToSQL()+" - 1 + 7*LEVEL, 'IYYY-IW') week,"
+ " TRUNC ("+datefrom.beginToSQL()+" - 1 + 7*LEVEL, 'IW') startdatum"
+ " FROM DUAL"
+ " WHERE ("+datefrom.beginToSQL()+" - 1 + 7*LEVEL) <=" + params.dateto.endToSQL()
+ " 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
+ " AND mld_opdr_einddatum > sysdate - 7*14"; // voorkennis: we doen maar 13 weken. Goed voor de performance
// 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>
<%
}
%>