Files
Database/PRS/PRS_PAC.SRC
Maykel Geerdink 4c6569bf5a FCLT#87146: Oplossing databasefout RWSN#86923 in release 2025.1.
svn path=/Database/trunk/; revision=67569
2025-01-13 08:23:43 +00:00

2922 lines
132 KiB
Plaintext
Raw Blame History

#ifdef PRS
/*
* $Revision$
* $Id$
*/
CREATE OR REPLACE PACKAGE aut AS
FUNCTION fac_get_prs_same_level(userkey IN NUMBER, perslidkey IN NUMBER) RETURN NUMBER;
END aut;
/
CREATE OR REPLACE PACKAGE BODY aut AS
FUNCTION fac_get_prs_same_level(userkey IN NUMBER, perslidkey IN NUMBER) RETURN NUMBER IS
CURSOR usr_deps IS
SELECT paf.prs_afdeling_key, prs_afdeling_elder_key, niveau
FROM prs_v_afdeling_familie paf, prs_perslid pp
WHERE paf.prs_afdeling_key = pp.prs_afdeling_key
AND pp.prs_perslid_key=userkey
ORDER BY niveau DESC;
CURSOR pers_deps IS
SELECT paf.prs_afdeling_key, prs_afdeling_elder_key, niveau
FROM prs_v_afdeling_familie paf, prs_perslid pp
WHERE paf.prs_afdeling_key = pp.prs_afdeling_key
AND pp.prs_perslid_key=perslidkey
ORDER BY niveau DESC;
usr_orglevel NUMBER(1);
pers_orglevel NUMBER(1);
samelevelFound BOOLEAN;
samelevel NUMBER(1);
BEGIN
BEGIN
samelevelFound := FALSE;
FOR c1 IN usr_deps
LOOP
FOR c2 IN pers_deps
LOOP
IF c1.prs_afdeling_elder_key = c2.prs_afdeling_elder_key
THEN
samelevelFound := TRUE;
samelevel := c2.niveau;
EXIT;
END IF;
END LOOP;
IF samelevelFound
THEN
EXIT;
END IF;
END LOOP;
IF NOT samelevelFound
THEN
samelevel := 0; -- no same level found,then assume same company
END IF; -- multi_company will be detected in ASP so no problem here
EXCEPTION
WHEN OTHERS THEN
samelevel:= 9;
END;
RETURN samelevel;
END;
END aut;
/
/* Formatted on 3-11-2010 11:50:08 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PACKAGE prs
AS
FUNCTION getkpverantwoordelijke (pkostenplaats_key IN NUMBER,
pmethode IN NUMBER,
pexcludekey IN NUMBER)
RETURN NUMBER;
FUNCTION getkostenplaats (pperslid_key IN NUMBER, pmethode IN NUMBER, pexcludekey IN NUMBER)
RETURN NUMBER;
FUNCTION getprofiellimiet (pperslidkey IN NUMBER, pdisckey IN NUMBER)
RETURN NUMBER;
FUNCTION getlimietagb (pkostenplaatskey IN NUMBER, pmethode IN NUMBER, pdisckey IN NUMBER)
RETURN NUMBER;
FUNCTION getfiatteur (pkostenplaats_key IN NUMBER,
pexcludekey IN NUMBER,
pondergrens IN NUMBER,
pdisckey IN NUMBER,
pfiatbedrag IN NUMBER DEFAULT -1
)
RETURN NUMBER;
FUNCTION nextfiatteur (pkey IN NUMBER,
pmodule IN VARCHAR2,
pexcludekey IN NUMBER DEFAULT -1)
RETURN NUMBER;
PROCEDURE setpassword(pperslidkey IN NUMBER, pwachtwoord IN VARCHAR2);
FUNCTION testpassword(pperslidkey IN NUMBER, pwachtwoord IN VARCHAR2)
RETURN NUMBER;
PROCEDURE upsertkenmerk (p_kenmerk_key IN NUMBER, p_prs_key IN NUMBER, p_waarde IN VARCHAR2);
PROCEDURE movetoruimte (p_prs_key IN NUMBER, p_ruimte_key IN NUMBER, p_alg_type IN VARCHAR2, p_virtual IN NUMBER DEFAULT 0);
PROCEDURE import_perslid (p_import_key IN NUMBER, p_seq_of_columns IN VARCHAR2, p_header IN VARCHAR2);
PROCEDURE update_perslid (p_import_key IN NUMBER, p_sleutelkolom IN VARCHAR2, p_alg_type IN VARCHAR2, p_import_kenmerk IN NUMBER DEFAULT 0);
PROCEDURE delete_perslid (p_import_key IN NUMBER, p_perslid_key IN NUMBER);
PROCEDURE set_afdeling_verwijder (p_afdeling_key IN NUMBER);
FUNCTION combinatievalidatie (p_kp_key IN NUMBER, p_ksrt_key IN NUMBER, p_disc_key IN NUMBER) RETURN BOOLEAN;
PROCEDURE personen_inactief_schonen;
PROCEDURE personen_vervangers_schonen;
END prs;
/
CREATE OR REPLACE PACKAGE BODY prs
AS
-- Levert de prs_perslid_key op van de budgethouder van een kostenplaats
-- Simpele versie van getfiatteur: hij negeert limieten
FUNCTION getkpverantwoordelijke (pkostenplaats_key IN NUMBER,
pmethode IN NUMBER, -- deze gebruiken we eigenlijk niet meer sinds 2017.2
pexcludekey IN NUMBER)
RETURN NUMBER
IS
BEGIN
IF pmethode = 3 THEN
raise_application_error (-20001, 'Cannot use prs.getkpverantwoordelijke with prs_approvemethod = 3');
END IF;
RETURN getfiatteur (pkostenplaats_key,
pexcludekey,
NULL,
NULL
);
END;
-- Levert de prs_kostenplaats_key op van de persoon volgens
-- de door ons gedefinieerde regels.
-- Levert -1 op indien er geen gevonden wordt.
-- Controleert niet of de meegegeven persoon nog wel actief is
-- pmethode geeft .. inderdaad, waarbij
-- methode 1 = 1-laagsmethode via eigen afdeling - kostenplaats
-- methode 2 = n-laagsmethode via afdelingsboom
-- Met pexcludekey kan een kostenplaats_key worden opgegeven die je niet wilt
-- Dat leek me wel een aardige feature. Geef -1 mee als je geen kostenplaats wilt excluden
FUNCTION getkostenplaats (pperslid_key IN NUMBER, pmethode IN NUMBER, pexcludekey IN NUMBER)
RETURN NUMBER
IS
lkostenplaatskey prs_afdeling.prs_kostenplaats_key%TYPE;
lparentafdkey prs_afdeling.prs_afdeling_parentkey%TYPE;
BEGIN
BEGIN
SELECT COALESCE (a.prs_kostenplaats_key, -1),
a.prs_afdeling_parentkey
INTO lkostenplaatskey,
lparentafdkey
FROM prs_perslid p,
prs_afdeling a
WHERE p.prs_afdeling_key = a.prs_afdeling_key
AND p.prs_perslid_key = pperslid_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- persoon bestaat niet
RETURN -1;
END;
IF (lkostenplaatskey = -1 OR lkostenplaatskey = pexcludekey) AND pmethode = 2
-- doorloop de boom naar boven, met allerlei aannames
THEN
WHILE (lkostenplaatskey = -1 OR lkostenplaatskey = pexcludekey) AND lparentafdkey IS NOT NULL
LOOP
SELECT COALESCE (a.prs_kostenplaats_key, -1),
a.prs_afdeling_parentkey
INTO lkostenplaatskey,
lparentafdkey
FROM prs_afdeling a
WHERE a.prs_afdeling_verwijder IS NULL
AND a.prs_afdeling_key = lparentafdkey;
END LOOP;
-- nu heb ik er een of kan ik er geen vinden
END IF;
RETURN lkostenplaatskey;
END;
-- Levert de limiet (maximaal bestelbedrag) van persoon pperslidkey,
-- eventueel specifiek voor pdisckey indien dat gedefinieerd zou zijn.
FUNCTION getprofiellimiet (pperslidkey IN NUMBER, pdisckey IN NUMBER)
RETURN NUMBER
IS
llimiet fac_profiel.fac_profiel_limiet%TYPE;
BEGIN
-- de algemene limiet telt het zwaarst indien ingevuld
IF pperslidkey IS NULL
THEN
RETURN NULL;
END IF;
-- persoon wordt geacht te bestaan, profiel is optioneel
SELECT fp.fac_profiel_limiet
INTO llimiet
FROM prs_perslid p, fac_profiel fp
WHERE p.fac_profiel_key = fp.fac_profiel_key(+) AND p.prs_perslid_key = pperslidkey;
IF llimiet IS NULL AND pdisckey IS NOT NULL
THEN
-- geen algemene limiet; zoek de disciplineafhankelijke (max() to prevent no data found)
SELECT MAX (fpw.fac_profielwaarde_limiet)
INTO llimiet
FROM prs_perslid p, fac_profielwaarde fpw
WHERE p.fac_profiel_key = fpw.fac_profiel_key
AND fpw.ins_discipline_key = pdisckey
AND p.prs_perslid_key = pperslidkey;
END IF;
RETURN llimiet;
END;
-- Levert de limiet (maximaal bestelbedrag) van persoon pperslidkey i.v.m. Afdelings Gebonden Budget (AGB),
FUNCTION getlimietagb (pkostenplaatskey IN NUMBER, pmethode IN NUMBER, pdisckey IN NUMBER)
RETURN NUMBER
IS
llimiet prs_kostenplaats.prs_kostenplaats_limiet%TYPE;
BEGIN
IF pkostenplaatskey > 0
THEN
-- Er is een kostenplaats meegegeven
SELECT k.prs_kostenplaats_limiet
INTO llimiet
FROM prs_kostenplaats k
WHERE k.prs_kostenplaats_key = pkostenplaatskey;
-- AGB per kostenplaats of catalogus
IF llimiet IS NULL
THEN
BEGIN
SELECT prs_kostenplaatsdisc_limiet
INTO llimiet
FROM prs_kostenplaatsdisc
WHERE prs_kostenplaats_key = pkostenplaatskey
AND ins_discipline_key = pdisckey;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- er is geen limiet voor deze kostenplaats-discipline.
RETURN NULL;
END;
END IF;
ELSE
RETURN NULL;
END IF;
RETURN llimiet;
END;
-- De functie levert de prs_perslid_key op van de perslid die een item (opdracht/bestelling) van
-- discipline pdisckey boven bedrag COALESCE(pfiatbedrag, pondergrens) mag fiatteren
-- volgens de door ons gedefinieerde regels. Werkt analoog aan getkpverantwoordelijke
-- Maar houdt hierbij rekening met de profielen van de budgethouders als prs_approvemethod == 3
--
-- 1) Levert dus in eerste instantie de kostenplaatsverantwoordelijke (budgethouder) op.
-- 2) Levert de kostenplaatsgroepverantwoordelijke op indien geen goede budgethouder wordt gevonden.
-- Afhankelijk van de pfiatbedrag levert de functie dan de kostenplaatsgroepverantwoordelijke op
-- die boven het bedrag van COALESCE(pfiatbedrag, pondergrens) mag fiatteren.
-- Als er in dat geval WEL een pfiatbedrag wordt meegegeven dan wordt de VOLGENDE (kpg) fiatteur opgeleverd.
-- Als er in dat geval GEEN pfiatbedrag wordt meegegeven dan wordt de LAATSTE (kpg) fiatteur opgeleverd.
-- De parameter pondergrens wordt ook gebruikt voor mode 3 om het profiel van de budgethouder te controleren. Daarom extra parameter pfiatbedrag nodig.
--
-- Als pexcludekey gevuld is, dan is dit de kp verantwoordelijke. Niet vullen met een kpGROEP verantwoordelijke, want dan wordt de kp verantwoordelijke teruggegeven.
-- Het fiatbedrag (of pondergrens) zorgt er wel voor dat je juiste kpg verantwoordelijke wordt teruggegeven.
--
FUNCTION getfiatteur (pkostenplaats_key IN NUMBER,
pexcludekey IN NUMBER,
pondergrens IN NUMBER,
pdisckey IN NUMBER,
pfiatbedrag IN NUMBER DEFAULT -1
)
RETURN NUMBER
IS
lkpverantwkey prs_kostenplaats.prs_perslid_key%TYPE;
lkpgverantwkey prs_kostenplaatsgrp.prs_perslid_key%TYPE;
lkpgverantwkey1 prs_kostenplaatsgrp.prs_perslid_key%TYPE;
lkpgverantwkey2 prs_kostenplaatsgrp.prs_kostenplaatsgrp_fiat2_key%TYPE;
lkpgverantwkey3 prs_kostenplaatsgrp.prs_kostenplaatsgrp_fiat3_key%TYPE;
lkpgfinlimit1 prs_kostenplaatsgrp.prs_kostenplaatsgrp_fin_limit1%TYPE;
lkpgfinlimit2 prs_kostenplaatsgrp.prs_kostenplaatsgrp_fin_limit2%TYPE;
lexcludeisvervanger NUMBER;
lexcludeiskpgverantw NUMBER;
lkpverantwlimiet fac_profiel.fac_profiel_limiet%TYPE;
afdkey prs_afdeling.prs_afdeling_key%TYPE;
parentafdkey prs_afdeling.prs_afdeling_parentkey%TYPE;
lmethode NUMBER;
lteller NUMBER;
lfoundfiatteur NUMBER;
lfiatteur prs_kostenplaats.prs_perslid_key%TYPE;
llastfiat BOOLEAN;
lgrens NUMBER;
BEGIN
BEGIN
lkpverantwkey := -1;
SELECT COALESCE (prs_perslid_key, -1)
INTO lkpverantwkey
FROM prs_kostenplaats
WHERE prs_kostenplaats_key = pkostenplaats_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Kostenplaats bestaat niet.
RETURN -1;
END;
dbms_output.put_line('Budgethouder: '||lkpverantwkey);
-- De lkpverantwkey is (mits gedefinieerd) de budgethouder van de kp. Het is nog niet gezegd of dit de gevraagde fiatteur is.
-- Is de meegegeven pexcludekey wellicht een vervanger van kostenplaatsverantwoordelijke van de kostenplaats?
-- Zo ja, dan is in dat geval lkpverantwkey de pexcludekey.
IF pexcludekey > 0 AND lkpverantwkey <> pexcludekey THEN
SELECT COUNT(prs_perslid_key)
INTO lexcludeisvervanger
FROM prs_collega
WHERE prs_perslid_key_alt = pexcludekey
AND prs_perslid_key = lkpverantwkey;
END IF;
dbms_output.put_line('ExcludeIsVervanger: '||lexcludeisvervanger);
lmethode := fac.getSetting('prs_approvemethod');
dbms_output.put_line('Approvemethod: '||lmethode);
dbms_output.put_line('Ondergrens: '||pondergrens);
IF lmethode = 3 AND lkpverantwkey > 0
THEN -- ook profiel budgethouder controleren
lkpverantwlimiet := prs.getprofiellimiet (lkpverantwkey, pdisckey);
dbms_output.put_line('Zijn limiet: '||lkpverantwlimiet);
IF (lkpverantwlimiet < pondergrens) -- lkpverantwkey != -1 is impliciet in die limiet
THEN -- het profiel van deze budgethouder is niet genoeg
lkpverantwkey := -1; -- Niet meer interessant wie dit was.
END IF;
END IF;
-- Mode 2 en 3: Doorloop de afdeling boom indien de kostenplaats geen verantwoordelijke heeft. Voor mode 3 ook profiel budgethouder controleren.
IF lkpverantwkey = -1 AND (lmethode = 2 OR lmethode = 3)
-- Doorloop de boom naar boven, met allerlei aannames.
THEN
dbms_output.put_line('We gaan de boom in');
-- Waar hoort deze kp bij?
BEGIN
SELECT prs_afdeling_key, prs_afdeling_parentkey
INTO afdkey, parentafdkey
FROM prs_afdeling
WHERE prs_kostenplaats_key = pkostenplaats_key AND prs_afdeling_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- De kostenplaats is niet aan een afdeling gerelateerd, dan weet ik het met deze methode niet.
RETURN -1;
END;
-- Zolang nog geen goede en we kunnen hogerop.
WHILE (lkpverantwkey = -1 OR lkpverantwkey = pexcludekey OR lexcludeisvervanger = 1)
AND parentafdkey IS NOT NULL
LOOP
SELECT COALESCE (k.prs_perslid_key, -1), prs_afdeling_parentkey
INTO lkpverantwkey, parentafdkey
FROM prs_kostenplaats k, prs_afdeling a
WHERE k.prs_kostenplaats_key(+) = a.prs_kostenplaats_key
AND a.prs_afdeling_verwijder IS NULL
AND a.prs_afdeling_key = parentafdkey;
dbms_output.put_line('Volgende budgethouder: '||lkpverantwkey);
IF lmethode = 3 THEN -- Ook profiel budgethouder controleren.
lkpverantwlimiet := prs.getprofiellimiet (lkpverantwkey, pdisckey);
dbms_output.put_line('Zijn limiet B: '||lkpverantwlimiet);
IF (lkpverantwlimiet < pondergrens)
THEN -- het profiel van deze budgethouder is niet genoeg
lkpverantwkey := -1; -- Niet meer interessant wie dit was.
END IF;
END IF;
IF pexcludekey > 0 AND lkpverantwkey <> pexcludekey THEN
SELECT COUNT(prs_perslid_key)
INTO lexcludeisvervanger
FROM prs_collega
WHERE prs_perslid_key_alt = pexcludekey
AND prs_perslid_key = lkpverantwkey;
END IF;
END LOOP;
-- Nu heb ik er een of kan ik er geen vinden.
END IF;
dbms_output.put_line('Gevonden budgethouder voor de kpgroep-tak: '||lkpverantwkey);
-- Als 1) de methode 1 is of
-- 2) de methode 2 of 3 is en dit niemand opleverde (ondanks afdelingskostenplaats) of
-- 3) de opgeleverde kostenplaatsverandwoordelijke de exclude(vervanger) is
-- dan kpngroepverantwoordelijken opvragen en kijken wie van hen de gevraagde fiatteur is.
IF lkpverantwkey = -1 OR lkpverantwkey = pexcludekey OR lexcludeisvervanger = 1
THEN
-- Vindt de kostenplaatsGROEPverantwoordelijken van de altijd meegegeven kostenplaats.
BEGIN
SELECT COALESCE(kg.prs_perslid_key, -1),
COALESCE(kg.prs_kostenplaatsgrp_fiat2_key, -1),
COALESCE(kg.prs_kostenplaatsgrp_fiat3_key, -1),
COALESCE(kg.prs_kostenplaatsgrp_fin_limit1, fac.safe_To_Number(fac.getsetting ('mld_opdr_kpg_fin_limit1'))),
COALESCE(kg.prs_kostenplaatsgrp_fin_limit2, fac.safe_To_Number(fac.getsetting ('mld_opdr_kpg_fin_limit2')))
INTO lkpgverantwkey1,
lkpgverantwkey2,
lkpgverantwkey3,
lkpgfinlimit1,
lkpgfinlimit2
FROM prs_kostenplaats k,
prs_kostenplaatsgrp kg
WHERE prs_kostenplaats_key = pkostenplaats_key
AND kg.prs_kostenplaatsgrp_key = k.prs_kostenplaatsgrp_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Er is geen kpgroep bij.
RETURN -1;
END;
lteller := 1;
lfoundfiatteur := 0;
lfiatteur := -1;
-- Als er WEL een fiatbedrag is meegegeven dan de VOLGENDE fiatteur opleveren. De ondergrens is dan het fiatbedrag (pfiatbedrag).
-- Als er GEEN fiatbedrag is meegegeven dan de LAATSTE fiatteur opleveren. De ondergrens is dan pondergrens (normaalgesproken het totale opdrachtbedrag).
IF pfiatbedrag >= 0
THEN
lgrens := pfiatbedrag; -- De volgende fiatteur opleveren.
ELSE
lgrens := pondergrens; -- De laatste fiatteur opleveren.
END IF;
WHILE lteller <= 3 AND lfoundfiatteur = 0
LOOP
CASE
WHEN lteller = 1
THEN
lkpgverantwkey := lkpgverantwkey1;
llastfiat := lgrens < lkpgfinlimit1;
WHEN lteller = 2
THEN
lkpgverantwkey := lkpgverantwkey2;
llastfiat := lgrens < lkpgfinlimit2;
WHEN lteller = 3
THEN
lkpgverantwkey := lkpgverantwkey3;
llastfiat := lgrens >= lkpgfinlimit2 OR
lexcludeiskpgverantw = 1; -- Als de 2de fiatteur de exclude is dan moet de 3de fiatteur toch nog fiatteren.
END CASE;
IF lkpgverantwkey = pexcludekey
THEN
lexcludeiskpgverantw := 1;
ELSE
SELECT CASE
WHEN COUNT(prs_perslid_key) > 0
THEN 1
ELSE 0
END
INTO lexcludeiskpgverantw
FROM prs_collega
WHERE prs_perslid_key_alt = pexcludekey
AND prs_perslid_key = lkpgverantwkey;
END IF;
IF lexcludeiskpgverantw = 0 AND llastfiat
THEN
lfiatteur := lkpgverantwkey;
lfoundfiatteur := 1;
END IF;
lteller := lteller + 1;
END LOOP;
ELSE
lfiatteur := lkpverantwkey;
END IF;
dbms_output.put_line('Resultaat budgethouder: '||lfiatteur);
RETURN lfiatteur;
END;
-- Levert de volgende fiatteur in de rij op. Indien geen volgende fiatteur gevonden kan worden wordt -1 teruggegeven.
-- Er wordt hier niet gecontroleerd of de opdracht gefiatteerd dient te worden. Dat dien je voor de aanroep te bepalen.
-- LET OP: Als de eerste fiatteur is verwijderd dan wordt bij het herfiatteren van een meldingen geen fiatteur meer gevonden.
-- Dan moet de functie prs.getfiatteur worden gebruikt (BLCC#80088).
FUNCTION nextfiatteur (pkey IN NUMBER,
pmodule IN VARCHAR2,
pexcludekey IN NUMBER DEFAULT -1)
RETURN NUMBER
IS
lnextfiatteur prs_kostenplaats.prs_perslid_key%TYPE;
BEGIN
CASE pmodule
WHEN 'MLD'
THEN
SELECT CASE
WHEN mld_opdr_fiatbedrag IS NULL
-- I.v.m. herfiattering hier niet meer met de 'ORDFOK' tracking gecontroleerd of de kp verantvoordelijke al gefiatteerd heeft,
-- maar hier kijken naar het gefiatteerde bedrag die is opgeslagen in het veld mld_opdr.mld_opdr_fiatbedrag.
-- Met Melding AASA#55601 wordt het veld mld_opdr.mld_opdr_fiatbedrag leeg gemaakt als de setting "mld_opdr_refiat_preference" op 1 staat
-- en de goedkeurder heeft aangegeven dat de opdracht opnieuw als een nieuwe opdracht moet worden gefiatteerd.
-- Er kan dan in dat geval nagegaan worden tot welk bedrag er is gefiatteerd.
THEN
prs.getfiatteur(o.prs_kostenplaats_key, pexcludekey, mld_opdr_kosten, std.mld_ins_discipline_key, COALESCE(mld_opdr_fiatbedrag, 0))
WHEN mld_opdr_fiatbedrag >= COALESCE(kpg.prs_kostenplaatsgrp_fin_limit2, fac.safe_To_Number(fac.getsetting ('mld_opdr_kpg_fin_limit2')))
THEN
COALESCE(prs_kostenplaatsgrp_fiat3_key, -1)
WHEN mld_opdr_fiatbedrag >= COALESCE(kpg.prs_kostenplaatsgrp_fin_limit1, fac.safe_To_Number(fac.getsetting ('mld_opdr_kpg_fin_limit1')))
THEN
COALESCE(prs_kostenplaatsgrp_fiat2_key, -1)
ELSE
COALESCE(kpg.prs_perslid_key, -1)
END nextfiatteur
INTO lnextfiatteur
FROM mld_opdr o,
mld_melding m,
mld_stdmelding std,
prs_kostenplaats kp,
prs_kostenplaatsgrp kpg
WHERE o.mld_melding_key = m.mld_melding_key
AND m.mld_stdmelding_key = std.mld_stdmelding_key
AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)
AND o.mld_opdr_key = pkey;
WHEN 'BES'
THEN
SELECT CASE
WHEN bes_bestelling_fiat_user IS NULL
-- I.v.m. herfiattering hier niet meer met de 'BESFIT' tracking gecontroleerd of de kp verantvoordelijke al gefiatteerd heeft,
-- maar hier kijken naar het gefiatteerde bedrag die is opgeslagen in het veld bes_bestelling.bes_bestelling_fiat_user.
-- Bij herfiattering wordt dit veld leeg gemaakt zodat de bestelling weer als een nieuwe bestelling moet worden gefiatteerd (AAIT#79538).
THEN
prs.getfiatteur(b.prs_kostenplaats_key, pexcludekey, binfo.totaal, binfo.ins_discipline_key, COALESCE(bes_bestelling_fiatbedrag, -1))
WHEN bes_bestelling_fiatbedrag >= COALESCE(kpg.prs_kostenplaatsgrp_fin_limit2, fac.safe_To_Number(fac.getsetting ('mld_opdr_kpg_fin_limit2')))
THEN
COALESCE(prs_kostenplaatsgrp_fiat3_key, -1)
WHEN bes_bestelling_fiatbedrag >= COALESCE(kpg.prs_kostenplaatsgrp_fin_limit1, fac.safe_To_Number(fac.getsetting ('mld_opdr_kpg_fin_limit1')))
THEN
COALESCE(prs_kostenplaatsgrp_fiat2_key, -1)
ELSE
COALESCE(kpg.prs_perslid_key, -1)
END
nextfiatteur
INTO lnextfiatteur
FROM bes_bestelling b,
(SELECT MAX(bsg.ins_discipline_key) ins_discipline_key,
SUM(bi.bes_bestelling_item_aantal * bi.bes_bestelling_item_prijs) totaal
FROM bes_bestelling_item bi,
bes_srtdeel bsd,
bes_srtgroep bsg
WHERE bi.bes_srtdeel_key = bsd.bes_srtdeel_key
AND bsd.bes_srtgroep_key = bsg.bes_srtgroep_key
AND bes_bestelling_key = pkey) binfo,
prs_kostenplaats kp,
prs_kostenplaatsgrp kpg
WHERE b.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
AND kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)
AND b.bes_bestelling_key = pkey;
END CASE;
RETURN lnextfiatteur;
END;
PROCEDURE setpassword(pperslidkey IN NUMBER, pwachtwoord IN VARCHAR2)
IS
BEGIN
IF pwachtwoord IS NULL
THEN
UPDATE prs_perslid
SET prs_perslid_salt = NULL,
prs_perslid_wachtwoord_hash = NULL,
prs_perslid_wachtwoord_exp = NULL,
prs_perslid_otpsecret = NULL
WHERE prs_perslid_key = pperslidkey;
ELSE
UPDATE prs_perslid
SET prs_perslid_salt = DBMS_RANDOM.string ('a', 32)
WHERE prs_perslid_key = pperslidkey;
UPDATE prs_perslid
SET prs_perslid_wachtwoord_hash = fac.makehash(prs_perslid_salt || pwachtwoord),
prs_perslid_wachtwoord_exp = CASE WHEN fac.getsetting ('prs_password_expiration') > 0
THEN SYSDATE + fac.getsetting ('prs_password_expiration')
ELSE NULL
END
WHERE prs_perslid_key = pperslidkey;
END IF;
END;
FUNCTION testpassword(pperslidkey IN NUMBER, pwachtwoord IN VARCHAR2)
RETURN NUMBER
IS
perslid_key prs_perslid.prs_perslid_key%TYPE;
BEGIN
IF pwachtwoord IS NULL
THEN
RETURN 0;
END IF;
BEGIN
SELECT prs_perslid_key
INTO perslid_key
FROM prs_perslid
WHERE fac.testhash(prs_perslid_wachtwoord_hash, prs_perslid_salt || pwachtwoord) = 1
AND prs_perslid_key = pperslidkey;
EXCEPTION
WHEN NO_DATA_FOUND
THEN RETURN 0;
END;
RETURN 1;
END;
-- Er wordt nu niet getrackt (wat eigenlijk niet zo goed is)
PROCEDURE upsertkenmerk (p_kenmerk_key IN NUMBER,
p_prs_key IN NUMBER,
p_waarde IN VARCHAR2)
IS
v_count NUMBER;
v_niveau prs_kenmerk.prs_kenmerk_niveau%TYPE;
BEGIN
-- niveau van prs_kenmerk ophalen, omdat deze ook in prs_kenmerklink wordt opgeslagen
SELECT prs_kenmerk_niveau
INTO v_niveau
FROM prs_kenmerk
WHERE prs_kenmerk_key = p_kenmerk_key;
SELECT COUNT ( * )
INTO v_count
FROM prs_kenmerklink
WHERE prs_link_key = p_prs_key
AND prs_kenmerk_key = p_kenmerk_key
AND prs_kenmerklink_verwijder IS NULL;
IF v_count = 1
THEN
IF p_waarde IS NULL
THEN
DELETE prs_kenmerklink
WHERE prs_link_key = p_prs_key
AND prs_kenmerk_key = p_kenmerk_key
AND prs_kenmerklink_verwijder IS NULL;
ELSE
UPDATE prs_kenmerklink
SET prs_kenmerklink_waarde = p_waarde
WHERE prs_link_key = p_prs_key
AND prs_kenmerk_key = p_kenmerk_key
AND prs_kenmerklink_verwijder IS NULL;
END IF;
ELSE
IF p_kenmerk_key IS NOT NULL AND p_waarde IS NOT NULL
THEN
INSERT INTO prs_kenmerklink (prs_kenmerk_key,
prs_link_key,
prs_kenmerklink_niveau,
prs_kenmerklink_waarde)
VALUES (p_kenmerk_key,
p_prs_key,
v_niveau,
p_waarde);
END IF;
END IF;
END;
-- Verhuist een persoon p_prs_key naar een werkplek in p_ruimte_key
-- Als er al vaste werkplekken waren binnen het niveau van p_alg_type (R,V,G,L,D,NULL,A)
-- dan worden die geleegd/gewist. Bij NULL wordt niks gewist, bij A wordt altijd gewist.
PROCEDURE movetoruimte (p_prs_key IN NUMBER,
p_ruimte_key IN NUMBER,
p_alg_type IN VARCHAR2,
p_virtual IN NUMBER DEFAULT 0)
IS
v_count NUMBER;
v_wp_key NUMBER (10);
v_wp_volgnr prs_werkplek.prs_werkplek_volgnr%TYPE;
v_ruimte_nr alg_ruimte.alg_ruimte_nr%TYPE;
v_wp_oms prs_werkplek.prs_werkplek_omschrijving%TYPE;
v_alg_key NUMBER (10);
BEGIN
-- Bepalen of werkplek gewijzigd is tov de huidige situatie
-- door te tellen hoe vaak (1) we al in de nieuwe situatie zitten
SELECT COUNT ( * )
INTO v_count
FROM prs_perslidwerkplek pw, prs_werkplek wp
WHERE pw.prs_perslid_key = p_prs_key
AND pw.prs_werkplek_key = wp.prs_werkplek_key
AND wp.prs_alg_ruimte_key = p_ruimte_key
AND wp.prs_werkplek_type = 0 -- alleen vaste plekken
AND wp.prs_werkplek_virtueel = p_virtual;
IF (v_count = 0)
THEN
-- Persoon zit nog niet op de bestemming
-- Verwijderen oude -vaste- werkplek(ken) op meegegeven niveau.
SELECT MIN(DECODE (p_alg_type,
'R', alg_ruimte_key,
'V', alg_verdieping_key,
'G', alg_gebouw_key,
'L', alg_locatie_key,
'D', alg_district_key,
NULL))
INTO v_alg_key
FROM alg_v_ruimte_gegevens_all
WHERE alg_ruimte_key = p_ruimte_key;
IF fac.getsetting ('prs_werkplek_implicit') = '0' --expliciet
THEN
-- Wis de bezetting maar laat de werkplek bestaan
DELETE FROM prs_perslidwerkplek pw
WHERE pw.prs_perslid_key = p_prs_key
AND EXISTS
(SELECT 1
FROM prs_werkplek wp,
(SELECT alg_ruimte_key,
DECODE (p_alg_type,
'R', alg_ruimte_key,
'V', alg_verdieping_key,
'G', alg_gebouw_key,
'L', alg_locatie_key,
'D', alg_district_key,
NULL)
alg_key
FROM alg_v_ruimte_gegevens_all) og
WHERE wp.prs_werkplek_key = pw.prs_werkplek_key
AND wp.prs_werkplek_virtueel = p_virtual
AND wp.prs_werkplek_type = 0 -- alleen vaste plekken
AND wp.prs_alg_ruimte_key = og.alg_ruimte_key
AND (og.alg_key = v_alg_key OR p_alg_type = 'A'));
ELSE
-- Wis de werkplek, automatisch inclusief de bezetting
DELETE FROM prs_werkplek wp
WHERE wp.prs_werkplek_virtueel = p_virtual
AND wp.prs_werkplek_type = 0 -- alleen vaste plekken
AND EXISTS
(SELECT 1
FROM prs_perslidwerkplek pw,
(SELECT alg_ruimte_key,
DECODE (p_alg_type,
'R', alg_ruimte_key,
'V', alg_verdieping_key,
'G', alg_gebouw_key,
'L', alg_locatie_key,
'D', alg_district_key,
NULL)
alg_key
FROM alg_v_ruimte_gegevens_all) og
WHERE pw.prs_perslid_key = p_prs_key
AND pw.prs_werkplek_key = wp.prs_werkplek_key
AND wp.prs_alg_ruimte_key = og.alg_ruimte_key
AND (og.alg_key = v_alg_key OR p_alg_type = 'A'));
END IF;
-- Persoon krijgt wp op de meegegeven ruimte.
IF p_ruimte_key IS NOT NULL
THEN
-- Bepalen vrije werkplek (kan alleen igv expliciete werkplekken).
IF fac.getsetting ('prs_werkplek_implicit') = '0' --expliciet
THEN
SELECT MIN (wp.prs_werkplek_key)
INTO v_wp_key
FROM prs_werkplek wp
WHERE wp.prs_alg_ruimte_key = p_ruimte_key
AND wp.prs_werkplek_virtueel = p_virtual
AND wp.prs_werkplek_type = 0 -- alleen vaste plekken
AND NOT EXISTS (SELECT 1
FROM prs_perslidwerkplek pw
WHERE pw.prs_werkplek_key = wp.prs_werkplek_key);
END IF;
IF v_wp_key IS NULL
THEN
-- Er is geen vrije (kan ook omdat we impliciet zijn), maak dan een nieuwe vrije werkplek.
SELECT COALESCE(MIN (ll), 1) eerstvrije
INTO v_wp_volgnr
FROM ( SELECT prs_werkplek_volgnr +1 AS ll
FROM prs_werkplek
WHERE prs_alg_ruimte_key = p_ruimte_key
MINUS
SELECT prs_werkplek_volgnr
FROM prs_werkplek
WHERE prs_alg_ruimte_key = p_ruimte_key);
SELECT alg_ruimte_nr
INTO v_ruimte_nr
FROM alg_ruimte
WHERE alg_ruimte_key = p_ruimte_key;
v_wp_oms := v_ruimte_nr || '/' || TO_CHAR (v_wp_volgnr);
-- Toevoegen nieuwe werkplek in meegegeven ruimte.
INSERT INTO prs_werkplek (prs_werkplek_volgnr,
prs_werkplek_omschrijving,
prs_alg_ruimte_key,
prs_werkplek_type,
prs_werkplek_virtueel)
VALUES (v_wp_volgnr, v_wp_oms, p_ruimte_key, 0, p_virtual)
RETURNING prs_werkplek_key
INTO v_wp_key;
END IF;
-- Koppelen persoon aan de (nieuwe of bestaande) vrije werkplek
INSERT INTO prs_perslidwerkplek (prs_perslid_key,
prs_werkplek_key,
prs_perslidwerkplek_bezetting)
VALUES (p_prs_key, v_wp_key, 100);
END IF;
END IF;
END;
-- Procedure om op een standaard wijze de import tabel voor personen te vullen
-- p_import_key
-- p_seq_of_columns string met puntkomma gescheiden reeks van kolomnummers waar onderstaande kolom
-- in het import bestand gevonden kan worden.
--
-- Naar analogie met de factuur import.
-- v_seq_of_columns ListOfInteger := (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 .....,46);
-- Het getal op een bepaalde postitie geeft aan in welke kolom dit veld in de csv staat
-- Voorbeeld: Als de derde waarde een 8 bevat betekent dit dat de verdieping volgnummer in kolom 8 van de csv staat.
--
-- Dus dan maar via een string, en ook op slimme wijze, nl alsof het een ingelezen perslid-record is met p_fielddelimitor
--
-- Afwijkingen op deze volgorde zijn in eigen cust_import_perslid te regelen.
--
-- Als locatiecode en gebouwcode b.v. zijn omgedraaid in het CSV-formaat,
-- dan perslid import ListOfInteger := (2,1,3,4,5,6,7,8,9,10,11,12);
-- v_seq_of_columns := '2;1;3;4;5;6;7;8;9;10;11;12';
--
-- Als locatiecode NIET in CSV staat, dan perslid import ListOfInteger := (0,2,3,4,5,6,7,8,9,10,11,12);
-- v_seq_of_columns := '0;2;3;4;5;6;7;8;9;10;11;12';
-- M.a.w. waar een 0 staat, wordt de variabele niet ingelezen en blijft LEEG.
--
-- p_header header waarop gecontroleerd moet worden. Indien null dan wordt er niet op een header gecontroleerd.
-- Het is mogelijk om wildcards in de string op te geven.
-- Standaard volgorde van de kolommen in het CSV-formaat)
-- Variabelelijst
-- v_alg_locatie_code 1
-- v_alg_gebouw_code 2
-- v_alg_verdieping_volgnr 3
-- v_alg_ruimte_nr 4
-- v_prs_werkplek_volgnr 5
-- v_prs_werkplek_omschrijving 6
-- v_prs_afdeling_naam 7
-- v_prs_perslid_naam 8
-- v_prs_perslid_tussenvoegsel 9
-- v_prs_perslid_voornaam 10
-- v_prs_perslid_voorletters 11
-- v_prs_perslid_partner_naam 12
-- v_prs_perslid_partner_tussenv 13
-- v_prs_naamgebruik_code 14 0 (default) perslid_naam en perslid_tussenvoegsel worden gebruikt
-- 1 personen die de geboortenaam van de partner icm de eigen naam willen gebruiken
-- 2 personen die de geboortenaam van de partner willen gebruiken
-- 3 personen die de eigen naam icm de geboortenaam van de partner willen gebruiken
-- v_prs_perslid_geslacht 15 Gebruik 'man', 'm' of 1 voor man en 'vrouw', 'v' of 0 voor vrouw case insensitive geen default
-- v_prs_perslid_telefoonnr 16
-- v_prs_perslid_mobiel 17
-- v_prs_perslid_email 18
-- v_prs_perslid_dienstverband 19
-- v_prs_perslid_nr 20
-- v_prs_srtperslid_omschrijving 21
-- v_prs_perslid_oslogin 22
-- v_prs_perslid_wachtwoord 23
-- v_prs_perslid_titel 24
-- v_prs_perslid_apikey 25
-- v_prs_kostenplaats_nr 26
-- v_prs_kenmerk1 27
-- v_prs_kenmerk2 28
-- v_prs_kenmerk3 29
-- v_prs_kenmerk4 30
-- v_prs_kenmerk5 31
-- v_prs_kenmerk6 32
-- v_prs_kenmerk7 33
-- v_prs_kenmerk8 34
-- v_prs_kenmerk9 35
-- v_prs_kenmerk10 36
-- v_prs_kenmerk11 37
-- v_prs_kenmerk12 38
-- v_prs_kenmerk13 39
-- v_prs_kenmerk14 40
-- v_prs_kenmerk15 41
-- v_prs_kenmerk16 42
-- v_prs_kenmerk17 43
-- v_prs_kenmerk18 44
-- v_prs_kenmerk19 45
-- v_prs_kenmerk20 46
PROCEDURE import_perslid (
p_import_key IN NUMBER,
p_seq_of_columns IN VARCHAR2,
p_header IN VARCHAR2)
AS
v_newline fac_imp_file.fac_imp_file_line%TYPE; -- Input line
v_field VARCHAR2 (100);
v_fielddelimitor VARCHAR2 (2);
v_aanduiding VARCHAR2 (400);
v_errormsg VARCHAR (200);
v_errorhint VARCHAR2 (200);
v_count NUMBER (10) := 0;
v_count_tot NUMBER (10) := 0;
v_count_import NUMBER (10) := 0;
v_index NUMBER (10);
v_ongeldig NUMBER (10);
v_header_is_valid NUMBER (1) := 0;
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
-- De importvelden
v_empty VARCHAR2 (100);
v_alg_locatie_code VARCHAR2 (256);
v_alg_gebouw_code VARCHAR2 (256);
v_alg_verdieping_volgnr VARCHAR2 (256);
v_alg_ruimte_nr VARCHAR2 (256);
v_prs_werkplek_volgnr VARCHAR2 (256);
v_prs_werkplek_omschrijving VARCHAR2 (256);
v_prs_afdeling_naam VARCHAR2 (256);
v_prs_kostenplaats_nr VARCHAR2 (256);
v_prs_perslid_naam VARCHAR2 (256);
v_prs_perslid_tussenvoegsel VARCHAR2 (256);
v_prs_perslid_voornaam VARCHAR2 (256);
v_prs_perslid_voorletters VARCHAR2 (256);
v_prs_perslid_partner_naam VARCHAR2 (256);
v_prs_perslid_partner_tussenv VARCHAR2 (256);
v_prs_naamgebruik_code VARCHAR2 (256);
v_prs_perslid_geslacht VARCHAR2 (256);
v_prs_perslid_telefoonnr VARCHAR2 (256);
v_prs_perslid_mobiel VARCHAR2 (256);
v_prs_perslid_email VARCHAR2 (256);
v_prs_perslid_dienstverband VARCHAR2 (256);
v_prs_perslid_nr VARCHAR2 (256);
v_prs_srtperslid_omschrijving VARCHAR2 (256);
v_prs_perslid_titel VARCHAR2 (256);
v_prs_perslid_oslogin VARCHAR2 (256);
v_prs_perslid_wachtwoord VARCHAR2 (256);
v_prs_perslid_apikey VARCHAR2 (256);
v_prs_kenmerk1 VARCHAR2 (4000);
v_prs_kenmerk2 VARCHAR2 (4000);
v_prs_kenmerk3 VARCHAR2 (4000);
v_prs_kenmerk4 VARCHAR2 (4000);
v_prs_kenmerk5 VARCHAR2 (4000);
v_prs_kenmerk6 VARCHAR2 (4000);
v_prs_kenmerk7 VARCHAR2 (4000);
v_prs_kenmerk8 VARCHAR2 (4000);
v_prs_kenmerk9 VARCHAR2 (4000);
v_prs_kenmerk10 VARCHAR2 (4000);
v_prs_kenmerk11 VARCHAR2 (4000);
v_prs_kenmerk12 VARCHAR2 (4000);
v_prs_kenmerk13 VARCHAR2 (4000);
v_prs_kenmerk14 VARCHAR2 (4000);
v_prs_kenmerk15 VARCHAR2 (4000);
v_prs_kenmerk16 VARCHAR2 (4000);
v_prs_kenmerk17 VARCHAR2 (4000);
v_prs_kenmerk18 VARCHAR2 (4000);
v_prs_kenmerk19 VARCHAR2 (4000);
v_prs_kenmerk20 VARCHAR2 (4000);
v_prs_kenmerk_key1 VARCHAR2 (255);
v_prs_kenmerk_key2 VARCHAR2 (255);
v_prs_kenmerk_key3 VARCHAR2 (255);
v_prs_kenmerk_key4 VARCHAR2 (255);
v_prs_kenmerk_key5 VARCHAR2 (255);
v_prs_kenmerk_key6 VARCHAR2 (255);
v_prs_kenmerk_key7 VARCHAR2 (255);
v_prs_kenmerk_key8 VARCHAR2 (255);
v_prs_kenmerk_key9 VARCHAR2 (255);
v_prs_kenmerk_key10 VARCHAR2 (255);
v_prs_kenmerk_key11 VARCHAR2 (255);
v_prs_kenmerk_key12 VARCHAR2 (255);
v_prs_kenmerk_key13 VARCHAR2 (255);
v_prs_kenmerk_key14 VARCHAR2 (255);
v_prs_kenmerk_key15 VARCHAR2 (255);
v_prs_kenmerk_key16 VARCHAR2 (255);
v_prs_kenmerk_key17 VARCHAR2 (255);
v_prs_kenmerk_key18 VARCHAR2 (255);
v_prs_kenmerk_key19 VARCHAR2 (255);
v_prs_kenmerk_key20 VARCHAR2 (255);
v_alg_verdieping_volgnr_num NUMBER;
v_prs_werkplek_volgnr_num NUMBER;
v_prs_perslid_dienstv_num NUMBER;
v_seq_of_columns VARCHAR2 (200);
v_lim_header VARCHAR2(4000);
TYPE array_t IS VARRAY (46) OF NUMBER (10);
v_colnr array_t := array_t ();
CURSOR c
IS
SELECT *
FROM fac_imp_file
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_file_index;
FUNCTION bepaal_kenmerk_key (kw IN VARCHAR)
RETURN NUMBER
IS
v_kenmerk_key NUMBER;
BEGIN
IF fac.safe_to_number (kw) IS NULL
THEN -- kenmerkwaarde is alfanumeriek (dus omschrijving)!
SELECT prs_kenmerk_key
INTO v_kenmerk_key
FROM prs_kenmerk
WHERE prs_kenmerk_upper = UPPER (kw)
AND prs_kenmerk_verwijder IS NULL
AND prs_kenmerk_niveau = 'P'
AND prs_kenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'r', 'S', 'X', 'V');
ELSE -- kenmerkwaarde is numeriek (dus key)!
SELECT prs_kenmerk_key
INTO v_kenmerk_key
FROM prs_kenmerk
WHERE prs_kenmerk_key = fac.safe_to_number (kw)
AND prs_kenmerk_verwijder IS NULL
AND prs_kenmerk_niveau = 'P'
AND prs_kenmerk_kenmerktype IN ('C', 'D', 'N', 'R', 'r', 'S', 'X', 'V');
END IF;
RETURN v_kenmerk_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
IF kw IS NULL OR UPPER (kw) LIKE 'KENMERK%'
THEN
RETURN NULL;
ELSE
fac.imp_writelog (p_import_key,
'W',
'Fout bij bepalen kenmerk [' || kw || ']',
'Bestaat niet of type ongeldig');
COMMIT;
RETURN NULL;
END IF;
END;
BEGIN
-- JGL: Ik zou graag een WHERE fac_import_key = p_import_key hieronder
-- toevoegen zodat het script ook multi-user veilig is,
-- Heel veel klant-specifieke imports(/aanvullingen) controleren
-- echter niet op de fac_import_key en zouden flink de fout in gaan.
-- Daarom vooralsnog hier toch maar alles verwijderen
-- NB: In fac_import_perslid worden v_seq_of_columns en p_header gezet!
DELETE FROM fac_imp_perslid;
SELECT COALESCE (MAX (fac_imp_file_index), 0) + 1
INTO v_count
FROM fac_imp_factuur;
-- Init
v_fielddelimitor := fac.import_delimiter(p_import_key);
v_seq_of_columns := p_seq_of_columns;
v_errorhint := 'Bepalen volgorde kolommen';
FOR v_index IN 1 .. 46
LOOP
v_colnr.EXTEND;
-- De volgorde van de te importeren kolommen in de CSV uitlezen uit v_seq_of_columns
-- De field delimiter is hier altijd ";"
fac.imp_getfield (v_seq_of_columns,
';',
v_colnr (v_index));
END LOOP;
-- Indien geen header check is opgegeven, gaan we niet op zoek naar een geldige header
IF p_header IS NULL
THEN
v_header_is_valid := 1;
END IF;
FOR rec1 IN c
LOOP
BEGIN
v_errormsg := 'Fout FETCH te importeren rij';
v_newline := rec1.fac_imp_file_line;
v_errormsg := '';
v_errorhint := 'Fout opvragen te importeren rij';
v_aanduiding := '';
v_ongeldig := 0;
IF v_header_is_valid = 0
THEN
v_lim_header := REPLACE(p_header, ';', v_fielddelimitor);
IF UPPER(v_newline) LIKE UPPER(v_lim_header)
THEN
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 27, v_prs_kenmerk1);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 28, v_prs_kenmerk2);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 29, v_prs_kenmerk3);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 30, v_prs_kenmerk4);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 31, v_prs_kenmerk5);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 32, v_prs_kenmerk6);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 33, v_prs_kenmerk7);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 34, v_prs_kenmerk8);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 35, v_prs_kenmerk9);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 36, v_prs_kenmerk10);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 37, v_prs_kenmerk11);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 38, v_prs_kenmerk12);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 39, v_prs_kenmerk13);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 40, v_prs_kenmerk14);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 41, v_prs_kenmerk15);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 42, v_prs_kenmerk16);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 43, v_prs_kenmerk17);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 44, v_prs_kenmerk18);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 45, v_prs_kenmerk19);
fac.imp_getfield_nr(v_newline, v_fielddelimitor, 46, v_prs_kenmerk20);
v_prs_kenmerk_key1 := bepaal_kenmerk_key (v_prs_kenmerk1);
v_prs_kenmerk_key2 := bepaal_kenmerk_key (v_prs_kenmerk2);
v_prs_kenmerk_key3 := bepaal_kenmerk_key (v_prs_kenmerk3);
v_prs_kenmerk_key4 := bepaal_kenmerk_key (v_prs_kenmerk4);
v_prs_kenmerk_key5 := bepaal_kenmerk_key (v_prs_kenmerk5);
v_prs_kenmerk_key6 := bepaal_kenmerk_key (v_prs_kenmerk6);
v_prs_kenmerk_key7 := bepaal_kenmerk_key (v_prs_kenmerk7);
v_prs_kenmerk_key8 := bepaal_kenmerk_key (v_prs_kenmerk8);
v_prs_kenmerk_key9 := bepaal_kenmerk_key (v_prs_kenmerk9);
v_prs_kenmerk_key10 := bepaal_kenmerk_key (v_prs_kenmerk10);
v_prs_kenmerk_key11 := bepaal_kenmerk_key (v_prs_kenmerk11);
v_prs_kenmerk_key12 := bepaal_kenmerk_key (v_prs_kenmerk12);
v_prs_kenmerk_key13 := bepaal_kenmerk_key (v_prs_kenmerk13);
v_prs_kenmerk_key14 := bepaal_kenmerk_key (v_prs_kenmerk14);
v_prs_kenmerk_key15 := bepaal_kenmerk_key (v_prs_kenmerk15);
v_prs_kenmerk_key16 := bepaal_kenmerk_key (v_prs_kenmerk16);
v_prs_kenmerk_key17 := bepaal_kenmerk_key (v_prs_kenmerk17);
v_prs_kenmerk_key18 := bepaal_kenmerk_key (v_prs_kenmerk18);
v_prs_kenmerk_key19 := bepaal_kenmerk_key (v_prs_kenmerk19);
v_prs_kenmerk_key20 := bepaal_kenmerk_key (v_prs_kenmerk20);
v_header_is_valid := 1;
END IF;
ELSE
-- Lees alle veldwaarden
v_errorhint := 'Inlezen alg_locatie_code kolom:' || v_colnr (1);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (1),
v_alg_locatie_code);
v_errorhint := 'Inlezen alg_lcoatie_code kolom:' || v_colnr (2);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (2),
v_alg_gebouw_code);
v_errorhint := 'Inlezen alg_verdieping_volgnr kolom:' || v_colnr (3);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (3),
v_alg_verdieping_volgnr);
v_errorhint := 'Inlezen alg_ruimte_nr kolom:' || v_colnr (4);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (4),
v_alg_ruimte_nr);
v_errorhint := 'Inlezen prs_werkplek_volgnr kolom:' || v_colnr (5);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (5),
v_prs_werkplek_volgnr);
v_errorhint := 'Inlezen prs_werkplek_omschrijving kolom:' || v_colnr (6);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (6),
v_prs_werkplek_omschrijving);
v_errorhint := 'Inlezen prs_afdeling_naam kolom:' || v_colnr (7);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (7),
v_prs_afdeling_naam);
v_errorhint := 'Inlezen prs_perslid_naam kolom:' || v_colnr (8);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (8),
v_prs_perslid_naam);
v_errorhint := 'Inlezen prs_perslid_tussenvoegsel kolom:' || v_colnr (9);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (9),
v_prs_perslid_tussenvoegsel);
v_errorhint := 'Inlezen prs_perslid_voornaam kolom:' || v_colnr (10);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (10),
v_prs_perslid_voornaam);
v_errorhint := 'Inlezen prs_perslid_voorletters kolom:' || v_colnr (11);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (11),
v_prs_perslid_voorletters);
v_errorhint := 'Inlezen prs_perslid_partner_naam kolom:' || v_colnr (12);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (12),
v_prs_perslid_partner_naam);
v_errorhint := 'Inlezen prs_perslid_partner_tussenv kolom:' || v_colnr (13);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (13),
v_prs_perslid_partner_tussenv);
v_errorhint := 'Inlezen prs_perslid_geslacht kolom:' || v_colnr (14);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (14),
v_prs_naamgebruik_code);
v_errorhint := 'Inlezen alg_lcoatie_code kolom:' || v_colnr (15);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (15),
v_prs_perslid_geslacht);
v_errorhint := 'Inlezen prs_perslid_telefoonnr kolom:' || v_colnr (16);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (16),
v_prs_perslid_telefoonnr);
v_errorhint := 'Inlezen prs_perslid_mobiel kolom:' || v_colnr (17);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (17),
v_prs_perslid_mobiel);
v_errorhint := 'Inlezen prs_perslid_email kolom:' || v_colnr (18);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (18),
v_prs_perslid_email);
v_errorhint := 'Inlezen prs_perslid_dienstverband kolom:' || v_colnr (19);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (19),
v_prs_perslid_dienstverband);
v_errorhint := 'Inlezen prs_perslid_nr kolom:' || v_colnr (20);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (20),
v_prs_perslid_nr);
v_errorhint := 'Inlezen prs_srtperslid_omschrijving kolom:' || v_colnr (21);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (21),
v_prs_srtperslid_omschrijving);
v_errorhint := 'Inlezen prs_perslid_oslogin kolom:' || v_colnr (22);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (22),
v_prs_perslid_oslogin);
v_errorhint := 'Inlezen prs_perslid_wachtwoord kolom:' || v_colnr (23);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (23),
v_prs_perslid_wachtwoord);
v_errorhint := 'Inlezen prs_perslid_titel kolom:' || v_colnr (24);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (24),
v_prs_perslid_titel);
v_errorhint := 'Inlezen prs_perslid_apikey kolom:' || v_colnr (25);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (25),
v_prs_perslid_apikey);
v_errorhint := 'Inlezen prs_perslid_kostenplaats kolom:' || v_colnr (26);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (26),
v_prs_kostenplaats_nr);
v_errorhint := 'Inlezen prs_kenmerk1 kolom:' || v_colnr (27);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (27),
v_prs_kenmerk1);
v_errorhint := 'Inlezen prs_kenmerk2 kolom:' || v_colnr (28);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (28),
v_prs_kenmerk2);
v_errorhint := 'Inlezen prs_kenmerk3 kolom:' || v_colnr (29);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (29),
v_prs_kenmerk3);
v_errorhint := 'Inlezen prs_kenmerk4 kolom:' || v_colnr (30);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (30),
v_prs_kenmerk4);
v_errorhint := 'Inlezen prs_kenmerk5 kolom:' || v_colnr (31);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (31),
v_prs_kenmerk5);
v_errorhint := 'Inlezen prs_kenmerk6 kolom:' || v_colnr (32);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (32),
v_prs_kenmerk6);
v_errorhint := 'Inlezen prs_kenmerk7 kolom:' || v_colnr (33);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (33),
v_prs_kenmerk7);
v_errorhint := 'Inlezen prs_kenmerk8 kolom:' || v_colnr (34);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (34),
v_prs_kenmerk8);
v_errorhint := 'Inlezen prs_kenmerk9 kolom:' || v_colnr (35);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (35),
v_prs_kenmerk9);
v_errorhint := 'Inlezen prs_kenmerk10 kolom:' || v_colnr (36);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (36),
v_prs_kenmerk10);
v_errorhint := 'Inlezen prs_kenmerk11 kolom:' || v_colnr (37);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (37),
v_prs_kenmerk11);
v_errorhint := 'Inlezen prs_kenmerk12 kolom:' || v_colnr (38);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (38),
v_prs_kenmerk12);
v_errorhint := 'Inlezen prs_kenmerk13 kolom:' || v_colnr (39);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (39),
v_prs_kenmerk13);
v_errorhint := 'Inlezen prs_kenmerk14 kolom:' || v_colnr (40);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (40),
v_prs_kenmerk14);
v_errorhint := 'Inlezen prs_kenmerk15 kolom:' || v_colnr (41);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (41),
v_prs_kenmerk15);
v_errorhint := 'Inlezen prs_kenmerk16 kolom:' || v_colnr (42);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (42),
v_prs_kenmerk16);
v_errorhint := 'Inlezen prs_kenmerk17 kolom:' || v_colnr (43);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (43),
v_prs_kenmerk17);
v_errorhint := 'Inlezen prs_kenmerk18 kolom:' || v_colnr (44);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (44),
v_prs_kenmerk18);
v_errorhint := 'Inlezen prs_kenmerk19 kolom:' || v_colnr (45);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (45),
v_prs_kenmerk19);
v_errorhint := 'Inlezen prs_kenmerk20 kolom:' || v_colnr (46);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (46),
v_prs_kenmerk20);
v_aanduiding :=
v_prs_perslid_naam || '|' || v_prs_perslid_voornaam || '| ';
v_count_tot := v_count_tot + 1;
v_errorhint := 'Ongeldige locatiecode';
v_alg_locatie_code := TRIM (v_alg_locatie_code);
IF LENGTH (v_alg_locatie_code) > 10
THEN
v_alg_locatie_code := SUBSTR (v_alg_locatie_code, 1, 10);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Locatie-aanduiding is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_alg_locatie_code
|| ']');
END IF;
--
v_errorhint := 'Ongeldige gebouw code';
v_alg_gebouw_code := TRIM (v_alg_gebouw_code);
IF LENGTH (v_alg_gebouw_code) > 12
THEN
v_alg_gebouw_code := SUBSTR (v_alg_gebouw_code, 1, 12);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Gebouw-aanduiding is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_alg_gebouw_code
|| ']');
END IF;
--
v_errorhint := 'Ongeldig verdieping volgnummer';
v_alg_verdieping_volgnr := TRIM (v_alg_verdieping_volgnr);
IF (v_alg_verdieping_volgnr IS NULL)
THEN
v_alg_verdieping_volgnr_num :=
TO_NUMBER (v_alg_verdieping_volgnr);
ELSE
BEGIN
v_alg_verdieping_volgnr_num :=
TO_NUMBER (v_alg_verdieping_volgnr);
EXCEPTION
WHEN OTHERS
THEN
v_ongeldig := 1;
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
'Error ' || oracle_err_num || '/' || oracle_err_mes;
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || v_errormsg,
v_errorhint);
END;
END IF;
--
v_errorhint := 'Ongeldige ruimte nr';
v_alg_ruimte_nr := TRIM (v_alg_ruimte_nr);
IF LENGTH (v_alg_ruimte_nr) > 20
THEN
v_alg_ruimte_nr := SUBSTR (v_alg_ruimte_nr, 1, 20);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Ruimtenr-aanduiding is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_alg_ruimte_nr
|| ']');
END IF;
--
v_errorhint := 'Ongeldig werkplek volgnummer';
v_prs_werkplek_volgnr := TRIM (v_prs_werkplek_volgnr);
IF (v_prs_werkplek_volgnr IS NULL)
THEN
v_prs_werkplek_volgnr_num := TO_NUMBER (v_prs_werkplek_volgnr);
ELSE
BEGIN
v_alg_verdieping_volgnr_num :=
TO_NUMBER (v_alg_verdieping_volgnr);
EXCEPTION
WHEN OTHERS
THEN
v_ongeldig := 1;
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
'Error ' || oracle_err_num || '/' || oracle_err_mes;
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || v_errormsg,
v_errorhint);
END;
END IF;
--
v_errorhint := 'Ongeldige werkplek omschrijving';
v_prs_werkplek_omschrijving := TRIM (v_prs_werkplek_omschrijving);
IF LENGTH (v_prs_werkplek_omschrijving) > 30
THEN
v_prs_werkplek_omschrijving :=
SUBSTR (v_prs_werkplek_omschrijving, 1, 30);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Werkplek-aanduiding is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_werkplek_omschrijving
|| ']');
END IF;
--
v_errorhint := 'Ongeldige afdelingscode';
v_prs_afdeling_naam := TRIM (v_prs_afdeling_naam);
IF LENGTH (v_prs_afdeling_naam) > 15
THEN
v_prs_afdeling_naam := SUBSTR (v_prs_afdeling_naam, 1, 15);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Afdelingscode is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_afdeling_naam
|| ']');
ELSE
IF (v_prs_afdeling_naam IS NULL)
THEN
v_ongeldig := 1;
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || 'Afdelingscode onbekend',
'Afdelingscode moet worden opgegeven');
END IF;
END IF;
--
v_errorhint := 'Ongeldige kostenplaats';
v_prs_kostenplaats_nr := TRIM (v_prs_kostenplaats_nr);
IF LENGTH (v_prs_kostenplaats_nr) > 30
THEN
v_prs_kostenplaats_nr := SUBSTR (v_prs_kostenplaats_nr, 1, 30);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'kostenplaatsnummer is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_kostenplaats_nr
|| ']');
END IF;
--
v_errorhint := 'Ongeldige naam persoon';
v_prs_perslid_naam := TRIM (v_prs_perslid_naam);
IF LENGTH (v_prs_perslid_naam) > 60
THEN
v_prs_perslid_naam := SUBSTR (v_prs_perslid_naam, 1, 60);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Naam persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_naam
|| ']');
ELSE
IF (v_prs_perslid_naam IS NULL)
THEN
v_ongeldig := 1;
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || 'Naam persoon onbekend',
'Naam persoon moet worden opgegeven');
END IF;
END IF;
--
v_errorhint := 'Ongeldige tussenvoegsel persoon';
v_prs_perslid_tussenvoegsel := TRIM (v_prs_perslid_tussenvoegsel);
IF LENGTH (v_prs_perslid_tussenvoegsel) > 10
THEN
v_prs_perslid_tussenvoegsel :=
SUBSTR (v_prs_perslid_tussenvoegsel, 1, 10);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Tussenvoegsel persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_tussenvoegsel
|| ']');
END IF;
--
v_errorhint := 'Ongeldige voorletters persoon';
v_prs_perslid_voorletters := TRIM (v_prs_perslid_voorletters);
IF LENGTH (v_prs_perslid_voorletters) > 15
THEN
v_prs_perslid_voorletters :=
SUBSTR (v_prs_perslid_voorletters, 1, 15);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Voorletters persoon zijn te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_voorletters
|| ']');
END IF;
--
v_errorhint := 'Voornaam persoon';
v_prs_perslid_voornaam := TRIM (v_prs_perslid_voornaam);
IF LENGTH (v_prs_perslid_voornaam) > 30
THEN
v_prs_perslid_voornaam :=
SUBSTR (v_prs_perslid_voornaam, 1, 30);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Voornaam persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_voornaam
|| ']');
END IF;
v_errorhint := 'Ongeldige partnernaam persoon';
v_prs_perslid_partner_naam := TRIM (v_prs_perslid_partner_naam);
--
IF LENGTH (v_prs_perslid_partner_naam) > 60
THEN
v_prs_perslid_partner_naam := SUBSTR (v_prs_perslid_partner_naam, 1, 60);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Partnernaam is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_partner_naam
|| ']');
END IF;
--
v_errorhint := 'Ongeldige tussenvoegsel partner';
v_prs_perslid_partner_tussenv := TRIM (v_prs_perslid_partner_tussenv);
IF LENGTH (v_prs_perslid_partner_tussenv) > 10
THEN
v_prs_perslid_partner_tussenv :=
SUBSTR (v_prs_perslid_partner_tussenv, 1, 10);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Tussenvoegsel partner is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_partner_tussenv
|| ']');
END IF;
--
v_errorhint := 'Ongeldig geslacht';
v_prs_perslid_geslacht := TRIM (v_prs_perslid_geslacht);
IF LENGTH (v_prs_perslid_geslacht) > 1
THEN
SELECT DECODE(UPPER(v_prs_perslid_geslacht), 'MAN', '1', 'VROUW', '0', NULL)
INTO v_prs_perslid_geslacht
FROM DUAL;
ELSE
IF fac.safe_to_number(v_prs_perslid_geslacht) IS NULL
THEN
SELECT DECODE(UPPER(v_prs_perslid_geslacht), 'M', '1', 'V', '0', NULL)
INTO v_prs_perslid_geslacht
FROM DUAL;
END IF;
END IF;
--
v_errorhint := 'Ongeldig dienstverband';
v_prs_perslid_dienstverband := TRIM (v_prs_perslid_dienstverband);
IF (v_prs_perslid_dienstverband IS NOT NULL)
THEN
BEGIN
v_prs_perslid_dienstv_num :=
TO_NUMBER (v_prs_perslid_dienstverband);
EXCEPTION
WHEN OTHERS
THEN
v_ongeldig := 1;
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
'Error ' || oracle_err_num || '/' || oracle_err_mes;
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || v_errormsg,
v_errorhint);
END;
END IF;
--
v_errorhint := 'Ongeldige titel persoon';
v_prs_perslid_titel := TRIM (v_prs_perslid_titel);
IF LENGTH (v_prs_perslid_titel) > 15
THEN
v_prs_perslid_titel := SUBSTR (v_prs_perslid_titel, 1, 15);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Titel persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_titel
|| ']');
END IF;
--
v_errorhint := 'Ongeldige telefoonnr. persoon';
v_prs_perslid_telefoonnr := TRIM (v_prs_perslid_telefoonnr);
IF LENGTH (v_prs_perslid_telefoonnr) > 20
THEN
v_prs_perslid_telefoonnr :=
SUBSTR (v_prs_perslid_telefoonnr, 1, 20);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Telefoonnr. persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_telefoonnr
|| ']');
END IF;
--
v_errorhint := 'Ongeldige mobielnr. persoon';
v_prs_perslid_mobiel := TRIM (v_prs_perslid_mobiel);
IF LENGTH (v_prs_perslid_mobiel) > 20
THEN
v_prs_perslid_mobiel := SUBSTR (v_prs_perslid_mobiel, 1, 20);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Mobielnr. persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_mobiel
|| ']');
END IF;
--
v_errorhint := 'Ongeldige email persoon';
v_prs_perslid_email := TRIM (v_prs_perslid_email);
IF LENGTH (v_prs_perslid_email) > 200
THEN
v_prs_perslid_email := SUBSTR (v_prs_perslid_email, 1, 200);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Email persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_email
|| ']');
END IF;
--
v_errorhint := 'Ongeldige functie persoon';
v_prs_srtperslid_omschrijving :=
TRIM (v_prs_srtperslid_omschrijving);
IF LENGTH (v_prs_srtperslid_omschrijving) > 100
THEN
v_prs_srtperslid_omschrijving :=
SUBSTR (v_prs_srtperslid_omschrijving, 1, 100);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Functie-aanduiding persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_srtperslid_omschrijving
|| ']');
ELSE
IF (v_prs_srtperslid_omschrijving IS NULL)
THEN
v_ongeldig := 1;
fac.imp_writelog (
p_import_key,
'E',
v_aanduiding || 'Functie persoon onbekend',
'Functie persoon moet worden opgegeven');
END IF;
END IF;
--
v_errorhint := 'Ongeldige persoonnr.';
v_prs_perslid_nr := TRIM (v_prs_perslid_nr);
IF LENGTH (v_prs_perslid_nr) > 16
THEN
v_prs_perslid_nr := SUBSTR (v_prs_perslid_nr, 1, 16);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Persoonnr. persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_nr
|| ']');
END IF;
--
v_errorhint := 'Ongeldige loginnaam';
v_prs_perslid_oslogin := TRIM (v_prs_perslid_oslogin);
IF LENGTH (v_prs_perslid_oslogin) > 256
THEN
v_prs_perslid_oslogin := SUBSTR (v_prs_perslid_oslogin, 1, 256);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Loginnaam persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_oslogin
|| ']');
END IF;
v_errorhint := 'Ongeldig wachtwoord';
v_prs_perslid_wachtwoord := TRIM (v_prs_perslid_wachtwoord);
--
-- Insert geformatteerde import record
IF v_ongeldig = 0
THEN
v_errorhint := 'Toevoegen record';
v_errormsg :=
'Fout bij toevoegen te impoteren bedrijf/afdeling ['
|| v_prs_afdeling_naam
|| ']';
INSERT INTO fac_imp_perslid (alg_locatie_code,
alg_gebouw_code,
alg_verdieping_volgnr,
alg_ruimte_nr,
prs_werkplek_volgnr,
prs_werkplek_omschrijving,
prs_afdeling_naam,
prs_kostenplaats_nr,
prs_perslid_naam,
prs_perslid_tussenvoegsel,
prs_perslid_voornaam,
prs_perslid_voorletters,
prs_perslid_partner_naam,
prs_perslid_partner_tussenv,
prs_perslid_naamgebruik_code,
prs_perslid_geslacht,
prs_perslid_telefoonnr,
prs_perslid_mobiel,
prs_perslid_email,
prs_perslid_dienstverband,
prs_perslid_nr,
prs_srtperslid_omschrijving,
prs_perslid_oslogin,
prs_perslid_wachtwoord,
prs_perslid_titel,
prs_perslid_apikey,
prs_kenmerk1,
prs_kenmerk2,
prs_kenmerk3,
prs_kenmerk4,
prs_kenmerk5,
prs_kenmerk6,
prs_kenmerk7,
prs_kenmerk8,
prs_kenmerk9,
prs_kenmerk10,
prs_kenmerk11,
prs_kenmerk12,
prs_kenmerk13,
prs_kenmerk14,
prs_kenmerk15,
prs_kenmerk16,
prs_kenmerk17,
prs_kenmerk18,
prs_kenmerk19,
prs_kenmerk20,
fac_import_key,
fac_imp_file_index)
VALUES (v_alg_locatie_code,
v_alg_gebouw_code,
v_alg_verdieping_volgnr,
v_alg_ruimte_nr,
v_prs_werkplek_volgnr,
v_prs_werkplek_omschrijving,
v_prs_afdeling_naam,
v_prs_kostenplaats_nr,
v_prs_perslid_naam,
v_prs_perslid_tussenvoegsel,
v_prs_perslid_voornaam,
v_prs_perslid_voorletters,
v_prs_perslid_partner_naam,
v_prs_perslid_partner_tussenv,
COALESCE(fac.safe_to_number(v_prs_naamgebruik_code), 0),
v_prs_perslid_geslacht,
v_prs_perslid_telefoonnr,
v_prs_perslid_mobiel,
v_prs_perslid_email,
v_prs_perslid_dienstverband,
v_prs_perslid_nr,
v_prs_srtperslid_omschrijving,
v_prs_perslid_oslogin,
v_prs_perslid_wachtwoord,
v_prs_perslid_titel,
v_prs_perslid_apikey,
DECODE(v_prs_kenmerk_key1, NULL, v_prs_kenmerk1, TO_CHAR(v_prs_kenmerk_key1) || '=' || SUBSTR(v_prs_kenmerk1, 1, 3980)),
DECODE(v_prs_kenmerk_key2, NULL, v_prs_kenmerk2, TO_CHAR(v_prs_kenmerk_key2) || '=' || SUBSTR(v_prs_kenmerk2, 1, 3980)),
DECODE(v_prs_kenmerk_key3, NULL, v_prs_kenmerk3, TO_CHAR(v_prs_kenmerk_key3) || '=' || SUBSTR(v_prs_kenmerk3, 1, 3980)),
DECODE(v_prs_kenmerk_key4, NULL, v_prs_kenmerk4, TO_CHAR(v_prs_kenmerk_key4) || '=' || SUBSTR(v_prs_kenmerk4, 1, 3980)),
DECODE(v_prs_kenmerk_key5, NULL, v_prs_kenmerk5, TO_CHAR(v_prs_kenmerk_key5) || '=' || SUBSTR(v_prs_kenmerk5, 1, 3980)),
DECODE(v_prs_kenmerk_key6, NULL, v_prs_kenmerk6, TO_CHAR(v_prs_kenmerk_key6) || '=' || SUBSTR(v_prs_kenmerk6, 1, 3980)),
DECODE(v_prs_kenmerk_key7, NULL, v_prs_kenmerk7, TO_CHAR(v_prs_kenmerk_key7) || '=' || SUBSTR(v_prs_kenmerk7, 1, 3980)),
DECODE(v_prs_kenmerk_key8, NULL, v_prs_kenmerk8, TO_CHAR(v_prs_kenmerk_key8) || '=' || SUBSTR(v_prs_kenmerk8, 1, 3980)),
DECODE(v_prs_kenmerk_key9, NULL, v_prs_kenmerk9, TO_CHAR(v_prs_kenmerk_key9) || '=' || SUBSTR(v_prs_kenmerk9, 1, 3980)),
DECODE(v_prs_kenmerk_key10, NULL, v_prs_kenmerk10, TO_CHAR(v_prs_kenmerk_key10) || '=' || SUBSTR(v_prs_kenmerk10, 1, 3980)),
DECODE(v_prs_kenmerk_key11, NULL, v_prs_kenmerk11, TO_CHAR(v_prs_kenmerk_key11) || '=' || SUBSTR(v_prs_kenmerk11, 1, 3980)),
DECODE(v_prs_kenmerk_key12, NULL, v_prs_kenmerk12, TO_CHAR(v_prs_kenmerk_key12) || '=' || SUBSTR(v_prs_kenmerk12, 1, 3980)),
DECODE(v_prs_kenmerk_key13, NULL, v_prs_kenmerk13, TO_CHAR(v_prs_kenmerk_key13) || '=' || SUBSTR(v_prs_kenmerk13, 1, 3980)),
DECODE(v_prs_kenmerk_key14, NULL, v_prs_kenmerk14, TO_CHAR(v_prs_kenmerk_key14) || '=' || SUBSTR(v_prs_kenmerk14, 1, 3980)),
DECODE(v_prs_kenmerk_key15, NULL, v_prs_kenmerk15, TO_CHAR(v_prs_kenmerk_key15) || '=' || SUBSTR(v_prs_kenmerk15, 1, 3980)),
DECODE(v_prs_kenmerk_key16, NULL, v_prs_kenmerk16, TO_CHAR(v_prs_kenmerk_key16) || '=' || SUBSTR(v_prs_kenmerk16, 1, 3980)),
DECODE(v_prs_kenmerk_key17, NULL, v_prs_kenmerk17, TO_CHAR(v_prs_kenmerk_key17) || '=' || SUBSTR(v_prs_kenmerk17, 1, 3980)),
DECODE(v_prs_kenmerk_key18, NULL, v_prs_kenmerk18, TO_CHAR(v_prs_kenmerk_key18) || '=' || SUBSTR(v_prs_kenmerk18, 1, 3980)),
DECODE(v_prs_kenmerk_key19, NULL, v_prs_kenmerk19, TO_CHAR(v_prs_kenmerk_key19) || '=' || SUBSTR(v_prs_kenmerk19, 1, 3980)),
DECODE(v_prs_kenmerk_key20, NULL, v_prs_kenmerk20, TO_CHAR(v_prs_kenmerk_key20) || '=' || SUBSTR(v_prs_kenmerk20, 1, 3980)),
rec1.fac_import_key,
rec1.fac_imp_file_index);
v_count_import := v_count_import + 1;
END IF;
END IF;
END;
END LOOP;
IF v_header_is_valid = 0
THEN
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || 'Ongeldig importbestand',
'Geen geldige headerregel aanwezig');
ELSE
fac.imp_writelog (
p_import_key,
'S',
'Persoon: aantal ingelezen regels: ' || TO_CHAR (v_count_tot),
'');
fac.imp_writelog (
p_import_key,
'S',
'Persoon: aantal ongeldige importregels: '
|| TO_CHAR (v_count_tot - v_count_import),
'');
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := 'Error ' || oracle_err_num || '/' || oracle_err_mes;
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || v_errormsg,
v_errorhint);
END;
-- Procedure om generiek personen in te lezen of aan te passen.
-- p_sleutelkolom Bevat het veld die als sleutel bij de import dient.
-- NR - personeelsnummer
-- EMAIL - emailadres
-- LOGIN - logincode
-- APIKEY - API-key voor distributie van persoonsgegevens over FACILITORs
-- p_alg_type Werkplekken binnen dit niveau verwijderen
-- NULL - geen werkplekken verwijderen
-- A - altijd vaste werkplek verwijderen
-- R,V,G,L,D - werkplek(en) op dit niveau verwijderen
PROCEDURE update_perslid (p_import_key IN NUMBER,
p_sleutelkolom IN VARCHAR2,
p_alg_type IN VARCHAR2,
p_import_kenmerk IN NUMBER DEFAULT 0)
IS
c_fielddelimitor VARCHAR2 (2) := fac.import_delimiter(p_import_key);
v_errormsg VARCHAR2 (1000);
v_errorhint VARCHAR2 (1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_aanduiding VARCHAR2 (200);
v_count NUMBER (10);
v_ongeldig NUMBER (1);
v_count_update NUMBER (10);
v_count_error NUMBER (10);
v_count_tot NUMBER (10);
v_wpcount_error NUMBER (10);
--
v_perslid_key NUMBER (10);
v_afdeling_key NUMBER (10);
v_kostenplaats_key NUMBER (10);
v_srtperslid_key NUMBER (10);
v_prs_perslid_naam VARCHAR2(200);
v_prs_perslid_tussenvoegsel VARCHAR2(200);
v_locatie_key NUMBER (10);
v_gebouw_key NUMBER (10);
v_verdieping_key NUMBER (10);
v_ruimte_key NUMBER (10);
v_space VARCHAR2(1);
CURSOR cSPERSLID
IS
SELECT MIN (prs_srtperslid_omschrijving) prs_srtperslid_omschrijving
FROM fac_imp_perslid i
WHERE NOT EXISTS
(SELECT prs_srtperslid_key
FROM prs_srtperslid sp
WHERE UPPER (sp.prs_srtperslid_omschrijving) =
UPPER (i.prs_srtperslid_omschrijving)
AND prs_srtperslid_verwijder IS NULL)
GROUP BY UPPER (prs_srtperslid_omschrijving);
recSPersLid cSPersLid%ROWTYPE;
CURSOR cPERSLID
IS
SELECT * FROM fac_imp_perslid;
recPersLid cPersLid%ROWTYPE;
-- SUBPROC
PROCEDURE upsertkenmerk_imp(p_perslid_key IN NUMBER,
p_kenmerkwaarde IN VARCHAR2)
AS
ccount NUMBER;
v_sql VARCHAR2(1000);
v_cursor INTEGER;
v_rowsprocessed NUMBER DEFAULT 0;
v_waarde prs_kenmerklink.prs_kenmerklink_waarde%TYPE;
v_kenmerk_key prs_kenmerk.prs_kenmerk_key%TYPE;
v_kenmerk_type prs_kenmerk.prs_kenmerk_kenmerktype%TYPE;
v_kenmerk_niveau prs_kenmerk.prs_kenmerk_niveau%TYPE;
v_kenmerk_waarde prs_kenmerklink.prs_kenmerklink_waarde%TYPE;
v_objectnaam fac_kenmerkdomein.fac_kenmerkdomein_objectnaam%TYPE;
v_kolomnaam fac_kenmerkdomein.fac_kenmerkdomein_kolomnaam%TYPE;
v_kolomtxt fac_kenmerkdomein.fac_kenmerkdomein_kolomtxt%TYPE;
v_kenmerklink_key prs_kenmerklink.prs_kenmerklink_key%TYPE;
BEGIN
v_kenmerk_key := fac.safe_to_number(SUBSTR (p_kenmerkwaarde, 1, INSTR (p_kenmerkwaarde, '=') - 1));
v_kenmerk_waarde := SUBSTR (p_kenmerkwaarde, INSTR (p_kenmerkwaarde, '=') + 1);
IF v_kenmerk_key IS NOT NULL AND v_kenmerk_waarde IS NOT NULL
THEN
v_errormsg := 'Fout bij bepalen kenmerk [' || v_kenmerk_key || ']';
SELECT prs_kenmerk_niveau
, prs_kenmerk_kenmerktype
INTO v_kenmerk_niveau
, v_kenmerk_type
FROM prs_kenmerk
WHERE prs_kenmerk_key = v_kenmerk_key
AND prs_kenmerk_verwijder IS NULL;
IF p_kenmerkwaarde IS NOT NULL
THEN
IF v_kenmerk_type IN ('R', 'r', 'S')
THEN
v_errormsg := 'Fout bij bepalen eigen tabel';
SELECT COUNT (*)
INTO ccount
FROM prs_kenmerk k,
fac_kenmerkdomein d
WHERE k.prs_kenmerk_key = v_kenmerk_key
AND k.prs_kenmerk_niveau = v_kenmerk_niveau
AND k.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
AND d.fac_usrtab_key IS NOT NULL;
v_errormsg := 'Fout bij bepalen nieuwe waarde [' || p_kenmerkwaarde || ']';
IF ccount = 1
THEN -- Eigen tabel
SELECT TO_CHAR(ud.fac_usrdata_key)
INTO v_waarde
FROM prs_kenmerk k,
fac_kenmerkdomein d,
fac_v_aanwezigusrdata ud
WHERE k.prs_kenmerk_key = v_kenmerk_key
AND k.prs_kenmerk_niveau = v_kenmerk_niveau
AND k.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
AND d.fac_usrtab_key = ud.fac_usrtab_key
AND UPPER(TRIM(ud.fac_usrdata_omschr)) = UPPER(v_kenmerk_waarde);
ELSE -- FACILITOR view/tabel
SELECT d.fac_kenmerkdomein_objectnaam,
d.fac_kenmerkdomein_kolomnaam,
d.fac_kenmerkdomein_kolomtxt
INTO v_objectnaam,
v_kolomnaam,
v_kolomtxt
FROM prs_kenmerk k,
fac_kenmerkdomein d
WHERE k.prs_kenmerk_key = v_kenmerk_key
AND k.prs_kenmerk_niveau = v_kenmerk_niveau
AND k.fac_kenmerkdomein_key = d.fac_kenmerkdomein_key
AND d.fac_usrtab_key IS NULL;
v_sql := 'SELECT MAX(' || v_kolomnaam || ')'
|| ' FROM ' || v_objectnaam
|| ' WHERE UPPER(TRIM(' || v_kolomtxt || ')) = UPPER(:pwaarde)';
v_cursor := DBMS_SQL.open_cursor;
DBMS_SQL.parse (v_cursor, v_sql, DBMS_SQL.native);
DBMS_SQL.BIND_VARIABLE(v_cursor, ':pwaarde', v_kenmerk_waarde);
DBMS_SQL.define_column(v_cursor, 1, v_waarde, 255);
v_rowsprocessed := DBMS_SQL.execute_and_fetch (v_cursor);
DBMS_SQL.column_value (v_cursor, 1, v_waarde);
DBMS_SQL.close_cursor(v_cursor);
END IF;
ELSE -- C(Karakter)/D(Datum)/N(Numeriek)/X(Bestandsnaam)
v_waarde := v_kenmerk_waarde;
END IF;
v_errormsg := 'Fout bij bepalen huidige waarde';
SELECT COUNT(*),
MAX(prs_kenmerklink_key)
INTO ccount,
v_kenmerklink_key
FROM prs_v_aanwezigkenmerklink
WHERE prs_link_key = p_perslid_key
AND prs_kenmerk_key = v_kenmerk_key
and prs_kenmerklink_niveau = v_kenmerk_niveau;
IF v_kenmerk_type = 'N' -- Alleen voor numerieke waarden de decimale komma vervangen door punt.
THEN
v_waarde := REPLACE (v_waarde, ',', '.');
END IF;
IF ccount = 0
THEN
v_errormsg := 'Fout bij toevoegen waarde [' || v_waarde || ']'
|| ' voor perslid_key=' || TO_CHAR(p_perslid_key)
|| ', kenmerk_key=' || TO_CHAR(v_kenmerk_key)
|| ', link_niveau=' || v_kenmerk_niveau;
INSERT INTO prs_kenmerklink (prs_link_key,
prs_kenmerk_key,
prs_kenmerklink_niveau,
prs_kenmerklink_waarde)
VALUES (p_perslid_key,
v_kenmerk_key,
v_kenmerk_niveau,
v_waarde);
ELSE
v_errormsg := 'Fout bij bijwerken waarde [' || v_waarde || ']'
|| ' voor kenmerklink_key=' || TO_CHAR(v_kenmerklink_key);
UPDATE prs_kenmerklink
SET prs_kenmerklink_waarde = v_waarde
WHERE prs_kenmerklink_key = v_kenmerklink_key;
END IF;
ELSE
-- Verwijder kenmerken die al bestaan maar met de nieuwe import leeg zijn.
DELETE prs_kenmerklink
WHERE prs_kenmerk_key = v_kenmerk_key
AND prs_link_key = p_perslid_key;
END IF;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR(SQLERRM, 1, 200);
v_errormsg := v_errormsg || ' (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || v_errormsg,
'upsertkenmerk_imp');
END; -- upsertkenmerk_imp
BEGIN
v_count_update := 0;
v_count_tot := 0;
v_count_error := 0;
v_wpcount_error := 0;
FOR recSPersLid IN cSPersLid
LOOP
BEGIN
v_aanduiding := '';
v_errormsg := '';
v_errorhint := '';
v_count_tot := v_count_tot + 1;
v_aanduiding := recSPersLid.PRS_SRTPERSLID_OMSCHRIJVING;
v_errorhint := 'Zoek in verwijderde functies';
SELECT MAX(prs_srtperslid_key)
INTO v_srtperslid_key
FROM prs_srtperslid sp
WHERE UPPER (sp.prs_srtperslid_omschrijving) = UPPER (recSPersLid.prs_srtperslid_omschrijving);
IF v_srtperslid_key IS NULL
THEN
v_errorhint := 'Fout bij toevoegen functie';
INSERT INTO prs_srtperslid (prs_srtperslid_omschrijving)
VALUES (recSPersLid.prs_srtperslid_omschrijving);
ELSE
v_errorhint := 'Reanimeer functie';
UPDATE prs_srtperslid SET prs_srtperslid_verwijder = NULL WHERE prs_srtperslid_key = v_srtperslid_key;
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
v_count_error := v_count_error + 1;
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg := ' (ORACLE error number = <'
|| ORACLE_err_num
|| '> ORACLE error message = <'
|| ORACLE_err_mes
|| '>)';
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || v_errormsg,
v_errorhint);
COMMIT; -- tbv logging
END;
END LOOP;
fac.imp_writelog (
p_import_key,
'S',
'Personeelsfunctie: toegevoegde regels zonder foutmelding: '
|| TO_CHAR (v_count_tot - v_count_error),
'');
fac.imp_writelog (
p_import_key,
'S',
'Personeelsfunctie: toegevoegde regels met foutmelding: '
|| TO_CHAR (v_count_error),
'');
COMMIT; -- logging
v_count_update := 0;
v_count_tot := 0;
v_count_error := 0;
FOR recPersLid IN cPersLid
LOOP
BEGIN
v_aanduiding := '';
v_errormsg := '';
v_errorhint := '';
v_count_tot := v_count_tot + 1;
v_aanduiding := recPersLid.prs_perslid_naam || '|'
|| recPersLid.prs_perslid_voornaam || '| ';
v_errormsg := '';
v_errorhint := 'Fout bij bepalen functie';
SELECT prs_srtperslid_key
INTO v_srtperslid_key
FROM prs_srtperslid
WHERE prs_srtperslid_verwijder IS NULL
AND UPPER (prs_srtperslid_omschrijving) =
UPPER (recPersLid.prs_srtperslid_omschrijving);
v_errorhint :=
'Afdeling niet gevonden ['
|| recPersLid.prs_afdeling_naam
|| ']';
SELECT a.prs_afdeling_key
INTO v_afdeling_key
FROM prs_v_aanwezigafdeling_boom b, prs_afdeling a
WHERE UPPER (a.prs_afdeling_naam) = UPPER (recPersLid.prs_afdeling_naam)
AND a.prs_afdeling_verwijder IS NULL
AND a.prs_afdeling_key = b.prs_afdeling_key;
IF (recPersLid.prs_kostenplaats_nr IS NOT NULL)
THEN
v_errorhint :=
'Kostenplaats niet gevonden ['
|| recPersLid.prs_kostenplaats_nr
|| ']';
SELECT k.prs_kostenplaats_key
INTO v_kostenplaats_key
FROM prs_v_aanwezigkostenplaats k
WHERE UPPER(prs_kostenplaats_nr) = UPPER(recPerslid.prs_kostenplaats_nr);
ELSE
v_kostenplaats_key := NULL;
END IF;
v_space := '';
-- kijk hoe we met partnernamen moeten omgaan:
IF recPersLid.prs_perslid_naamgebruik_code = 0
THEN
-- normaal gebruik van naam. Eigen naam wordt gebruikt
v_prs_perslid_naam := recPersLid.prs_perslid_naam;
v_prs_perslid_tussenvoegsel := recPersLid.prs_perslid_tussenvoegsel;
ELSIF recPersLid.prs_perslid_naamgebruik_code = 1
THEN
-- personen die de geboortenaam van de partner icm de eigen naam willen gebruiken
IF recPersLid.prs_perslid_tussenvoegsel IS NOT NULL
THEN
v_space := ' ';
END IF;
v_prs_perslid_naam := recPersLid.prs_perslid_partner_naam || ' - ' || recPersLid.prs_perslid_tussenvoegsel || v_space || recPersLid.prs_perslid_naam;
v_prs_perslid_tussenvoegsel := recPersLid.prs_perslid_partner_tussenv;
ELSIF recPersLid.prs_perslid_naamgebruik_code = 2
THEN
-- personen die de geboortenaam van de partner willen gebruiken
v_prs_perslid_naam := recPersLid.prs_perslid_partner_naam;
v_prs_perslid_tussenvoegsel := recPersLid.prs_perslid_partner_tussenv;
ELSIF recPersLid.prs_perslid_naamgebruik_code = 3
THEN
-- personen die de eigen naam icm de geboortenaam van de partner willen gebruiken
IF recPersLid.prs_perslid_partner_tussenv IS NOT NULL
THEN
v_space := ' ';
END IF;
v_prs_perslid_naam := recPersLid.prs_perslid_naam || ' - ' || recPersLid.prs_perslid_partner_tussenv || v_space || recPersLid.prs_perslid_partner_naam;
v_prs_perslid_tussenvoegsel := recPersLid.prs_perslid_tussenvoegsel;
END IF;
IF length(v_prs_perslid_naam) > 60
THEN
v_prs_perslid_naam := SUBSTR(v_prs_perslid_naam, 1,60);
fac.imp_writelog (
p_import_key,
'W',
recPersLid.prs_perslid_naam || '|' || recPersLid.prs_perslid_voornaam || '| ' || 'Samengestelde achternaam is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_naam
|| ']');
END IF;
-- p_sleutelkolom
-- NR = prs_perslid_nr
-- EMAIL = prs_perslid_email
-- LOGIN = prs_perslid_oslogin
-- APIKEY = prs_perslid_apikey
v_errorhint := 'Kijken of de persoon al bestaat';
SELECT MAX (prs_perslid_key), COUNT ( * )
INTO v_perslid_key, v_count
FROM prs_perslid
WHERE prs_perslid_verwijder IS NULL
AND ( ( p_sleutelkolom IS NULL
AND UPPER (prs_perslid_naam) = UPPER (recPersLid.prs_perslid_naam)
AND UPPER (prs_perslid_voornaam) = UPPER (recPersLid.prs_perslid_voornaam)
)
OR ( UPPER (p_sleutelkolom) = 'NR' AND UPPER (prs_perslid_nr) = UPPER (recPersLid.prs_perslid_nr)
OR UPPER (p_sleutelkolom) = 'EMAIL' AND UPPER (prs_perslid_email) = UPPER (recPersLid.prs_perslid_email)
OR UPPER (p_sleutelkolom) = 'LOGIN' AND UPPER (prs_perslid_oslogin) = UPPER (recPersLid.prs_perslid_oslogin)
OR UPPER (p_sleutelkolom) = 'APIKEY' AND UPPER (prs_perslid_apikey) = UPPER (recPersLid.prs_perslid_apikey)
)
);
IF (v_count = 0)
THEN
v_errorhint := 'Fout bij toevoegen persoon';
INSERT INTO prs_perslid (prs_perslid_module,
prs_srtperslid_key,
prs_afdeling_key,
prs_kostenplaats_key,
prs_perslid_naam,
prs_perslid_voorletters,
prs_perslid_tussenvoegsel,
prs_perslid_voornaam,
prs_perslid_telefoonnr,
prs_perslid_mobiel,
prs_perslid_email,
prs_perslid_nr,
prs_perslid_geslacht,
prs_perslid_titel,
prs_perslid_dienstverband,
prs_perslid_oslogin,
prs_perslid_apikey)
VALUES ('PRS',
v_srtperslid_key,
v_afdeling_key,
v_kostenplaats_key,
v_prs_perslid_naam,
recPersLid.prs_perslid_voorletters,
v_prs_perslid_tussenvoegsel,
recPersLid.prs_perslid_voornaam,
recPersLid.prs_perslid_telefoonnr,
recPersLid.prs_perslid_mobiel,
recPersLid.prs_perslid_email,
recPersLid.prs_perslid_nr,
recPersLid.prs_perslid_geslacht,
recPersLid.prs_perslid_titel,
recPersLid.prs_perslid_dienstverband,
recPersLid.prs_perslid_oslogin,
recPersLid.prs_perslid_apikey)
RETURNING prs_perslid_key
INTO v_perslid_key;
prs.setpassword(v_perslid_key, recPersLid.prs_perslid_wachtwoord);
COMMIT;
v_count_update := v_count_update + 1;
ELSIF v_count = 1
THEN
UPDATE prs_perslid
SET prs_srtperslid_key = v_srtperslid_key,
prs_afdeling_key = v_afdeling_key,
prs_perslid_naam = v_prs_perslid_naam,
prs_perslid_inactief = NULL, -- altijd potentieel reanimeren bij import, naam zal ook geen INACTIEF: prefix meer bevatten
prs_perslid_voorletters = recPersLid.prs_perslid_voorletters,
prs_perslid_tussenvoegsel = v_prs_perslid_tussenvoegsel,
prs_perslid_voornaam = recPersLid.prs_perslid_voornaam,
prs_perslid_nr = recPersLid.prs_perslid_nr,
prs_perslid_dienstverband = recPersLid.prs_perslid_dienstverband,
prs_perslid_geslacht = recPersLid.prs_perslid_geslacht,
prs_perslid_titel = recPersLid.prs_perslid_titel,
prs_perslid_telefoonnr = recPersLid.prs_perslid_telefoonnr,
prs_perslid_mobiel = recPersLid.prs_perslid_mobiel,
prs_perslid_email = recPersLid.prs_perslid_email,
prs_perslid_oslogin = recPersLid.prs_perslid_oslogin,
prs_perslid_apikey = recPersLid.prs_perslid_apikey
WHERE prs_perslid_key = v_perslid_key;
IF recPersLid.prs_perslid_wachtwoord IS NOT NULL
THEN
prs.setpassword(v_perslid_key, recPersLid.prs_perslid_wachtwoord);
END IF;
END IF;
-- Voor CUST-postprocessing (van de kenmerken) is het handig te onthouden:
UPDATE fac_imp_perslid
SET prs_perslid_key = v_perslid_key
WHERE fac_import_key = recPersLid.fac_import_key
AND fac_imp_file_index = recPersLid.fac_imp_file_index;
COMMIT; -- persoon in ieder geval toegevoegd.
IF (p_import_kenmerk = 1)
THEN
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk1);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk2);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk3);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk4);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk5);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk6);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk7);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk8);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk9);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk10);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk11);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk12);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk13);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk14);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk15);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk16);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk17);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk18);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk19);
upsertkenmerk_imp(v_perslid_key, recPersLid.prs_kenmerk20);
END IF;
v_aanduiding := recPersLid.prs_perslid_nr || '|'
|| recPersLid.prs_perslid_naam || '|'
|| recPersLid.prs_perslid_voornaam || '|'
|| recPersLid.alg_locatie_code || '|'
|| recPersLid.alg_gebouw_code || '|'
|| recPersLid.alg_verdieping_volgnr || '|'
|| recPersLid.alg_ruimte_nr || ' - ';
v_locatie_key := NULL;
v_gebouw_key := NULL;
v_verdieping_key := NULL;
v_ruimte_key := NULL;
v_errorhint := 'Fout bij bepalen locatie';
SELECT MAX(alg_locatie_key)
INTO v_locatie_key
FROM alg_v_aanweziglocatie
WHERE UPPER (alg_locatie_code) = UPPER (recPersLid.alg_locatie_code);
v_errorhint := 'Fout bij bepalen gebouw';
SELECT MAX(alg_gebouw_key)
INTO v_gebouw_key
FROM alg_v_aanweziggebouw
WHERE UPPER (alg_gebouw_code) = UPPER (recPersLid.alg_gebouw_code)
AND alg_locatie_key = v_locatie_key;
v_errorhint := 'Fout bij bepalen verdieping';
SELECT MAX(alg_verdieping_key)
INTO v_verdieping_key
FROM alg_v_aanwezigverdieping
WHERE UPPER (alg_verdieping_volgnr) = UPPER (recPersLid.alg_verdieping_volgnr)
AND alg_gebouw_key = v_gebouw_key;
v_errorhint := 'Fout bij bepalen beoogde ruimte';
SELECT MAX(alg_ruimte_key)
INTO v_ruimte_key
FROM alg_v_aanwezigruimte r
WHERE r.alg_ruimte_upper_nr = UPPER (recPersLid.alg_ruimte_nr)
AND r.alg_verdieping_key = v_verdieping_key;
-- standaard ruimte moet door cust gedeelte van deFout bij bepalen beoogde ruimte import ingevuld worden.
-- als er een locatie ingevuld is willen we ook een ruimte vinden.
IF v_ruimte_key IS NULL AND recPersLid.alg_locatie_code IS NOT NULL
THEN
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || ' Ruimte kan niet gevonden worden',
'Controleer locatie,gebouw en verdieping');
END IF;
-- fouten bij het bepalen van de werkplek worden als waarschuwing weergegeven.
BEGIN
v_errorhint := 'Fout bij het aanpassen van de werkplek';
PRS.movetoruimte (v_perslid_key, v_ruimte_key, p_alg_type);
EXCEPTION WHEN OTHERS
THEN
v_wpcount_error := v_wpcount_error + 1;
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg := ' (ORACLE error number = <' || ORACLE_err_num || '> ORACLE error message = <' || ORACLE_err_mes || '>)';
fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, v_errorhint);
END;
EXCEPTION WHEN OTHERS
THEN
v_count_error := v_count_error + 1;
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg := ' (ORACLE error number = <' || ORACLE_err_num || '> ORACLE error message = <' || ORACLE_err_mes || '>)';
fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, v_errorhint);
COMMIT; -- tbv logging
END;
END LOOP;
fac.imp_writelog (
p_import_key,
'S',
'Persoon: verwerkte regels zonder foutmelding: '
|| TO_CHAR (v_count_tot - v_count_error),
'');
fac.imp_writelog (
p_import_key,
'S',
'Persoon: verwerkte regels met foutmelding: '
|| TO_CHAR (v_count_error),
'');
fac.imp_writelog (
p_import_key,
'S',
'Werkplek: verwerkte regels met foutmelding: '
|| TO_CHAR (v_wpcount_error),
'');
END update_perslid;
PROCEDURE delete_perslid (p_import_key IN NUMBER,
p_perslid_key IN NUMBER)
IS
v_errormsg VARCHAR2 (1000);
v_errorhint VARCHAR2 (1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_count NUMBER (10);
--
v_perslid_naam VARCHAR (100);
v_perslid_nr VARCHAR (30);
BEGIN
BEGIN
v_errormsg := 'Verwijderen van de persoon is NIET gelukt';
v_errorhint :=
'Heeft de persoon met prs_perslid_key '
|| TO_CHAR (p_perslid_key)
|| ' historie?';
SELECT prs_perslid_naam_full, prs_perslid_nr
INTO v_perslid_naam, v_perslid_nr
FROM prs_perslid p, prs_v_perslid_fullnames pf
WHERE p.prs_perslid_key = pf.prs_perslid_key
AND p.prs_perslid_key = p_perslid_key;
-- *** Budgethouderschap ***
-- Voor hoeveel kostenplaatsen is deze persoon budgethouder?
SELECT COUNT ( * )
INTO v_count
FROM prs_kostenplaats
WHERE prs_perslid_key = p_perslid_key;
IF (v_count > 0)
THEN
UPDATE prs_kostenplaats
SET prs_perslid_key = NULL
WHERE prs_perslid_key = p_perslid_key;
fac.imp_writelog (
p_import_key,
'I',
'Budgethouderschap van te verwijderen persoon ('
|| v_count
|| ' stuks) vervallen.',
'Naam/persoonsnr: ' || v_perslid_naam || '/' || v_perslid_nr);
END IF;
-- *** Vervangers ***
-- koppelingen met vervangers dienen ook verwijderd te worden
SELECT COUNT ( * )
INTO v_count
FROM prs_collega
WHERE prs_perslid_key = p_perslid_key
OR prs_perslid_key_alt = p_perslid_key;
IF (v_count > 0)
THEN
DELETE FROM prs_collega
WHERE prs_perslid_key = p_perslid_key
OR prs_perslid_key_alt = p_perslid_key;
fac.imp_writelog (
p_import_key,
'I',
'Te verwijderen persoon heeft vervanger(s). Koppeling(en) verwijderd.',
'Naam/persoonsnr: ' || v_perslid_naam || '/' || v_perslid_nr);
END IF;
-- *** werkplekken ***
-- per 5.3.2 worden impliciete werkplekken via trigger verwijderd!
DELETE prs_perslidwerkplek
WHERE prs_perslid_key = p_perslid_key;
-- *** Verplichtingen ***
SELECT COUNT ( * )
INTO v_count
FROM prs_v_verplichting_refcheck vp
WHERE vp.prs_perslid_key = p_perslid_key;
IF v_count = 0
THEN
-- Persoon heeft geen enkele (actuele of historische) verplichting
v_errorhint :=
'Verwijderen van persoon met key ' || TO_CHAR (p_perslid_key);
-- Referenties in tabellen naar deze pers_perslid_key moeten eerst verwijderd worden.
-- Door cascade verwijderen van deze record onstaan audits op die tabellen die audit tracking hebben.
-- Daardoor onstaan "ORxA-04091:table VLKC.FAC_AUDIT is mutating, trigger/function may not see it" foutmeldingen
-- op de delete van de prs_perslid_key uit de prs_perslid tabel.
-- De tabellen prs_kostenplaats, prs_kostenplaatsgrp, prs_perslidkostenplaats en fac_gebruikersgroep hebben een prs_perslid_key referentie en audit tracking.
DELETE FROM prs_kostenplaats
WHERE prs_perslid_key = p_perslid_key;
DELETE FROM prs_kostenplaatsgrp
WHERE prs_perslid_key = p_perslid_key;
DELETE FROM prs_perslidkostenplaats
WHERE prs_perslid_key = p_perslid_key;
DELETE FROM fac_gebruikersgroep
WHERE prs_perslid_key = p_perslid_key;
DELETE FROM prs_perslid
WHERE prs_perslid_key = p_perslid_key;
fac.imp_writelog (
p_import_key,
'I',
'Persoon verwijderd.',
'Achternaam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr);
ELSE
-- Controleer of er ACTUELE verplichtingen zijn
SELECT COUNT ( * )
INTO v_count
FROM prs_v_verplichting_keys vp
WHERE vp.prs_perslid_key = p_perslid_key;
IF v_count > 0
THEN
UPDATE prs_perslid
SET prs_perslid_naam =
SUBSTR ('INACTIEF:' || prs_perslid_naam, 1, 60),
prs_perslid_inactief = SYSDATE,
prs_perslid_oslogin = NULL,
prs_perslid_oslogin2 = NULL
WHERE prs_perslid_key = p_perslid_key
AND prs_perslid_naam NOT LIKE 'INACTIEF:%';
fac.imp_writelog (
p_import_key,
'I',
'Persoon als INACTIEF gemarkeerd of was al INACTIEF gemarkeerd.',
'Achternaam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr);
ELSE
BEGIN
UPDATE prs_perslid
SET prs_perslid_verwijder = SYSDATE
WHERE prs_perslid_key = p_perslid_key;
fac.imp_writelog (
p_import_key,
'I',
'Persoon ge<67>nactiveerd.',
'Achternaam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr);
EXCEPTION
WHEN OTHERS
THEN
-- Kennelijk heeft de persoon toch ernstige verplichtingen
v_errorhint :=
'Persoon heeft nog (max. '
|| TO_CHAR (v_count)
|| ') verplichtingen. Naam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr;
fac.imp_writelog (p_import_key,
'I',
'Inactiveren persoon is niet gelukt',
v_errorhint);
END;
END IF;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
'(ORACLE error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'E',
v_errormsg,
v_errorhint);
END;
END delete_perslid;
-- Verwijder ook alle children
-- Let wel dat de trigger van alles kan tegengaan (nog personen, objecten enz.)
PROCEDURE set_afdeling_verwijder (p_afdeling_key IN NUMBER)
AS
BEGIN
UPDATE prs_afdeling
SET prs_afdeling_verwijder = SYSDATE
WHERE prs_afdeling_verwijder IS NULL
AND prs_afdeling_key IN ( SELECT prs_afdeling_key
FROM prs_afdeling
START WITH prs_afdeling_key = p_afdeling_key
CONNECT BY PRIOR prs_afdeling_key = prs_afdeling_parentkey);
END;
FUNCTION combinatievalidatie (p_kp_key IN NUMBER, p_ksrt_key IN NUMBER, p_disc_key IN NUMBER)
RETURN BOOLEAN
AS
l_dummy prs_kostencombinatie.prs_kostencombinatie_key%TYPE;
l_kp_key prs_kostenplaats.prs_kostenplaats_key%TYPE;
l_ksrt_key prs_kostensoort.prs_kostensoort_key%TYPE;
l_disc_key mld_stdmelding.mld_ins_discipline_key%TYPE;
l_combination_OK BOOLEAN DEFAULT FALSE; -- Start de afvalrace met FALSE.
l_kpgrp_key prs_kostenplaatsgrp.prs_kostenplaatsgrp_key%TYPE DEFAULT -1;
BEGIN
l_kp_key := p_kp_key;
l_ksrt_key := p_ksrt_key;
l_disc_key := p_disc_key;
-- Als de kostensoort niet werd meegegeven dan deze proberen zelf te bepalen.
IF l_ksrt_key IS NULL AND l_disc_key IS NOT NULL
THEN
SELECT prs_kostensoort_key
INTO l_ksrt_key
FROM ins_tab_discipline
WHERE ins_discipline_key = l_disc_key;
END IF;
-- Start de afvalrace.
IF l_kp_key IS NULL OR l_ksrt_key IS NULL
THEN
l_combination_OK := TRUE;
END IF;
IF NOT l_combination_OK
THEN
BEGIN
SELECT prs_kostenplaatsgrp_key
INTO l_kpgrp_key
FROM prs_kostenplaats
WHERE prs_kostenplaats_key = l_kp_key;
-- het is goed als er geen groep gedefinieerd is
l_combination_OK := l_kpgrp_key IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
END;
END IF;
IF NOT l_combination_OK
THEN
BEGIN
-- Geldt er uberhaupt een restrictie op deze kostensoort?
SELECT DISTINCT 1
INTO l_dummy
FROM prs_kostencombinatie kc
WHERE kc.prs_kostensoort_key = l_ksrt_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_combination_OK := TRUE;
END;
END IF;
IF NOT l_combination_OK
THEN
BEGIN
SELECT prs_kostencombinatie_key
INTO l_dummy
FROM prs_kostencombinatie kc
WHERE kc.prs_kostenplaatsgrp_key = l_kpgrp_key
AND kc.prs_kostensoort_key = l_ksrt_key;
-- Er is een geldige combinatie gevonden.
l_combination_OK := TRUE;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
END;
END IF;
RETURN l_combination_OK;
END;
PROCEDURE personen_inactief_schonen
AS
CURSOR c1
IS
SELECT '[' || TO_CHAR (p.prs_perslid_key) || '|' || p.prs_perslid_email || '|' || pf.prs_perslid_naam_full || '] ' aanduiding
, p.prs_perslid_key
, COUNT (vp.prs_perslid_key) aant
FROM prs_v_aanwezigperslid p
, prs_v_verplichting_keys vp
, prs_v_perslid_fullnames pf
WHERE p.prs_perslid_key = vp.prs_perslid_key(+) -- Actuele verplichtingen?
AND p.prs_perslid_key = pf.prs_perslid_key
AND COALESCE (p.prs_perslid_inactief, SYSDATE) < TRUNC (SYSDATE)
-- AND p.prs_perslid_externid IS NOT NULL -- SCIM-populatie!
GROUP BY '[' || TO_CHAR (p.prs_perslid_key) || '|' || p.prs_perslid_email || '|' || pf.prs_perslid_naam_full || '] '
, p.prs_perslid_key
ORDER BY 2;
v_errormsg VARCHAR2(1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2(200);
v_count_del NUMBER(10);
v_schedular_user NUMBER(10) := NULL;
BEGIN
v_count_del := 0;
FOR rec IN c1
LOOP
BEGIN
IF rec.aant = 0
THEN
v_errormsg := 'Fout schonen collega';
DELETE
FROM prs_collega
WHERE prs_perslid_key = rec.prs_perslid_key
OR prs_perslid_key_alt = rec.prs_perslid_key;
v_errormsg := 'Fout schonen perslid';
UPDATE prs_perslid
SET prs_perslid_verwijder = SYSDATE
WHERE prs_perslid_key = rec.prs_perslid_key;
fac.trackaction ('PRSDEL', rec.prs_perslid_key, v_schedular_user, NULL, NULL);
v_count_del := v_count_del + 1;
IF MOD (v_count_del, 1000) = 0
THEN
COMMIT;
END IF;
ELSE
fac.writelog ('PRS_PERSLID_SCHONEN', 'I', rec.aanduiding || '/#Verplichtingen: ' || TO_CHAR (rec.aant), 'Persoon niet geschoond');
END IF;
EXCEPTION
WHEN OTHERS
THEN -- Kennelijk heeft persoon toch nog ernstige verplichtingen!
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.writelog ('PRS_PERSLID_SCHONEN', 'W', rec.aanduiding || v_errormsg, 'Fout schonen persoon');
END;
END LOOP;
fac.writelog ('PRS_PERSLID_SCHONEN', 'S', 'Personen/#geschoond: ' || TO_CHAR (v_count_del), '');
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.writelog ('PRS_PERSLID_SCHONEN', 'E', v_errormsg, '');
COMMIT;
END;
PROCEDURE personen_vervangers_schonen
AS
v_count_del NUMBER(10);
BEGIN
v_count_del := 0;
DELETE
FROM prs_collega
WHERE prs_collega_vervaldatum < TRUNC(SYSDATE);
v_count_del := SQL%ROWCOUNT;
IF v_count_del > 0
THEN
fac.writelog ('PRS_COLLEGA_SCHONEN', 'S', 'Vervangers/#geschoond: ' || TO_CHAR (v_count_del), '');
END IF;
END;
END prs;
/
REGISTERRUN('$Id$')
#endif // PRS