352 lines
16 KiB
C++
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>
|
|
<%
|
|
}
|
|
%>
|