DJIN#41674: DJIN - BES/INS: Objecten vanuit bestellingen kunnen aanmaken.

svn path=/Website/trunk/; revision=36896
This commit is contained in:
Maykel Geerdink
2018-02-08 13:25:14 +00:00
parent e4e3271ed5
commit ebe7c710a9
7 changed files with 169 additions and 85 deletions

View File

@@ -20,6 +20,7 @@
<!-- #include file="../shared/budget.inc" -->
<!-- #include file="../shared/kpl_ksrt_validate.inc" -->
<!-- #include file="../mld/mld.inc" -->
<!-- #include file="../prs/prs.inc" -->
<!-- #include file="./model_notes.inc"-->
<!-- #include file="./model_custom_fields.inc"-->
<!-- #include file="./model_fac_tracking.inc"-->
@@ -532,9 +533,16 @@ function model_orders(opdr_key, params)
{
// Wie moet op verzoek goedkeuren voor deze kostenplaats, terwijl het bedrag wellicht onbekend is?
// Eerste fiatteur (pkey) mag niet fiatteren want het zit boven zijn profiel limiet.
// De melder van de melding (user_key) mag niet zelf goedkeuren boven het bedrag can_selfapprove.
// De melder van de melding (user_key) mag niet zelf goedkeuren boven het bedrag can_selfapprove (functie prs.getApprover() regelt dat).
// tot_kosten > can_selfapprove => user_key als exclude key meegeven.
approver_key = prs.getFiatteur(kostenplaats_key, (tot_kosten > S("can_selfapprove"))?user_key:-1, tot_kosten, disc_key);
// De functie prs.getFiatteur() vervangen door de functie prs.getFiatteur().
// De functie prs.getApprover() levert de eerste fiatteur op en checkt daarnaast nog
// of het totaalbedrag door iemand gefiatteerd kan worden.
var params = {prs_key: user_key,
dis_key: disc_key,
kp_key: kostenplaats_key,
totaalbedrag: tot_kosten};
approver_key = prs.getApprover(params);
for_approval = true;
}
}
@@ -559,6 +567,8 @@ function model_orders(opdr_key, params)
if (for_approval && kp_fiat)
{
// Als approver_key -1 was, dan had de functie prs.getApprover() al een abort_with_warning afgegeven
// maar de functie mld.getFirstApprover() nog niet. Daarom hier nog even testen.
if (approver_key == -1)
abort_with_warning(L("lcl_bes_exceed_limit"));
else

View File

@@ -589,6 +589,10 @@
+ " , m.mld_adres_key"
+ " , b.bes_bestelling_leverdatum"
+ " , b.bes_bestelling_retourvan_key"
+ " , prs.getfiatteur (b.prs_kostenplaats_key, -1, " + staffel_info.totaalbedrag + ", sg.ins_discipline_key) fiatteur_kp_key"
+ " , kg.prs_perslid_key fiatteur_kpg_key"
+ " , kg.prs_kostenplaatsgrp_fiat2_key"
+ " , kg.prs_kostenplaatsgrp_fiat3_key"
+ " , b.bes_bestelling_fiat_user"
+ " , b.bes_bestelling_korting"
+ " , b.bes_bestelling_levkosten"
@@ -606,9 +610,22 @@
+ " FROM bes_bestelling b"
+ " , prs_perslid p"
+ " , mld_adres m"
+ " , bes_bestelling_item bi"
+ " , bes_srtdeel sd"
+ " , bes_srtgroep sg"
+ " , prs_kostenplaats k"
+ " , prs_kostenplaatsgrp kg"
+ " WHERE b.bes_bestelling_key = " + bes_key
+ " AND p.prs_perslid_key = b.prs_perslid_key"
+ " AND m.mld_adres_key(+) = b.mld_adres_key_lev";
+ " AND m.mld_adres_key(+) = b.mld_adres_key_lev"
+ " AND b.bes_bestelling_key = bi.bes_bestelling_key"
+ " AND bi.bes_bestelling_item_key = (SELECT MAX(bi2.bes_bestelling_item_key)"
+ " FROM bes_bestelling_item bi2"
+ " WHERE bi2.bes_bestelling_key = " + bes_key + ")"
+ " AND bi.bes_srtdeel_key = sd.bes_srtdeel_key"
+ " AND sd.bes_srtgroep_key = sg.bes_srtgroep_key"
+ " AND b.prs_kostenplaats_key = k.prs_kostenplaats_key(+)" // kostenplaats van de opdracht kan leeg zijn
+ " AND k.prs_kostenplaatsgrp_key = kg.prs_kostenplaatsgrp_key(+)";
var oRs = Oracle.Execute(sql);
if (oRs.Eof)
@@ -632,7 +649,11 @@
afleverruimte : oRs("bes_bestelling_plaats").Value,
rfoDeliverydate : new Date(oRs("bes_bestelling_leverdatum").Value),
rfoRetourVan : oRs("bes_bestelling_retourvan_key").Value,
bes_bestelling_fiat_user : oRs("bes_bestelling_fiat_user").Value, // degene die al geweest is
fiatteur_kp_key : oRs("fiatteur_kp_key").Value || -1,
fiatteur_kpg_key : oRs("fiatteur_kpg_key").Value || -1,
fiatteur2_kpg_key : oRs("prs_kostenplaatsgrp_fiat2_key").Value || -1,
fiatteur3_kpg_key : oRs("prs_kostenplaatsgrp_fiat3_key").Value || -1,
bes_bestelling_fiat_user : oRs("bes_bestelling_fiat_user").Value, // Degene als laatste heeft gefiatteerd.
rfoBesKosten : oRs("bes_bestelling_korting").Value,
rfoLevKosten : oRs("bes_bestelling_levkosten").Value,
rfoOpmerking : oRs("bes_bestelling_opmerking").Value,
@@ -659,7 +680,7 @@
// Merk op dat het datamodel bestellingen uit meerdere catalogi ondersteund maar
// de interface niet. Daarom kan hieronder de MAX(bsg.ins_discipline_key) om <20><>n record te krijgen
var sql = "SELECT MAX(bsg.ins_discipline_key) ins_discipline_key"
+ " , prs.getfiatteur (" + bes_bestelling.kostenplaats_key + ", " + exclude_fiatter + ", " + staffel_info.totaalbedrag + ", MAX(bsg.ins_discipline_key)) fiatteur_key"
+ " , prs.nextfiatteur(" + bes_key + ", 'BES', COALESCE(" + bes_bestelling.bes_bestelling_fiat_user + ", -1)) fiatteur_key"
+ " , SUM(bi.bes_bestelling_item_aantal * bi.bes_bestelling_item_prijs) totaal"
+ " , SUM(bi.bes_bestelling_item_aantalontv) aantalontv"
+ " , MAX(bsg.bes_srtgroep_key) bes_srtgroep_key" // Wordt gebruikt tbv. singlegroep en dan is er maar eentje
@@ -688,7 +709,7 @@
shared.internal_error("BES: no item lines.");
bes_bestelling.dis_key = oRs("ins_discipline_key").Value;
bes_bestelling.fiatteur_key = oRs("fiatteur_key").Value; // degene die het moet doen
bes_bestelling.fiatteur_key = oRs("fiatteur_key").Value; // De volgende fiatteur. Degene die het moet doen.
bes_bestelling.srtgroep = oRs("bes_srtgroep_key").Value;
bes_bestelling.singlegroep = oRs("singlegroep").Value == 1;
bes_bestelling.inclBTW = oRs("inclBTW").Value || 0;
@@ -1557,42 +1578,6 @@
},
getApprover: function(params)
{ // Bepaalde de fiatteur (KP verantwoordelijke of KPG verantwoordlijke).
// Levert altijd de eerste fiatteur op maar controleert wel alvast of (als zijn
// budget niet echt genoeg is) of de KPG verantwoordelijke wel voldoende budget
// heeft. Anders stokt het verderop in het proces.
var prs_key = params.prs_key;
var dis_key = params.dis_key;
var kp_key = params.kp_key;
var totaalbedrag = params.totaalbedrag;
var approver_key = prs.getFiatteur(kp_key, totaalbedrag > S("can_selfapprove")?prs_key:-1, totaalbedrag, dis_key);
__Log('Eerstgevonden fiatteur: ' + approver_key);
if (approver_key == -1) {
// geen fiatteur gevonden, bestellen niet mogelijk
__Log('bestelling afgebroken');
abort_with_warning(L("lcl_bes_no_fiatteur"));
}
// Bij methode 3 heeft getfiatteur() al gekeken naar de profielen en heeft daarbij al
// tot en met de kpgroepverantwoordelijke gekeken. Als de opgeleverde perslid die
// kpgroepverantw is, ga je hier geen hogere meer vinden. Niet doen dan dus.
if (S("prs_approvemethod") != 3 && budget.exceeds_profiel(totaalbedrag, approver_key, dis_key))
{ // de gevonden fiatteur heeft onvoldoende profiel, is er een hogere (kpngroepverantwoordelijke)
// Let wel: alleen controle of hij er bestaat. Wie het is doen we nog niets mee hier.
__Log('voldoet niet');
var nextapprover_key = prs.getFiatteur(kp_key, approver_key, totaalbedrag, dis_key);
__Log('Vervolgensgevonden fiatteur: ' + nextapprover_key);
if (nextapprover_key == -1 || budget.exceeds_profiel(totaalbedrag, nextapprover_key, dis_key))
{
__Log('voldoet ook niet');
abort_with_warning(L("lcl_bes_exceed_limit"));
}
}
return approver_key;
},
// Levert de 'Is ter fiattering aangeboden bij approver' op.
sendNeedApprovalNotification: function(bes_key, approver)
{

View File

@@ -183,7 +183,7 @@ for (var i = 0; i < ingesloten.length; i++)
ter_finfiattering = bes.checkFiat(bes_key, params);
if (ter_finfiattering)
{
var approver_key = bes.getApprover(params);
var approver_key = prs.getApprover(params);
__Log("Fiatteur: " + approver_key);
apprmessage = bes.sendNeedApprovalNotification(bes_key, approver_key);
}

View File

@@ -41,6 +41,11 @@ for (var i = 0; i < bes_key_arr.length; i++)
rfoBesKosten: bes_bestelling.rfoBesKosten,
rfoLevKosten: bes_bestelling.rfoLevKosten,
fiatteur_key: bes_bestelling.fiatteur_key, // LET OP: De huidige fiatteur wordt opgehaald (Ook als de user_key een vervanger is).
fiatteur_kp_key: bes_bestelling.fiatteur_kp_key, // De kostenplaats verantwoordelijke/fiatteur.
fiatteur_kpg_key: bes_bestelling.fiatteur_kpg_key, // De kostenplaatsgroep verantwoordelijke/fiatteur.
fiatteur2_kpg_key: bes_bestelling.fiatteur2_kpg_key, // De tweede kostenplaatsgroep verantwoordelijke/fiatteur.
fiatteur3_kpg_key: bes_bestelling.fiatteur3_kpg_key, // De derde kostenplaatsgroep verantwoordelijke/fiatteur.
bes_bestelling_fiat_user: bes_bestelling.bes_bestelling_fiat_user, // Degene als laatste heeft gefiatteerd.
dis_key: bes_bestelling.dis_key,
perslid_key_voor: bes_bestelling.perslid_key_voor,
disc_params_fiatflow: bes_disc_info.disc_params_fiatflow,
@@ -55,23 +60,70 @@ user.anything_todo_or_abort(tobeapproved > 0); // We klagen niet over enkele wel
for (var i = 0; i < ingesloten.length; i++)
{
// Blijkbaar mogen we Approve'n
var totaal = ingesloten[i].totaal - ingesloten[i].rfoBesKosten + ingesloten[i].rfoLevKosten;
// als het valt binnen onze limiet (of eigenlijk: degene die nu moet fiatteren als we vervanger zijn) dan zijn we klaar
// NB: de fiatteur kan nu direct de kpg-er zijn
// Check welk profiel gebruikt moet worden als ik vervanger van de budgethouder ben.
var profile_user_key = user_key;
if (user.isCollega(ingesloten[i].fiatteur_kp_key)) {
profile_user_key = ingesloten[i].fiatteur_kp_key;
}
var fiatbedrag = 0;
var bijnaklaar = false;
var fiat_key = ingesloten[i].bes_bestelling_fiat_user; // is deze opdracht al een keer gefiatterd
// Vrijwillige fiattering komt bij bestellingen niet voor en het totaalbedrag is groter dan 0 want er valt iets te fiatteren.
if (!budget.exceeds_profiel(totaal, profile_user_key, ingesloten[i].dis_key) && !fiat_key) // Het valt binnen onze limiet en alleen voor de budgethouder.
{
fiatbedrag = budget.get_pgblimiet(profile_user_key, -1);
bijnaklaar = true;
}
else // een kpgroep verantwoordelijke moet fiatteren
{ // dat zijn wij of collega daarvan, anders was this_opdr.canApprove false geweest
// || user.isCollega(ingesloten[i].nextfiatteur_kpg_key) // wij zijn de groepverantwoordelijke1,2,3 of de vervanger van de groepverantwoordelijke.
if ( ingesloten[i].fiatteur3_kpg_key > 0 && user.isCollega(ingesloten[i].fiatteur3_kpg_key) )
{
fiatbedrag = totaal;
bijnaklaar = true;
}
else if (ingesloten[i].fiatteur2_kpg_key > 0 && user.isCollega(ingesloten[i].fiatteur2_kpg_key))
{
fiatbedrag = S("mld_opdr_kpg_fin_limit2");
if (totaal <= S("mld_opdr_kpg_fin_limit2"))
{
bijnaklaar = true;
}
}
else if (ingesloten[i].fiatteur_kpg_key > 0 && user.isCollega(ingesloten[i].fiatteur_kpg_key)) // we zijn (collega van) ingesloten[i].fiatteur_kpg_key.
{
fiatbedrag = S("mld_opdr_kpg_fin_limit1");
if (totaal <= S("mld_opdr_kpg_fin_limit1"))
{
bijnaklaar = true;
}
}
else
{ // budgethouder en profiel is niet toereikend.
fiatbedrag = budget.get_pgblimiet(profile_user_key, -1);
}
}
var sql = "UPDATE bes_bestelling"
+ " SET bes_bestelling_fiat_user = " + user_key // als we vervanger zijn wordt *onze* naam geregistrerd
+ " SET bes_bestelling_fiatbedrag = " + fiatbedrag
+ " , bes_bestelling_fiat_user = " + user_key // Als we vervanger zijn wordt *onze* naam geregistreerd.
+ " WHERE bes_bestelling_key = " + ingesloten[i].bes_key;
Oracle.Execute(sql);
// Gequeuede berichten/notificaties en portalberichten van de approver verwijderen.
sql = "BEGIN fac.clrnotifications ('BESAP1', " + ingesloten[i].bes_key + "); END;";
Oracle.Execute(sql);
var totaal = ingesloten[i].totaal - ingesloten[i].rfoBesKosten + ingesloten[i].rfoLevKosten;
// als het valt binnen onze limiet (of eigenlijk: degene die nu moet fiatteren als we vervanger zijn) dan zijn we klaar
// TODO in de volgende versie (zie docu PF) meerlaags fiattering met prs.getfiatteur() vgl opdr_approve.asp
// NB: de fiatteur kan nu direct de kpg-er zijn
if (!budget.exceeds_profiel(totaal, ingesloten[i].fiatteur_key, ingesloten[i].dis_key))
if (bijnaklaar)
{
// Klaar met fiatteren.
bes.setbestellingstatus(ingesloten[i].bes_key, 3); // helemaal Gefiatteerd
bes.setbestellingstatus(ingesloten[i].bes_key, 3); // Gefiatteerd, trackt zelf BESFIT
// Afhankelijk van de fiatterings/acceptatie flow zijn dit de acties:
// 1) "Fiatteur -> BESBOF": bes_disc_params_fiatflow = 0 (fiatteren en dan accepteren).
@@ -104,15 +156,13 @@ for (var i = 0; i < ingesloten.length; i++)
// vervolgens naar de volgende/kostenplaatsgroep fiatteur sturen
// Fiatteringsproces moet gevolgd worden op de naam van de "voor wie" (bestelling voor)
// Als bes_disc_params_for_others niet is gezet zijn perslid_key en perslid_key_voor identiek
// Haal de kostenplaatsgroep verantwoordelijke/fiatteur op. De kolom b.bes_bestelling_fiat_user is gevuld met de user_key).
// Geen methode 3 dus bedrag/ discipline hoeft er niet in. Strikt genomen wordt hier gewoon de volgende bepaald omdat we de
// eerste uitsluiten, volgens de huidige structuren is dat de kpgverantwoordelijk maar dat is niet cruciaal.
sql = "SELECT prs.getfiatteur (b.prs_kostenplaats_key, COALESCE (b.bes_bestelling_fiat_user, -1), NULL, NULL) kpg_fiatteur_key"
// Haal de volgende kostenplaatsgroep verantwoordelijke/fiatteur op in de rij van drie. De kolom b.bes_bestelling_fiat_user is gevuld met de user_key.
sql = "SELECT prs.nextfiatteur(b.bes_bestelling_key, 'BES', COALESCE(b.bes_bestelling_fiat_user, -1)) kpg_fiatteur_key"
+ " FROM bes_bestelling b"
+ " WHERE b.bes_bestelling_key = " + ingesloten[i].bes_key;
var oRs = Oracle.Execute(sql);
var nextapprover_key = oRs("kpg_fiatteur_key").Value;
if (nextapprover_key == -1 || budget.exceeds_profiel(totaal, nextapprover_key, ingesloten[i].dis_key))
if (nextapprover_key == -1)
{ // Deze bestelling overschrijdt het mandaat van de budgethouder (kostenplaatsgroep verantwoordelijke/fiatteur) van de opgegeven kostenplaats en/of de budgethouder is onbekend.
result.message = L("lcl_bes_exceed_limit");
}

View File

@@ -185,7 +185,7 @@ if (!isCorrectie)
// De melder van de melding (prs_key) mag niet zelf goedkeuren boven het bedrag can_selfapprove.
// staffel_info.totaalbedrag > can_selfapprove => prs_key als exclude key meegeven.
// prs_key heeft altijd een waarde (prs_key > 0) (required).
approver_key = bes.getApprover(params);
approver_key = prs.getApprover(params);
}
}
}

