Files
Facilitor/APPL/FAC/fac_fiattering_list.inc
2025-12-04 12:57:50 +00:00

1661 lines
98 KiB
PHP

<%
/*
$Revision$
$Id$
File: fac_fiattering_list.inc
Description: Overzicht fiatteringsverzoeken
Parameters:
Context: Gemeenschappelijke code van FAC/fac_fiattering_list.asp en PDA/fiat_list.asp
*/
function getSqlFiatBes(fiatstatus, prsKeys, params)
{
var v_sql_bestelling_bedrag = "(SELECT b.bes_bestelling_key"
+ " , SUM(bi.bes_bestelling_item_prijs * bi.bes_bestelling_item_aantal) bestelling_bedrag"
+ " FROM bes_bestelling b"
+ " , bes_bestelling_item bi"
+ " , bes_srtdeel bsd"
+ " , bes_srtgroep bsg"
+ " , bes_disc_params bdp"
+ " WHERE b.bes_bestelling_key = bi.bes_bestelling_key"
+ " AND bi.bes_srtdeel_key = bsd.bes_srtdeel_key"
+ " AND bsd.bes_srtgroep_key = bsg.bes_srtgroep_key"
+ " AND bsg.ins_discipline_key = bdp.bes_ins_discipline_key"
+ (fiatstatus == "open"
? " AND b.bes_bestelling_status = CASE"
+ " WHEN bdp.bes_disc_params_fiatflow = 0"
+ " THEN 2"
+ " ELSE 4"
+ " END" // Te fiatteren
: (fiatstatus == "close"
? " AND b.bes_bestelling_status != 2" // Gefiatteerd
: " AND b.bes_bestelling_status = 1")) // Afgewezen
+ " GROUP BY b.bes_bestelling_key)";
// Kan ik zelf fiatteren?: true: totaalbedrag <= can_selfapprove
// false totaalbedrag > can_selfapprove
var totaalbedrag = "(SELECT SUM(i1.bes_bestelling_item_aantal * COALESCE(i1.bes_bestelling_item_prijs, 0))"
+ " FROM bes_bestelling_item i1"
+ " WHERE i1.bes_bestelling_key = b.bes_bestelling_key)";
// Deze mag/hoeft niet meer te fiatteren
var exclude_fiatter = " COALESCE(b.bes_bestelling_fiat_user, "
+ " CASE"
+ " WHEN " + totaalbedrag + " <= " + S("can_selfapprove")
+ " THEN -1"
+ " ELSE b.prs_perslid_key"
+ " END)";
var fiatteur = " (SELECT p2.prs_perslid_naam_full"
+ " FROM prs_v_perslid_fullnames_all p2"
+ " WHERE p2.prs_perslid_key ="
+ (fiatstatus == "open"
? " prs.nextfiatteur(b.bes_bestelling_key, 'BES', " + exclude_fiatter + "))" // Open. Toon wie de fiatteur is. Voor de BES module wordt de pexcludekey toch niet gebruikt.
: " b.bes_bestelling_fiat_user)") // Gefiatteerd en afgewezen. Toon wie dat is geweest. (Afwijzer werd voorheen niet opgeslagen, nu wel)
// Tijdens het uiteindelijk fiatteren wordt gekeken afhankelijk van totaalbedrag of er wellicht na kostenplaatsverantwoordelijke ook nog door kostenplaatsgroepverantwoordelijke moet worden gefiatteerd.
var sql = " SELECT TO_CHAR(b.bes_bestelling_key) aanvraagnummer"
+ " , b.bes_bestelling_datum datum"
+ " , p.prs_perslid_naam_full"
+ " , prijs.bestelling_bedrag bedrag"
+ " , 'BES' module"
+ " , 'mld_typeopdr_omschrijving' type"
+ ", " + safe.quoted_sql(fiatstatus) + " fiatstatus"
+ " , b.bes_bestelling_key request_key"
+ " , b.bes_bestelling_status statuskey"
+ " , b.bes_bestelling_datum sortdate"
+ " , " + lcl.xsql("td.ins_discipline_omschrijving", "td.ins_discipline_key") + " categorie"
+ " , " + fiatteur + " fiatteur"
+ " , bes_bestelling_parentkey"
+ " , NULL prefix"
+ " , NULL uitvoerende"
+ " , l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')' locatie"
+ " , NULL gebouw"
+ " , NULL terrein"
+ " , NULL omschrijving"
+ " , NULL extra1"
+ " FROM prs_v_perslid_fullnames_all p"
+ " , bes_bestelling b"
+ " , " + v_sql_bestelling_bedrag + " prijs"
+ " , bes_bestelling_item bi"
+ " , bes_srtdeel sd"
+ " , bes_srtgroep sg"
+ " , ins_tab_discipline td"
+ " , bes_disc_params dp"
+ " , prs_kostenplaats k"
+ " , prs_kostenplaatsgrp kpg"
+ " , " + fac.getVSqlVerantwoordelijk(prsKeys) + " ver"
+ (fiatstatus != "open"
? " , fac_tracking ft"
+ " , fac_srtnotificatie fno"
: "")
+ " , mld_v_afleveradres m"
+ " , alg_locatie l"
+ (params.bld_key_arr
? " , alg_gebouw g"
+ " , alg_terreinsector t"
: "")
+ " WHERE bi.bes_bestelling_key = b.bes_bestelling_key"
+ " AND prijs.bes_bestelling_key = b.bes_bestelling_key"
+ " AND sd.bes_srtdeel_key = bi.bes_srtdeel_key"
+ " AND sd.bes_srtgroep_key = sg.bes_srtgroep_key"
+ " AND sg.ins_discipline_key = td.ins_discipline_key"
+ " AND td.ins_discipline_key = dp.bes_ins_discipline_key"
+ " AND p.prs_perslid_key = b.prs_perslid_key"
+ " AND b.prs_kostenplaats_key = k.prs_kostenplaats_key"
+ " AND k.prs_kostenplaats_key = ver.prs_kostenplaats_key(+)"
+ " AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
+ (params.kpgrp_key_arr
? " AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
: "")
+ " AND b.mld_adres_key_lev = m.mld_adres_key" // Afleveradres is altijd verplicht
+ " AND m.alg_locatie_key = l.alg_locatie_key(+)"
+ (fiatstatus == "open"
? " AND b.bes_bestelling_status = CASE"
+ " WHEN dp.bes_disc_params_fiatflow = 0"
+ " THEN 2"
+ " ELSE 4"
+ " END"
/* A1 */ + " AND ((bes_bestelling_fiat_user IS NULL AND"
+ " prs.nextfiatteur(b.bes_bestelling_key, 'BES', " + exclude_fiatter + ") IN (" + prsKeys + ")" + ")" // Voor de BES module wordt de pexcludekey toch niet gebruikt.
/* A2 */ + " OR (bes_bestelling_fiat_user IS NOT NULL AND"
+ " ((ver.prs_perslid_key IN (" + prsKeys + ") AND b.bes_bestelling_fiatbedrag < COALESCE(kpg.prs_kostenplaatsgrp_fin_limit1, " + S("mld_opdr_kpg_fin_limit1") + "))"
+ " OR (ver.prs_kostenplaatsgrp_fiat2_key IN (" + prsKeys + ") AND b.bes_bestelling_fiatbedrag >= COALESCE(kpg.prs_kostenplaatsgrp_fin_limit1, " + S("mld_opdr_kpg_fin_limit1") + ") AND b.bes_bestelling_fiatbedrag < COALESCE(kpg.prs_kostenplaatsgrp_fin_limit2, " + S("mld_opdr_kpg_fin_limit2") + "))"
+ " OR (ver.prs_kostenplaatsgrp_fiat3_key IN (" + prsKeys + ") AND b.bes_bestelling_fiatbedrag >= COALESCE(kpg.prs_kostenplaatsgrp_fin_limit2, " + S("mld_opdr_kpg_fin_limit2") + "))))"
+ " )"
: " AND ft.fac_tracking_refkey = b.bes_bestelling_key"
+ " AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
+ " AND fno.fac_srtnotificatie_code IN (" + (fiatstatus == "close"? "'BESFIT', 'BESACP'" : "'BESREJ'") + ")"
+ " AND ft.prs_perslid_key IN (" + prsKeys + ")")
+ (fiatstatus == "open" // Als nog gefiatteerd moet worden door kostenplaatsgroep verantwoordelijke en ik heb net gefiatteerd dan wil ik die niet meer zien (want dan was het wel in 1 keer goedgekeurd).
? " AND (bes_bestelling_fiat_user <> " + user_key + " OR bes_bestelling_fiat_user IS NULL)" // Geldt alleen voor nog te fiatteren bestellingen, zie canApprove bij bestellingen. Dan heb je toch de rechten niet.
: "") // Door mij goedgekeurde of afgekeurde bestellingen hoef ik niet meer af te melden maar wil ik nog wel zien
+ (params.bld_key_arr
? " AND l.alg_locatie_key = g.alg_locatie_key(+)"
+ " AND l.alg_locatie_key = t.alg_locatie_key(+)"
+ " AND (g.alg_gebouw_key IN (" + params.bld_key_arr.join(",") + ") OR t.alg_terreinsector_key IN (" + params.bld_key_arr.join(",") + "))"
: "")
+ (params.loc_key_arr && !params.bld_key_arr
? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
: "")
+ " GROUP BY b.bes_bestelling_key"
+ " , b.bes_bestelling_datum"
+ " , p.prs_perslid_naam_full"
+ " , b.bes_bestelling_status"
+ " , prijs.bestelling_bedrag"
+ " , "+ lcl.xsql('td.ins_discipline_omschrijving','td.ins_discipline_key')
+ " , b.prs_kostenplaats_key"
+ " , b.prs_perslid_key"
+ " , b.bes_bestelling_fiat_user"
+ " , bes_bestelling_parentkey"
+ " , l.alg_locatie_omschrijving"
+ " , l.alg_locatie_code"
+ " , td.ins_discipline_key";
return sql;
}
function getCntScope(params)
{
return " SELECT l.alg_locatie_key loc"
+ " , " + S("alg_loc_string") + " loc_oms"
+ " , NULL gebter"
+ " , NULL gebter_oms"
+ " , cp.cnt_contract_key cnt_key"
+ " FROM cnt_contract_plaats cp"
+ " , 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"
+ (params.loc_key_arr
? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
: "")
+ " UNION"
+ " SELECT l.alg_locatie_key loc"
+ " , " + S("alg_loc_string") + " loc_oms"
+ " , g.alg_gebouw_key gebter"
+ " , g.alg_gebouw_naam gebter_oms"
+ " , cp.cnt_contract_key cnt_key"
+ " FROM cnt_contract_plaats cp"
+ " , 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"
+ (params.bld_key_arr
? " AND g.alg_gebouw_key IN (" + params.bld_key_arr.join(",") + ")"
: (params.loc_key_arr
? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
: ""))
+ " UNION"
+ " SELECT l.alg_locatie_key loc"
+ " , " + S("alg_loc_string") + " loc_oms"
+ " , t.alg_terreinsector_key gebter"
+ " , t.alg_terreinsector_naam gebter_oms"
+ " , cp.cnt_contract_key cnt_key"
+ " FROM cnt_contract_plaats cp"
+ " , 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"
+ (params.bld_key_arr
? " AND t.alg_terreinsector_key IN (" + params.bld_key_arr.join(",") + ")"
: (params.loc_key_arr
? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
: ""));
}
function getCntGebonden(params)
{
var filterlocatie = (params.dist_key_arr? true : false);
var filter_gebonden = "";
if (filterlocatie)
{
if (params.cnt)
filter_gebonden = " c.cnt_contract_key = cp.cnt_contract_key";
if (params.bld_key_arr)
{
// Filteren op gebouw/terrein levert alleen de gebouw/terreingebonden contracten. De cnt_alg_plaats_key is uniek voor gebouw en terrein en daarom is cnt_alg_plaats_code niet nodig.
filter_gebonden += (params.cnt? " AND" : "") + " cp.cnt_alg_plaats_key IN (" + params.bld_key_arr.join(",") + ")";
}
else if (params.loc_key_arr)
{
// Filteren op locatie moet zowel de locatie gebonden contracten opleveren
// als de gebouwgebonden contracten binnen deze locatie.
var locaties = params.loc_key_arr.join(","); // De geselecteerde locatie, of alle locaties in het geselecteerde district.
var gebouwenterreinen = "";
sql_f = "SELECT alg_gebouw_key"
+ " FROM alg_gebouw"
+ " WHERE alg_locatie_key IN (" + locaties + ")"
+ " UNION "
+ "SELECT alg_terreinsector_key"
+ " FROM alg_terreinsector"
+ " WHERE alg_locatie_key IN (" + locaties + ")";
var bld_key_arr2 = [];
var oRsf = Oracle.Execute(sql_f);
if (!oRsf.eof)
{
while (!oRsf.eof)
{
bld_key_arr2.push(oRsf("alg_gebouw_key").Value);
oRsf.moveNext();
}
oRsf.Close();
gebouwenterreinen = bld_key_arr2.join(",");
}
filter_gebonden += (params.cnt? " AND" : "") + " ( (cp.cnt_alg_plaats_code = 'L' AND cp.cnt_alg_plaats_key IN (" + locaties + "))"
+ (gebouwenterreinen ? " OR (cp.cnt_alg_plaats_key IN (" + gebouwenterreinen + "))" : "") // De cnt_alg_plaats_key is uniek voor gebouw en terrein en daarom is cnt_alg_plaats_code niet nodig.
+ " )";
}
}
return filter_gebonden;
}
function getSqlFiatCnt(fiatstatus, prsKeys, params)
{ // Contracten: Goedkeuren tot de vijf limieten (WEB_CNTGO1 t/m WEB_CNTGO5)
var scope = getCntScope(params);
var loc_count = "(SELECT COUNT(loc) FROM theScope scope WHERE scope.cnt_key = c.cnt_contract_key)";
var loc_oms = "(SELECT loc_oms FROM theScope scope WHERE scope.cnt_key = c.cnt_contract_key)";
var gebter_oms = "(SELECT gebter_oms FROM theScope scope WHERE scope.cnt_key = c.cnt_contract_key)";
var filterlocatie = (params.dist_key_arr? true : false);
params.cnt = true;
var filter_gebonden = getCntGebonden(params);
function getSqlLocAut(lfunctie_code)
{
var sql_cntloc = cnt.getCntLocationsSql();
return " AND EXISTS(SELECT g.prs_perslid_key"
+ " FROM fac_v_webgebruiker g"
+ " , fac_functie f"
+ " , cnt_contract c1"
+ " , (" + sql_cntloc + ") cntloc"
+ " WHERE g.fac_functie_key = f.fac_functie_key"
+ " AND g.ins_discipline_key = c.ins_discipline_key"
+ " AND g.prs_perslid_key IN (" + prsKeys + ")"
+ " AND f.fac_functie_code = " + safe.quoted_sql(lfunctie_code)
+ " AND c1.cnt_contract_key = cntloc.cnt_contract_key(+)"
+ " AND c1.cnt_contract_key = c.cnt_contract_key"
+ " AND (g.fac_gebruiker_alg_level_write = -1"
+ " OR (g.fac_gebruiker_alg_level_write < 9"
+ " AND (cntloc.alg_locatie_key IN (SELECT alg_locatie_key"
+ " FROM fac_v_my_locations"
+ " WHERE prs_perslid_key IN (" + prsKeys + ")"
+ " AND niveau = fac_gebruiker_alg_level_write)"
+ " OR cntloc.alg_locatie_key IS NULL)" // Op contracten zonder locatie(s) heeft iedereen rechten.
+ ")))";
}
var sql = " WITH theScope AS (" + scope + ")"
+ " SELECT DISTINCT TO_CHAR (c.cnt_contract_nummer_intern)||NVL2(cnt_contract_versie,'.'||cnt_contract_versie,'') aanvraagnummer"
+ " , c.cnt_contract_aanmaak datum"
+ " , p.prs_perslid_naam_full"
+ " , c.cnt_contract_kosten bedrag"
+ " , 'CNT' module"
+ " , 'mld_typeopdr_omschrijving' type"
+ " , " + safe.quoted_sql(fiatstatus) + " fiatstatus"
+ " , c.cnt_contract_key request_key"
+ " , c.cnt_contract_status statuskey"
+ " , c.cnt_contract_aanmaak sortdate"
+ " , " + lcl.xsql("td.ins_discipline_omschrijving", "td.ins_discipline_key") + " categorie"
+ (fiatstatus == "open"
? " , CASE"
+ " WHEN COALESCE (c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit1")
+ " THEN '1'"
+ " WHEN COALESCE (c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit2")
+ " THEN '2'"
+ " WHEN COALESCE (c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit3")
+ " THEN '3'"
+ " WHEN COALESCE (c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit4")
+ " THEN '4'"
+ " WHEN COALESCE (c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit5")
+ " THEN '5'"
+ " ELSE '0'"
+ " END"
: " , ' '") + " fiatteur"
+ " , NULL bes_bestelling_parentkey"
+ " , NULL prefix"
+ " , NULL uitvoerende"
+ " , CASE " + loc_count
+ " WHEN 0"
+ " THEN NULL"
+ " WHEN 1"
+ " THEN " + loc_oms
+ " ELSE " + safe.quoted_sql(L("lcl_cnt_locatie_m")) + " || "
+ " ' (' || TO_CHAR(" + loc_count + ") || ')'" // Er kunnen meerdere locaties zijn (contract scope)
+ " END locatie"
+ " , CASE " + loc_count
+ " WHEN 1"
+ " THEN TO_CHAR (" + gebter_oms + ")"
+ " ELSE NULL"
+ " END gebouw"
+ " , NULL terrein"
+ " , c.cnt_contract_omschrijving omschrijving"
+ " , NULL extra1"
+ " FROM prs_v_perslid_fullnames_all p"
+ " , cnt_v_aanwezigcontract c"
+ " , ins_tab_discipline td"
+ " , cnt_disc_params cd"
+ " , prs_kostenplaats k"
+ (params.kpgrp_key_arr
? " , prs_kostenplaatsgrp kpg"
: "")
+ " , fac_v_webgebruiker w"
+ " , fac_functie f"
+ (fiatstatus != "open"
? ", fac_tracking ft"
+ ", fac_srtnotificatie fno"
: "")
+ (filterlocatie
? ", cnt_contract_plaats cp"
: "")
+ " WHERE c.ins_discipline_key = td.ins_discipline_key"
+ " AND td.ins_discipline_key = cd.cnt_ins_discipline_key(+)"
+ " AND c.prs_perslid_key_beh = p.prs_perslid_key"
+ " AND c.prs_kostenplaats_key = k.prs_kostenplaats_key(+)"
+ (params.kpgrp_key_arr
? " AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
+ " AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
: "")
+ " AND w.prs_perslid_key IN (" + prsKeys + ")"
+ " AND w.fac_functie_key = f.fac_functie_key"
+ " AND w.ins_discipline_key = c.ins_discipline_key"
//+ " AND fac_functie_code LIKE 'WEB_CNTGO%'"
+ (fiatstatus == "open"
? " AND c.cnt_contract_status = 3"
+ " AND ( COALESCE(c.cnt_contract_approved, 0) < cnt_contract_kosten" // Contract is nog niet volledig goedgekeurd.
+ " OR cd.cnt_disc_params_approve_new = 1" // of moet altijd worden goedgekeurd
+ " )"
/* A1 */ + " AND ( ( ( c.cnt_contract_kosten > " + S("cnt_contract_limit1") // Zijn de kosten hoger als de limiet.
+ " OR cd.cnt_disc_params_approve_new = 1" // of moet altijd worden goedgekeurd
+ " )"
+ " AND COALESCE(c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit1") // Goedkeur 1.
+ (S("cnt_approval_all") == 1
? " AND cnt_contract_kosten > " + S("cnt_contract_limit1")
+ " AND cnt_contract_kosten <= " + S("cnt_contract_limit2") // Er moet in 1 keer goed gekeurd te worden.
: "")
+ getSqlLocAut('WEB_CNTGO1')
+ " AND f.fac_functie_code LIKE 'WEB_CNTGO1')" // Heb ik rechten voor de eerste goedkeur.
/* A2 */ + " OR (c.cnt_contract_kosten > " + S("cnt_contract_limit2") // Zijn de kosten hoger als de limiet.
+ " AND COALESCE(c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit2") // Goedkeur 2.
+ (S("cnt_approval_all") == 0
? " AND COALESCE(c.cnt_contract_approved, 0) > " + S("cnt_contract_limit1") // Eerste goedkeuring is geweest.
: " AND cnt_contract_kosten > " + S("cnt_contract_limit1")
+ " AND cnt_contract_kosten <= " + S("cnt_contract_limit3")) // Er moet in 1 keer goed gekeurd worden.
+ getSqlLocAut('WEB_CNTGO2')
+ " AND f.fac_functie_code LIKE 'WEB_CNTGO2')" // Heb ik rechten voor de tweede goedkeur.
/* A3 */ + " OR (c.cnt_contract_kosten > " + S("cnt_contract_limit3") // Zijn de kosten hoger als de limiet.
+ " AND COALESCE(c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit3") // Goedkeur 3.
+ (S("cnt_approval_all") == 0
? " AND COALESCE(c.cnt_contract_approved, 0) > " + S("cnt_contract_limit2") // Tweede goedkeuring is geweest.
: " AND cnt_contract_kosten > " + S("cnt_contract_limit2")
+ " AND cnt_contract_kosten <= " + S("cnt_contract_limit4")) // Er moet in 1 keer goed gekeurd worden.
+ getSqlLocAut('WEB_CNTGO3')
+ " AND f.fac_functie_code LIKE 'WEB_CNTGO3')" // Heb ik rechten voor de derde goedkeur.
/* A4 */ + " OR (c.cnt_contract_kosten > " + S("cnt_contract_limit4") // Zijn de kosten hoger als de limiet.
+ " AND COALESCE(c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit4") // Goedkeur 4.
+ (S("cnt_approval_all") == 0
? " AND COALESCE(c.cnt_contract_approved, 0) > " + S("cnt_contract_limit3") // Derde goedkeuring is geweest.
: " AND cnt_contract_kosten > " + S("cnt_contract_limit3")
+ " AND cnt_contract_kosten <= " + S("cnt_contract_limit5")) // Er moet in 1 keer goed gekeurd worden.
+ getSqlLocAut('WEB_CNTGO4')
+ " AND f.fac_functie_code LIKE 'WEB_CNTGO4')" // Heb ik rechten voor de vierde goedkeur.
/* A5 */ + " OR (c.cnt_contract_kosten > " + S("cnt_contract_limit5") // Zijn de kosten hoger als de limiet.
+ " AND COALESCE(c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit5") // Goedkeur 5.
+ (S("cnt_approval_all") == 0
? " AND COALESCE(c.cnt_contract_approved, 0) > " + S("cnt_contract_limit4") // Vierde goedkeuring is geweest.
: " AND cnt_contract_kosten > " + S("cnt_contract_limit5")) // Er moet in 1 keer goed gekeurd te worden.
+ getSqlLocAut('WEB_CNTGO5')
+ " AND f.fac_functie_code LIKE 'WEB_CNTGO5'))" // Heb ik rechten voor de vijfde goedkeur.
+ " AND COALESCE (fac_gebruiker_prs_level_write, 9) < 9" // Heb ik enige schrijfrechten, dan heb ik alle schrijfrechten. Autorisatie is Ja/Nee.
: " AND c.cnt_contract_status = " + (fiatstatus == "close"? "0" : "2")
+ " AND ft.fac_tracking_refkey = c.cnt_contract_key"
+ " AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
+ " AND fno.fac_srtnotificatie_code IN (" + (fiatstatus == "close"? "'CNTFIT'" : "'CNTREJ'") + ")"
+ " AND ft.prs_perslid_key IN (" + prsKeys + ")")
+ (filterlocatie
? " AND" + filter_gebonden
: "");
return " SELECT * FROM (" + sql + ")";
}
function getSqlFiatMld(fiatstatus, prsKeys, params)
{ // opdrachten: te fiatteren op mijn budgetten
var sql = (params.goedkeur
? " SELECT op.mld_opdr_key" // Query wordt gebruikt als subquery voor getSqlGoedkeurMld (AND op.mld_opdr_key NOT IN (...))
: " SELECT sd.ins_srtdiscipline_prefix || op.mld_melding_key || '/' || op.mld_opdr_bedrijfopdr_volgnr aanvraagnummer"
+ " , mld_opdr_datumbegin datum"
+ " , pf.prs_perslid_naam_full"
+ " , mld_opdr_kosten bedrag"
+ " , 'MLD' module"
+ " , mld_typeopdr_omschrijving type"
+ " , " + safe.quoted_sql(fiatstatus) + " fiatstatus"
+ " , op.mld_opdr_key request_key"
+ " , op.mld_statusopdr_key statuskey"
+ " , mld_opdr_datumbegin sortdate"
+ " , " + lcl.xsql("td.ins_discipline_omschrijving", "td.ins_discipline_key") + " categorie"
+ (fiatstatus == "open"
? " , p2.prs_perslid_naam_full"
: " , ' '") + " fiatteur"
+ " , NULL bes_bestelling_parentkey"
+ " , sd.ins_srtdiscipline_prefix prefix"
+ " , NULL uitvoerende"
+ " , CASE "
+ " WHEN l.alg_locatie_key IS NULL"
+ " THEN NULL"
+ " ELSE l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'"
+ " END locatie"
+ " , g.alg_gebouw_code || ' ' || g.alg_gebouw_naam gebouw"
+ " , t.alg_terreinsector_code || ' ' || alg_terreinsector_naam terrein"
+ " , TO_CHAR(SUBSTR(m.mld_melding_omschrijving, 1, 4000)) omschrijving"
+ " , NULL extra1")
+ " FROM mld_melding m"
+ " , mld_stdmelding sm"
+ " , mld_opdr op"
+ " , mld_typeopdr ot"
+ " , prs_v_perslid_fullnames_all pf"
+ " , prs_kostenplaats k"
+ (params.kpgrp_key_arr
? " , prs_kostenplaatsgrp kpg"
: "")
+ " , ins_tab_discipline td"
+ " , ins_srtdiscipline sd"
+ " , fac_tracking ft"
+ " , fac_srtnotificatie fno"
+ " , " + fac.getVSqlVerantwoordelijk(prsKeys) + " ver"
+ (fiatstatus == "open"
? " , prs_v_perslid_fullnames_all p2"
: "")
+ " , alg_locatie l"
+ " , alg_v_allonroerendgoed onrg"
+ " , alg_v_aanweziggebouw g"
+ " , alg_terreinsector t"
+ " WHERE op.mld_melding_key = m.mld_melding_key"
+ " AND op.mld_typeopdr_key = ot.mld_typeopdr_key"
+ " AND COALESCE(op.prs_kostenplaats_key, m.prs_kostenplaats_key) = k.prs_kostenplaats_key" // Indien melding en opdracht geen kostenplaats hebben, dan ook niet fiateren en is de opdrachtstatus al "Uitgegeven"
+ " AND k.prs_kostenplaats_key = ver.prs_kostenplaats_key(+)"
+ (params.kpgrp_key_arr
? " AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
+ " AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
: "")
+ " AND pf.prs_perslid_key = m.prs_perslid_key"
+ " AND ft.fac_tracking_refkey = op.mld_opdr_key"
+ " AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
+ " AND ft.fac_tracking_refkey = op.mld_opdr_key"
// Door herfiatteren kunnen twee tracking record onstaan. Maximum nemen.
+ " AND ft.fac_tracking_key = (SELECT MAX(ft2.fac_tracking_key)"
+ " FROM fac_tracking ft2"
+ " WHERE ft2.fac_tracking_refkey = op.mld_opdr_key"
+ " AND ft2.fac_srtnotificatie_key = fno.fac_srtnotificatie_key)"
+ " AND op.mld_melding_key = m.mld_melding_key"
+ " AND m.mld_stdmelding_key = sm.mld_stdmelding_key"
+ " AND sm.mld_ins_discipline_key = td.ins_discipline_key"
+ " AND sd.ins_srtdiscipline_key = td.ins_srtdiscipline_key"
+ " AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
+ " AND m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
+ " AND onrg.alg_gebouw_key = g.alg_gebouw_key(+)"
+ " AND onrg.alg_terreinsector_key = t.alg_terreinsector_key(+)"
+ (fiatstatus == "open"
? " AND fno.fac_srtnotificatie_code = 'ORDFIA'"// Er moe(s)t uberhaupt gefiatteerd worden
+ " AND op.mld_statusopdr_key = 3"
// Door gebruik van de database functie fac.gettrackinguserkey (peventcode IN VARCHAR2, pkey IN NUMBER) in het WHERE statement
// is de query zeer traag indien er vervangers zijn gedefinieerd (prsKeys bestaat uit meer dan 1 key).
// Daarom de database functie fac.gettrackinguserkey (peventcode IN VARCHAR2, pkey IN NUMBER) uitgeschreven.
// De fac_tracking en fac_srtnotificatie mee joinen duurder langer dan onderstaande oplossing.
/* A1 */ //+ " AND p2.prs_perslid_key = CASE WHEN fac.gettrackinguserkey('ORDFOK', op.mld_opdr_key) IS NULL"
/* A1 */ + " AND p2.prs_perslid_key = prs.getFiatteur(op.prs_kostenplaats_key"
+ (S("mld_opdr_reapproval_rate") >= 0
? " , -1"
: " , CASE"
+ " WHEN op.mld_opdr_fiatbedrag IS NULL"
+ " THEN NULL"
+ " ELSE fac.gettrackinguserkey('ORDFOK', op.mld_opdr_key)"
+ " END")
+ " , op.mld_opdr_kosten"
+ " , op.mld_opdr_discipline_key"
+ " , COALESCE(op.mld_opdr_fiatbedrag, 0))"
+ " AND p2.prs_perslid_key IN (" + prsKeys + ")"
: " AND fno.fac_srtnotificatie_code = " + (fiatstatus == "close"? "'ORDFOK'" : "'ORDFNO'") // Er is gefiatteerd.
+ " AND ft.prs_perslid_key IN (" + prsKeys + ")") // Gefiatterd door jezelf of waarvoor je vervanger bent
+ (params.bld_key_arr // sortering op gebouw, locatie of district
? " AND (g.alg_gebouw_key IN (" + params.bld_key_arr.join(",") + ") OR t.alg_terreinsector_key IN (" + params.bld_key_arr.join(",") + "))"
: (params.loc_key_arr
? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
: ""))
+ (params.opdrtype_key
? " AND ot.mld_typeopdr_key = " + params.opdrtype_key
: "");
return sql;
}
// opdrachten die eerst nog goedgekeurd moet worden (nog voordat ze gefiatteerd mogen worden)
function getSqlGoedkeurMld(fiatstatus, prsKeys, params)
{ // opdrachten: goedkeuren
params.goedkeur = true;
var sql = " SELECT sd.ins_srtdiscipline_prefix || op.mld_melding_key || '/' || op.mld_opdr_bedrijfopdr_volgnr aanvraagnummer"
+ " , mld_opdr_datumbegin datum"
+ " , pf.prs_perslid_naam_full"
+ " , mld_opdr_kosten bedrag"
+ " , 'GOED' module"
+ " , mld_typeopdr_omschrijving type"
+ " , " + safe.quoted_sql(fiatstatus) + " fiatstatus"
+ " , op.mld_opdr_key request_key"
+ " , op.mld_statusopdr_key statuskey"
+ " , mld_opdr_datumbegin sortdate"
+ " , " + lcl.xsql("td.ins_discipline_omschrijving", "td.ins_discipline_key") + " categorie"
+ " , ' ' fiatteur" // dat kunnen er meerdere met WEB_ORDGOE zijn
+ " , NULL bes_bestelling_parentkey"
+ " , sd.ins_srtdiscipline_prefix prefix"
+ " , COALESCE((SELECT b.prs_bedrijf_naam FROM prs_bedrijf b WHERE b.prs_bedrijf_key = op.mld_uitvoerende_keys),"
+ " COALESCE((SELECT " + S("prs_pers_string") + " FROM prs_perslid p WHERE p.prs_perslid_key = op.mld_uitvoerende_keys),"
+ " '')) uitvoerende"
+ " , CASE "
+ " WHEN l.alg_locatie_key IS NULL"
+ " THEN NULL"
+ " ELSE l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'"
+ " END locatie"
+ " , g.alg_gebouw_code || ' ' || g.alg_gebouw_naam gebouw"
+ " , t.alg_terreinsector_code || ' ' || alg_terreinsector_naam terrein"
+ " , op.mld_opdr_omschrijving omschrijving"
+ " , NULL extra1"
+ " FROM mld_melding m"
+ " , mld_disc_params mdp"
+ " , mld_stdmelding sm"
+ " , mld_opdr op"
+ (params.kpgrp_key_arr
? " , prs_kostenplaats k"
+ " , prs_kostenplaatsgrp kpg"
: "")
+ " , mld_typeopdr ot"
+ " , prs_v_perslid_fullnames_all pf"
+ " , prs_perslid p"
+ " , ins_tab_discipline td"
+ " , ins_srtdiscipline sd"
+ (fiatstatus != "open"
? " , fac_tracking ft"
+ " , fac_srtnotificatie fno"
: "")
+ " , alg_locatie l"
+ " , alg_v_allonroerendgoed onrg"
+ " , alg_v_aanweziggebouw g"
+ " , alg_terreinsector t"
+ " WHERE op.mld_melding_key = m.mld_melding_key"
+ " AND op.mld_typeopdr_key = ot.mld_typeopdr_key"
+ " AND pf.prs_perslid_key = m.prs_perslid_key"
+ " AND p.prs_perslid_key = m.prs_perslid_key"
+ (params.kpgrp_key_arr
? " AND COALESCE(op.prs_kostenplaats_key, m.prs_kostenplaats_key) = k.prs_kostenplaats_key"
+ " AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
+ " AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
: "")
+ " AND m.mld_stdmelding_key = sm.mld_stdmelding_key"
+ " AND sm.mld_ins_discipline_key = td.ins_discipline_key"
+ " AND sd.ins_srtdiscipline_key = td.ins_srtdiscipline_key"
+ " AND mdp.mld_ins_discipline_key = op.mld_opdr_discipline_key"
+ " AND EXISTS("
// JGL: 31-7-2017 Deze prs-scoping werkt volgens mij niet voor bedrijf-niveau
// Bovendien heeft geen van de WEB_ORDGO? uberhaupt PRS-scoping?
+ " SELECT g.prs_perslid_key"
+ " FROM fac_v_webgebruiker g"
+ " , fac_functie f"
+ " , prs_perslid pzelf"
+ " WHERE g.fac_functie_key = f.fac_functie_key"
+ " AND g.ins_discipline_key = op.mld_opdr_discipline_key"
+ " AND pzelf.prs_perslid_key IN (" + (S("mld_opdr_validate_by_substitute") == 0? user_key : prsKeys) + ")"
+ " AND g.prs_perslid_key = pzelf.prs_perslid_key"
+ " AND (g.fac_gebruiker_prs_level_write = -1"
+ " OR (g.fac_gebruiker_prs_level_write < 9"
+ " AND pzelf.prs_afdeling_key IN"
+ " (SELECT prs_afdeling_key"
+ " FROM prs_v_afdeling_familie a"
+ " WHERE a.prs_afdeling_elder_key IN"
+ " (SELECT aa.prs_afdeling_elder_key"
+ " FROM prs_v_afdeling_familie aa"
+ " WHERE aa.prs_afdeling_key = p.prs_afdeling_key"
+ " AND aa.niveau = g.fac_gebruiker_prs_level_write))))"
+ " AND (g.fac_gebruiker_alg_level_write = -1"
+ " OR (g.fac_gebruiker_alg_level_write < 9"
+ " AND (CASE"
+ " WHEN m.mld_alg_onroerendgoed_keys IS NULL"
+ " AND m.mld_alg_locatie_key IN (SELECT alg_locatie_key"
+ " FROM fac_v_my_locations"
+ " WHERE prs_perslid_key = pzelf.prs_perslid_key"
+ " AND niveau = fac_gebruiker_alg_level_write)"
+ " THEN 1"
+ " WHEN onrg.alg_type = 'T'"
+ " AND m.mld_alg_onroerendgoed_keys IN (SELECT t.alg_terreinsector_key"
+ " FROM fac_v_my_locations l, alg_terreinsector t"
+ " WHERE t.alg_locatie_key = l.alg_locatie_key"
+ " AND l.prs_perslid_key = pzelf.prs_perslid_key"
+ " AND l.niveau = fac_gebruiker_alg_level_write)"
+ " THEN 1"
+ " WHEN onrg.alg_type = 'G'"
+ " AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_gebouw_key"
+ " FROM fac_v_my_buildings"
+ " WHERE prs_perslid_key = pzelf.prs_perslid_key"
+ " AND niveau = fac_gebruiker_alg_level_write)"
+ " THEN 1"
+ " WHEN onrg.alg_type = 'V'"
+ " AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_verdieping_key"
+ " FROM fac_v_my_floors"
+ " WHERE prs_perslid_key = pzelf.prs_perslid_key"
+ " AND niveau = fac_gebruiker_alg_level_write)"
+ " THEN 1"
+ " WHEN onrg.alg_type = 'R'"
+ " AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_ruimte_key"
+ " FROM fac_v_my_rooms"
+ " WHERE prs_perslid_key = pzelf.prs_perslid_key"
+ " AND niveau = fac_gebruiker_alg_level_write)"
+ " THEN 1"
+ " ELSE 0"
+ " END) = 1))"
+ (fiatstatus == "open"
? (S("mld_opdr_approval_all") == 0
? " AND ((fac_functie_code = 'WEB_ORDGOE'"
+ " AND ((op.mld_opdr_kosten >= mdp.mld_disc_params_bestellimiet"
+ " AND COALESCE (op.mld_opdr_approved, 0) <= mdp.mld_disc_params_bestellimiet)"
+ " OR (op.mld_opdr_kosten >= ot.mld_typeopdr_gvs AND COALESCE (op.mld_opdr_approved, -1) < 0)))"
+ " OR (fac_functie_code = 'WEB_ORDGO2'"
+ " AND op.mld_opdr_kosten >= mdp.mld_disc_params_bestellimiet2"
+ " AND COALESCE(op.mld_opdr_approved, 0) = mdp.mld_disc_params_bestellimiet2)"
+ " OR (fac_functie_code = 'WEB_ORDGO3'"
+ " AND op.mld_opdr_kosten >= mdp.mld_disc_params_bestellimiet3"
+ " AND COALESCE(op.mld_opdr_approved, 0) = mdp.mld_disc_params_bestellimiet3)"
+ " OR (fac_functie_code = 'WEB_ORDGO4'"
+ " AND op.mld_opdr_kosten >= mdp.mld_disc_params_bestellimiet4"
+ " AND COALESCE(op.mld_opdr_approved, 0) = mdp.mld_disc_params_bestellimiet4)"
+ " OR (fac_functie_code = 'WEB_ORDGO5'"
+ " AND op.mld_opdr_kosten >= mdp.mld_disc_params_bestellimiet5"
+ " AND COALESCE(op.mld_opdr_approved, 0) >= mdp.mld_disc_params_bestellimiet5)"
+ " )"
: " AND ((fac_functie_code = 'WEB_ORDGOE'"
+ " AND op.mld_opdr_kosten <= mdp.mld_disc_params_bestellimiet2"
+ " AND COALESCE(op.mld_opdr_approved, 0) <= mdp.mld_disc_params_bestellimiet)"
+ " OR (fac_functie_code = 'WEB_ORDGO2'"
+ " AND op.mld_opdr_kosten <= mdp.mld_disc_params_bestellimiet3"
+ " AND COALESCE(op.mld_opdr_approved, 0) <= mdp.mld_disc_params_bestellimiet2)"
+ " OR (fac_functie_code = 'WEB_ORDGO3'"
+ " AND op.mld_opdr_kosten <= mdp.mld_disc_params_bestellimiet4"
+ " AND COALESCE(op.mld_opdr_approved, 0) <= mdp.mld_disc_params_bestellimiet3)"
+ " OR (fac_functie_code = 'WEB_ORDGO4'"
+ " AND op.mld_opdr_kosten <= mdp.mld_disc_params_bestellimiet5"
+ " AND COALESCE(op.mld_opdr_approved, 0) <= mdp.mld_disc_params_bestellimiet4)"
+ " OR (fac_functie_code = 'WEB_ORDGO5'"
+ " AND op.mld_opdr_kosten >= mdp.mld_disc_params_bestellimiet5"
+ " AND COALESCE(op.mld_opdr_approved, 0) <= mdp.mld_disc_params_bestellimiet5)"
+ " )")
: "")
+ " )"
+ " AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
+ " AND m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
+ " AND onrg.alg_gebouw_key = g.alg_gebouw_key(+)"
+ " AND onrg.alg_terreinsector_key = t.alg_terreinsector_key(+)"
+ (fiatstatus == "open"
? " AND op.mld_statusopdr_key = 10"
: " AND mld_opdr_kosten > mdp.mld_disc_params_bestellimiet" // zo duur, moet wel een goedkeur geweest zijn
+ " AND ft.fac_tracking_refkey = op.mld_opdr_key"
+ " AND ft.prs_perslid_key IN (" + (S("mld_opdr_validate_by_substitute") == 0? user_key : prsKeys) + ")"
+ " AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
+ " AND fno.fac_srtnotificatie_code IN"
+ (fiatstatus == "close"
? " ('ORDFOK', 'ORDGOE') AND m.prs_perslid_key != ft.prs_perslid_key" // Als goedkeurder ook de opdracht heeft aangemaakt dan komt opdracht niet in de gefiatteerd lijst. Is niet zo gemakkelijk en zal performance kosten.
: " ('ORDGNO')"))
+ (params.bld_key_arr // sortering op gebouw, locatie of district
? " AND (g.alg_gebouw_key IN (" + params.bld_key_arr.join(",") + ") OR t.alg_terreinsector_key IN (" + params.bld_key_arr.join(",") + "))"
: (params.loc_key_arr
? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
: ""))
+ (params.opdrtype_key
? " AND ot.mld_typeopdr_key = " + params.opdrtype_key
: "")
+ (fiatstatus == "close"
? " AND op.mld_opdr_key NOT IN (" + getSqlFiatMld(fiatstatus, (S("mld_opdr_validate_by_substitute") == 0? user_key : prsKeys), params) + ")"
: "");
return sql;
}
// Offertes die geaccepteerd of afgewezen dienen te worden van meldingen waarvoor nog geen uitvoeringsopdracht is aangemaakt.
function getSqlAccAfwOff(prsKeys, params)
{ // opdrachten: accepten/afwijzen
// Zonder WEB_ORDOAP rechten kom ik hier al niet.
var sql = " SELECT sd.ins_srtdiscipline_prefix || o.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr aanvraagnummer"
+ " , mld_opdr_datumbegin datum"
+ " , pf.prs_perslid_naam_full"
+ " , mld_opdr_kosten bedrag"
+ " , 'OFFERTE' module"
+ " , mld_typeopdr_omschrijving type"
+ " , 'open' fiatstatus"
+ " , o.mld_opdr_key request_key"
+ " , o.mld_statusopdr_key statuskey"
+ " , mld_opdr_einddatum sortdate"
+ " , " + lcl.xsql("td.ins_discipline_omschrijving", "td.ins_discipline_key") + " categorie"
+ " , ' ' fiatteur" // dat kunnen er meerdere met WEB_ORDOAP zijn
+ " , NULL bes_bestelling_parentkey"
+ " , sd.ins_srtdiscipline_prefix prefix"
+ " , COALESCE((SELECT b.prs_bedrijf_naam FROM prs_bedrijf b WHERE b.prs_bedrijf_key = o.mld_uitvoerende_keys),"
+ " COALESCE((SELECT " + S("prs_pers_string") + " FROM prs_perslid p WHERE p.prs_perslid_key = o.mld_uitvoerende_keys),"
+ " '')) uitvoerende"
+ " , CASE "
+ " WHEN l.alg_locatie_key IS NULL"
+ " THEN NULL"
+ " ELSE l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'"
+ " END locatie"
+ " , g.alg_gebouw_code || ' ' || g.alg_gebouw_naam gebouw"
+ " , t.alg_terreinsector_code || ' ' || alg_terreinsector_naam terrein"
+ " , o.mld_opdr_omschrijving omschrijving"
+ " , NULL extra1"
+ " FROM mld_melding m"
+ " , mld_stdmelding sm"
+ " , mld_opdr o"
+ (params.kpgrp_key_arr
? " , prs_kostenplaats k"
+ " , prs_kostenplaatsgrp kpg"
: "")
+ " , mld_typeopdr ot"
+ " , prs_v_perslid_fullnames_all pf"
+ " , ins_tab_discipline td"
+ " , mld_disc_params dp"
+ " , ins_srtdiscipline sd"
+ " , (SELECT o1.mld_melding_key"
+ " , COUNT (o1.mld_opdr_key) aantal_opdrachten"
+ " , MAX(o1.mld_opdr_bedrijfopdr_volgnr) lastopdrachtvolgnr"
+ " FROM mld_opdr o1"
+ " , mld_typeopdr mto"
+ " WHERE o1.mld_typeopdr_key = mto.mld_typeopdr_key"
+ " AND mto.mld_typeopdr_isofferte = 0"
+ " GROUP BY o1.mld_melding_key) opdracht"
+ " , alg_locatie l"
+ " , alg_v_allonroerendgoed onrg"
+ " , alg_v_aanweziggebouw g"
+ " , alg_terreinsector t"
+ " WHERE o.mld_melding_key = m.mld_melding_key"
+ " AND o.mld_typeopdr_key = ot.mld_typeopdr_key"
+ " AND pf.prs_perslid_key = m.prs_perslid_key"
+ " AND m.mld_stdmelding_key = sm.mld_stdmelding_key"
+ (params.kpgrp_key_arr
? " AND COALESCE(o.prs_kostenplaats_key, m.prs_kostenplaats_key) = k.prs_kostenplaats_key(+)"
+ " AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
+ " AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
: "")
+ " AND sm.mld_ins_discipline_key = td.ins_discipline_key"
+ " AND sd.ins_srtdiscipline_key = td.ins_srtdiscipline_key"
+ " AND dp.mld_ins_discipline_key = o.mld_opdr_discipline_key"
+ " AND ot.mld_typeopdr_isofferte = 1"
+ " AND o.mld_melding_key = opdracht.mld_melding_key(+)"
+ " AND (opdracht.aantal_opdrachten IS NULL"
+ " OR opdracht.lastopdrachtvolgnr < o.mld_opdr_bedrijfopdr_volgnr"
+ " OR dp.mld_disc_params_offerteauto = 0)"
+ " AND o.mld_statusopdr_key IN (6)"
+ " AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
+ " AND m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
+ " AND onrg.alg_gebouw_key = g.alg_gebouw_key(+)"
+ " AND onrg.alg_terreinsector_key = t.alg_terreinsector_key(+)"
+ " AND EXISTS(SELECT g.prs_perslid_key"
+ " FROM fac_v_webgebruiker g"
+ " , fac_functie f"
+ " , prs_perslid pzelf"
+ " WHERE g.fac_functie_key = f.fac_functie_key"
+ " AND f.fac_functie_code = 'WEB_ORDBOF'"
+ " AND g.ins_discipline_key = o.mld_opdr_discipline_key"
+ " AND pzelf.prs_perslid_key IN (" + prsKeys + ")"
+ " AND g.prs_perslid_key = pzelf.prs_perslid_key"
+ " AND (g.fac_gebruiker_alg_level_read = -1"
+ " OR (g.fac_gebruiker_alg_level_read < 9"
+ " AND (CASE"
+ " WHEN m.mld_alg_onroerendgoed_keys IS NULL"
+ " AND m.mld_alg_locatie_key IN (SELECT alg_locatie_key"
+ " FROM fac_v_my_locations"
+ " WHERE prs_perslid_key = pzelf.prs_perslid_key"
+ " AND niveau = fac_gebruiker_alg_level_read)"
+ " THEN 1"
+ " WHEN onrg.alg_type = 'T'"
+ " AND m.mld_alg_onroerendgoed_keys IN (SELECT t.alg_terreinsector_key"
+ " FROM fac_v_my_locations l, alg_terreinsector t"
+ " WHERE t.alg_locatie_key = l.alg_locatie_key"
+ " AND l.prs_perslid_key = pzelf.prs_perslid_key"
+ " AND l.niveau = fac_gebruiker_alg_level_read)"
+ " THEN 1"
+ " WHEN onrg.alg_type = 'G'"
+ " AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_gebouw_key"
+ " FROM fac_v_my_buildings"
+ " WHERE prs_perslid_key = pzelf.prs_perslid_key"
+ " AND niveau = fac_gebruiker_alg_level_read)"
+ " THEN 1"
+ " WHEN onrg.alg_type = 'V'"
+ " AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_verdieping_key"
+ " FROM fac_v_my_floors"
+ " WHERE prs_perslid_key = pzelf.prs_perslid_key"
+ " AND niveau = fac_gebruiker_alg_level_read)"
+ " THEN 1"
+ " WHEN onrg.alg_type = 'R'"
+ " AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_ruimte_key"
+ " FROM fac_v_my_rooms"
+ " WHERE prs_perslid_key = pzelf.prs_perslid_key"
+ " AND niveau = fac_gebruiker_alg_level_read)"
+ " THEN 1"
+ " ELSE 0"
+ " END) = 1))"
+ " )"
+ " AND o.mld_opdr_discipline_key IN"
+ " (SELECT DISTINCT wg.ins_discipline_key"
+ " FROM fac_v_webgebruiker wg, fac_functie f"
+ " WHERE f.fac_functie_key = wg.fac_functie_key"
+ " AND f.fac_functie_code = 'WEB_ORDOAP'"
+ " AND wg.fac_gebruiker_alg_level_write < 9"
+ " AND wg.fac_gebruiker_prs_level_write < 9"
+ " AND wg.prs_perslid_key = " + user_key + ")"
+ (params.bld_key_arr // sortering op gebouw/terrein, locatie of district
? " AND (g.alg_gebouw_key IN (" + params.bld_key_arr.join(",") + ") OR t.alg_terreinsector_key IN (" + params.bld_key_arr.join(",") + "))"
: (params.loc_key_arr
? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
: ""))
+ (params.opdrtype_key
? " AND ot.mld_typeopdr_key = " + params.opdrtype_key
: "");
return sql;
}
// Facturen die gefiatteerd moet worden.
function getSqlFiatFin(fiatstatus, prsKeys, params)
{ // Facturen: fiatteren.
// Zonder WEB_FINBOF rechten of zonder dat ik budgethouder ben, kom ik hier al niet.
var scope = getCntScope(params);
var loc_count = "(SELECT COUNT(loc) FROM theScope scope WHERE scope.cnt_key = c.cnt_contract_key)";
var loc_oms = "(SELECT loc_oms FROM theScope scope WHERE scope.cnt_key = c.cnt_contract_key)";
var gebter_oms = "(SELECT gebter_oms FROM theScope scope WHERE scope.cnt_key = c.cnt_contract_key)";
var filterlocatie = (params.dist_key_arr? true : false);
var filter_gebonden = getCntGebonden(params);
var authparamsFINBOF = user.checkAutorisation("WEB_FINBOF", true);
var sql = " WITH theScope AS (" + scope + ")"
+ " SELECT DISTINCT TO_CHAR(f.fin_factuur_key) aanvraagnummer"
+ " , f.fin_factuur_datum datum"
+ " , pf.prs_perslid_naam_full"
+ " , (fin_factuur_totaal + fin_factuur_totaal_btw) bedrag"
+ " , 'FIN' module"
+ " , CASE"
+ " WHEN f.bes_bestelopdr_key IS NOT NULL"
+ " THEN 'Bestelling'"
+ " WHEN f.cnt_contract_key IS NOT NULL"
+ " THEN 'Contract'"
+ " WHEN f.mld_opdr_key IS NOT NULL"
+ " THEN 'Opdracht'"
+ " END type"
+ " , " + safe.quoted_sql(fiatstatus) + " fiatstatus"
+ " , f.fin_factuur_key request_key"
+ " , f.fin_factuur_statuses_key statuskey"
+ " , f.fin_factuur_datum sortdate"
+ " , NULL categorie"
+ (fiatstatus == "open"
? " , ' '"
: " , pf2.prs_perslid_naam_full") + " fiatteur"
+ " , NULL bes_bestelling_parentkey"
+ " , NULL prefix"
+ " , COALESCE((SELECT b.prs_bedrijf_naam FROM prs_bedrijf b WHERE prs_bedrijf_key = COALESCE (o.mld_uitvoerende_keys, c.cnt_prs_bedrijf_key, bo.prs_bedrijf_key)),"
+ " (SELECT " + S("prs_dep_string") + " FROM prs_v_afdeling d WHERE d.prs_afdeling_key = c.cnt_prs_afdeling_key),"
+ " (SELECT " + S("prs_pers_string") + " FROM prs_perslid p WHERE p.prs_perslid_key = c.cnt_prs_perslid_key)) uitvoerende"
+ " , CASE"
+ " WHEN f.bes_bestelopdr_key IS NOT NULL"
+ " THEN (SELECT m.mld_adres_naam FROM mld_v_afleveradres m WHERE m.mld_adres_key IN (bo.mld_adres_key_lev))"
+ " WHEN f.cnt_contract_key IS NOT NULL"
+ " THEN CASE " + loc_count
+ " WHEN 0"
+ " THEN NULL"
+ " WHEN 1"
+ " THEN " + loc_oms
+ " ELSE " + safe.quoted_sql(L("lcl_cnt_locatie_m")) + " || "
+ " ' (' || TO_CHAR(" + loc_count + ") || ')'" // Er kunnen meerdere locaties zijn (contract scope)
+ " END"
+ " WHEN f.mld_opdr_key IS NOT NULL"
+ " THEN CASE "
+ " WHEN l.alg_locatie_key IS NULL"
+ " THEN NULL"
+ " ELSE l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'"
+ " END"
+ " END locatie"
+ " , CASE"
+ " WHEN f.bes_bestelopdr_key IS NOT NULL"
+ " THEN NULL"
+ " WHEN f.cnt_contract_key IS NOT NULL"
+ " THEN CASE " + loc_count
+ " WHEN 1"
+ " THEN TO_CHAR (" + gebter_oms + ")"
+ " ELSE NULL"
+ " END"
+ " WHEN f.mld_opdr_key IS NOT NULL"
+ " THEN g.alg_gebouw_code || ' ' || g.alg_gebouw_naam"
+ " END gebouw"
+ " , CASE"
+ " WHEN f.mld_opdr_key IS NOT NULL"
+ " THEN t.alg_terreinsector_code || ' ' || alg_terreinsector_naam"
+ " ELSE NULL" // f.bes_bestelopdr_key IS NOT NULL en f.cnt_contract_key IS NOT NULL
+ " END terrein"
+ " , NULL omschrijving"
+ " , NULL extra1"
+ " FROM (SELECT fin.getfiatteur(f.fin_factuur_key) budgethouder, f.* from fin_factuur f) f"
+ " , prs_v_perslid_fullnames_all pf"
+ " , bes_bestelopdr bo"
+ " , mld_opdr o"
+ (params.kpgrp_key_arr
? " , bes_bestelopdr_item boi"
+ " , bes_bestelling_item bi"
+ " , bes_bestelling b"
+ " , prs_kostenplaats k"
+ " , prs_kostenplaatsgrp kpg"
: "")
+ " , mld_melding m"
+ " , cnt_contract c"
+ " , alg_locatie l"
+ " , alg_v_allonroerendgoed onrg"
+ " , alg_v_aanweziggebouw g"
+ " , alg_terreinsector t"
+ (filterlocatie
? ", cnt_contract_plaats cp"
: "")
+ (fiatstatus != "open"
? " , fac_tracking ft"
+ " , fac_srtnotificatie fno"
+ " , prs_v_perslid_fullnames_all pf2"
: "")
+ " WHERE f.prs_perslid_key_user = pf.prs_perslid_key(+)"
+ " AND f.bes_bestelopdr_key = bo.bes_bestelopdr_key(+)"
+ " AND f.mld_opdr_key = o.mld_opdr_key(+)" // vast staat in welke tak we zitten
+ " AND o.mld_melding_key = m.mld_melding_key(+)"
+ (params.kpgrp_key_arr
? " AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key(+)"
+ " AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key(+)"
+ " AND bi.bes_bestelling_key = b.bes_bestelling_key(+)"
+ " AND COALESCE(o.prs_kostenplaats_key, c.prs_kostenplaats_key, b.prs_kostenplaats_key) = k.prs_kostenplaats_key(+)"
+ " AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
+ " AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
: "")
+ " AND f.cnt_contract_key = c.cnt_contract_key(+)"
+ " AND f.fin_factuur_verwijder IS NULL"
// Ik kan facturen fiatteren als: 1) ik heb ALG write rechten (WEB_FINBOF) op
// a) het afleveradres van de locatie van de bestelling
// b) de plaats van de bijbehorende melding van de opdracht OF
// 2) ik ben budgethouder van de BrOC-kostenplaats (BrOC = Bestelling, /*reservering*/, Opdracht, Contract)
// "AND (" + sql1a + " OR " + sql1b + " OR " + sql2 + " OR " + sql3 + ")"
+ " AND ("
+ (authparamsFINBOF && authparamsFINBOF.ALGwritelevel > -1
? // 1a) Heb ik ALG write rechten (WEB_FINBOF) op het afleveradres van de locatie van de bestelling?
" (f.bes_bestelopdr_key IS NOT NULL "
+ " AND bo.mld_adres_key_lev IN (SELECT ma.mld_adres_key"
+ " FROM mld_v_afleveradres ma"
+ " WHERE ma.alg_locatie_key IN (SELECT alg_locatie_key"
+ " FROM fac_v_my_locations"
+ " WHERE prs_perslid_key IN (" + prsKeys + ")"
+ " AND niveau = " + authparamsFINBOF.ALGwritelevel + ")))"
// 1b) Heb ik ALG write rechten (WEB_FINBOF) op de plaats van de bijbehorende melding van de opdracht?
+ " OR (f.mld_opdr_key IS NOT NULL "
+ " AND ((onrg.alg_type = 'R' "
+ " AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_ruimte_key"
+ " FROM fac_v_my_rooms"
+ " WHERE prs_perslid_key IN (" + prsKeys + ")"
+ " AND niveau = " + authparamsFINBOF.ALGwritelevel + "))"
+ " OR (onrg.alg_type = 'V'"
+ " AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_verdieping_key"
+ " FROM fac_v_my_floors"
+ " WHERE prs_perslid_key IN (" + prsKeys + ")"
+ " AND niveau = " + authparamsFINBOF.ALGwritelevel + "))"
+ " OR (onrg.alg_type = 'G'"
+ " AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_gebouw_key"
+ " FROM fac_v_my_buildings"
+ " WHERE prs_perslid_key IN (" + prsKeys + ")"
+ " AND niveau = " + authparamsFINBOF.ALGwritelevel + "))"
+ " OR (onrg.alg_type = 'T'"
+ " AND m.mld_alg_onroerendgoed_keys IN (SELECT t.alg_terreinsector_key"
+ " FROM fac_v_my_locations l, alg_terreinsector t"
+ " WHERE t.alg_locatie_key = l.alg_locatie_key"
+ " AND l.prs_perslid_key IN (" + prsKeys + ")"
+ " AND l.niveau = " + authparamsFINBOF.ALGwritelevel + "))"
+ " OR (m.mld_alg_onroerendgoed_keys IS NULL"
+ " AND m.mld_alg_locatie_key IN (SELECT alg_locatie_key"
+ " FROM fac_v_my_locations"
+ " WHERE prs_perslid_key IN (" + prsKeys + ")"
+ " AND niveau = " + authparamsFINBOF.ALGwritelevel + "))"
+ " )"
+ " )"
// 1c) Heb ik ALG write rechten (WEB_FINBOF) op de plaats van het bijbehorende contract?
+ " OR (f.cnt_contract_key IS NOT NULL"
+ " AND EXISTS"
+ " (SELECT cp.CNT_ALG_PLAATS_KEY, cp.CNT_ALG_PLAATS_CODE"
+ " FROM cnt_v_aanwezigcontract_plaats cp"
+ " WHERE cp.cnt_contract_key = f.cnt_contract_key"
+ " AND cp.cnt_contract_plaats_key = COALESCE(f.cnt_contract_plaats_key, cp.cnt_contract_plaats_key)"
+ " AND ((cp.cnt_alg_plaats_code = 'G'"
+ " AND cp.cnt_alg_plaats_key IN (SELECT alg_gebouw_key"
+ " FROM fac_v_my_buildings"
+ " WHERE prs_perslid_key IN (" + prsKeys + ")"
+ " AND niveau = " + authparamsFINBOF.ALGwritelevel + "))"
+ " OR (cp.cnt_alg_plaats_code = 'L'"
+ " AND cp.cnt_alg_plaats_key IN (SELECT alg_locatie_key"
+ " FROM fac_v_my_locations"
+ " WHERE prs_perslid_key IN (" + prsKeys + ")"
+ " AND niveau = " + authparamsFINBOF.ALGwritelevel + "))"
+ " ))"
+ " )"
: (authparamsFINBOF && authparamsFINBOF.ALGwritelevel == -1
? " 1 = 1" // Volledige FINBOF rechten
: " 1 = 0")) // Geen enkele FINBOF rechten
// 2) Ben ik budgethouder van de BrOC-kostenplaats?
+ " OR (budgethouder IN (" + prsKeys + "))"
+ ")"
+ (params.opdrtype_key
? " AND o.mld_typeopdr_key = " + params.opdrtype_key
: "")
+ (fiatstatus == "open"
? " AND f.fin_factuur_statuses_key IN (2)"
//+ " AND f.prs_perslid_key_goedkeur IN (" + prsKeys + ")"
: " AND ft.fac_tracking_refkey = f.fin_factuur_key"
+ " AND ft.prs_perslid_key = pf2.prs_perslid_key"
+ " AND ft.prs_perslid_key IN (" + prsKeys + ")" // Alleen die facturen die ik zelf (ook als vervanger) kon fiatteren/afkeuren.
+ " AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
+ " AND fno.fac_srtnotificatie_code IN"
+ (fiatstatus == "close"
? " ('FINGOE')"
: " ('FINFNO')"))
+ " AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
+ " AND m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
+ " AND onrg.alg_gebouw_key = g.alg_gebouw_key(+)"
+ " AND onrg.alg_terreinsector_key = t.alg_terreinsector_key(+)"
+ (filterlocatie
? " AND c.cnt_contract_key = cp.cnt_contract_key(+)"
+ " AND cp.cnt_alg_plaats_code(+) IN ('G', 'L', 'T')"
: "");
// Locatie, Gebouw of Terrein filtering.
// Als bld_key_arr een geldige waarde heeft, hebben loc_key_arr en dist_key_arr ook een geldige waarde.
if (params.dist_key_arr)
{
var loc_key_arr = params.loc_key_arr;
var bld_key_arr = params.bld_key_arr;
// Als alleen dist_key_arr bekend is dan zoeken voor alle locaties (loc_key_arr) bij deze districten (dist_key_arr).
// 1) Het afleveradres van de locatie van de bestelling (bld_key_arr is niet bekend/gedefinieerd)
sql1 = " (f.bes_bestelopdr_key IS NOT NULL "
+ " AND bo.mld_adres_key_lev IN ("
+ "SELECT m.mld_adres_key"
+ " FROM mld_v_afleveradres m"
+ " WHERE m.alg_locatie_key IN (" + loc_key_arr.join(",") + ")))";
// 2) De plaats van de bijbehorende melding van de opdracht
sql2 = " (f.mld_opdr_key IS NOT NULL "
+ " AND EXISTS (SELECT m.mld_melding_key"
+ " FROM alg_v_allonroerendgoed onrg"
+ " WHERE m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
+ " AND onrg.alg_locatie_key IN (" + loc_key_arr.join(",") + ")"
+ (bld_key_arr
? " AND ( (onrg.alg_gebouw_key IN (" + bld_key_arr.join(",") + "))"
+ " OR (onrg.alg_terreinsector_key IN (" + bld_key_arr.join(",") + "))"
+ " )"
: "")
+ " ))";
// Locatie/gebouw scope van het contract
sql3 = " (c.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 (" + loc_key_arr.join(",") + "))";
if (bld_key_arr)
{
sql3 += " OR (cnt_alg_plaats_code = 'G' AND cnt_alg_plaats_key IN (" + bld_key_arr.join(",") + "))"
+ " OR (cnt_alg_plaats_code = 'T' AND cnt_alg_plaats_key IN (" + bld_key_arr.join(",") + "))";
}
else
{
sql3 += " 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 (" + loc_key_arr.join(",") + "))"
+ " 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 (" + loc_key_arr.join(",") + ")))";
}
sql3 += " 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 (" + loc_key_arr.join(",") + ")))";
sql += "AND (" + sql1 + " OR " + sql2 + " OR " + sql3 + ")";
}
return " SELECT * FROM (" + sql + ")";
}
// Facturen die goedgekeurd moet worden nadat ze gefiatteerd zijn geworden
function getSqlGoedkeurFin(fiatstatus, prsKeys, params)
{ // Facturen: goedkeuren
// Zonder WEB_FINGOE rechten kom ik hier al niet.
var sql = " SELECT TO_CHAR(f.fin_factuur_key) aanvraagnummer"
+ " , f.fin_factuur_datum datum"
+ " , pf.prs_perslid_naam_full"
+ " , (fin_factuur_totaal + fin_factuur_totaal_btw) bedrag"
+ " , 'FIN2' module"
+ " , CASE"
+ " WHEN f.bes_bestelopdr_key IS NOT NULL"
+ " THEN 'Bestelling'"
+ " WHEN f.cnt_contract_key IS NOT NULL"
+ " THEN 'Contract'"
+ " WHEN f.mld_opdr_key IS NOT NULL"
+ " THEN 'Opdracht'"
+ " END type"
+ " , " + safe.quoted_sql(fiatstatus) + " fiatstatus"
+ " , f.fin_factuur_key request_key"
+ " , f.fin_factuur_statuses_key statuskey"
+ " , f.fin_factuur_datum sortdate"
+ " , NULL categorie"
+ " , pf2.prs_perslid_naam_full fiatteur"
+ " , NULL bes_bestelling_parentkey"
+ " , NULL prefix"
+ " , NULL uitvoerende"
+ " , CASE"
+ " WHEN f.mld_opdr_key IS NOT NULL"
+ " THEN CASE "
+ " WHEN l.alg_locatie_key IS NULL"
+ " THEN NULL"
+ " ELSE l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'"
+ " END"
+ " ELSE NULL"
+ " END locatie"
+ " , CASE"
+ " WHEN f.mld_opdr_key IS NOT NULL"
+ " THEN g.alg_gebouw_code || ' ' || g.alg_gebouw_naam"
+ " ELSE NULL"
+ " END gebouw"
+ " , CASE"
+ " WHEN f.mld_opdr_key IS NOT NULL"
+ " THEN t.alg_terreinsector_code || ' ' || alg_terreinsector_naam"
+ " ELSE NULL" // f.bes_bestelopdr_key IS NOT NULL en f.cnt_contract_key IS NOT NULL
+ " END terrein"
+ " , NULL omschrijving"
+ " , NULL extra1"
+ " FROM fin_factuur f"
+ " , mld_opdr o"
+ " , mld_melding m"
+ " , alg_locatie l"
+ " , alg_v_allonroerendgoed onrg"
+ " , alg_v_aanweziggebouw g"
+ " , alg_terreinsector t"
+ (params.kpgrp_key_arr
? " , cnt_contract c"
+ " , bes_bestelopdr bo"
+ " , bes_bestelopdr_item boi"
+ " , bes_bestelling_item bi"
+ " , bes_bestelling b"
+ " , prs_kostenplaats k"
+ " , prs_kostenplaatsgrp kpg"
: "")
+ " , prs_v_perslid_fullnames_all pf"
+ " , prs_v_perslid_fullnames_all pf2"
+ (fiatstatus != "open"
? " , fac_tracking ft"
+ " , fac_srtnotificatie fno"
: "")
+ " WHERE f.prs_perslid_key_user = pf.prs_perslid_key(+)"
+ " AND f.prs_perslid_key_goedkeur = pf2.prs_perslid_key"
+ " AND f.mld_opdr_key = o.mld_opdr_key(+)"
+ " AND o.mld_melding_key = m.mld_melding_key(+)"
+ " AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
+ " AND m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
+ " AND onrg.alg_gebouw_key = g.alg_gebouw_key(+)"
+ " AND onrg.alg_terreinsector_key = t.alg_terreinsector_key(+)"
+ (params.kpgrp_key_arr
? " AND f.cnt_contract_key = c.cnt_contract_key(+)"
+ " AND f.bes_bestelopdr_key = bo.bes_bestelopdr_key(+)"
+ " AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key(+)"
+ " AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key(+)"
+ " AND bi.bes_bestelling_key = b.bes_bestelling_key(+)"
+ " AND COALESCE(c.prs_kostenplaats_key, o.prs_kostenplaats_key, b.prs_kostenplaats_key) = k.prs_kostenplaats_key(+)"
+ " AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
+ " AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
: "")
+ (fiatstatus == "open"
? " AND f.fin_factuur_statuses_key IN (5)"
+ " AND f.prs_perslid_key_goedkeur IN (" + prsKeys + ")"
: " AND ft.fac_tracking_refkey = f.fin_factuur_key"
+ " AND ft.prs_perslid_key IN (" + prsKeys + ")" // Alleen die facturen die ik zelf (ook als vervanger) kon goedkeuren/afkeuren.
+ " AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
+ " AND fno.fac_srtnotificatie_code IN"
+ (fiatstatus == "close"
? " ('FINFOK')"
: " ('FINGNO')")
+ " AND f.prs_perslid_key_goedkeur = ft.prs_perslid_key"); // Goedkeurder heeft goedgekeurd/afgekeurd.
return sql;
}
function getSqlFiatRes(fiatstatus, prsKeys, params)
{ // Reserveringen: catalogus artikelen fiatteren.
var sql = "SELECT aanvraagnummer"
+ " , datum"
+ " , prs_perslid_naam_full"
+ " , SUM(bedrag) bedrag"
+ " , module"
+ " , type"
+ " , fiatstatus"
+ " , request_key"
+ " , statuskey"
+ " , sortdate"
+ " , MIN(categorie) || CASE WHEN MIN(categorie) != MAX(categorie) THEN '...' ELSE '' END categorie"
+ " , fiatteur"
+ " , bes_bestelling_parentkey"
+ " , prefix"
+ " , uitvoerende"
+ " , locatie"
+ " , gebouw"
+ " , terrein"
+ " , omschrijving"
+ " , extra1"
+ " FROM (SELECT DISTINCT TO_CHAR(COALESCE(rsact.res_srtactiviteit_prefix, '') || rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr) aanvraagnummer"
+ " , rrr.res_rsv_ruimte_aanmaak datum"
+ " , p.prs_perslid_naam_full"
+ " , ( SELECT SUM(res.getartikelprijs(ra1.res_rsv_artikel_key))"
+ " FROM res_rsv_artikel ra1"
+ " , res_rsv_ruimte rr1"
+ " , res_artikel a1"
+ " , res_discipline d1"
+ " WHERE ra1.res_rsv_ruimte_key = rr1.res_rsv_ruimte_key"
+ " AND rr1.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key"
+ " AND ra1.res_artikel_key = a1.res_artikel_key"
+ " AND d1.ins_discipline_key = a1.res_discipline_key"
+ " AND ra1.res_rsv_artikel_verwijder IS NULL"
+ " AND d1.ins_discipline_key = d.ins_discipline_key"
+ " GROUP BY d.ins_discipline_key) bedrag"
+ " , 'RES' module"
+ " , 'mld_typeopdr_omschrijving' type"
+ " , " + safe.quoted_sql(fiatstatus) + " fiatstatus"
+ " , rrr.res_rsv_ruimte_key request_key"
+ " , COALESCE(rrr.res_status_bo_key, rra.res_status_bo_key) statuskey"
+ " , rrr.res_rsv_ruimte_aanmaak sortdate"
+ " , " + lcl.xsql("d.ins_discipline_omschrijving", "d.ins_discipline_key") + " categorie"
+ " , (SELECT p2.prs_perslid_naam_full"
+ " FROM prs_v_perslid_fullnames_all p2"
+ " WHERE p2.prs_perslid_key = k.prs_perslid_key) fiatteur"
+ " , NULL bes_bestelling_parentkey"
+ " , NULL prefix"
+ " , NULL uitvoerende"
+ " , l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')' locatie"
+ " , aog.alg_gebouw_code || ' ' || aog.alg_gebouw_naam gebouw"
+ " , NULL terrein" // Terrein heeft geen ruimte /*(aog.alg_terreinsector_code || ' ' || aog.alg_terreinsector_naam terrein)*/
+ " , res_rsv_ruimte_omschrijving omschrijving"
+ " , NULL extra1"
+ " FROM res_rsv_ruimte rrr"
+ " , res_rsv_artikel rra"
+ " , res_artikel ra"
+ " , res_ruimte_opstelling rro"
+ " , res_ruimte rr"
+ " , res_v_aanwezigalg_ruimte rar"
+ " , alg_v_allonrgoed_gegevens aog"
+ " , alg_locatie l"
+ " , res_discipline d"
+ " , res_disc_params dp"
+ " , prs_v_perslid_fullnames_all p"
+ " , prs_kostenplaats k"
+ " , res_activiteit ract"
+ " , res_srtactiviteit rsact"
+ " WHERE rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key"
+ " AND rra.res_artikel_key = ra.res_artikel_key"
+ " AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)"
+ " AND rro.res_ruimte_key = rr.res_ruimte_key(+)"
+ " AND rr.res_ruimte_key = rar.res_ruimte_key(+)"
+ " AND aog.alg_ruimte_key = COALESCE(rrr.alg_ruimte_key, rar.alg_ruimte_key)"
+ " AND aog.alg_locatie_key = l.alg_locatie_key"
+ " AND d.ins_discipline_key = ra.res_discipline_key"
+ " AND d.ins_discipline_key = dp.res_ins_discipline_key"
+ " AND rrr.res_rsv_ruimte_contact_key = p.prs_perslid_key"
+ " AND rrr.prs_kostenplaats_key = k.prs_kostenplaats_key"
+ " AND rrr.res_activiteit_key = ract.res_activiteit_key"
+ " AND ract.res_srtactiviteit_key = rsact.res_srtactiviteit_key"
+ " AND rrr.res_rsv_ruimte_verwijder IS NULL"
// Welke artikelen moeten/kunnen gefiatteerd worden?
// 1) Dan moeten er artikelregels gevonden zijn die nog niet gefiatteerd zijn (res_rsv_artikel_approved = 0).
// 2) De BO status (res_status_bo_key) moet Nieuw(2) zijn (COALESCE(res_rsv_ruimte.res_status_bo_key, res_rsv_artikel.res_status_bo_key) = 2).
// Als de BO status al Afgemeld(5) is of Verwerkt(6) dan is de reservering al voorbij en heeft fiattering geen zin meer.
// 3) Dan moet gelden dat de artikelen in de catalogus gefiatteerd dienen te worden (res_rsv_ruimte_cat_appr == 1)
// Tijdens het opslaan wordt gekeken of er catalogussen zijn met een totaal bestelbedrag die boven de drempelwaarde ligt.
// Afhankelijk daarvan wordt de waarde res_rsv_ruimte_cat_appr op 0=Nee of 1=Ja gezet (Wel of niet fiatteren).
// 4) Ben ik de budgethouder van de kostenplaats van de reservering?
+ (fiatstatus == "open"
? " AND rra.res_rsv_artikel_approved = 0" // 1) Er zijn niet gefiatteerde artikelregels.
+ " AND COALESCE(rrr.res_status_bo_key, rra.res_status_bo_key) = 2" // 2) De BO status is Nieuw(2).
: (fiatstatus == "close"
? " AND rra.res_rsv_artikel_approved = 1" // 1) Er zijn gefiatteerde artikelregels.
: " AND rra.res_rsv_artikel_approved = 2")) // 1) Er zijn afgewezen artikelregels.
+ " AND rrr.res_rsv_ruimte_cat_appr = 1" // 3) De artikelen in de catalogus dienen gefiatteerd te worden (res_rsv_ruimte_cat_appr == 1).
+ " AND k.prs_perslid_key IN (" + prsKeys + ")" // 4) Alleen reserveringen waarvan ik budgethouder (kostenplaatsverantwoordelijke) ben.
+ " )"
+ " GROUP BY aanvraagnummer"
+ " , datum"
+ " , prs_perslid_naam_full"
+ " , module"
+ " , type"
+ " , fiatstatus"
+ " , request_key"
+ " , statuskey"
+ " , sortdate"
+ " , fiatteur"
+ " , bes_bestelling_parentkey"
+ " , prefix"
+ " , uitvoerende"
+ " , locatie"
+ " , gebouw"
+ " , terrein"
+ " , omschrijving"
+ " , extra1";
return sql;
}
function getSqlInstemMld(fiatstatus, prsKeys, params)
{ // Meldingen: in te stemmen.
var sql = "SELECT sd.ins_srtdiscipline_prefix || m.mld_melding_key aanvraagnummer"
+ " , m.mld_melding_datum datum"
+ " , pf.prs_perslid_naam_full"
+ " , NULL bedrag"
+ " , 'MLDIN' module"
+ " , sm.mld_stdmelding_omschrijving type"
+ " , 'open' fiatstatus" // per definitie
+ " , m.mld_melding_key request_key"
+ " , m.mld_melding_status statuskey"
+ " , mld_melding_datum sortdate"
+ " , " + lcl.xsql("di.ins_discipline_omschrijving", "di.ins_discipline_key") + " categorie"
+ (fiatstatus == "open"
? " , pf2.prs_perslid_naam_full"
: " , ''") + " fiatteur"
+ " , NULL bes_bestelling_parentkey"
+ " , sd.ins_srtdiscipline_prefix prefix"
+ " , NULL uitvoerende"
+ " , alg_locatie_omschrijving locatie"
+ " , alg_gebouw_naam gebouw"
+ " , alg_terreinsector_naam terrein"
+ " , mld_melding_onderwerp omschrijving"
+ " , mld_melding_conceptstatus extra1" // teveel
+ " FROM mld_melding m"
+ " , mld_stdmelding sm"
+ " , ins_tab_discipline di"
+ " , ins_srtdiscipline sd"
+ " , prs_v_perslid_fullnames_all pf"
+ " , alg_v_allonrgoed_gegevens v"
+ " , alg_locatie l"
+ (fiatstatus == "open"
? " , prs_v_perslid_fullnames_all pf2"
: ""
)
+ " WHERE m.prs_perslid_key_voor = pf.prs_perslid_key"
+ " AND m.mld_alg_onroerendgoed_keys = v.alg_onroerendgoed_keys(+)"
+ " AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
+ " AND m.mld_stdmelding_key = sm.mld_stdmelding_key"
+ " AND sd.ins_srtdiscipline_key = di.ins_srtdiscipline_key"
+ " AND sm.mld_ins_discipline_key = di.ins_discipline_key"
+ (fiatstatus == "open"
? " AND mld_melding_status = 2"
+ " AND mld_melding_conceptstatus > 0"
+ " AND pf2.prs_perslid_key = mld.getinstemmer(m.mld_melding_key)"
+ " AND pf2.prs_perslid_key IN (" + prsKeys + ")" // Alleen mijn instemmingen
: " AND EXISTS (SELECT ft.fac_tracking_key"
+ " FROM fac_tracking ft"
+ " , fac_srtnotificatie fno"
+ " WHERE ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
+ " AND ft.fac_tracking_refkey = m.mld_melding_key"
+ " AND ft.prs_perslid_key IN (" + prsKeys + ")"
+ (fiatstatus == "close"
? " AND fno.fac_srtnotificatie_code IN ('MLDUPD')"
+ " AND ft.fac_tracking_datum <= (SELECT MIN(ft2.fac_tracking_datum)"
+ " FROM fac_tracking ft2"
+ " , fac_srtnotificatie fno2"
+ " WHERE ft2.fac_srtnotificatie_key = fno2.fac_srtnotificatie_key"
+ " AND ft2.fac_tracking_refkey = m.mld_melding_key"
+ " AND fno2.fac_srtnotificatie_code IN ('MLDNEW')"
+ " )"
: " AND fno.fac_srtnotificatie_code IN ('MLDREJ')"
)
+ " )"
);
return sql;
}
// Uit alle sql-definities hierboven wordt hier het uiteindelijke totale query samengesteld en opgeleverd
// waarbij onnodige delen worden weggelaten. Dat gebeurt met UNION ALL, dus al die query-functies moeten
// een gelijkvormig resultaat opleveren in termen van kolommen, namen en volgorde, en wel deze:
//
// aanvraagnummer
// datum
// prs_perslid_naam_full
// bedrag
// module
// type
// fiatstatus
// request_key
// statuskey
// sortdate
// categorie
// fiatteur
// bes_bestelling_parentkey
// prefix
// uitvoerende
// locatie
// gebouw
// terrein
// omschrijving
// extra1 (ruimte om specifiek nog wat op te leveren, type=numeriek vooralsnog
//
function fiattering_sql(params)
{
var haveORDOAPrights = user.checkAutorisation("WEB_ORDOAP", true); // Heb ik WEB_ORDOAP rechten om offertes te accepteren/af te wijzen.
var haveFINBOFrights = user.checkAutorisation("WEB_FINBOF", true); // Heb ik WEB_FINBOF rechten om facturen te fiatteren/af te wijzen.
var haveFINGOErights = user.checkAutorisation("WEB_FINGOE", true); // Heb ik WEB_FINGOE rechten om facturen goed te keuren/af te wijzen.
var prsKeys = user.collegakeylist();
params.betreft = params.betreft || [];
// Betreft hoofdletter onafhankelijk maken.
for (var i = 0; i < params.betreft.length; i++)
{
params.betreft[i] = params.betreft[i].toUpperCase();
}
var sqls = [];
if (params.opdrtype_key)
{ // Er wordt gezocht naar een opdrachttype, die bestaan alleen voor offertes, opdrachten en eventueel bij facturen van opdrachten.
// Verwijder "BES" uit de betreft array.
for (var i = 0; i < params.betreft.length; i++)
{
if (params.betreft[i] == "BES")
params.betreft.splice(i, 1);
}
// Verwijder "CNT" uit de betreft array.
for (var i = 0; i < params.betreft.length; i++)
{
if (params.betreft[i] == "CNT")
params.betreft.splice(i, 1);
}
}
// Ben ik budgethouder van de kostenplaats of de kostenplaatsgroep?
// Alleen als budgethouder van de kostenplaats(groep) kan ik bestellingen en meldingsopdrachten fiatteren anders hoef ik niet eens te kijken.
// Als budgethouder van de kostenplaats(groep) kan ik misschien ook facturen fiatteren.
var sqlkp = "SELECT COUNT(*) aantal"
+ " FROM prs_kostenplaats k"
+ " WHERE k.prs_perslid_key IN (" + prsKeys + ")";
var sqlkpg = "SELECT COUNT(*) aantal"
+ " FROM prs_kostenplaatsgrp kg"
+ " WHERE kg.prs_perslid_key IN (" + prsKeys + ")"
+ " OR prs_kostenplaatsgrp_fiat2_key IN (" + prsKeys + ")"
+ " OR prs_kostenplaatsgrp_fiat3_key IN (" + prsKeys + ")";
var sqlbud = "SELECT SUM (aantal) aantal"
+ " FROM (" + sqlkp + " UNION " + sqlkpg + ")";
var oRsbud = Oracle.Execute(sqlbud);
var benBudgethouder = oRsbud("aantal").Value > 0;
oRsbud.Close();
var alleModules = params.betreft.length == 0;
if (benBudgethouder && (inArray("BES", params.betreft) || alleModules))
{
// Sql gedeelte voor bestellingen (BES) ophalen.
if (params.getopen)
sqls.push(getSqlFiatBes("open", prsKeys, params)); // Te fiatteren
if (params.getclosed)
sqls.push(getSqlFiatBes("close", prsKeys, params)); // Gefiatteerd
if (params.getrejected)
sqls.push(getSqlFiatBes("reject", prsKeys, params)); // Afgewezen
}
if (inArray("CNT", params.betreft) || alleModules)
{
// Sql gedeelte voor contracten (CNT) ophalen.
if (params.getopen)
{
// Heb ik enige goedkeur rechten anders hoef ik niet eens te kijken.
var haveCNTGOErights = user.checkAutorisation(["WEB_CNTGO1", "WEB_CNTGO2", "WEB_CNTGO3", "WEB_CNTGO4", "WEB_CNTGO5"], true);
if (haveCNTGOErights)
sqls.push(getSqlFiatCnt("open", prsKeys, params)); // Ter goedkeuring
}
if (params.getclosed)
sqls.push(getSqlFiatCnt("close", prsKeys, params)); // Goedgekeurd
if (params.getrejected)
sqls.push(getSqlFiatCnt("reject", prsKeys, params)); // Afgewezen
}
if (inArray("MLDIN", params.betreft) || alleModules)
{
if (params.getopen)
sqls.push(getSqlInstemMld("open", prsKeys, params)); // In te stemmen.
if (params.getclosed)
sqls.push(getSqlInstemMld("close", prsKeys, params)); // Ingestemd.
if (params.getrejected)
sqls.push(getSqlInstemMld("reject", prsKeys, params)); // Afgewezen.
}
if (inArray("MLDOP", params.betreft) || alleModules)
{
if(benBudgethouder)
{
// Sql gedeelte voor meldingsopdrachten (MLD) ophalen.
if (params.getopen)
sqls.push(getSqlFiatMld("open", prsKeys, params)); // Te fiatteren
if (params.getclosed)
sqls.push(getSqlFiatMld("close", prsKeys, params)); // Gefiatteerd
if (params.getrejected)
sqls.push(getSqlFiatMld("reject", prsKeys, params)); // Afgewezen
}
// Heb ik enige goedkeur rechten anders hoef ik niet eens te kijken.
var haveORDGOErights = user.checkAutorisation(["WEB_ORDGOE", "WEB_ORDGO2", "WEB_ORDGO3", "WEB_ORDGO4", "WEB_ORDGO5"], true);
if (haveORDGOErights)
{
// Sql gedeelte voor goedkeur meldingen (MLD) ophalen.
if (params.getopen)
sqls.push(getSqlGoedkeurMld("open", prsKeys, params)); // Goed te keuren
if (params.getclosed)
sqls.push(getSqlGoedkeurMld("close", prsKeys, params)); // Gefiatteerd
if (params.getrejected)
sqls.push(getSqlGoedkeurMld("reject", prsKeys, params)); // Afgewezen
}
}
if (inArray("MLDOF", params.betreft) || alleModules)
{ // Werken we uberhaubt met offeretes?
var sqloff = "SELECT COUNT(*) aantal"
+ " FROM mld_typeopdr"
+ " WHERE mld_typeopdr_isofferte = 1";
var oRsoff = Oracle.Execute(sqloff);
var haveOffertes = oRsoff("aantal").Value > 0;
oRsoff.Close();
// Heb ik WEB_ORDOAP rechten? Zonder deze rechten kan ik offertes toch niet accepteren/afwijzen.
if (haveOffertes && haveORDOAPrights && params.getopen)
sqls.push(getSqlAccAfwOff(prsKeys, params)); // Te accepteren/Af te wijzen offertes (offerte opdrachten) van meldingen waarvoor nog geen uitvoeringsopdracht is aangemaakt.
}
if (inArray("FIN", params.betreft) || alleModules)
{ // Heb ik WEB_FINBOF rechten? Zonder deze rechten kan ik facturen toch niet fiatteren/afwijzen.
if (haveFINBOFrights || benBudgethouder)
{
// Sql gedeelte voor fiatteren facturen (FIN) ophalen.
if (params.getopen)
sqls.push(getSqlFiatFin("open", prsKeys, params)); // Te fiatteren
if (params.getclosed)
sqls.push(getSqlFiatFin("close", prsKeys, params)); // Gefiatteerd
if (params.getrejected)
sqls.push(getSqlFiatFin("reject", prsKeys, params)); // Afgewezen
}
if (haveFINGOErights)
{// Heb ik WEB_FINGOE rechten? Zonder deze rechten kan ik nooit als goedkeurder worden aangewezen/geselecteerd.
// Sql gedeelte voor goedkeuren facturen (FIN) ophalen.
if (params.getopen)
sqls.push(getSqlGoedkeurFin("open", prsKeys, params)); // Ter goedkeuring
if (params.getclosed)
sqls.push(getSqlGoedkeurFin("close", prsKeys, params)); // Goedgekeurd
if (params.getrejected)
sqls.push(getSqlGoedkeurFin("reject", prsKeys, params)); // Afgewezen
}
}
if (benBudgethouder && (inArray("RES", params.betreft) || alleModules))
{
// Sql gedeelte voor reserveringen (RES) ophalen.
if (params.getopen)
sqls.push(getSqlFiatRes("open", prsKeys, params)); // Te fiatteren
if (params.getclosed)
sqls.push(getSqlFiatRes("close", prsKeys, params)); // Gefiatteerd
if (params.getrejected)
sqls.push(getSqlFiatRes("reject", prsKeys, params)); // Afgewezen
}
if (sqls.length == 0)
sql = "SELECT '1' aanvraagnummer, '2' sortdate FROM DUAL WHERE 1=0 ORDER BY sortdate, aanvraagnummer ASC"; // Geen resultaat.
else if (params.groupbymodule) {
for (var i = 0; i < sqls.length; i++) {
sqls[i] = "SELECT module module_code"
+ " , DECODE(module"
+ ", 'BES', " + safe.quoted_sql(L("lcl_fin_bestellingen"))
+ ", 'CNT', " + safe.quoted_sql(L("lcl_fin_contracten"))
+ ", 'MLD', " + safe.quoted_sql(L("lcl_fin_opdrachten"))
+ ", 'GOED', " + safe.quoted_sql(L("lcl_fin_opdrachten"))
+ ", 'OFFERTE', " + safe.quoted_sql(L("lcl_fin_offertes"))
+ ", 'FIN', " + safe.quoted_sql(L("lcl_fin_invoices"))
+ ", 'FIN2', " + safe.quoted_sql(L("lcl_fin_invoices"))
+ ", 'RES', " + safe.quoted_sql(L("lcl_fin_catering_order"))
+ ", 'MLDIN', " + safe.quoted_sql(L("lcl_mld_concepten")) + ") module"
+ " , COUNT(*) aantal"
+ " FROM (" + sqls[i] + ")"
+ " GROUP BY module";
sql = "SELECT * FROM (" + sqls.join(" UNION ALL ") + ")";
}
} else {
sql = "SELECT * FROM (" + sqls.join(" UNION ALL ") + ") ORDER BY sortdate, aanvraagnummer ASC";
}
return sql;
}
%>