LOGI#56094: Personen import afgelopen nacht verkeerd gelopen

svn path=/Customer/trunk/; revision=42896
This commit is contained in:
Suzan Wiegerinck
2019-06-07 10:03:39 +00:00
parent b6294cba0f
commit 67e1f5e584

View File

@@ -18,6 +18,7 @@ SET DEFINE OFF
------ payload begin ------
/* De 'oude' personen import en update vervangen door de standaard
CREATE OR REPLACE PROCEDURE logi_import_persoon (p_import_key IN NUMBER)
AS
c_max_import_str_len NUMBER (10) := 1000;
@@ -216,6 +217,7 @@ EXCEPTION
END;
/
CREATE OR REPLACE PROCEDURE logi_update_persoon (p_import_key IN NUMBER)
AS
-- Constanten (LET OP: deze waarden moeten letterlijk in de DB aabwezig zijn!)
@@ -334,99 +336,7 @@ BEGIN
END;
END LOOP;
/* oude del procedure vervangen door aanroep standaard
FOR rec_prs_del IN c_prs_del
LOOP
BEGIN
v_perslid_key := rec_prs_del.prs_perslid_key;
v_errorhint := 'Verwijderen van de persoon is NIET gelukt';
SELECT COUNT (*)
INTO v_count
FROM prs_v_verplichting_refcheck pv
WHERE pv.prs_perslid_key = v_perslid_key;
IF v_count = 0
THEN
-- Persoon heeft geen enkele (actuele of historische) verplichting
v_errormsg := 'Kan persoon (kennelijk zonder historie!) niet met prs_perslid_key [' || TO_CHAR (v_perslid_key) || '] niet verwijder. ';
DELETE FROM prs_perslid
WHERE prs_perslid_key = v_perslid_key;
fac.imp_writelog (p_import_key,
'I',
'Persoon verwijderd met personeelsnummer ['||rec_prs_del.prs_perslid_nr||']',
''
);
commit; -- tbv logging
ELSE
-- Controleer of er ACTUELE verplichtingen zijn
SELECT COUNT (*)
INTO v_count
FROM prs_v_verplichting_keys pv
WHERE pv.prs_perslid_key = v_perslid_key;
IF v_count > 0
THEN
v_errormsg := 'Kan persoon (kennelijk met historie!) niet inactiveren met prs_perslid_key [' || TO_CHAR (v_perslid_key) || ']';
UPDATE prs_perslid
SET prs_perslid_naam = SUBSTR (c_inactief || prs_perslid_naam, 1, 30),
prs_perslid_oslogin = NULL
WHERE prs_perslid_key = v_perslid_key
AND prs_perslid_naam NOT LIKE c_inactief||'%';
fac.imp_writelog (p_import_key,
'I',
'Persoon als ['||c_inactief||'] gemarkeerd met personeelsnummer ['||rec_prs_del.prs_perslid_nr||']',
''
);
ELSE
BEGIN
v_errormsg := 'Kan persoon (kennelijk met historie!) niet inactiveren (verwijderdatum zetten) met prs_perslid_key [' || TO_CHAR (v_perslid_key) || ']';
UPDATE prs_perslid
SET prs_perslid_verwijder = c_perslid_verwijder
WHERE prs_perslid_key = v_perslid_key;
fac.imp_writelog (p_import_key,
'I',
'Persoon verwijderd met personeelsnummer ['||rec_prs_del.prs_perslid_nr||']',
''
);
EXCEPTION
WHEN OTHERS
THEN
-- Kennelijk heeft de persoon toch ernstige verplichtingen
v_errorhint :=
'Persoon heeft nog (max. '
|| TO_CHAR (v_count)
|| ') verplichtingen; personeelsnummer: '
|| rec_prs_del.prs_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 := v_errormsg||'(ORACLE error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
END;
END LOOP;
*/
COMMIT;
-- Update
v_errormsg := 'Persoonsgegevens worden nu angepast (toevoegen/wijzigen) ';
@@ -505,52 +415,6 @@ BEGIN
END;
END IF;
/*
-- Controle: PRS_AFDELING_NAAM
IF v_update
THEN
BEGIN
v_errormsg := 'De afdeling ['||rec_prs_upd.prs_afdeling_naam||']'||' kan niet <20><>nduidig bepaald worden ';
-- Bepaal de afdelingskey; afdelingen worden met een andere import beheerd
-- RD**** MAX ivm testen!
SELECT max(prs_afdeling_key)
INTO v_afdeling_key
FROM prs_v_afdeling_fullnames
WHERE upper(prs_afdeling_naam3) = upper(rec_prs_upd.prs_afdeling_naam)
AND niveau = c_afdeling_niveau_persoon;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_update := FALSE;
v_errorhint :=
'Afdeling '
|| rec_prs_upd.prs_afdeling_naam
|| ' bestaat niet; personeelsnummer: '
|| rec_prs_upd.prs_perslid_nr;
-- Kennelijk is de afdeling niet gevonden
IF (v_aktie = 'INSERT')
THEN
fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
ELSE
fac.imp_writelog
(p_import_key,
'E',
'Afdeling van de persoon kan niet gewijzigd worden, evt. andere wijzigingen worden ook genegeerd.',
v_errorhint
);
END IF;
WHEN OTHERS
THEN
v_update := FALSE;
v_errorhint := 'Kan Afdeling ' || rec_prs_upd.prs_afdeling_naam || ' niet eenduidig bepalen?!';
END;
END IF;
*/
-- Controle: PRS_SRTPERSLID_OMSCHRIJVING
IF v_update
THEN
@@ -996,6 +860,427 @@ EXCEPTION
END;
/
*/
CREATE OR REPLACE PROCEDURE logi_import_persoon (p_import_key IN NUMBER)
AS
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_errormsg VARCHAR2 (400);
v_errorhint VARCHAR2 (400);
v_aantal_in_FCLT NUMBER;
BEGIN
v_errorhint := 'Generieke update';
-- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid proc
prs.import_perslid (
p_import_key,
'0;0;0;0;0;0;8;2;4;3;'
|| '0;0;0;0;0;0;0;6;0;1;'
|| '1;5;0;0;0;0;9;0;0;0;'
|| '0;0;0;0;0;0;0;0;0;0;'
|| '0;0;0;0;0;0',
'employeeID;sn;givenName;infix;uid;mail;orglevel7;orgleve7id;a1physicalDeliveryOfficeName%');
UPDATE fac_imp_perslid
SET prs_srtperslid_omschrijving = 'Onbekend';
UPDATE fac_imp_perslid
SET prs_afdeling_naam = 'CGI';
--- LET OP: medewerkers zonder email adres (want dat wordt de match) verwijderen!
DELETE fac_imp_perslid p
WHERE p.prs_perslid_email IS NULL;
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_errormsg,
v_errorhint);
END logi_import_persoon;
/
/* Formatted on 7-6-2019 11:07:56 (QP5 v5.336) */
CREATE OR REPLACE PROCEDURE logi_update_persoon (p_import_key IN NUMBER)
AS
v_perslid_key NUMBER (10);
v_nr_werkplek NUMBER;
v_current_locatie_key NUMBER;
v_new_locatie_key NUMBER;
v_update BOOLEAN;
v_errormsg VARCHAR2 (1024);
v_errorhint VARCHAR2 (1024);
v_locatie_key NUMBER (10);
v_gebouw_key NUMBER (10);
v_verdieping_key NUMBER (10);
v_ruimte_key NUMBER (10);
v_werkplek_key NUMBER (10);
v_gebouw_code VARCHAR2 (10);
-- Constanten (overig)
c_usrtab_key INTEGER := 1; -- Tbv LOCATIE
c_srtgebouw_default INTEGER := 1;
c_srtruimte_default INTEGER := 1;
c_prs_werkplek_omschrijving VARCHAR2 (16) := 'Onbekend';
c_srtperslid_omschr_default VARCHAR2 (16) := 'Onbekend';
c_werkplek_volgnr_default INTEGER := 1;
c_verdieping_omschr_default VARCHAR2 (16) := 'BG';
c_ruimte_omschr_default VARCHAR2 (16) := 'Onbekend';
c_ruimte_code VARCHAR2 (3) := '000';
c_commitbuffer NUMBER := 1000;
CURSOR c_prs_upd IS
SELECT p.prs_perslid_key,
lp.prs_kenmerk1, --- locatie omschrijving
lp.prs_perslid_naam,
lp.prs_perslid_tussenvoegsel,
lp.prs_perslid_voorletters,
lp.prs_perslid_voornaam,
lp.prs_perslid_telefoonnr,
lp.prs_perslid_mobiel,
lp.prs_perslid_oslogin,
lp.prs_perslid_email,
COALESCE (lp.prs_srtperslid_omschrijving, 'Onbekend')
prs_srtperslid_omschrijving,
lp.prs_perslid_nr,
''
prs_perslid_titel,
p.prs_perslid_verwijder
FROM fac_imp_perslid lp, prs_perslid p
WHERE 1 = 1 AND lp.prs_perslid_email = p.prs_perslid_email(+)
-- Dit moet analoog aan UWVA#13061: verwijderde personen moeten kunnen worden gereactiveerd.
-- AND p.prs_perslid_verwijder IS NULL
ORDER BY lp.prs_perslid_nr, p.prs_perslid_key DESC;
-- Verwijderen op basis van oslogin #56094
CURSOR c_prs_del IS
SELECT p.prs_perslid_key, p.prs_perslid_nr, p.prs_perslid_oslogin
FROM PRS_PERSLID p,
(SELECT prs_perslid_oslogin
FROM logi_imp_persoon
WHERE prs_perslid_oslogin IS NOT NULL) lp
WHERE 1 = 1
AND p.prs_perslid_nr IS NOT NULL
AND p.prs_perslid_oslogin IS NOT NULL
AND p.prs_perslid_verwijder IS NULL
AND p.prs_perslid_oslogin NOT LIKE '%\_%' ESCAPE '\'
AND UPPER (p.prs_perslid_oslogin) =
UPPER (lp.prs_perslid_oslogin(+))
AND lp.prs_perslid_oslogin IS NULL
ORDER BY 2, 1;
BEGIN
FOR rec IN c_prs_upd
LOOP
BEGIN
-- 'Email' betekent dat op basis van Email wordt gematched.
prs.update_perslid (p_import_key, 'EMAIL', NULL);
BEGIN
-- Bepaal werkplekken
SELECT COUNT (*)
INTO v_nr_werkplek
FROM prs_perslidwerkplek
WHERE prs_perslid_key = rec.prs_perslid_key;
EXCEPTION
WHEN OTHERS
THEN
fac.imp_writelog (
p_import_key,
'I',
v_errormsg,
'Het aantal werkplekken kan niet bepaald worden?! personeelsnummer: '
|| rec.prs_perslid_nr);
-- indien niet te bepalen dan niet updaten.
v_update := FALSE;
END;
IF v_nr_werkplek = 1
THEN
BEGIN
-- bepaal huidige alg_locatie_key
SELECT alg_locatie_key
INTO v_current_locatie_key
FROM prs_v_werkplekperslid_gegevens
WHERE prs_perslid_key = rec.prs_perslid_key;
-- bepaal nieuwe alg_locatie_key
SELECT lo.alg_locatie_key
INTO v_new_locatie_key
FROM fac_usrdata ud, alg_locatie lo
WHERE ud.fac_usrtab_key = c_usrtab_key
AND ud.fac_usrdata_code = lo.alg_locatie_code
AND ud.fac_usrdata_omschr = rec.prs_kenmerk1
AND lo.alg_locatie_verwijder IS NULL;
-- indien gelijk dan werkplek niet updaten.
v_update := (v_current_locatie_key <> v_new_locatie_key);
EXCEPTION
WHEN OTHERS
THEN
fac.imp_writelog (
p_import_key,
'I',
v_errormsg,
'huidige of nieuwe alg_locatie_key kan niet bepaald worden?! personeelsnummer: '
|| rec.prs_perslid_nr);
v_update := FALSE;
END;
END IF;
--- We gaan de werkplek vervangen of toevoegen
IF v_update
AND (rec.prs_kenmerk1 IS NOT NULL)
AND (v_nr_werkplek <= 1)
THEN
v_errormsg :=
'Fout bij toewijzen werkplek bij zojuist toegevoegde persoon ';
-- stap 1: perslid key bepalen
BEGIN
SELECT prs_perslid_key
INTO v_perslid_key
FROM prs_perslid
WHERE prs_perslid_nr = rec.prs_perslid_nr
AND prs_perslid_verwijder IS NULL;
EXCEPTION
WHEN TOO_MANY_ROWS
THEN
fac.imp_writelog (
p_import_key,
'I',
v_errormsg,
'Het personeelsnummer is niet uniek: '
|| rec.prs_perslid_nr);
v_update := FALSE;
WHEN OTHERS
THEN
fac.imp_writelog (
p_import_key,
'I',
v_errormsg,
'De persoon kan niet bepaald worden?! personeelsnummer: '
|| rec.prs_perslid_nr);
v_update := FALSE;
END;
--- stap 2: locatie code bepalen
BEGIN
SELECT lo.alg_locatie_key
INTO v_locatie_key
FROM FAC_USRDATA ud, ALG_LOCATIE lo
WHERE ud.fac_usrtab_key = c_usrtab_key
AND ud.fac_usrdata_code = lo.alg_locatie_code
AND ud.fac_usrdata_omschr = rec.prs_kenmerk1
AND lo.alg_locatie_verwijder IS NULL;
EXCEPTION
WHEN OTHERS
THEN
v_update := FALSE;
END;
IF NOT v_update
THEN
v_errorhint :=
'Onbekende Locatie-omschrijving '
|| rec.prs_kenmerk1
|| '; personeelsnummer: '
|| rec.prs_perslid_nr;
fac.imp_writelog (p_import_key,
'I',
v_errormsg,
v_errorhint);
-- er is een locatie code gevonden dus nu kunnen we verder met het bepalen van de werkplek
ELSE
BEGIN
-- Stap 3: gebouwcode bepalen, indien geen gevonden dan een dummy aanmaken
SELECT MIN (alg_gebouw_code)
INTO v_gebouw_code
FROM alg_gebouw
WHERE alg_locatie_key = v_locatie_key
AND alg_gebouw_verwijder IS NULL;
SELECT alg_gebouw_key
INTO v_gebouw_key
FROM alg_gebouw
WHERE alg_locatie_key = v_locatie_key
AND alg_gebouw_code = v_gebouw_code
AND alg_gebouw_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
INSERT INTO alg_gebouw (alg_locatie_key,
alg_srtgebouw_key,
alg_gebouw_code,
alg_gebouw_naam)
VALUES (v_locatie_key,
c_srtgebouw_default,
'0',
'Onbekend');
v_errormsg :=
'Bepalen alg_gebouw_key adhv v_locatie_key=['
|| TO_CHAR (v_locatie_key)
|| '] en v_gebouw_code=['
|| v_gebouw_code
|| ']';
SELECT alg_gebouw_key
INTO v_gebouw_key
FROM alg_gebouw
WHERE alg_locatie_key = v_locatie_key
AND alg_gebouw_code = v_gebouw_code
AND alg_gebouw_verwijder IS NULL;
END;
--- Stap 4: verdieping bepalen, indien niet te bekend dan dummy aanmaken
BEGIN
v_errormsg := 'Bepalen alg_verdieping_key';
SELECT alg_verdieping_key
INTO v_verdieping_key
FROM alg_verdieping
WHERE alg_gebouw_key = v_gebouw_key
AND alg_verdieping_verwijder IS NULL
AND alg_verdieping_volgnr = 0; -- Begane grond!
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_errorhint :=
'Persoon met persoonnummer '
|| rec.prs_perslid_nr
|| ': toevoegen verdieping Onbekend';
INSERT INTO alg_verdieping (
alg_gebouw_key,
alg_verdieping_omschrijving,
alg_verdieping_volgnr,
alg_verdieping_code)
VALUES (v_gebouw_key,
c_verdieping_omschr_default,
0,
'0');
-- Alsnog bepalen v_verdieping_key
SELECT alg_verdieping_key
INTO v_verdieping_key
FROM alg_verdieping
WHERE alg_gebouw_key = v_gebouw_key
AND alg_verdieping_verwijder IS NULL
AND alg_verdieping_volgnr = 0; -- Begane grond!
END;
--- stap 5: dan de ruimte bepalen, aanmaken indien deze niet te herleiden is
BEGIN
v_errorhint :=
'Persoon met persoonnummer '
|| rec.prs_perslid_nr
|| ': bepalen ruimte (ruimte zou bekend moeten zijn)';
SELECT alg_ruimte_key
INTO v_ruimte_key
FROM alg_ruimte
WHERE alg_verdieping_key = v_verdieping_key
AND alg_ruimte_verwijder IS NULL
AND alg_ruimte_nr = c_ruimte_code;
-- Altijd ruimte met deze notatie!
EXCEPTION
WHEN NO_DATA_FOUND
THEN
INSERT INTO alg_ruimte (alg_verdieping_key,
alg_srtruimte_key,
alg_ruimte_nr,
alg_ruimte_omschrijving)
VALUES (v_verdieping_key,
c_srtruimte_default,
c_ruimte_code,
c_ruimte_omschr_default);
-- Alsnog bepalen v_ruimte_key
SELECT alg_ruimte_key
INTO v_ruimte_key
FROM alg_ruimte
WHERE alg_verdieping_key = v_verdieping_key
AND alg_ruimte_verwijder IS NULL
AND alg_ruimte_nr = c_ruimte_code;
-- Altijd ruimte met deze notatie!
END;
-- stap 6 werkplek zou nu te bepalen moeten zijn
BEGIN
v_errorhint :=
'Persoon met persoonnummer '
|| rec.prs_perslid_nr
|| ': bepalen werkplek (werkplek zou bekend moeten zijn)';
SELECT prs_werkplek_key
INTO v_werkplek_key
FROM prs_werkplek
WHERE prs_alg_ruimte_key = v_ruimte_key
AND prs_werkplek_volgnr =
c_werkplek_volgnr_default;
-- Altijd werkplek met deze notatie!
EXCEPTION
WHEN NO_DATA_FOUND
THEN
INSERT INTO prs_werkplek (
prs_werkplek_volgnr,
prs_werkplek_omschrijving,
prs_alg_ruimte_key,
prs_werkplek_virtueel)
VALUES (c_werkplek_volgnr_default,
c_prs_werkplek_omschrijving,
v_ruimte_key,
1);
-- Alsnog bepalen v_werkplek_key
SELECT prs_werkplek_key
INTO v_werkplek_key
FROM prs_werkplek
WHERE prs_alg_ruimte_key = v_ruimte_key
AND prs_werkplek_volgnr =
c_werkplek_volgnr_default;
-- Altijd werkplek met deze notatie!
END;
IF v_nr_werkplek = 0
THEN
INSERT INTO prs_perslidwerkplek (
prs_perslid_key,
prs_werkplek_key,
prs_perslidwerkplek_bezetting)
VALUES (v_perslid_key, v_werkplek_key, 0);
ELSE -- v_nr_werkplek = 1
UPDATE prs_perslidwerkplek
SET prs_werkplek_key = v_werkplek_key
WHERE prs_perslid_key = v_perslid_key;
END IF;
END IF;
END IF;
END;
END LOOP;
FOR rec IN c_prs_del
LOOP
BEGIN
prs.delete_perslid (p_import_key, rec.prs_perslid_key);
END;
END LOOP;
COMMIT;
END;
/
CREATE OR REPLACE PROCEDURE logi_import_organisatie (p_import_key IN NUMBER)
AS