diff --git a/LOGI/logi.sql b/LOGI/logi.sql index 2ed2e30be..2a25d69d6 100644 --- a/LOGI/logi.sql +++ b/LOGI/logi.sql @@ -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 éé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