#ifdef BES // 03-11-2000 PF /* BES_PAC.SRC * $Revision$ * $Id$ */ -- STATUS: TESTEN CREATE OR REPLACE PACKAGE bes AS FUNCTION getsrtdeelprijsinfo (pbes_srtdeel_key IN NUMBER, pdate IN DATE, pflags IN NUMBER) RETURN NUMBER; FUNCTION getsrtdeelprijs (pbes_srtdeel_key IN NUMBER, pdate IN DATE) RETURN NUMBER; FUNCTION getsrtdeelinkprijs (pbes_srtdeel_key IN NUMBER, pdate IN DATE) RETURN NUMBER; FUNCTION calcartikelkortingsprijs (pbes_srtdeel_key IN NUMBER, pbestelaantal IN NUMBER) RETURN NUMBER; FUNCTION calcbesartikelkortingsprijs (pbes_bestelling_item_key IN NUMBER, ppunchout IN NUMBER) RETURN NUMBER; FUNCTION calcbesopdrachtkosten (pbes_bestelopdr_key IN NUMBER, pautoupdate IN NUMBER) RETURN NUMBER; PROCEDURE upsert_srtdeel_prijs (p_bes_srtdeel_key IN NUMBER, p_bes_srtdeel_prijs IN NUMBER, p_bes_srtdeel_inkprijs IN NUMBER); PROCEDURE upsert_srtdeel (p_ins_discipline_key IN NUMBER, p_bes_srtgroep_omschrijving IN VARCHAR2, p_bes_srtdeel_omschrijving IN VARCHAR2, p_bes_srtdeel_prijs IN NUMBER, p_bes_srtdeel_btw IN NUMBER, p_bes_srtdeel_eenheid IN VARCHAR2, p_bes_srtdeel_nr IN VARCHAR2, p_prs_bedrijf_key IN NUMBER, p_bes_srtdeel_vervaldatum IN DATE, p_bes_srtdeel_image IN VARCHAR2, p_bes_srtdeel_veelvoud IN NUMBER, p_bes_srtdeel_opmerking IN VARCHAR2, p_bes_srtdeel_details_loc IN VARCHAR2, new_bes_srtdeel_key OUT NUMBER ); PROCEDURE makeorders (i_userkey IN NUMBER, bes_key IN NUMBER); PROCEDURE changeorders (i_userkey IN NUMBER, bes_key IN NUMBER); PROCEDURE makecontract (bestelopdr_key IN NUMBER); PROCEDURE setbestellingstatus (pbestellingkey IN NUMBER, pstatus IN NUMBER, puserkey IN NUMBER); PROCEDURE setbestelopdrstatus (pbestelopdrkey IN NUMBER, pstatus IN NUMBER, puserkey IN NUMBER); PROCEDURE updatebestellingstatus (pbestelling_key IN NUMBER, user_key IN NUMBER); PROCEDURE updatebestelopdrstatus (pbestelopdr_key IN NUMBER, user_key IN NUMBER); PROCEDURE notifybackoffice (pbeskey IN NUMBER); PROCEDURE notifybesgoedkeurders (pbeskey IN NUMBER); PROCEDURE acceptopdracht (pbestelopdr_key IN NUMBER, user_key IN NUMBER, presulttext IN VARCHAR2); PROCEDURE rejectopdracht (pbestelopdr_key IN NUMBER, user_key IN NUMBER, presulttext IN VARCHAR2); FUNCTION bestelopdr_tooltip (besopdrkey IN NUMBER) RETURN VARCHAR2; FUNCTION bessprintf (ps IN varchar2, pbes_bestelling_key IN number, pbes_discipline IN VARCHAR2) RETURN varchar2; FUNCTION opdrsprintf (ps IN varchar2, pbes_bestelopdr_key IN number) RETURN varchar2; PROCEDURE remove(p_bes_bestelling_key IN NUMBER); PROCEDURE remove_opdr(p_bes_opdr_key IN NUMBER); FUNCTION bes_besteed_budget_pgb (p_prs_key IN NUMBER, p_disc_key IN NUMBER) RETURN NUMBER; FUNCTION bes_besteed_budget_agb (p_kp_key IN NUMBER) RETURN NUMBER; PROCEDURE notifybestellingbedrijven (pbestelkey NUMBER, ptrackingkey NUMBER, pnotidelay NUMBER DEFAULT NULL); PROCEDURE notifybestelopdrbedrijven (pbestelopdrkey NUMBER, ptrackingkey NUMBER, pnotidelay NUMBER DEFAULT NULL); PROCEDURE autodeliver; END bes; / CREATE OR REPLACE PACKAGE BODY bes AS -- Deze functie moet aan de hand van de flags prijsinfo leveren van het artikel op pdate -- en zonder pdate is dat sysdate. -- Gekozen voor deze generieke functie omdat het algoritme voor alle variaties gelijk is -- en zo kunnen we de source eenmalig houden. Wordt normaal niet van buitenaf aangeroepen. -- Under construction. Gedachte (bitwise flags) -- 8: ? -- 4: ? -- 2: inkoopprijs -- 1: prijs (brutoprijs) FUNCTION getsrtdeelprijsinfo (pbes_srtdeel_key IN NUMBER, pdate IN DATE, pflags IN NUMBER) RETURN NUMBER AS ldate DATE; lsrtdeelprijskey bes_srtdeel_prijs.bes_srtdeel_prijs_key%TYPE; lprijs bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE; linkprijs bes_srtdeel_prijs.bes_srtdeel_prijs_inkprijs%TYPE; BEGIN -- voor vervallen artikelen nemen we de prijs ttv vervallen -- we halen er iets vanaf (anderhalve minuut) om de prijs VOOR de einddatum te krijgen SELECT bes_srtdeel_verwijder-0.001 INTO ldate FROM bes_srtdeel WHERE bes_srtdeel_key = pbes_srtdeel_key; -- voor actieve artikelen pakken we meegegeven datum of anders vandaag IF ldate IS NULL THEN ldate := SYSDATE; -- default vandaag indien niet verwijderd (meestal) END IF; IF pdate IS NOT NULL THEN ldate := LEAST(pdate, ldate); -- maar een meegegeven datum overruled alleen als artikel actueel is of datum voor de vervaldatum ligt END IF; -- Vind de meest recentste prijs. Bij meerdere records de meest recente prijs pakken SELECT MAX(sdp.bes_srtdeel_prijs_key) INTO lsrtdeelprijskey FROM bes_srtdeel_prijs sdp WHERE COALESCE (sdp.bes_srtdeel_prijs_vervaldatum, SYSDATE + 999) > ldate AND sdp.bes_srtdeel_key = pbes_srtdeel_key AND NOT EXISTS (SELECT '' FROM bes_srtdeel_prijs sdp1 WHERE COALESCE (sdp1.bes_srtdeel_prijs_vervaldatum, SYSDATE + 999) > ldate AND sdp1.bes_srtdeel_key = pbes_srtdeel_key AND COALESCE(sdp1.bes_srtdeel_prijs_vervaldatum, SYSDATE+999) < COALESCE (sdp.bes_srtdeel_prijs_vervaldatum, SYSDATE + 999)); IF lsrtdeelprijskey IS NULL THEN RETURN NULL; END IF; SELECT sdp.bes_srtdeel_prijs_prijs, sdp.bes_srtdeel_prijs_inkprijs INTO lprijs, linkprijs FROM bes_srtdeel_prijs sdp WHERE sdp.bes_srtdeel_prijs_key = lsrtdeelprijskey; IF pflags = 1 THEN RETURN lprijs; ELSE -- kan nu nog alleen maar 2 zijn, dus RETURN linkprijs; END IF; END; -- Levert de actuele (standaard)prijs van artikel pbes_srtdeel_key op datum pdate -- Als pdatum leeg is, dan wordt de prijs van vandaag geleverd -- Als er geen geldende prijs gevonden wordt, wordt NULL opgeleverd -- De actuele prijs is de prijs dit het spoedigst vervalt, waarbij de prijs -- zonder een vervaldatum ongeveer als oneindig geldig wordt behandeld. -- Moeten ff kijken of we zo'n functie voor elke prijs moeten hebben, of dat we wat -- kunnen combineren. We willen deze liever niet 5x aan hoeven te roepen voor -- een artikel om alle prijzen te weten. Dus evt optimalisatie kandidaat, maar hoe? FUNCTION getsrtdeelprijs (pbes_srtdeel_key IN NUMBER, pdate IN DATE) RETURN NUMBER AS BEGIN RETURN bes.getsrtdeelprijsinfo (pbes_srtdeel_key, pdate, 1); END; FUNCTION getsrtdeelinkprijs (pbes_srtdeel_key IN NUMBER, pdate IN DATE) RETURN NUMBER AS BEGIN RETURN bes.getsrtdeelprijsinfo (pbes_srtdeel_key, pdate, 2); END; FUNCTION calcartikelkortingsprijs (pbes_srtdeel_key IN NUMBER, pbestelaantal IN NUMBER) RETURN NUMBER AS lstaffeltabelkey bes_staffeltabel.bes_staffeltabel_key%TYPE; lprijs bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE; lstaffeltype bes_staffeltabel.fac_typestaffel_key%TYPE; lstaffelkorting bes_staffel.bes_staffel_korting%TYPE; lkortingsprijs NUMBER; BEGIN -- Levert de stuksprijs inclusief (eventuele) korting ---- aantal -> srtdeel/srtgroep.staffel -> stuksprijs incl korting = bes_bestelopdr_item_prijs -- merk op: deze staffel is op aantallen (niet op prijs) -- Check of er een staffel geldt voor dit artikel -- Als het een groepstaffel is, tel dan de overige artikelen in deze bestelopdracht met dezelfde staffel en bepaal het toepasselijke interval -- Als het geen groepstaffel is, bepaal dan het toepasselijke interval BEGIN SELECT sd.bes_staffeltabel_key, bes.getsrtdeelprijs (pbes_srtdeel_key, NULL) bes_srtdeel_prijs, st.fac_typestaffel_key INTO lstaffeltabelkey, lprijs, lstaffeltype FROM bes_srtdeel sd, bes_staffeltabel st WHERE sd.bes_staffeltabel_key = st.bes_staffeltabel_key AND sd.bes_srtdeel_key = pbes_srtdeel_key; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN lprijs; END; -- Vindt staffelrecord; zie(!) opmerkingen bij prs_staffel in bes.calcopdrachtkorting. BEGIN SELECT COALESCE(MIN(bes_staffel_korting), 0) INTO lstaffelkorting FROM bes_staffel s1 WHERE s1.bes_staffeltabel_key = lstaffeltabelkey AND (s1.bes_staffel_grenswaarde > pbestelaantal OR s1.bes_staffel_grenswaarde IS NULL) AND NOT EXISTS (SELECT 'X' FROM bes_staffel s2 WHERE s2.bes_staffeltabel_key = lstaffeltabelkey AND s2.bes_staffel_grenswaarde < s1.bes_staffel_grenswaarde AND (s2.bes_staffel_grenswaarde > pbestelaantal OR s2.bes_staffel_grenswaarde IS NULL)); EXCEPTION WHEN NO_DATA_FOUND THEN RETURN lprijs; END; IF lstaffeltype = 1 THEN lkortingsprijs := (100 - lstaffelkorting)/100 * lprijs; END IF; IF lstaffeltype = 2 THEN lkortingsprijs := lprijs - lstaffelkorting / pbestelaantal; END IF; IF lstaffeltype = 3 THEN lkortingsprijs := lprijs - lstaffelkorting; END IF; RETURN lkortingsprijs; END; FUNCTION calcbesartikelkortingsprijs (pbes_bestelling_item_key IN NUMBER, ppunchout IN NUMBER) RETURN NUMBER AS lstaffelgroep bes_staffeltabel.bes_staffeltabel_groep%TYPE; lstaffeltabelkey bes_staffeltabel.bes_staffeltabel_key%TYPE; laanvraagprijs bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE; lcatalogusprijs bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE; lprijs bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE; lstaffeltype bes_staffeltabel.fac_typestaffel_key%TYPE; lstaffelkorting bes_staffel.bes_staffel_korting%TYPE; lkortingsprijs NUMBER; laantalbesteld NUMBER; BEGIN -- Levert de stuksprijs inclusief (eventuele) korting ---- aantal -> srtdeel/srtgroep.staffel -> stuksprijs incl korting = bes_bestelopdr_item_prijs -- merk op: deze staffel is op aantallen (niet op prijs) -- Check of er een staffel geldt voor dit artikel -- Als het een groepstaffel is, tel dan de overige artikelen in deze bestelopdracht met dezelfde staffel en bepaal het toepasselijke interval -- Als het geen groepstaffel is, bepaal dan het toepasselijke interval BEGIN SELECT st.bes_staffeltabel_groep, sd.bes_staffeltabel_key, st.fac_typestaffel_key, bi.bes_bestelling_item_brutoprijs, bes.getsrtdeelprijs (sd.bes_srtdeel_key, NULL) bes_srtdeel_prijs, bi.bes_bestelling_item_aantal INTO lstaffelgroep, lstaffeltabelkey, lstaffeltype, laanvraagprijs, lcatalogusprijs, laantalbesteld FROM bes_srtdeel sd, bes_staffeltabel st, bes_bestelling_item bi WHERE sd.bes_staffeltabel_key = st.bes_staffeltabel_key AND sd.bes_srtdeel_key = bi.bes_srtdeel_key AND bi.bes_bestelling_item_key = pbes_bestelling_item_key; EXCEPTION WHEN NO_DATA_FOUND THEN BEGIN SELECT bi.bes_bestelling_item_brutoprijs, bes.getsrtdeelprijs (sd.bes_srtdeel_key, NULL) bes_srtdeel_prijs INTO laanvraagprijs, lcatalogusprijs FROM bes_srtdeel sd, bes_bestelling_item bi WHERE sd.bes_srtdeel_key = bi.bes_srtdeel_key AND bi.bes_bestelling_item_key = pbes_bestelling_item_key; IF ppunchout = 1 THEN RETURN laanvraagprijs; ELSE RETURN lcatalogusprijs; END IF; END; END; IF ppunchout = 1 THEN lprijs := laanvraagprijs; ELSE lprijs := lcatalogusprijs; END IF; IF lstaffelgroep = 1 THEN SELECT SUM (bi.bes_bestelling_item_aantal) INTO laantalbesteld FROM bes_bestelling_item bi, bes_srtdeel sd WHERE sd.bes_srtdeel_key = bi.bes_srtdeel_key AND sd.bes_staffeltabel_key = lstaffeltabelkey AND bi.bes_bestelling_item_key = pbes_bestelling_item_key; END IF; -- Vindt staffelrecord; BEGIN SELECT COALESCE(MIN(bes_staffel_korting), 0) INTO lstaffelkorting FROM bes_staffel s1 WHERE s1.bes_staffeltabel_key = lstaffeltabelkey AND (s1.bes_staffel_grenswaarde > laantalbesteld OR s1.bes_staffel_grenswaarde IS NULL) AND NOT EXISTS (SELECT 'X' FROM bes_staffel s2 WHERE s2.bes_staffeltabel_key = lstaffeltabelkey AND s2.bes_staffel_grenswaarde < s1.bes_staffel_grenswaarde AND (s2.bes_staffel_grenswaarde > laantalbesteld OR s2.bes_staffel_grenswaarde IS NULL)); EXCEPTION WHEN NO_DATA_FOUND THEN RETURN lprijs; END; IF lstaffeltype = 1 THEN lkortingsprijs := (100 - lstaffelkorting)/100 * lprijs; END IF; IF lstaffeltype = 2 THEN lkortingsprijs := lprijs - lstaffelkorting / laantalbesteld; END IF; IF lstaffeltype = 3 THEN lkortingsprijs := lprijs - lstaffelkorting; END IF; RETURN lkortingsprijs; END; FUNCTION calcbesopdrachtkosten (pbes_bestelopdr_key IN NUMBER, pautoupdate IN NUMBER) RETURN NUMBER AS lbrutoopdrachtbedrag NUMBER; lopdrachtkorting bes_bestelopdr.bes_bestelopdr_korting%TYPE; lfrancogrens prs_bedrijf.prs_bedrijf_bes_limiet%TYPE; lverzendkosten prs_bedrijf.prs_bedrijf_bes_kosten%TYPE; BEGIN -- berekent de bijkomende kosten van een bestelopdracht, meestal de verzendkosten -- die alleen worden berekend onder een bepaald opdrachtbedrag (leveranciersafhankelijk, inclusief regelkortingen en opdrachtkorting) ---- som van de bes_bestelopdr_item_prijs > prs_bedrijf_bes_limiet -> prs_bedrijf_bes_kosten = bes_bestelopdr_levkosten -- als iets niet wordt gevonden, wordt 0 geleverd (geen kosten); je zou error kunnen overwegen. SELECT COALESCE(SUM (bes_bestelopdr_item_prijs * bes_bestelopdr_item_aantal), 0) INTO lbrutoopdrachtbedrag FROM bes_bestelopdr_item WHERE bes_bestelopdr_key = pbes_bestelopdr_key; SELECT COALESCE(bes_bestelopdr_korting, 0) INTO lopdrachtkorting FROM bes_bestelopdr WHERE bes_bestelopdr_key = pbes_bestelopdr_key; SELECT COALESCE(prs_bedrijf_bes_limiet, 0), COALESCE(prs_bedrijf_bes_kosten, 0) INTO lfrancogrens, lverzendkosten FROM prs_bedrijf WHERE prs_bedrijf_key = (SELECT prs_bedrijf_key FROM bes_bestelopdr WHERE bes_bestelopdr_key = pbes_bestelopdr_key); IF lbrutoopdrachtbedrag - lopdrachtkorting >= lfrancogrens THEN lverzendkosten := 0; END IF; IF pautoupdate > 0 THEN UPDATE bes_bestelopdr SET bes_bestelopdr_levkosten = lverzendkosten WHERE bes_bestelopdr_key = pbes_bestelopdr_key; END IF; RETURN lverzendkosten; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 0; END; -- Zorg dat de prijs van het artikel de gegeven prijs wordt. Als dat al zo is, verandert er niets PROCEDURE upsert_srtdeel_prijs (p_bes_srtdeel_key IN NUMBER, p_bes_srtdeel_prijs IN NUMBER, p_bes_srtdeel_inkprijs IN NUMBER ) IS v_currentprijs bes_srtdeel_prijs.bes_srtdeel_prijs_prijs%TYPE; v_currentinkprijs bes_srtdeel_prijs.bes_srtdeel_prijs_inkprijs%TYPE; lneedchange BOOLEAN := FALSE; loldkey bes_srtdeel_prijs.bes_srtdeel_prijs_key%TYPE; BEGIN -- Is er al een vigerende prijs bekend en is dat dezelfde? v_currentprijs := bes.getsrtdeelprijs (p_bes_srtdeel_key, NULL); v_currentinkprijs := bes.getsrtdeelinkprijs (p_bes_srtdeel_key, NULL); IF (v_currentprijs IS NULL AND p_bes_srtdeel_prijs IS NOT NULL) OR (v_currentinkprijs IS NULL AND p_bes_srtdeel_inkprijs IS NOT NULL) OR (v_currentprijs IS NOT NULL AND p_bes_srtdeel_prijs IS NULL) OR (v_currentinkprijs IS NOT NULL AND p_bes_srtdeel_inkprijs IS NULL) OR v_currentprijs <> p_bes_srtdeel_prijs OR v_currentinkprijs <> p_bes_srtdeel_inkprijs THEN lneedchange := TRUE; END IF; IF lneedchange THEN -- Er was nog geen prijs of een afwijkende prijs: vanaf nu geldt deze nieuwe prijs INSERT INTO bes_srtdeel_prijs (bes_srtdeel_key, bes_srtdeel_prijs_prijs, bes_srtdeel_prijs_inkprijs ) VALUES (p_bes_srtdeel_key, p_bes_srtdeel_prijs, p_bes_srtdeel_inkprijs ); -- geen einddatum IF v_currentprijs IS NOT NULL OR v_currentinkprijs IS NOT NULL THEN SELECT MIN (bes_srtdeel_prijs_key) INTO loldkey FROM bes_srtdeel_prijs sdp WHERE bes_srtdeel_key = p_bes_srtdeel_key AND (bes_srtdeel_prijs_vervaldatum IS NULL OR bes_srtdeel_prijs_vervaldatum > SYSDATE) AND COALESCE (bes_srtdeel_prijs_prijs, -99) = COALESCE (v_currentprijs, -99) AND COALESCE (bes_srtdeel_prijs_inkprijs, -99) = COALESCE (v_currentinkprijs, -99) AND NOT EXISTS (SELECT '' FROM bes_srtdeel_prijs sdp1 WHERE COALESCE (sdp1.bes_srtdeel_prijs_vervaldatum, SYSDATE + 999) > SYSDATE AND sdp1.bes_srtdeel_key = p_bes_srtdeel_key AND COALESCE (sdp1.bes_srtdeel_prijs_vervaldatum, SYSDATE + 999) < COALESCE (sdp.bes_srtdeel_prijs_vervaldatum, SYSDATE + 999)); -- Er was al een prijs geregistreerd: invalideer de oude prijs UPDATE bes_srtdeel_prijs SET bes_srtdeel_prijs_vervaldatum = SYSDATE - 1 WHERE bes_srtdeel_prijs_key = loldkey; END IF; -- ELSE de juiste prijs was al geregistreerd END IF; -- De actuele prijs is nu geregistreerd END; -- was: bes_check_or_create_item -- Maakt een artikel (bes_srtdeel) aan binnen een reeds bestaande catalogus (discipline), waarbij zonodig nog de groep -- (srtgroep) wordt aangemaakt. Deze wordt aangeroepen bij een punchout bestelling, en om te voorkomen dat dergelijke -- artikelen rechtstreeks worden besteld wordt direct de verwijderdatum ook gezet. Dat je het weet. PROCEDURE upsert_srtdeel (p_ins_discipline_key IN NUMBER, p_bes_srtgroep_omschrijving IN VARCHAR2, -- VARCHAR2(60) p_bes_srtdeel_omschrijving IN VARCHAR2, -- VARCHAR2 (60) p_bes_srtdeel_prijs IN NUMBER, -- NUMBER (8,2) p_bes_srtdeel_btw IN NUMBER, -- NUMBER (3) p_bes_srtdeel_eenheid IN VARCHAR2, -- VARCHAR2 (30) p_bes_srtdeel_nr IN VARCHAR2, -- VARCHAR2 (32) p_prs_bedrijf_key IN NUMBER, p_bes_srtdeel_vervaldatum IN DATE, p_bes_srtdeel_image IN VARCHAR2, -- VARCHAR2 (255) p_bes_srtdeel_veelvoud IN NUMBER, -- NUMBER (6) p_bes_srtdeel_opmerking IN VARCHAR2, -- VARCHAR2 (2000) p_bes_srtdeel_details_loc IN VARCHAR2, -- VARCHAR2 (255) new_bes_srtdeel_key OUT NUMBER -- NUMBER (10) ) AS v_bes_srtgroep_key NUMBER (10); v_bes_srtdeel_key NUMBER (10); v_prs_bedrijf_key NUMBER (10); BEGIN BEGIN SELECT bes_srtgroep_key INTO v_bes_srtgroep_key FROM bes_srtgroep WHERE ins_discipline_key = p_ins_discipline_key AND UPPER (bes_srtgroep_omschrijving) = UPPER (p_bes_srtgroep_omschrijving); EXCEPTION WHEN NO_DATA_FOUND THEN v_bes_srtgroep_key := -1; END; IF v_bes_srtgroep_key = -1 THEN INSERT INTO bes_srtgroep (ins_discipline_key, bes_srtgroep_omschrijving ) VALUES (p_ins_discipline_key, p_bes_srtgroep_omschrijving ) RETURNING bes_srtgroep_key INTO v_bes_srtgroep_key; END IF; IF p_prs_bedrijf_key = -1 THEN BEGIN SELECT bes_disc_params_punch_bedr_key INTO v_prs_bedrijf_key FROM bes_disc_params WHERE bes_ins_discipline_key = p_ins_discipline_key; EXCEPTION WHEN NO_DATA_FOUND THEN v_prs_bedrijf_key := -1; END; ELSE v_prs_bedrijf_key := p_prs_bedrijf_key; END IF; SELECT MAX(bes_srtdeel_key) INTO v_bes_srtdeel_key FROM bes_srtdeel sd WHERE bes_srtgroep_key = v_bes_srtgroep_key AND bes_srtdeel_nr = p_bes_srtdeel_nr AND bes_srtdeel_omschrijving = p_bes_srtdeel_omschrijving AND bes_srtdeel_btw = p_bes_srtdeel_btw AND COALESCE (bes_srtdeel_eenheid, 'Geen') = COALESCE (p_bes_srtdeel_eenheid, 'Geen') AND prs_bedrijf_key = v_prs_bedrijf_key AND bes_srtdeel_veelvoud = p_bes_srtdeel_veelvoud AND COALESCE (bes_srtdeel_opmerking, 'Geen') = COALESCE (p_bes_srtdeel_opmerking, 'Geen'); IF v_bes_srtdeel_key IS NULL THEN v_bes_srtdeel_key := -1; END IF; COMMIT; IF v_bes_srtdeel_key = -1 THEN SELECT bes_s_bes_srtdeel_key.NEXTVAL INTO v_bes_srtdeel_key FROM DUAL; INSERT INTO bes_srtdeel ( bes_srtdeel_key, bes_srtgroep_key, bes_srtdeel_omschrijving, bes_srtdeel_btw, bes_srtdeel_eenheid, bes_srtdeel_nr, prs_bedrijf_key, bes_srtdeel_vervaldatum, bes_srtdeel_image, bes_srtdeel_veelvoud, bes_srtdeel_verwijder, bes_srtdeel_opmerking, bes_srtdeel_details_loc ) VALUES ( v_bes_srtdeel_key, v_bes_srtgroep_key, p_bes_srtdeel_omschrijving, p_bes_srtdeel_btw, p_bes_srtdeel_eenheid, p_bes_srtdeel_nr, v_prs_bedrijf_key, p_bes_srtdeel_vervaldatum, p_bes_srtdeel_image, p_bes_srtdeel_veelvoud, SYSDATE, p_bes_srtdeel_opmerking, p_bes_srtdeel_details_loc ); ELSE -- Bestaand artikel, maar de verwijdatum moet wel ververst worden -- Anders gaat de prijsbepaling niet goed UPDATE bes_srtdeel SET bes_srtdeel_verwijder = SYSDATE WHERE bes_srtdeel_key = v_bes_srtdeel_key; END IF; new_bes_srtdeel_key := v_bes_srtdeel_key; -- Verwerk de prijs bes.upsert_srtdeel_prijs (v_bes_srtdeel_key, p_bes_srtdeel_prijs, NULL); -- TODO: waar komt die inkoopprijs vandaan? END; -- Oude opdracht verwijderen, nieuwe aanmaken PROCEDURE changeorders (i_userkey IN NUMBER, bes_key IN NUMBER) AS orgopdrkey bes_bestelopdr.bes_bestelopdr_key%TYPE; BEGIN SELECT MAX (boi.bes_bestelopdr_key) INTO orgopdrkey FROM bes_bestelopdr_item boi, bes_bestelling_item bi WHERE bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key AND bi.bes_bestelling_key = bes_key; DELETE FROM bes_bestelopdr_item WHERE bes_bestelopdr_key = orgopdrkey; DELETE FROM bes_bestelopdr WHERE bes_bestelopdr_key = orgopdrkey; bes.makeorders (i_userkey, bes_key); END; PROCEDURE makeorders (i_userkey IN NUMBER, bes_key IN NUMBER) AS lfound BOOLEAN; niveau NUMBER (10); afd_key NUMBER (10); afd_key_temp NUMBER (10); link_key NUMBER (10); lbord_key NUMBER (10); lbord_id bes_bestelopdr.bes_bestelopdr_id%TYPE; i_cnt_sum NUMBER (5); i_price_sum NUMBER (8, 2); current_leverancier_key NUMBER (10); aantalopdrachtregels NUMBER; factura_key mld_adres.mld_adres_key%TYPE; bedrijf_email prs_bedrijf.prs_bedrijf_email%TYPE; bedrijf_telefoon2 prs_bedrijf.prs_bedrijf_telefoon2%TYPE; l_item_brutoprijs bes_bestelopdr_item.bes_bestelopdr_item_brutoprijs%TYPE; l_item_prijs bes_bestelopdr_item.bes_bestelopdr_item_prijs%TYPE; l_item_inkprijs bes_bestelopdr_item.bes_bestelopdr_item_inkprijs%TYPE; besopdrachtkosten NUMBER (8, 2); bedrijfvolgnr NUMBER (3); CURSOR tebestellen IS SELECT bd.prs_bedrijf_key, bd.prs_bedrijf_naam, s.bes_srtdeel_omschrijving, NVL (s.bes_srtdeel_eenheid, '') bes_srtdeel_eenheid, bi.bes_bestelling_item_brutoprijs, bes.getsrtdeelprijs (s.bes_srtdeel_key, NULL) bes_srtdeel_prijs, s.bes_srtdeel_key, bi.bes_bestelling_item_key, bi.bes_bestelling_item_aantal, NVL (b.mld_adres_key_lev, abd.mld_adres_key_lev) mld_adres_key_lev, p.prs_afdeling_key, abd.mld_adres_key_fac, bi.bes_bestelling_item_inkprijs, bes.getsrtdeelinkprijs (s.bes_srtdeel_key, NULL) bes_srtdeel_inkprijs, b.bes_bestelling_parentkey, b.prs_perslid_key, bdp.bes_disc_params_punchouturl, bdp.bes_disc_params_freeartikel FROM prs_bedrijf bd, bes_srtdeel s, bes_srtgroep g, bes_disc_params bdp, bes_bestelling_item bi, bes_bestelling b, prs_perslid p, prs_v_afdeling d, prs_bedrijf abd WHERE abd.prs_bedrijf_key = d.prs_bedrijf_key AND p.prs_afdeling_key = d.prs_afdeling_key AND b.prs_perslid_key = p.prs_perslid_key AND bi.bes_bestelling_key = b.bes_bestelling_key AND g.ins_discipline_key = bdp.bes_ins_discipline_key AND s.bes_srtgroep_key = g.bes_srtgroep_key AND s.bes_srtdeel_key = bi.bes_srtdeel_key AND s.prs_bedrijf_key = bd.prs_bedrijf_key AND b.bes_bestelling_status IN (1, 2, 3, 4) -- om dubbelen te vermijden AND b.bes_bestelling_key = bes_key ORDER BY 1, 7; BEGIN -- Maakt bestelopdrachten van bestelaanvragen current_leverancier_key := -1; bedrijfvolgnr := 0; FOR rec1 IN tebestellen LOOP --DBMS_OUTPUT.put_line ('Een regel'); -- Moeten we van leverancier wisselen? IF current_leverancier_key <> rec1.prs_bedrijf_key THEN BEGIN --DBMS_OUTPUT.put_line ('Een nieuwe leverancier:' || TO_CHAR (rec1.prs_bedrijf_key)); -- Bepaal het factuuradres. Deze kan binnen 1 aanvraag verschillen als er meerdere leveranciers betrokken zijn. -- Dit is het factuuradres van de leverancier indien gedefinieerd, -- en zo niet, dan het factuuradres van de afdeling (daarbij zover omhoog zoeken tot gevonden) -- van de aanvrager. Is die er niet, dan is het het factuuradres van het bedrijf van de aanvrager. -- Er zou geen factuuraders gevonden kunnen worden, dan blijft die gewoon leeg. -- Van de aanvrager: factura_key := rec1.mld_adres_key_fac; -- Van de leverancier: SELECT mld_adres_key_fac, prs_bedrijf_email, prs_bedrijf_telefoon2 INTO factura_key, bedrijf_email, bedrijf_telefoon2 FROM prs_bedrijf WHERE prs_bedrijf_key = rec1.prs_bedrijf_key AND mld_adres_key_fac IS NOT NULL; EXCEPTION WHEN NO_DATA_FOUND THEN -- Van de afdeling: SELECT a.niveau, a.prs_afdeling_key INTO niveau, afd_key FROM prs_v_aanwezigafdeling a WHERE a.prs_afdeling_key = rec1.prs_afdeling_key; lfound := FALSE; WHILE (niveau >= 1 AND NOT lfound) LOOP -- zoek kenmerk BEGIN SELECT prs_kenmerklink_waarde INTO link_key FROM prs_kenmerklink kl, prs_kenmerk k WHERE kl.prs_kenmerk_key = k.prs_kenmerk_key AND kl.prs_link_key = afd_key AND k.prs_kenmerk_key = 6 AND kl.prs_kenmerklink_waarde IS NOT NULL; EXCEPTION WHEN NO_DATA_FOUND THEN link_key := NULL; END; IF link_key IS NULL THEN -- -- kenmerk factuuradres niet aanwezig, zoek parent afdeling BEGIN SELECT a.prs_afdeling_parentkey INTO afd_key_temp FROM prs_afdeling a WHERE a.prs_afdeling_key = afd_key; IF niveau != 1 THEN afd_key := afd_key_temp; -- als niveau=1 en geen kenmerk gevonden dan nog afd_key van niveau=1 nodig END IF; niveau := niveau - 1; END; ELSE lfound := TRUE; -- kenmerk aanwezig END IF; END LOOP; IF link_key IS NOT NULL THEN factura_key := link_key; END IF; END; -- factuuradres is bepaald, maak nu de opdracht aan IF current_leverancier_key <> -1 THEN -- Afronden vorige opdracht UPDATE bes_bestelopdr SET bes_bestelopdr_status = 3 -- JGL: stond hij hier nog niet op dan? WHERE bes_bestelopdr_key = lbord_key; fac.trackaction ('BES2NE', lbord_key, i_userkey, NULL, ''); -- Bepaal opdrachtkorting en opdrachtkosten en sla deze op -- Met parameter 1 geven we aan dat de berekende waarde automaisch ook word opgeslagen besopdrachtkosten := bes.calcbesopdrachtkosten(lbord_key, 1); UPDATE bes_bestelopdr SET bes_bestelopdr_levkosten = besopdrachtkosten WHERE bes_bestelopdr_key = lbord_key; END IF; -- Op naar de volgende current_leverancier_key := rec1.prs_bedrijf_key; bedrijfvolgnr := bedrijfvolgnr + 1; SELECT bes_s_bes_bestelopdr_key.NEXTVAL INTO lbord_key FROM DUAL; -- UWVA#13420, als zichtbaar opdrachtnummer wordt het aanvraagnummer gebruikt -- Indien dit ooit anders moet, bv bundeling, dan moet alleen dit anders -- Met UWVA#21074 hanteren we voor mutaties toch hetzelfde opdrachtnummer, zodat -- de leverancier de link met het origineel kan vinden. lbord_id := TO_CHAR(COALESCE(rec1.bes_bestelling_parentkey, bes_key))||'/'|| bedrijfvolgnr; --DBMS_OUTPUT.put_line ('Bestelopdracht maken: ' || TO_CHAR (lbord_key)); INSERT INTO bes_bestelopdr (bes_bestelopdr_key, bes_bestelopdr_status, prs_bedrijf_key, bes_bestelopdr_datum, mld_adres_key_lev, mld_adres_key_fac, prs_perslid_key, bes_bestelopdr_id ) VALUES (lbord_key, 3, rec1.prs_bedrijf_key, SYSDATE, rec1.mld_adres_key_lev, factura_key, rec1.prs_perslid_key, lbord_id ); aantalopdrachtregels := 0; END IF; --DBMS_OUTPUT.put_line ('Bestelregel maken: ' || TO_CHAR (aantalopdrachtregels + 1)); -- Voor punchout gebruiken we de aanvraagprijzen, anders de catalogusprijzen (as was) voor -- bes_bestelling_item_brutoprijs / bes_bestelopdr_item_brutoprijs -- bes_bestelling_item_prijs / bes_bestelopdr_item_prijs -- bes_bestelling_item_inkprijs / bes_bestelopdr_item_inkprijs IF (rec1.bes_disc_params_punchouturl IS NOT NULL AND rec1.bes_disc_params_freeartikel = 0) THEN -- punchout --DBMS_OUTPUT.put_line ('Punchoutprijzen'); l_item_brutoprijs := rec1.bes_bestelling_item_brutoprijs; l_item_prijs := bes.calcbesartikelkortingsprijs(rec1.bes_bestelling_item_key, 1); l_item_inkprijs := rec1.bes_bestelling_item_inkprijs; ELSE --DBMS_OUTPUT.put_line ('Catalogusprijzen'); l_item_brutoprijs := rec1.bes_srtdeel_prijs; l_item_prijs := bes.calcbesartikelkortingsprijs(rec1.bes_bestelling_item_key, 0); l_item_inkprijs := rec1.bes_srtdeel_inkprijs; END IF; INSERT INTO bes_bestelopdr_item (bes_bestelopdr_item_key, bes_bestelopdr_item_posnr, bes_bestelopdr_key, bes_bestelopdr_item_aantal, bes_bestelopdr_item_aantalontv, bes_bestelopdr_item_omschrijv, bes_bestelopdr_item_brutoprijs, bes_bestelopdr_item_ontvangen, bes_bestelopdr_item_inkprijs, bes_bestelopdr_item_prijs ) VALUES (bes_s_bes_bestelopdr_item_key.NEXTVAL, aantalopdrachtregels + 1, lbord_key, rec1.bes_bestelling_item_aantal, NULL, rec1.bes_srtdeel_omschrijving, l_item_brutoprijs, NULL, l_item_inkprijs, l_item_prijs ); aantalopdrachtregels := aantalopdrachtregels + 1; UPDATE bes_bestelling_item SET bes_bestelopdr_item_key = bes_s_bes_bestelopdr_item_key.CURRVAL WHERE bes_bestelling_item_key = rec1.bes_bestelling_item_key; END LOOP; IF current_leverancier_key <> -1 THEN -- Afronden vorige opdracht UPDATE bes_bestelopdr SET bes_bestelopdr_status = 3 WHERE bes_bestelopdr_key = lbord_key; fac.trackaction ('BES2NE', lbord_key, i_userkey, NULL, ''); -- Bepaal opdrachtkorting en opdrachtkosten en sla deze op -- Met parameter 1 geven we aan dat de berekende waarde automaisch ook word opgeslagen besopdrachtkosten := bes.calcbesopdrachtkosten(lbord_key, 1); UPDATE bes_bestelopdr SET bes_bestelopdr_levkosten = besopdrachtkosten WHERE bes_bestelopdr_key = lbord_key; END IF; END; PROCEDURE makecontract (bestelopdr_key IN NUMBER) AS cnt_rappel_abonnement fac_setting.fac_setting_default%TYPE; bes_bestelling_prefix fac_setting.fac_setting_default%TYPE; lbeschrijving VARCHAR2 (50); lomschrijving VARCHAR2 (2048); lopmerking VARCHAR2 (4000); lcnt_nummer VARCHAR2 (30); lcnt_disckey bes_disc_params.bes_disc_params_cnt_disckey%TYPE; lprs_afdeling_key prs_afdeling.prs_afdeling_key%TYPE; lprs_perslid_key prs_perslid.prs_perslid_key%TYPE; lprs_perslid_key_voor prs_perslid.prs_perslid_key%TYPE; lprs_contactpersoon_key prs_contactpersoon.prs_contactpersoon_key%TYPE; lcnt_opzegtermijn bes_disc_params.bes_disc_params_cnt_opzegterm%TYPE; lbedr_key NUMBER(10); ltotaal NUMBER(11,2); lprs_kostenplaats_key prs_kostenplaats.prs_kostenplaats_key%TYPE; lcnt_key cnt_contract.cnt_contract_key%TYPE; looptijd_van DATE; looptijd_tot DATE; lfirst NUMBER; llast NUMBER; date_boolean BOOLEAN; CURSOR artikelregels IS SELECT b.bes_bestelling_key, bdp.bes_disc_params_cnt_disckey, bdp.bes_disc_params_cnt_termijn, bdp.bes_disc_params_cnt_opzegterm, bsd.bes_srtdeel_nr, bsd.bes_srtdeel_omschrijving, p.prs_afdeling_key, bsd.bes_srtdeel_opmerking, bsd.prs_bedrijf_key, b.bes_bestelling_leverdatum, b.prs_kostenplaats_key, b.prs_perslid_key, b.prs_perslid_key_voor, bi.bes_bestelling_item_prijs * bi.bes_bestelling_item_aantal totaal, (SELECT MAX (pc.prs_contactpersoon_key) -- Neem de nieuwste contactpersoon FROM prs_contactpersoon pc WHERE pc.prs_bedrijf_key = bsd.prs_bedrijf_key AND pc.prs_contactpersoon_verwijder IS NULL) prs_contactpersoon FROM bes_bestelling b, bes_bestelling_item bi, bes_srtdeel bsd, bes_srtgroep bsg, bes_disc_params bdp, prs_perslid p, bes_bestelopdr_item boi 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 AND p.prs_perslid_key = b.prs_perslid_key AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key AND boi.bes_bestelopdr_key = bestelopdr_key ORDER BY bes_bestelling_item_key; BEGIN -- Maakt een contract aan bij een abonnement bestelling cnt_rappel_abonnement := fac.getsetting ('cnt_rappel_abonnement'); bes_bestelling_prefix := fac.getsetting ('bes_bestelling_prefix'); lbeschrijving := NULL; lomschrijving := NULL; lopmerking := NULL; lfirst := 0; llast := 0; FOR artikel_rec IN artikelregels LOOP IF lfirst = 0 THEN BEGIN -- Voor het aan te maken contract de gegevens van het eerste artikel pakken. lbeschrijving := substr(artikel_rec.bes_srtdeel_omschrijving, 1, 50); lomschrijving := lcl.L('lcl_bes_srtdeel_nr') || ': ' || artikel_rec.bes_srtdeel_nr; lopmerking := artikel_rec.bes_srtdeel_opmerking; lcnt_nummer := bes_bestelling_prefix || TO_CHAR(artikel_rec.bes_bestelling_key); lcnt_disckey := artikel_rec.bes_disc_params_cnt_disckey; lprs_afdeling_key := artikel_rec.prs_afdeling_key; lprs_perslid_key := artikel_rec.prs_perslid_key; lprs_perslid_key_voor := artikel_rec.prs_perslid_key_voor; lprs_contactpersoon_key := artikel_rec.prs_contactpersoon; looptijd_van := artikel_rec.bes_bestelling_leverdatum; -- De looptijd komt uit de bes_disc_params looptijd_tot := cnt.cnt_getTermijndatum(artikel_rec.bes_bestelling_leverdatum, artikel_rec.bes_disc_params_cnt_termijn, 1); lcnt_opzegtermijn := artikel_rec.bes_disc_params_cnt_opzegterm; lbedr_key := artikel_rec.prs_bedrijf_key; ltotaal := artikel_rec.totaal; lprs_kostenplaats_key := artikel_rec.prs_kostenplaats_key; lfirst := 1; END; ELSE IF llast = 0 THEN IF ((LENGTH (lbeschrijving) + LENGTH (artikel_rec.bes_srtdeel_omschrijving) < (50 - 5)) AND (LENGTH (lomschrijving) + LENGTH (artikel_rec.bes_srtdeel_nr) < (2048 - 5)) AND (LENGTH (lopmerking) + LENGTH (artikel_rec.bes_srtdeel_opmerking) < (2048 - 5))) THEN lbeschrijving := lbeschrijving || ', ' || artikel_rec.bes_srtdeel_omschrijving; lomschrijving := lomschrijving || CHR (10) || artikel_rec.bes_srtdeel_nr; lopmerking := lopmerking || CHR (10) || artikel_rec.bes_srtdeel_opmerking; ELSE lbeschrijving := lbeschrijving || ', ' || '...'; lomschrijving := lomschrijving || CHR (10) || '...'; lopmerking := lopmerking || CHR (10) || '...'; llast := 1; END IF; END IF; END IF; END LOOP; -- Is er al een contract aanwezig? BEGIN SELECT c.cnt_contract_key INTO lcnt_key FROM cnt_contract c WHERE c.bes_bestelopdr_key = bestelopdr_key; EXCEPTION WHEN NO_DATA_FOUND THEN lcnt_key := -1; END; IF lcnt_key > 0 THEN -- Abonnement contract wijzigen UPDATE cnt_contract SET cnt_contract_nummer_intern = lcnt_nummer, ins_discipline_key = lcnt_disckey, cnt_contract_omschrijving = lbeschrijving, cnt_contract_document = lomschrijving, prs_afdeling_key_eig = lprs_afdeling_key, prs_perslid_key_eig = lprs_perslid_key_voor, prs_perslid_key_beh = lprs_perslid_key, cnt_contract_opmerking = lopmerking, cnt_contract_looptijd_van = looptijd_van, cnt_contract_looptijd_tot = looptijd_tot, cnt_contract_opzegtermijn = lcnt_opzegtermijn, cnt_contract_rappeltermijn = cnt_rappel_abonnement, cnt_prs_bedrijf_key = lbedr_key, prs_contactpersoon_key = lprs_contactpersoon_key, cnt_contract_kosten = ltotaal, prs_kostenplaats_key = lprs_kostenplaats_key, cnt_contract_verlenging = NULL, bes_bestelopdr_key = bestelopdr_key WHERE cnt_contract_key = lcnt_key; fac.trackaction ('CNTUPD', lcnt_key, NULL, NULL, NULL); ELSE -- Er moet een abonnement contract aangemaakt worden. -- Abonnement contract toevoegen SELECT cnt_s_cnt_contract_key.NEXTVAL INTO lcnt_key FROM DUAL; INSERT INTO cnt_contract (cnt_contract_key, cnt_contract_nummer_intern, ins_discipline_key, cnt_contract_omschrijving, cnt_contract_document, prs_afdeling_key_eig, prs_perslid_key_eig, prs_perslid_key_beh, cnt_contract_opmerking, cnt_contract_looptijd_van, cnt_contract_looptijd_tot, cnt_contract_opzegtermijn, cnt_contract_rappeltermijn, cnt_prs_bedrijf_key, prs_contactpersoon_key, cnt_contract_kosten, prs_kostenplaats_key, cnt_contract_verlenging, bes_bestelopdr_key, cnt_contract_status) VALUES (lcnt_key, lcnt_nummer, lcnt_disckey, lbeschrijving, lomschrijving, lprs_afdeling_key, lprs_perslid_key_voor, lprs_perslid_key, lopmerking, looptijd_van, looptijd_tot, lcnt_opzegtermijn, cnt_rappel_abonnement, lbedr_key, lprs_contactpersoon_key, ltotaal, lprs_kostenplaats_key, NULL, bestelopdr_key, 0); -- Status zou eigenlijk afhankelijk moeten zijn van het approval mechanisme of deze wel of niet actief is (Setting cnt_contract_approval). Voor nu nog niet. TODO... fac.trackaction ('CNTNEW', lcnt_key, NULL, NULL, lcl.L ('lcl_bes_cnt_insert') || lcnt_nummer); END IF; END; -- Geef bestellingkey, gewenste status en userkey, en de status wordt -- gezet, waarbij zonodig (indien verandering) een trackrecord wordt gemaakt -- Als de status niet wijzigt, wordt ook geen trackrecord gemaakt -- ZIE schema StateDiagramBestellingen.vsd PROCEDURE setbestellingstatus (pbestellingkey IN NUMBER, pstatus IN NUMBER, puserkey IN NUMBER) AS currentstatus bes_bestelling.bes_bestelling_status%TYPE; newstatus bes_bestelling.bes_bestelling_status%TYPE; eventcode VARCHAR2(10); -- tabelsize is 6 BEGIN SELECT COALESCE (bes_bestelling_status, -1) INTO currentstatus FROM bes_bestelling WHERE bes_bestelling_key = pbestellingkey; CASE pstatus WHEN 1 -- Afgewezen THEN IF currentstatus <> 1 THEN eventcode := 'BESREJ'; END IF; WHEN 2 -- Nieuw. Dit is de default, dus leeg kan niet; we rekenen 2>2 ook goed THEN eventcode := 'BESAP2'; WHEN 3 -- Gefiatteerd (voor de eerste keer, voordat acceptatie) THEN IF currentstatus <> 3 THEN eventcode := 'BESFIT'; END IF; WHEN 4 -- Geaccepteerd THEN IF currentstatus <> 4 THEN eventcode := 'BESACP'; END IF; WHEN 5 -- Besteld THEN IF currentstatus <> 5 THEN eventcode := 'BESBES'; END IF; WHEN 6 -- Geleverd THEN IF currentstatus <> 6 THEN eventcode := 'BESOTV'; END IF; WHEN 7 -- Verwerkt THEN IF currentstatus <> 7 THEN eventcode := 'BESVER'; END IF; WHEN 8 -- Geannuleerd THEN IF currentstatus <> 8 THEN eventcode := 'BESCAN'; END IF; WHEN 9 -- Ontvangen THEN IF currentstatus <> 9 THEN eventcode := '#BESOT2'; -- Alleen tracken en geen notificatie omdat die bij het ontvangen(6) wordt verstuurd. END IF; ELSE -- Invalid statuschange or no change eventcode := NULL; END CASE; IF eventcode IS NOT NULL THEN UPDATE bes_bestelling SET bes_bestelling_status = pstatus WHERE bes_bestelling_key = pbestellingkey; -- We know that trackaction doesnt do tracking if eventcode is null fac.trackaction (eventcode, pbestellingkey, puserkey, NULL, NULL); END IF; END; PROCEDURE setbestelopdrstatus (pbestelopdrkey IN NUMBER, pstatus IN NUMBER, puserkey IN NUMBER) AS currentstatus bes_bestelling.bes_bestelling_status%TYPE; newstatus bes_bestelling.bes_bestelling_status%TYPE; eventcode fac_srtnotificatie.fac_srtnotificatie_code%TYPE; BEGIN SELECT COALESCE (bes_bestelopdr_status, -1) INTO currentstatus FROM bes_bestelopdr WHERE bes_bestelopdr_key = pbestelopdrkey; CASE pstatus WHEN 1 -- Afgewezen THEN IF currentstatus <> 1 THEN eventcode := 'BES2RE'; END IF; WHEN 2 -- Unused THEN eventcode := NULL; WHEN 3 THEN IF currentstatus <> 3 -- In behandeling THEN eventcode := 'BES2NE'; END IF; WHEN 4 -- In Bestelling (bevestigd) THEN IF currentstatus <> 4 THEN eventcode := 'BES2CO'; END IF; WHEN 5 -- Ter Bevesting THEN IF currentstatus <> 5 THEN eventcode := 'BES2BE'; END IF; WHEN 6 -- Geleverd THEN IF currentstatus <> 6 THEN eventcode := 'BES2AF'; END IF; WHEN 7 -- Verwerkt THEN IF currentstatus <> 7 THEN eventcode := 'BES2VE'; END IF; WHEN 8 -- Geannuleerd THEN IF currentstatus <> 8 THEN eventcode := 'BES2CA'; END IF; ELSE -- Invalid statuschange or no change eventcode := NULL; END CASE; IF eventcode IS NOT NULL THEN UPDATE bes_bestelopdr SET bes_bestelopdr_status = pstatus WHERE bes_bestelopdr_key = pbestelopdrkey; -- We know that trackaction doesnt do tracking if eventcode is null fac.trackaction (eventcode, pbestelopdrkey, puserkey, NULL, NULL); END IF; END; -- Werkt zonodig de status bij (als alles geleverd is met name) -- ATTENTIE: onderstaande checks kunnen niet in de trigger vanwege mutating-errors! -- Deze moeten dus op gezette tijden worden aangeroepen, na aanpassing van een -- bestelaanvraag of bestelopdracht. PROCEDURE updatebestellingstatus (pbestelling_key IN NUMBER, user_key IN NUMBER) AS regel_cnt NUMBER; regel_cnt_geleverd NUMBER; regel_cnt_verwerkt NUMBER; BEGIN SELECT COUNT ( * ) INTO regel_cnt FROM bes_bestelling_item bi WHERE bes_bestelling_key = pbestelling_key; SELECT COUNT ( * ) INTO regel_cnt_geleverd FROM bes_bestelling_item bi WHERE bi.bes_bestelling_item_status = 6 AND bes_bestelling_key = pbestelling_key; SELECT COUNT ( * ) INTO regel_cnt_verwerkt FROM bes_bestelling_item bi WHERE bi.bes_bestelling_item_status = 7 AND bes_bestelling_key = pbestelling_key; IF regel_cnt_geleverd = regel_cnt THEN -- alles is geleverd, dus bestelling is geleverd bes.setbestellingstatus (pbestelling_key, 6, user_key); END IF; IF regel_cnt_verwerkt = regel_cnt THEN -- alles is verwerkt, dus bestelling is verwerkt bes.setbestellingstatus (pbestelling_key, 7, user_key); END IF; END; PROCEDURE updatebestelopdrstatus (pbestelopdr_key IN NUMBER, user_key IN NUMBER) AS regel_cnt NUMBER; regel_cnt_geleverd NUMBER; regel_cnt_verwerkt NUMBER; BEGIN SELECT COUNT ( * ) INTO regel_cnt FROM bes_bestelopdr_item bi WHERE bes_bestelopdr_key = pbestelopdr_key; SELECT COUNT ( * ) INTO regel_cnt_geleverd FROM bes_bestelopdr_item bi WHERE bi.bes_bestelopdr_item_status = 6 AND bes_bestelopdr_key = pbestelopdr_key; SELECT COUNT ( * ) INTO regel_cnt_verwerkt FROM bes_bestelopdr_item bi WHERE bi.bes_bestelopdr_item_status = 7 AND bes_bestelopdr_key = pbestelopdr_key; IF regel_cnt_geleverd = regel_cnt THEN -- alles is geleverd, dus opdracht is geleverd bes.setbestelopdrstatus (pbestelopdr_key, 6, user_key); END IF; IF regel_cnt_verwerkt = regel_cnt THEN -- alles is verwerkt, dus opdracht is verwerkt bes.setbestelopdrstatus (pbestelopdr_key, 7, user_key); END IF; END; -- Stuur alle mogelijke backofficemedewerkers een bericht als de -- melding NIEUW is. Naar wie, wordt reversed opgezocht op basis van -- toegekende autorisaties -- (zoals bij de lijst van BO-behandelaars in suggest/persoonfilter.inc) PROCEDURE notifybackoffice (pbeskey IN NUMBER) AS lloc_key mld_adres.alg_locatie_key%TYPE; lafd_key prs_perslid.prs_afdeling_key%TYPE; ldisc_key bes_srtgroep.ins_discipline_key%TYPE; ldisc_oms bes_discipline.ins_discipline_omschrijving%TYPE; loms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE; bericht fac_srtnotificatie.fac_srtnotificatie_oms%TYPE; lnrreceivers NUMBER; lreceivers fac_srtnotificatie.fac_srtnotificatie_oms%TYPE; lreceivers1 fac_srtnotificatie.fac_srtnotificatie_oms%TYPE; ltracking VARCHAR2(4000); -- moet tijdelijk groter dan fac_srtnotificatie.fac_srtnotificatie_oms%TYPE kunnen zijn BEGIN BEGIN SELECT DISTINCT COALESCE(ma.alg_locatie_key, -1), p.prs_afdeling_key, bsg.ins_discipline_key, bd.ins_discipline_omschrijving INTO lloc_key, lafd_key, ldisc_key, ldisc_oms FROM bes_bestelling b, bes_bestelling_item bi, bes_srtdeel bsd, bes_srtgroep bsg, bes_discipline bd, prs_perslid p, mld_adres ma 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 = bd.ins_discipline_key AND b.prs_perslid_key = p.prs_perslid_key AND b.mld_adres_key_lev = ma.mld_adres_key AND b.bes_bestelling_key = pbeskey; -- op dit moment nog alleen voor NIEUWE bestellingen -- Als die er niet is sprongen we al naar de exception -- Als die er wel is, gaan we verder SELECT lcl.x('fac_srtnotificatie_oms', fac_srtnotificatie_key, fac_srtnotificatie_oms) INTO loms FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'BES2BO'; bericht := bes.bessprintf (loms, pbeskey, ldisc_oms); -- de variabelen invullen lnrreceivers := 0; lreceivers := ''; FOR boer IN (SELECT g.prs_perslid_key FROM fac_v_webgebruiker g, fac_functie f, prs_perslid p, prs_v_afdeling d WHERE g.fac_functie_key = f.fac_functie_key AND g.ins_discipline_key = ldisc_key AND g.prs_perslid_key = p.prs_perslid_key AND d.prs_afdeling_key = p.prs_afdeling_key AND (g.fac_gebruiker_prs_level_write = -1 OR (g.fac_gebruiker_prs_level_write = 0 AND d.prs_bedrijf_key = (SELECT aa.prs_bedrijf_key FROM prs_v_afdeling aa WHERE aa.prs_afdeling_key = lafd_key)) OR (g.fac_gebruiker_prs_level_write >0 AND p.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 = lafd_key AND aa.niveau = g.fac_gebruiker_prs_level_write)))) -- in ASP: if (params.loc_key>0) -- Bij bestelling wordt afleveradres ingevuld die is gekoppeld aan alg_locatie_key. Dus op locatie niveau checken is hier voldoende. AND (g.fac_gebruiker_alg_level_write = -1 OR (g.fac_gebruiker_alg_level_write < 9 AND lloc_key IN (SELECT alg_locatie_key FROM fac_v_my_locations WHERE prs_perslid_key = p.prs_perslid_key AND niveau = fac_gebruiker_alg_level_write))) AND fac_functie_code = 'WEB_BESBOF') LOOP fac.putnotificationsrtprio (NULL, boer.prs_perslid_key, 'BES2BO', pbeskey, bericht, NULL, NULL, NULL, NULL, 2, NULL ); IF lnrreceivers = 0 THEN SELECT prs_perslid_naam_friendly INTO lreceivers FROM prs_v_perslid_fullnames WHERE prs_perslid_key = boer.prs_perslid_key; ELSE SELECT prs_perslid_naam_friendly INTO lreceivers1 FROM prs_v_perslid_fullnames WHERE prs_perslid_key = boer.prs_perslid_key; lreceivers := lreceivers||', '||lreceivers1; END IF; lnrreceivers := lnrreceivers+1; END LOOP; IF lnrreceivers > 0 THEN DBMS_OUTPUT.PUT_LINE(lnrreceivers); ltracking := lcl.l ('lcl_bes_notification_sent_to'); --ltracking := 'Notitificatie ''{0}'' verstuurd aan {1}'; ltracking := REPLACE (ltracking, '{0}', bericht); ltracking := REPLACE (ltracking, '{1}', lreceivers); DBMS_OUTPUT.PUT_LINE(ltracking); fac.trackaction ('#BESMAI', pbeskey, NULL, NULL, SUBSTR(ltracking,1,2048)); -- maxlengte van fac_srtnotificatie_oms END IF; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN; END; END; -- Stuur alle mogelijke bestelling goedkeurders een bericht als de bestelling status 3 heeft. -- Naar wie, wordt reversed opgezocht op basis van toegekende autorisaties. PROCEDURE notifybesgoedkeurders (pbeskey IN NUMBER) AS lloc_key mld_adres.alg_locatie_key%TYPE; lafd_key prs_perslid.prs_afdeling_key%TYPE; ldisc_key bes_srtgroep.ins_discipline_key%TYPE; loms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE; lbes_approved bes_bestelling.bes_bestelling_approved%TYPE; lbes_kosten NUMBER (11,2); lbestellimiet bes_disc_params.bes_disc_params_bestellimiet%TYPE; lbestellimiet2 bes_disc_params.bes_disc_params_bestellimiet2%TYPE; lbestellimiet3 bes_disc_params.bes_disc_params_bestellimiet3%TYPE; lbestellimiet4 bes_disc_params.bes_disc_params_bestellimiet4%TYPE; lbestellimiet5 bes_disc_params.bes_disc_params_bestellimiet5%TYPE; lbonotify bes_disc_params.bes_disc_params_bonotify%TYPE; lfunctiecode fac_functie.fac_functie_code%TYPE; lsender mld_discipline.ins_discipline_email%TYPE; bericht fac_srtnotificatie.fac_srtnotificatie_oms%TYPE; -- kan te kort zijn na substitutie lnrreceivers NUMBER; lreceivers fac_srtnotificatie.fac_srtnotificatie_oms%TYPE; lreceivers1 fac_srtnotificatie.fac_srtnotificatie_oms%TYPE; ltracking VARCHAR2(4000); -- moet tijdelijk groter dan fac_srtnotificatie.fac_srtnotificatie_oms%TYPE kunnen zijn BEGIN BEGIN SELECT COALESCE(ma.alg_locatie_key, -1), p.prs_afdeling_key, bsg.ins_discipline_key, COALESCE (b.bes_bestelling_approved, -1), COALESCE (SUM (bi.bes_bestelling_item_aantal * bi.bes_bestelling_item_prijs) - b.bes_bestelling_korting + b.bes_bestelling_levkosten, 0), COALESCE (bdp.bes_disc_params_bestellimiet, 0), COALESCE (bdp.bes_disc_params_bestellimiet2, 0), COALESCE (bdp.bes_disc_params_bestellimiet3, 0), COALESCE (bdp.bes_disc_params_bestellimiet4, 0), COALESCE (bdp.bes_disc_params_bestellimiet5, 0), bdp.bes_disc_params_bonotify INTO lloc_key, lafd_key, ldisc_key, lbes_approved, lbes_kosten, lbestellimiet, lbestellimiet2, lbestellimiet3, lbestellimiet4, lbestellimiet5, lbonotify FROM bes_bestelling b, bes_bestelling_item bi, bes_srtdeel bsd, bes_srtgroep bsg, bes_disc_params bdp, prs_perslid p, mld_adres ma 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 AND b.prs_perslid_key = p.prs_perslid_key AND b.mld_adres_key_lev = ma.mld_adres_key AND bi.bes_bestelling_key = pbeskey GROUP BY ma.alg_locatie_key, p.prs_afdeling_key, bsg.ins_discipline_key, b.bes_bestelling_approved, b.bes_bestelling_korting, b.bes_bestelling_levkosten, bdp.bes_disc_params_bestellimiet, bdp.bes_disc_params_bestellimiet2, bdp.bes_disc_params_bestellimiet3, bdp.bes_disc_params_bestellimiet4, bdp.bes_disc_params_bestellimiet5, bdp.bes_disc_params_bonotify; IF lbes_kosten <= lbestellimiet -- Dit eerst testen i.v.m. Acceptering. Verder moet sowieso geaccepteerd worden. THEN IF lbonotify = 1 THEN -- Er hoeft niet gefiatteerd te worden, bes.notifybackoffice(pbeskey); -- dus stuur de backoffice een bericht dat er een nieuwe bestelling is. END IF; RETURN; -- Het bedrag is lager als de eerste limiet. De bestelling hoeft niet goed gekeurd te worden, dus een lege fiatteurs array teruggeven. ELSIF (((fac.getsetting ('bes_approval_all') = 0 AND lbes_kosten >= lbestellimiet) OR (fac.getsetting ('bes_approval_all') = 1 AND lbes_kosten <= lbestellimiet2)) AND lbes_approved <= lbestellimiet) THEN lfunctiecode := 'WEB_BESBOF'; ELSIF ((fac.getsetting ('bes_approval_all') = 0 AND lbes_kosten >= lbestellimiet2 AND lbes_approved = lbestellimiet2) OR (fac.getsetting ('bes_approval_all') = 1 AND lbes_kosten <= lbestellimiet3 AND lbes_approved <= lbestellimiet2)) THEN lfunctiecode := 'WEB_BESGO2'; ELSIF ((fac.getsetting ('bes_approval_all') = 0 AND lbes_kosten >= lbestellimiet3 AND lbes_approved = lbestellimiet3) OR (fac.getsetting ('bes_approval_all') = 1 AND lbes_kosten <= lbestellimiet4 AND lbes_approved <= lbestellimiet3)) THEN lfunctiecode := 'WEB_BESGO3'; ELSIF ((fac.getsetting ('bes_approval_all') = 0 AND lbes_kosten >= lbestellimiet4 AND lbes_approved = lbestellimiet4) OR (fac.getsetting ('bes_approval_all') = 1 AND lbes_kosten <= lbestellimiet5 AND lbes_approved <= lbestellimiet4)) THEN lfunctiecode := 'WEB_BESGO4'; ELSIF((fac.getsetting ('bes_approval_all') = 0 AND lbes_kosten >= lbestellimiet5 AND lbes_approved >= lbestellimiet5) OR (fac.getsetting ('bes_approval_all') = 1 AND lbes_kosten > lbestellimiet5 AND lbes_approved <= lbestellimiet5)) THEN lfunctiecode := 'WEB_BESGO5'; ELSE IF lbonotify = 1 THEN -- De laatste fiatteur heeft de bestelling goedgekeurd, bes.notifybackoffice(pbeskey); -- dus nu mag de backoffice het bericht krijgen dat er een nieuwe bestelling is. END IF; RETURN; -- Het goedgekeurde bedrag zit al boven de limiet. Geen approval meer nodig. END IF; -- These notifications are now sent on behalf of the system, what might be the local FM organisation SELECT MAX (COALESCE (bd.ins_discipline_email, l.alg_locatie_email)) email INTO lsender FROM bes_bestelling b, bes_bestelling_item bi, bes_srtdeel bsd, bes_srtgroep bsg, bes_discipline bd, mld_adres ma, alg_locatie l 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 = bd.ins_discipline_key AND b.mld_adres_key_lev = ma.mld_adres_key AND ma.alg_locatie_key = l.alg_locatie_key AND bi.bes_bestelling_key = pbeskey; -- Als die er niet is sprongen we al naar de exception -- Als die er wel is, gaan we verder SELECT lcl.x('fac_srtnotificatie_oms', fac_srtnotificatie_key, fac_srtnotificatie_oms) INTO loms FROM fac_srtnotificatie WHERE fac_srtnotificatie_code = 'BESAP1'; bericht := bes.bessprintf (loms, pbeskey, ''); -- de variabelen invullen lnrreceivers := 0; lreceivers := ''; FOR boer IN (SELECT g.prs_perslid_key FROM fac_v_webgebruiker g, fac_functie f, prs_perslid p WHERE g.fac_functie_key = f.fac_functie_key AND g.ins_discipline_key = ldisc_key AND g.prs_perslid_key = p.prs_perslid_key AND (g.fac_gebruiker_prs_level_write = -1 OR (g.fac_gebruiker_prs_level_write < 9 AND p.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 = lafd_key AND aa.niveau = g.fac_gebruiker_prs_level_write)))) -- in ASP: if (params.loc_key>0) AND (g.fac_gebruiker_alg_level_write = -1 OR (g.fac_gebruiker_alg_level_write < 9 AND lloc_key IN (SELECT alg_locatie_key FROM fac_v_my_locations WHERE prs_perslid_key = p.prs_perslid_key AND niveau = fac_gebruiker_alg_level_write))) AND fac_functie_code = lfunctiecode) LOOP fac.putnotificationsrtprio (NULL, boer.prs_perslid_key, 'BESAP1', pbeskey, bericht, NULL, NULL, NULL, NULL, 2, lsender ); IF lnrreceivers = 0 THEN SELECT prs_perslid_naam_friendly INTO lreceivers FROM prs_v_perslid_fullnames WHERE prs_perslid_key = boer.prs_perslid_key; ELSE SELECT prs_perslid_naam_friendly INTO lreceivers1 FROM prs_v_perslid_fullnames WHERE prs_perslid_key = boer.prs_perslid_key; lreceivers := lreceivers||', '||lreceivers1; END IF; lnrreceivers := lnrreceivers+1; END LOOP; IF lnrreceivers > 0 THEN DBMS_OUTPUT.PUT_LINE(lnrreceivers); ltracking := lcl.l ('lcl_ord_notification_sent_to'); --ltracking := 'Notitificatie ''{0}'' verstuurd aan {1}'; DBMS_OUTPUT.PUT_LINE(ltracking); ltracking := REPLACE (ltracking, '{0}', bericht); ltracking := REPLACE (ltracking, '{1}', lreceivers); DBMS_OUTPUT.PUT_LINE(ltracking); fac.trackaction ('#BES2MA', pbeskey, NULL, NULL, SUBSTR(ltracking,1,2048)); -- maxlengte van fac_srtnotificatie_oms END IF; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN; END; END; -- Opdracht wordt geaccepteerd door de leverancier (of door de BO namens de leverancier) PROCEDURE acceptopdracht (pbestelopdr_key IN NUMBER, user_key IN NUMBER, presulttext IN VARCHAR2) AS beskey bes_bestelling.bes_bestelling_key%TYPE; orgbeskey bes_bestelling.bes_bestelling_key%TYPE; orgopdrkey bes_bestelopdr.bes_bestelopdr_key%TYPE; opdrachtaantal bes_bestelopdr_item.bes_bestelopdr_item_aantal%TYPE; abonnement bes_disc_params.bes_disc_params_contract%TYPE; BEGIN SELECT MAX (b.bes_bestelling_key), MAX (b.bes_bestelling_parentkey), MAX (bdp.bes_disc_params_contract) INTO beskey, orgbeskey, abonnement FROM bes_bestelopdr_item boi, bes_bestelling_item bi, bes_bestelling b, bes_srtdeel bsd, bes_srtgroep bsg, bes_disc_params bdp WHERE bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key AND bi.bes_bestelling_key = b.bes_bestelling_key AND bi.bes_srtdeel_key = bsd.bes_srtdeel_key AND bsd.bes_srtgroep_key = bsg.bes_srtgroep_key AND bdp.bes_ins_discipline_key = bsg.ins_discipline_key AND boi.bes_bestelopdr_key = pbestelopdr_key; -- We hebben nu alles in geval van een mutatieopdracht: -- orgopdrkey = de key van de oude opdracht BO1 -- pbestelopdr_key = de key van de nieuwe opdracht BO2 -- orgbeskey = de key van de oude aanvraag BA1 -- beskey = de key van de nieuwe aanvraag BA2 DBMS_OUTPUT.put_line ('orgbeskey' || orgbeskey); DBMS_OUTPUT.put_line ('pbestelopdr_key' || pbestelopdr_key); DBMS_OUTPUT.put_line ('beskey' || beskey); -- Ook gewoon op change-opdracht bes.setbestelopdrstatus (pbestelopdr_key, 4, user_key); IF orgbeskey IS NULL THEN -- dit is geen kopie of zo, gewoon een bestelling/opdracht IF abonnement = 1 THEN -- Het is een abonnement bestelling/opdracht. Er moet een abonnement contract aangemaakt worden. bes.makecontract (pbestelopdr_key); END IF; ELSE -- Deze opdracht behoort bij een kopie-bestelaanvraag, waarvan de opdracht -- nu dus is goedgekeurd door de leverancier. Aan het werk! -- SELECT MAX (boi.bes_bestelopdr_key) INTO orgopdrkey FROM bes_bestelopdr_item boi, bes_bestelling_item bi WHERE bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key AND bi.bes_bestelling_key = orgbeskey; DBMS_OUTPUT.put_line ('orgopdrkey' || orgopdrkey); -- Nieuwe tracking toevoegen aan de oude (die we straks weggooien); UPDATE fac_tracking SET fac_tracking_refkey = orgopdrkey WHERE fac_tracking_refkey = pbestelopdr_key AND fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_xmlnode = 'bestelopdr'); -- Als het totaal van de mutatie-opdracht 0 is, is het een annulering, die nu -- dus door de leverancier is goedgekeurd. Het kan echter zo zijn dat de -- annuleringshorizon verstreken is, en dat er toch nog betaald moet worden -- we moeten DAN dus de oorspronkelijke opdracht bewaren tbv de factuur later -- Daarom gooien we dan niet de opdracht weg, maar zetten we status op 8. SELECT SUM (bes_bestelopdr_item_aantal) INTO opdrachtaantal FROM bes_bestelopdr_item WHERE bes_bestelopdr_key = pbestelopdr_key; -- Misschien moet je hier nog meer conditie aan toevoegen om zeker te weten dat het een annulering is? IF opdrachtaantal <> 0 THEN -- -- Nu alle nieuwe gegevens aan de oorspronkelijke hangen (behoud van nummer/key) -- Eerst de opdracht. -- Let op: we *verwijderen* de originele bes_bestelling_item en bes_bestelopdr_item -- (en flex) maar *houden* de originele bes_bestelling en bes_bestelopdr -- De concept aanvraag- en opdrachtregels (en flex) worden omgezet naar de -- originele bes_bestelling en bes_bestelopdr -- Vervolgens verwijderen we de concept bes_bestelling en de concept bes_bestelopdr -- De flexkenmerken onder de nieuwe itemregels gaan zo vanzelf goed -- maar de flexkenmerken onder de nieuwe bes_bestelling moeten wel omgezet -- Originele bestelregels en opdrachtregels verwijderen -- Deze moeten eerst, anders faalt de volgende DELETE FROM bes_bestelling_item WHERE bes_bestelling_key = orgbeskey; DELETE FROM bes_bestelopdr_item WHERE bes_bestelopdr_key = orgopdrkey; DELETE FROM bes_kenmerkbestell WHERE bes_bestelling_key = orgbeskey; UPDATE bes_bestelopdr_item -- de concept opdracht regels actueel maken SET bes_bestelopdr_key = orgopdrkey WHERE bes_bestelopdr_key = pbestelopdr_key; -- TODO: de kopgegevens overzetten UITWERKEN UPDATE bes_bestelopdr -- de originele opdracht SET (prs_bedrijf_key, bes_bestelopdr_datum, mld_adres_key_lev, mld_adres_key_fac, bes_bestelopdr_id ) = (SELECT prs_bedrijf_key, bes_bestelopdr_datum, mld_adres_key_lev, mld_adres_key_fac, bes_bestelopdr_id FROM bes_bestelopdr WHERE bes_bestelopdr_key = pbestelopdr_key) WHERE bes_bestelopdr_key = orgopdrkey; -- De opdracht is weg, nu de aanvraag -- Merk op: bij een annuleer doen we dit niet, bestelling-tracking -- is niet interessant UPDATE fac_tracking SET fac_tracking_refkey = orgbeskey WHERE fac_tracking_refkey = beskey AND fac_srtnotificatie_key IN (SELECT fac_srtnotificatie_key FROM fac_srtnotificatie WHERE fac_srtnotificatie_xmlnode = 'bestelling'); UPDATE bes_bestelling_item -- de concept aanvraagregels actueel maken SET bes_bestelling_key = orgbeskey WHERE bes_bestelling_key = beskey; UPDATE bes_kenmerkbestell -- bestelling kenmerken SET bes_bestelling_key = orgbeskey WHERE bes_bestelling_key = beskey; -- TODO: GOED NAGAAN WAT OVERGENOMEN MOET WORDEN EN WAT NIET. ECHT NOG DOEN HOOR! UPDATE bes_bestelling -- de originele bestelling SET (bes_bestelling_datum, prs_perslid_key, bes_bestelling_opmerking, bes_bestelling_ordernr, bes_bestelling_plaats, mld_adres_key_lev, prs_kostenplaats_key, bes_bestelling_leverdatum, bes_bestelling_lev_opm ) = (SELECT bes_bestelling_datum, prs_perslid_key, bes_bestelling_opmerking, bes_bestelling_ordernr, bes_bestelling_plaats, mld_adres_key_lev, prs_kostenplaats_key, bes_bestelling_leverdatum, bes_bestelling_lev_opm FROM bes_bestelling WHERE bes_bestelling_key = beskey) WHERE bes_bestelling_key = orgbeskey; -- bes.setbestelopdrstatus (orgopdrkey, 4, user_key); IF abonnement = 1 THEN -- Het is een abonnement bestelling/opdracht. Abonnement contract wijzigen/toevoegen. bes.makecontract (orgopdrkey); END IF; -- Anders nog iets? ELSE -- Een annulering -- We behouden de oude opdracht/ bestelling, maar zetten die op Geannuleerd, -- De nieuwe gooien we weg, die heeft zijn werk gedaan -- Eindstand is dus BA1 en BO1 bes.setbestelopdrstatus (orgopdrkey, 8, user_key); bes.setbestellingstatus (orgbeskey, 8, user_key); DELETE FROM bes_bestelling_item WHERE bes_bestelling_key = beskey; DELETE FROM bes_bestelopdr_item -- de concept opdracht regels mogen weg WHERE bes_bestelopdr_key = pbestelopdr_key; END IF; -- De concept bestelling en bestelopdracht records mogen nu altijd weg DELETE FROM bes_bestelopdr WHERE bes_bestelopdr_key = pbestelopdr_key; DELETE FROM bes_bestelling WHERE bes_bestelling_key = beskey; END IF; END; -- Opdracht wordt afgewezen door de leverancier (of door de BO namens de leverancier) PROCEDURE rejectopdracht (pbestelopdr_key IN NUMBER, user_key IN NUMBER, presulttext IN VARCHAR2) AS beskey bes_bestelling.bes_bestelling_key%TYPE; orgbeskey bes_bestelling.bes_bestelling_key%TYPE; orgopdrkey bes_bestelopdr.bes_bestelopdr_key%TYPE; BEGIN SELECT MAX (b.bes_bestelling_key), MAX (b.bes_bestelling_parentkey) INTO beskey, orgbeskey FROM bes_bestelopdr_item boi, bes_bestelling_item bi, bes_bestelling b WHERE bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key AND bi.bes_bestelling_key = b.bes_bestelling_key AND boi.bes_bestelopdr_key = pbestelopdr_key; IF orgbeskey IS NULL THEN -- dit is geen kopie of zo, gewoon een bestelling/opdracht, dus gewoon vervallen bes.setbestelopdrstatus (pbestelopdr_key, 1, user_key); bes.setbestellingstatus(beskey, 1, user_key); ELSE -- rollback fac.trackaction ('BESXXX', orgbeskey, user_key, NULL, presulttext); -- mutatie gefaalt DELETE FROM bes_bestelling_item WHERE bes_bestelling_key = beskey; DELETE FROM bes_bestelopdr_item WHERE bes_bestelopdr_key = pbestelopdr_key; DELETE FROM bes_bestelopdr WHERE bes_bestelopdr_key = pbestelopdr_key; DELETE FROM bes_bestelling WHERE bes_bestelling_key = beskey; DBMS_OUTPUT.put_line ('failed -3'); END IF; -- rollback END; FUNCTION bestelopdr_tooltip (besopdrkey IN NUMBER) RETURN VARCHAR2 IS lret VARCHAR2 (512); lfirst NUMBER; llast NUMBER; CURSOR opdritems IS SELECT TO_CHAR (boi.bes_bestelopdr_item_aantal) || 'x ' || s.bes_srtdeel_omschrijving /* lcl.x()?*/ || ' (' || s.bes_srtdeel_eenheid || ') ' besitemdsc FROM bes_bestelopdr_item boi, bes_bestelling_item bi, bes_srtdeel s WHERE boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key AND bi.bes_srtdeel_key = s.bes_srtdeel_key AND boi.bes_bestelopdr_key = besopdrkey; BEGIN lret := NULL; lfirst := 0; llast := 0; FOR besitem_rec IN opdritems LOOP IF lfirst = 0 THEN BEGIN lret := besitem_rec.besitemdsc; lfirst := 1; END; ELSE IF llast = 0 THEN IF LENGTH (lret) + LENGTH (besitem_rec.besitemdsc) < (512 - 5) THEN lret := lret || CHR (10) || besitem_rec.besitemdsc; ELSE lret := lret || CHR (10) || '...'; llast := 1; END IF; END IF; END IF; END LOOP; RETURN lret; END; FUNCTION bessprintf (ps IN varchar2, pbes_bestelling_key IN number, pbes_discipline IN VARCHAR2) RETURN varchar2 IS s varchar2 (2048 CHAR); lbes_bestelling_datum bes_bestelling.bes_bestelling_datum%TYPE; BEGIN s := ps; -- We support substitution of placeholders in the messages -- ##KEY## = bes_bestelling_key -- ##DATUM## = bes_bestelling_datum -- ##DISC## = ins_discipline_omschrijving IF INSTR2 (s, '#') > 0 THEN SELECT b.bes_bestelling_datum INTO lbes_bestelling_datum FROM bes_bestelling b WHERE b.bes_bestelling_key = pbes_bestelling_key; s := REPLACE( REPLACE( REPLACE( s , '##KEY##', TO_CHAR (pbes_bestelling_key) ) , '##DATUM##', TO_CHAR (lbes_bestelling_datum, 'DD-MM-YY HH24:MI') ) , '##DISC##', pbes_discipline ); END IF; RETURN s; END; FUNCTION opdrsprintf (ps IN VARCHAR2, pbes_bestelopdr_key IN NUMBER) RETURN VARCHAR2 IS s VARCHAR2 (2048 CHAR); f VARCHAR2 (2048 CHAR); d NUMBER := 0; fmt VARCHAR2 (50 CHAR); s1 VARCHAR2 (2048 CHAR); d1 NUMBER; d2 NUMBER; lopdrid bes_bestelopdr.bes_bestelopdr_id%TYPE; BEGIN s := ps; -- We support substitution of placeholders in the messages -- ##KEY## = bes_bestelopdr_id -- ##KEYN## = voorloop+bes_bestelopdr_id IF (instr2 (s, '#') > 0 AND instr2 (s, '$') > 0) THEN f := SUBSTR( s, INSTR2( s, '$$')+2); f := SUBSTR( f, 1, INSTR2( f, '##')-1); s := REPLACE( s, '$$'||f, ''); IF f is not null THEN BEGIN d := TO_NUMBER(f); EXCEPTION WHEN OTHERS THEN d := 0; END; fmt := LPAD('0', d, '0'); END IF; END IF; IF INSTR (s, '#') > 0 THEN SELECT bes_bestelopdr_id INTO lopdrid FROM bes_bestelopdr WHERE bes_bestelopdr_key = pbes_bestelopdr_key; IF (INSTR (s, '##KEY##') > 0) THEN s := REPLACE (s, '##KEY##', lopdrid); END IF; -- IF (INSTR (s, '##KEYN##') > 0) THEN IF (fmt IS NOT NULL) THEN s1 := fmt || lopdrid; d2 := INSTR(lopdrid, '/')-1; IF (d2<0) THEN d2 := LENGTH(lopdrid); d1 := LENGTH(s1)+1; ELSE d1 := INSTR(s1, '/'); END IF; s1 := SUBSTR(s1, (d1 - d)); IF (d < d2) THEN s1 := '####'; END IF; ELSE s1 := lopdrid; END IF; -- s := REPLACE (s, '##KEYN##', s1); END IF; END IF; RETURN s; END; PROCEDURE remove(p_bes_bestelling_key IN NUMBER) IS CURSOR c_bestelling(p_bestelling_key IN NUMBER) IS SELECT bes_bestelling_key FROM bes_bestelling WHERE bes_bestelling_retourvan_key = p_bestelling_key OR bes_bestelling_parentkey = p_bestelling_key; CURSOR c_opdracht(p_bestelling_key IN NUMBER) IS SELECT DISTINCT oi.bes_bestelopdr_key FROM bes_bestelling_item bi , bes_bestelopdr_item oi WHERE bi.bes_bestelopdr_item_key = oi.bes_bestelopdr_item_key AND bi.bes_bestelling_key = p_bestelling_key; CURSOR c_bijlagen(p_refkey IN NUMBER) IS SELECT b.fac_bijlagen_key FROM fac_bijlagen b , bes_bestelling r , (SELECT k.bes_kenmerk_key kenmerk_key FROM bes_kenmerk k , bes_srtkenmerk s WHERE k.bes_srtkenmerk_key = s.bes_srtkenmerk_key AND k.bes_kenmerk_type = 'B' AND s.bes_srtkenmerk_kenmerktype IN ('F', 'M', 'E', 'X') ) k WHERE b.fac_bijlagen_refkey = r.bes_bestelling_key AND b.fac_bijlagen_kenmerk_key = k.kenmerk_key AND b.fac_bijlagen_module = 'BES' AND r.bes_bestelling_key = p_refkey UNION SELECT b.fac_bijlagen_key FROM fac_bijlagen b , bes_bestelling_item r , (SELECT k.bes_kenmerk_key kenmerk_key FROM bes_kenmerk k , bes_srtkenmerk s WHERE k.bes_srtkenmerk_key = s.bes_srtkenmerk_key AND k.bes_kenmerk_type = 'B' AND s.bes_srtkenmerk_kenmerktype IN ('F', 'M', 'E', 'X') ) k WHERE b.fac_bijlagen_refkey = r.bes_bestelling_item_key AND b.fac_bijlagen_kenmerk_key = k.kenmerk_key AND b.fac_bijlagen_module = 'BES' AND r.bes_bestelling_key = p_refkey; BEGIN -- Ook alle child/retour bestellingen verwijderen. FOR ref_bestelling IN c_bestelling(p_bes_bestelling_key) LOOP bes.remove(ref_bestelling.bes_bestelling_key); END LOOP; -- Alle bestelopdrachten onder de bestelling verwijderen. FOR ref_opdracht IN c_opdracht(p_bes_bestelling_key) LOOP bes.remove_opdr(ref_opdracht.bes_bestelopdr_key); END LOOP; -- Van alle bestellingen en bestelitems die worden verwijderd moeten ook de bijlagen verwijderd worden. FOR ref_bijlagen IN c_bijlagen(p_bes_bestelling_key) LOOP flx.deleteflexbijlage (ref_bijlagen.fac_bijlagen_key); END LOOP; -- Verwijderen bestelling DELETE FROM bes_bestelling WHERE bes_bestelling_key = p_bes_bestelling_key; -- Van de volgende tabellen worden de records die naar deze p_bes_bestelling_key -- verwijzen met ON DELETE CASCADE ook verwijderd: -- bes_kenmerkbestell -- bes_bestelling_item -- Hierdoor worden de afhankelijkheden in de volgende tabel ook verwijderd: -- bes_kenmerkbesteli fac.remove_tracking('bestelling', p_bes_bestelling_key); END; PROCEDURE remove_opdr(p_bes_opdr_key IN NUMBER) IS CURSOR c_factuur(p_bestelopdracht_key IN NUMBER) IS SELECT fin_factuur_key FROM fin_factuur WHERE bes_bestelopdr_key = p_bestelopdracht_key; BEGIN -- Verwijderen bestelopdracht FOR ref_factuur IN c_factuur(p_bes_opdr_key) LOOP fin.remove(ref_factuur.fin_factuur_key); END LOOP; -- verwijder de verwijzing van bestelaanvraag regel naar bestelopdracht regel -- dat had een on delete set null mogen zijn UPDATE bes_bestelling_item SET bes_bestelopdr_item_key = NULL WHERE bes_bestelopdr_item_key IN (SELECT bes_bestelopdr_item_key FROM bes_bestelopdr_item WHERE bes_bestelopdr_key = p_bes_opdr_key); FOR ref_contract IN (SELECT cnt_contract_key FROM cnt_contract WHERE bes_bestelopdr_key = p_bes_opdr_key ) LOOP -- Verwijder contracten die aan deze bestelopdracht zitten. cnt.remove(ref_contract.cnt_contract_key); END LOOP; DELETE FROM bes_bestelopdr WHERE bes_bestelopdr_key = p_bes_opdr_key; -- Van de volgende tabellen worden de records die naar deze p_bestelling_key -- verwijzen met ON DELETE CASCADE ook verwijderd: -- bes_bestelopdr_item fac.remove_tracking('bestelopdr', p_bes_opdr_key); END; FUNCTION bes_besteed_budget_pgb (p_prs_key IN NUMBER, p_disc_key IN NUMBER) RETURN NUMBER AS l_budgetbesteld NUMBER := 0; BEGIN -- Besteed budget van meegegeven persoon dit jaar voor de meegegeven discipline i.v.m. Persoons Gebonden Budget (PGB). -- Eventueel uitgezonderd (huidige) bestellingkey bes_key en meldingopdrachtkey opdr_key. -- De discipline instelling disc_params_pgb moet 1 of 3 zijn. Afhankelijk van deze instelling roep je de pgb of agb versie aan. Hier opnieuw controleren is niet nodig. -- Totaalbedrag van eerdere bestellingen en meldingopdrachten dit jaar van de besteller en behandelaar i.v.m. Persoons Gebonden Budget (PGB). SELECT COALESCE(SUM(totaalbedrag), 0) - COALESCE(SUM(korting), 0) + COALESCE(SUM(levkosten), 0) budgetbesteld INTO l_budgetbesteld FROM (SELECT SUM(totaalbedrag) totaalbedrag , SUM(b.bes_bestelling_korting) korting , SUM(b.bes_bestelling_levkosten) levkosten FROM (SELECT SUM (boi.bes_bestelopdr_item_aantal * boi.bes_bestelopdr_item_prijs) totaalbedrag , b.bes_bestelling_key FROM bes_bestelling b , bes_bestelling_item bi , bes_bestelopdr_item boi , bes_bestelopdr bo , bes_srtdeel isd , bes_srtgroep isg WHERE b.bes_bestelling_key = bi.bes_bestelling_key AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key AND bi.bes_srtdeel_key = isd.bes_srtdeel_key AND isd.bes_srtgroep_key = isg.bes_srtgroep_key AND b.prs_perslid_key = p_prs_key AND isg.ins_discipline_key = p_disc_key -- Alleen bestellingopdrachten in de behandelings fase (In bestelling (Bevestigd)(4)) en in de gereed fase (Geleverd(6) en Verwerkt(7)). -- Afgewezen(1), In behandeling(3), Ter bevestiging(5) en Geannuleerd(8) doen niet mee in de bepaling van geraamde en definitieve kosten. AND bo.bes_bestelopdr_status IN (4, 6, 7) AND b.bes_bestelling_datum >= TRUNC (SYSDATE, 'YEAR') GROUP BY b.bes_bestelling_key) tot , bes_bestelling b WHERE b.bes_bestelling_key = tot.bes_bestelling_key); RETURN l_budgetbesteld; END; FUNCTION bes_besteed_budget_agb (p_kp_key IN NUMBER) RETURN NUMBER AS l_budgetbesteld NUMBER := 0; l_kp_limietperiode NUMBER (1); l_periode VARCHAR2 (4); BEGIN -- Besteed budget van meegegeven persoon afgelopen periode i.v.m. Afdelings Gebonden Budget (AGB). -- Eventueel uitgezonderd (huidige) bestellingkey bes_key en meldingopdrachtkey opdr_key. -- De discipline instelling disc_params_pgb moet 1 of 3 zijn. Afhankelijk van deze instelling roep je de pgb of agb versie aan. Hier opnieuw controleren is niet nodig. -- Totaalbedrag van eerdere bestellingen en meldingopdrachten van afgelopen periode van de besteller en behandeaar i.v.m. Afdelings Gebonden Budget (AGB). -- Limietperiode kostenplaats (prs_kostenplaats_limietperiode): 0(of NULL)=geen(oneindig) (default), 1=maand, 2=jaar. IF p_kp_key > 0 THEN -- Er is een kostenplaats gevonden. -- De limiet periode van de kostenplaatsgroep overruled die van de kostenplaats indien ingevuld. SELECT CASE COALESCE(kg.prs_kostenplaatsgrp_limperiode, 0) -- Indien kostenplaats geen kostenplaatsgroep heeft dan ook "Geen" en eigen limietperiode van de kostenplaats nemen. WHEN 0 -- Geen. THEN k.prs_kostenplaats_limietperiode ELSE kg.prs_kostenplaatsgrp_limperiode -- Maand of Jaar. END limietperiode INTO l_kp_limietperiode FROM prs_kostenplaats k , prs_kostenplaatsgrp kg WHERE k.prs_kostenplaatsgrp_key = kg.prs_kostenplaatsgrp_key(+) AND k.prs_kostenplaats_key = p_kp_key; IF l_kp_limietperiode = 1 THEN l_periode := 'MM'; -- Maandelijks budget. ELSIF l_kp_limietperiode = 2 THEN l_periode := 'YYYY'; -- Jaarlijks budget. ELSE l_periode := NULL; END IF; SELECT COALESCE(SUM(totaalbedrag), 0) - COALESCE(SUM(korting), 0) + COALESCE(SUM(levkosten), 0) budgetbesteld INTO l_budgetbesteld FROM (SELECT SUM(totaalbedrag) totaalbedrag , SUM(b.bes_bestelling_korting) korting , SUM(b.bes_bestelling_levkosten) levkosten FROM (SELECT SUM (boi.bes_bestelopdr_item_aantal * boi.bes_bestelopdr_item_prijs) totaalbedrag , b.bes_bestelling_key FROM bes_bestelling b , bes_bestelling_item bi , bes_bestelopdr_item boi , bes_bestelopdr bo , bes_srtdeel bsd , bes_srtgroep bsg , bes_discipline bd , bes_disc_params bdp WHERE b.bes_bestelling_key = bi.bes_bestelling_key AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key AND bi.bes_srtdeel_key = bsd.bes_srtdeel_key AND bsd.bes_srtgroep_key = bsg.bes_srtgroep_key AND bsg.ins_discipline_key = bd.ins_discipline_key AND bsg.ins_discipline_key = bdp.bes_ins_discipline_key AND bdp.bes_disc_params_pgb IN (2, 3) -- Alleenn agb meetellen: 2 = Alleen agb, 3 = Beiden, pgb en agb. AND b.prs_kostenplaats_key = p_kp_key -- Alleen bestellingopdrachten in de behandelings fase (In bestelling (Bevestigd)(4)) en in de gereed fase (Geleverd(6) en Verwerkt(7)). -- Afgewezen(1), In behandeling(3), Ter bevestiging(5) en Geannuleerd(8) doen niet mee in de bepaling van geraamde en definitieve kosten. AND bo.bes_bestelopdr_status IN (4, 6, 7) AND ((l_periode IS NOT NULL AND b.bes_bestelling_datum >= TRUNC (SYSDATE, l_periode)) OR (l_periode IS NULL)) -- De eerste van de deze maand of 1 januari dit jaar GROUP BY b.bes_bestelling_key) tot , bes_bestelling b WHERE b.bes_bestelling_key = tot.bes_bestelling_key); END IF; RETURN l_budgetbesteld; END; PROCEDURE notifybestellingbedrijven (pbestelkey NUMBER, ptrackingkey NUMBER, pnotidelay NUMBER DEFAULT NULL) AS BEGIN NULL; -- TODO? END; PROCEDURE notifybestelopdrbedrijven (pbestelopdrkey NUMBER, ptrackingkey NUMBER, pnotidelay NUMBER DEFAULT NULL) AS BEGIN FOR bedrijfrec IN (SELECT b.prs_bedrijf_key, CASE WHEN b.prs_bedrijf_key = o.prs_bedrijf_key THEN 'B' ELSE 'G' END bedrijfadres_type, l.alg_locatie_key, o.bes_bestelopdr_id FROM prs_bedrijf b, bes_bestelopdr o, mld_adres ma, alg_locatie l WHERE o.bes_bestelopdr_key = pbestelopdrkey AND b.prs_bedrijf_key = o.prs_bedrijf_key AND o.mld_adres_key_lev = ma.mld_adres_key AND ma.alg_locatie_key = l.alg_locatie_key(+) AND ( b.prs_bedrijf_key = o.prs_bedrijf_key -- type 'B' OR EXISTS (SELECT 1 FROM prs_bedrijfadres ba WHERE ba.prs_bedrijf_key = b.prs_bedrijf_key AND ba.prs_bedrijfadres_startdatum <= SYSDATE AND ba.prs_bedrijfadres_type = 'G'))) LOOP fac.notifybedrijf (pbedrijf_key => bedrijfrec.prs_bedrijf_key, pbedrijfadres_type => bedrijfrec.bedrijfadres_type, prefkey => pbestelopdrkey, ptrackingkey => ptrackingkey, preference => bedrijfrec.bes_bestelopdr_id, plocatie_key => bedrijfrec.alg_locatie_key, pnotidelay => pnotidelay); END LOOP; END; PROCEDURE autodeliver IS v_bes_bestellevr_key bes_bestellevr.bes_bestellevr_key%TYPE; last_bes_bestelopdr_key bes_bestelopdr.bes_bestelopdr_key%TYPE; last_bes_bestelling_key bes_bestelling_item.bes_bestelling_key%TYPE; amount bes_bestelling_item.bes_bestelling_item_aantal%TYPE; tracking VARCHAR2 (2000); CURSOR b_upd IS SELECT b.bes_bestelopdr_key, b.bes_bestelopdr_id, boi.bes_bestelopdr_item_key, boi.bes_bestelopdr_item_aantal, boi.bes_bestelopdr_item_omschrijv, bi.bes_bestelling_key, bi.bes_bestelling_item_key FROM bes_bestelling bes JOIN bes_bestelling_item bi ON bi.bes_bestelling_key = bes.bes_bestelling_key JOIN bes_bestelopdr_item boi ON boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key JOIN bes_srtdeel s ON s.bes_srtdeel_key = bi.bes_srtdeel_key JOIN bes_srtgroep g ON g.bes_srtgroep_key = s.bes_srtgroep_key JOIN bes_disc_params bdp ON bdp.bes_ins_discipline_key = g.ins_discipline_key JOIN bes_bestelopdr b ON b.bes_bestelopdr_key = boi.bes_bestelopdr_key WHERE bdp.bes_disc_params_fe_confirm = 0 AND bdp.bes_disc_params_deliver_fe = 0 AND ( boi.bes_bestelopdr_item_aantalontv IS NULL OR boi.bes_bestelopdr_item_aantalontv < boi.bes_bestelopdr_item_aantal) AND bdp.bes_disc_params_autodeliverdays > 0 AND bes.bes_bestelling_leverdatum + bdp.bes_disc_params_autodeliverdays < SYSDATE ORDER BY b.bes_bestelopdr_key; PROCEDURE bes_auto_update (bes_bestelling_key IN NUMBER, bes_bestelopdr_key IN NUMBER, tracking IN VARCHAR2) IS prs_voor bes_bestelling.prs_perslid_key_voor%TYPE; sender alg_locatie.alg_locatie_email%TYPE; CURSOR fin_autoapprove (bestelopdr_key NUMBER) IS SELECT f.fin_factuur_key FROM fin_factuur f WHERE f.bes_bestelopdr_key = bestelopdr_key AND f.fin_factuur_statuses_key = 2 AND f.fin_factuur_verwijder IS NULL ORDER BY f.fin_factuur_key; BEGIN IF bes_bestelopdr_key <> -1 THEN -- Update eerst de vorige nog even (deze is voor de laatste) UPDATE bes_bestelopdr bo SET bo.bes_bestelopdr_delivery_opmerk = lcl.l ('bes_discipline_autodelivered') WHERE bo.bes_bestelopdr_key = bes_auto_update.bes_bestelopdr_key; fac.trackaction ('BES2UP', bes_bestelopdr_key, NULL, NULL, tracking); bes.updatebestelopdrstatus (bes_bestelopdr_key, NULL); bes.updatebestellingstatus (bes_bestelling_key, NULL); BEGIN SELECT bes.prs_perslid_key_voor, l.alg_locatie_email INTO prs_voor, sender FROM bes_bestelling bes JOIN mld_adres ma ON ma.mld_adres_key = bes.mld_adres_key_lev JOIN alg_locatie l ON l.alg_locatie_key = ma.alg_locatie_key WHERE bes.bes_bestelling_key = bes_auto_update.bes_bestelling_key; EXCEPTION WHEN NO_DATA_FOUND THEN prs_voor := NULL; sender := NULL; END; fac.putnotificationsrtprio (NULL, prs_voor, 'BESOT2', bes_bestelling_key, NULL, NULL, NULL, NULL, NULL, 2, sender); FOR rec IN fin_autoapprove (bes_bestelopdr_key) LOOP fin.autoapprovefactuur (rec.fin_factuur_key); END LOOP; END IF; END; BEGIN last_bes_bestelopdr_key := -1; last_bes_bestelling_key := -1; FOR rec IN b_upd LOOP IF rec.bes_bestelopdr_key <> last_bes_bestelopdr_key THEN -- Update eerst de vorige nog even; bes_auto_update (last_bes_bestelling_key, last_bes_bestelopdr_key, tracking); -- En hierna verder met de huidige last_bes_bestelopdr_key := rec.bes_bestelopdr_key; last_bes_bestelling_key := rec.bes_bestelling_key; tracking := REPLACE ( lcl.l ('lcl_bes_is_bes2uptrack'), '{0}', fac.getsetting ('bes_bestelopdr_prefix') || rec.bes_bestelopdr_id); INSERT INTO bes_bestellevr (bes_bestellevr_opmerk) VALUES (lcl.l ('bes_discipline_autodelivered')) RETURNING bes_bestellevr_key INTO v_bes_bestellevr_key; END IF; SELECT bes_bestelopdr_item_aantal - COALESCE (bes_bestelopdr_item_aantalontv, 0) INTO amount FROM bes_bestelopdr_item WHERE bes_bestelopdr_item_key = rec.bes_bestelopdr_item_key; INSERT INTO bes_bestellevr_item (bes_bestellevr_key, bes_bestelopdr_item_key, bes_bestellevr_item_aantal) VALUES (v_bes_bestellevr_key, rec.bes_bestelopdr_item_key, amount); UPDATE bes_bestelopdr_item SET bes_bestelopdr_item_aantalontv = bes_bestelopdr_item_aantal, bes_bestelopdr_item_ontvangen = SYSDATE WHERE bes_bestelopdr_item_key = rec.bes_bestelopdr_item_key; UPDATE bes_bestelling_item SET bes_bestelling_item_aantalontv = COALESCE (bes_bestelling_item_aantalontv, 0) + amount WHERE bes_bestelling_item_key = rec.bes_bestelling_item_key; tracking := SUBSTR ( tracking || CHR(10) || lcl.l ('lcl_bes_delivery') || ': ' || amount || ' ' || rec.bes_bestelopdr_item_omschrijv, 1, 2000); END LOOP; -- Update de laatste ook nog even; bes_auto_update (last_bes_bestelling_key, last_bes_bestelopdr_key, tracking); END; END bes; / REGISTERRUN('$Id$') #endif // BES