View File

@@ -50,9 +50,7 @@ for (var i = 0; i < ingesloten.length; i++)
// Blijkbaar mogen we Approve'n
var mld_opdr = ingesloten[i].mld_opdr;
// TODO in de volgende versie (zie docu PF) meerlaags fiattering met prs.getfiatteur() vgl bes_approve.asp
// check welk profiel gebruikt moet worden als ik vervanger van de budgethouder ben.
// Check welk profiel gebruikt moet worden als ik vervanger van de budgethouder ben.
var profile_user_key = user_key;
if (user.isCollega(mld_opdr.fiatteur_kp_key)) {
@@ -67,37 +65,38 @@ for (var i = 0; i < ingesloten.length; i++)
bijnaklaar = true;
else if (!budget.exceeds_profiel(mld_opdr.t_cost, profile_user_key, -1) && !fiat_key) // het valt binnen onze limiet (geen disicpline) en alleen voor de budgethouder.
{
bijnaklaar = true;
fiatbedrag = budget.get_pgblimiet(profile_user_key, -1);
fiatbedrag = budget.get_pgblimiet(profile_user_key, -1);
bijnaklaar = true;
}
else // een kpgroep verantwoordelijke moet fiatteren
{ // dat zijn wij of collega daarvan, anders was this_opdr.canApprove false geweest
// || user.isCollega(mld_opdr.nextfiatteur_kpg_key) // wij zijn de groepverantwoordelijke1,2,3 of de vervanger van de groepverantwoordelijke.
if ( mld_opdr.fiatteur3_kpg_key > 0 && user.isCollega(mld_opdr.fiatteur3_kpg_key) )
{ // dat zijn wij of collega daarvan, anders was this_opdr.canApprove false geweest
// || user.isCollega(mld_opdr.nextfiatteur_kpg_key) // wij zijn de groepverantwoordelijke1,2,3 of de vervanger van de groepverantwoordelijke.
if ( mld_opdr.fiatteur3_kpg_key > 0 && user.isCollega(mld_opdr.fiatteur3_kpg_key) )
{
fiatbedrag = mld_opdr.t_cost;
bijnaklaar = true;
}
else if ( mld_opdr.fiatteur2_kpg_key > 0 && user.isCollega(mld_opdr.fiatteur2_kpg_key) )
{
fiatbedrag = S("mld_opdr_kpg_fin_limit2");
if (mld_opdr.t_cost <= S("mld_opdr_kpg_fin_limit2"))
{
bijnaklaar = true;
bijnaklaar = true;
}
else if ( mld_opdr.fiatteur2_kpg_key > 0 && user.isCollega(mld_opdr.fiatteur2_kpg_key) )
}
else if ( mld_opdr.fiatteur_kpg_key > 0 && user.isCollega(mld_opdr.fiatteur_kpg_key) ) // we zijn (collega van) mld_opdr.fiatteur_kpg_key
{
fiatbedrag = S("mld_opdr_kpg_fin_limit1");
if (mld_opdr.t_cost <= S("mld_opdr_kpg_fin_limit1"))
{
fiatbedrag = S("mld_opdr_kpg_fin_limit2");
if (mld_opdr.t_cost <= S("mld_opdr_kpg_fin_limit2"))
{
bijnaklaar = true;
}
}
else if ( mld_opdr.fiatteur_kpg_key > 0 && user.isCollega(mld_opdr.fiatteur_kpg_key) ) // we zijn (collega van) mld_opdr.fiatteur_kpg_key
{
fiatbedrag = S("mld_opdr_kpg_fin_limit1");
if (mld_opdr.t_cost <= S("mld_opdr_kpg_fin_limit1"))
{
bijnaklaar = true;
}
}
else
{
// budgethouder en profiel is niet toereikend.
fiatbedrag = budget.get_pgblimiet(profile_user_key, -1);
bijnaklaar = true;
}
}
else
{
// budgethouder en profiel is niet toereikend.
fiatbedrag = budget.get_pgblimiet(profile_user_key, -1);
}
}

View File

@@ -228,6 +228,46 @@ prs =
return res;
},
getApprover: function(params)
{ // Bepaalde de fiatteur (KP verantwoordelijke of KPG verantwoordlijke).
// Levert altijd de eerste fiatteur op maar controleert wel alvast of (als zijn
// budget niet echt genoeg is) of de KPG verantwoordelijke wel voldoende budget
// heeft. Anders stokt het verderop in het proces.
var prs_key = params.prs_key;
var dis_key = params.dis_key;
var kp_key = params.kp_key;
var totaalbedrag = params.totaalbedrag;
// Eerst de kostenplaatsverantwoordelijke (budgethouder) opvragen.
var approver_key = prs.getFiatteur(kp_key, totaalbedrag > S("can_selfapprove")?prs_key:-1, totaalbedrag, dis_key);
__Log('Eerstgevonden fiatteur: ' + approver_key);
if (approver_key == -1) {
// geen fiatteur gevonden, bestellen niet mogelijk
__Log('bestelling afgebroken');
abort_with_warning(L("lcl_bes_no_fiatteur"));
}
// Bij methode 3 heeft getfiatteur() al gekeken naar de profielen en heeft daarbij al
// tot en met de kpgroepverantwoordelijke gekeken. Als de opgeleverde perslid die
// kpgroepverantw is, ga je hier geen hogere meer vinden. Niet doen dan dus.
if (S("prs_approvemethod") != 3 && budget.exceeds_profiel(totaalbedrag, approver_key, dis_key))
{ // de gevonden fiatteur heeft onvoldoende profiel, is er een hogere (kpngroepverantwoordelijke)
// Let wel: alleen controle of hij er bestaat. Wie het is doen we nog niets mee hier.
__Log('voldoet niet');
// Nu de kostenplaatsverantwoordelijke opvragen die het totaalbedrag mag/kan goedkeuren.
// Ter controle of de bestelling geheel goed gekeurd kan worden.
// Deze fiatteur wordt niet opgeleverd! De eerste fiatteur/kostenplaatsverantwoordelijke wordt opgelever.
var nextapprover_key = prs.getFiatteur(kp_key, approver_key, totaalbedrag, dis_key);
__Log('Vervolgensgevonden fiatteur: ' + nextapprover_key);
if (nextapprover_key == -1 || budget.exceeds_profiel(totaalbedrag, nextapprover_key, dis_key))
{
__Log('voldoet ook niet');
abort_with_warning(L("lcl_bes_exceed_limit"));
}
}
return approver_key;
},
getLocationSql: function(loc_key, alias)
{
var sql = " (prs_bedrijfdienstlocatie.alg_locatie_key IN (" + loc_key + ")"