Files
Customer/onces/RWSN/rwsn52.sql
Peter Koerhuis 3b8d7f1dcc Migratie once-scripts van /branch naar /onces
svn path=/Customer/; revision=21207
2014-04-02 13:57:31 +00:00

1041 lines
44 KiB
SQL
Raw Blame History

-- Customer specific once-script RWSN52.
--
-- (c) 2013 SG|facilitor bv
-- $Revision$
-- $Id$
--
-- Support: +31 53 4800700
SET ECHO ON
SPOOL xrwsn52.lst
SET DEFINE OFF
-- RWSN#27455: Aanpassing IDM-koppeling (van BSN naar RIN); tbv. levering naar
-- Test nu nog in rwsn52, maar later (TODO) opnemen in rwsn.sql!!!
CREATE OR REPLACE PROCEDURE rwsn_update_idm_pers (p_import_key IN NUMBER)
AS
/* Globale werking:
Op basis van het IDM importbestand
-- worden personen toegevoegd aan (vereist) bestaande afdelingen
-- worden onderwijl functie aangemaakt, zonodig
-- worden werkplekken gedefinieerd zomogelijk (vertaaltabel)
-- worden vervallen personen verwijderd
(c) SG|facilitor bv
*/
-- Constanten
c_verdieping_omschr_default VARCHAR2 (16) := 'Begane grond';
c_srtruimte_default INTEGER := 1;
c_ruimte_code VARCHAR2 (3) := '001';
c_ruimte_omschr_default VARCHAR2 (16) := 'Onbekend';
c_werkplek_volgnr_default INTEGER := 1;
c_prs_werkplek_omschrijving VARCHAR2 (16) := '1';
c_default_profiel_key NUMBER (10) := 1;
c_rin_kkey NUMBER (10) := 1160;
c_commitbuffer NUMBER := 1000;
-- om de zoveel committen
v_buffercount NUMBER := 0;
-- Personen die moeten vervallen zijn personen die:
--- volgens de importregels zijn ingevoerd (ignore handmatige)
--- in de import voorkomen en een einddatum hebben die voorbij is
--- of niet in de import voorkomen
-- en die nog niet vervallen waren
-- personeelsnummer=BSN uit de importtabel mapt op prs_perslid_authenticatie => per RWSN52 vervallen!
-- RIN uit de importtabel mapt op kenmerk met key=1160
-- dienstverbandid uit de importtabel (SAPHRnummer) mapt op prs_perslid_nr
CURSOR c_prs_del
IS
SELECT p.prs_perslid_key,
pf.prs_perslid_naam_full,
kl.prs_kenmerklink_waarde rin
FROM prs_perslid p,
prs_v_perslid_fullnames_all pf,
prs_v_aanwezigkenmerklink kl
WHERE p.prs_perslid_verwijder IS NULL -- is niet al verwijderd
AND p.prs_perslid_key = pf.prs_perslid_key
AND p.prs_perslid_key = kl.prs_link_key
AND kl.prs_kenmerk_key = c_rin_kkey -- is ooit geimporteerd
AND NOT EXISTS -- komt niet voor in import
(SELECT 1
FROM rwsn_imp_idm_pers
WHERE UPPER (rin) = UPPER (kl.prs_kenmerklink_waarde))
UNION ALL
SELECT p.prs_perslid_key,
pf.prs_perslid_naam_full,
kl.prs_kenmerklink_waarde rin
FROM prs_perslid p,
prs_v_perslid_fullnames_all pf,
prs_v_aanwezigkenmerklink kl
WHERE p.prs_perslid_verwijder IS NULL -- is niet al verwijderd
AND p.prs_perslid_key = pf.prs_perslid_key
AND p.prs_perslid_key = kl.prs_link_key
AND kl.prs_kenmerk_key = c_rin_kkey -- is ooit geimporteerd
AND NOT EXISTS -- is beeindigd volgens import (geen persoon-regels met einddatum in toekomst)
(SELECT 1
FROM rwsn_imp_idm_pers
WHERE UPPER (rin) = UPPER (kl.prs_kenmerklink_waarde)
AND COALESCE (einddatum,SYSDATE + 1) > SYSDATE)
ORDER BY 3, 1;
-- Personen die nieuw of gewijzigd zijn
--- Reeds eerder verwijderde personen kunnen worden gereactiveerd (.. check)
-- Dubbele dienstverbanden wordt achter elkaar ingelezen en overschrijven elkaar dus.
-- In de volgorde is de laatste einddatum het laatst aan de beurt. Dit is vaak het
-- permanente contract tot jaar 9999.
CURSOR c_prs_upd
IS
SELECT p.prs_perslid_key, idm.locatiecode alg_locatie_code, idm.afdelingscode prs_afdeling_naam,
idm.persoonachternaam prs_perslid_naam, idm.tussenvoegsel prs_perslid_tussenvoegsel,
idm.voorletters prs_perslid_voorletters, idm.voornaam prs_perslid_voornaam,
idm.telefoonnummer prs_perslid_telefoonnr, idm.functie prs_srtperslid_omschrijving, idm.rin,
idm.personeelsnummer personeelsnummer, idm.titel prs_perslid_titel, p.prs_perslid_verwijder,
idm.begindatum, idm.einddatum, idm.mobielnummer, idm.email, idm.loginnaam, idm.dienstverbandguid,
idm.dienstverbandid, idm.bezoekadresnaam, idm.bezoekadresnummer, idm.bezoekadrespostcode,
idm.bezoekadresplaats, idm.aanduidingnaamgebruik, idm.partnertussenvoegsel, idm.partnernaam
FROM (SELECT *
FROM rwsn_imp_idm_pers
WHERE einddatum > SYSDATE) idm
LEFT JOIN
(SELECT kl.prs_kenmerklink_waarde rin,
p.prs_perslid_key,
p.prs_perslid_verwijder
FROM prs_perslid p, prs_v_aanwezigkenmerklink kl
WHERE p.prs_perslid_key = kl.prs_link_key
AND kl.prs_kenmerk_key = c_rin_kkey) p
ON idm.rin = p.rin
ORDER BY idm.rin, idm.einddatum, prs_perslid_key DESC;
v_perslid_key NUMBER (10);
v_prs_key_cnt NUMBER (10);
v_srtperslid_key NUMBER (10);
v_afdeling_key NUMBER (10);
v_srtperslid_omschr VARCHAR2 (30);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_errormsg VARCHAR2 (1000);
v_errorhint VARCHAR2 (1000);
v_count NUMBER (10);
v_update BOOLEAN;
v_perslid_count_imp NUMBER;
v_perslid_count_fclt NUMBER;
v_perslid_newcount_fclt NUMBER;
currentversion fac_module.fac_module_version%TYPE;
v_newgebouwkey NUMBER;
lnaampresentatie VARCHAR2 (100);
ltussenvoegselpres VARCHAR2 (100);
lemail VARCHAR2 (100);
llogin1 VARCHAR2 (100);
llogin2 VARCHAR2 (100);
-- Bepaal het gebouw behorende bij postcode en nummer (best guess!)
-- Return -1 als het niet bepaald kan worden
FUNCTION getgebouwkey (postcode IN VARCHAR2, nummer IN VARCHAR2)
RETURN NUMBER
IS
llocatiekey alg_locatie.alg_locatie_key%TYPE;
lgebouwkey alg_gebouw.alg_gebouw_key%TYPE;
BEGIN
IF postcode IS NULL
THEN
RETURN -1;
END IF;
SELECT NVL (MIN (alg_locatie_key), -1)
INTO llocatiekey
FROM mld_adres m
WHERE m.mld_adres_bezoek_postcode = postcode
AND UPPER(SUBSTR(RTRIM(m.mld_adres_bezoek_adres), INSTR(RTRIM(m.mld_adres_bezoek_adres), ' ', -1)+1))
= UPPER(nummer) ;
IF llocatiekey <> -1
THEN
SELECT NVL (MIN (alg_gebouw_key), -1)
INTO lgebouwkey
FROM alg_gebouw
WHERE alg_gebouw_verwijder IS NULL AND alg_locatie_key = llocatiekey;
ELSE
lgebouwkey := -1;
END IF;
RETURN lgebouwkey;
END;
-- Het login veld in het importbestand heeft de onzalige eigenschap
-- dat er soms meerdere in staan, gescheiden door een , (komma)
-- Deze functie vertaalt dit veld tot een goede login
-- Op dit moment is dat het eerste adres. Tenzij de bestaande login voorkomt
-- in de lijst.
PROCEDURE handle_login (plogin IN VARCHAR2, p_perslid_key IN NUMBER, login1 OUT VARCHAR2, login2 OUT VARCHAR2)
IS
l_login_str rwsn_imp_idm_pers.loginnaam%TYPE;
BEGIN
l_login_str := UPPER(plogin);
IF p_perslid_key IS NOT NULL THEN
-- bestaand persoon
SELECT prs_perslid_oslogin, prs_perslid_oslogin2
INTO login1, login2
FROM prs_perslid
WHERE prs_perslid_key = p_perslid_key;
IF login1 = login2 THEN
login2 := NULL;
END IF;
IF login1 IS NOT NULL AND INSTR(','||l_login_str||',', ','||login1||',') > 0 THEN
-- 1e login is niet leeg en is gevonden in login lijst
-- we hoeven niets te doen
NULL;
ELSE
-- 1e login is niet gevonden of is leeg
-- controleer of er meerdere logins op de regel staan
IF INSTR (l_login_str, ',') > 0 THEN
login1 := SUBSTR (l_login_str, 1, INSTR (l_login_str, ',') - 1);
ELSE
login1 := l_login_str;
END IF;
IF login1 = login2 THEN
login2 := NULL;
END IF;
END IF;
IF login2 IS NOT NULL AND INSTR(','||l_login_str||',', ','||login2||',') > 0 THEN
-- 2e login is niet leeg en is gevonden in login lijst
-- we hoeven niets te doen
NULL;
ELSE
-- 2e login is niet gevonden of is leeg
login2 := SUBSTR (l_login_str, 1, INSTR (l_login_str, ',') - 1);
IF login1 = login2 THEN
-- ga op zoek naar de volgende
l_login_str := SUBSTR(l_login_str, INSTR (l_login_str, ',')+1);
IF INSTR (l_login_str, ',') > 0 THEN
login2 := SUBSTR (l_login_str, 1, INSTR (l_login_str, ',') - 1);
ELSE
login2 := l_login_str;
END IF;
END IF;
END IF;
ELSE
IF INSTR (l_login_str, ',') > 0
THEN
login1 := SUBSTR (l_login_str, 1, INSTR (l_login_str, ',') - 1);
l_login_str := SUBSTR(l_login_str, INSTR (l_login_str, ',')+1);
IF INSTR (l_login_str, ',') > 0 THEN
login2 := SUBSTR (l_login_str, 1, INSTR (l_login_str, ',') - 1);
ELSE
login2 := l_login_str;
END IF;
ELSE
login1 := l_login_str;
login2 := null;
END IF;
END IF;
END;
-- Het emailveld in het importbestand heeft de onzalige eigenschap
-- dat er soms meerdere in staan, gescheiden door een , (komma)
-- Deze functie vertaalt dit veld tot een goed emailadressen
-- Op dit moment nemen we alle email adressen over zodat de
-- gebruiker meerdere mailtjes krijgt.
FUNCTION handle_email (pemail IN VARCHAR2)
RETURN VARCHAR2
IS
rstr rwsn_imp_idm_pers.email%TYPE;
BEGIN
rstr := pemail;
RETURN rstr;
END;
-- Procedure die alles regelt voor de locatie van een persoon, varierend van
-- NIKS: als plaats ongeldig is of de huidige situatie al goed is
-- ZETTEN OP EEN BESTAANDE WERKPLEK
-- VERDIEPING/RUIMTE/WERKPLEK AANMAKEN EN TOEKENNEN
PROCEDURE handle_location (pkey IN NUMBER, pgebouwkey IN VARCHAR2, prin IN VARCHAR2)
IS
lv_errormsg VARCHAR2 (1000);
lv_errorhint VARCHAR2 (1000);
lv_nr_werkplek NUMBER;
lv_current_gebouw_key NUMBER;
lv_verdieping_key NUMBER (10);
lv_ruimte_key NUMBER (10);
lv_werkplek_key NUMBER (10);
BEGIN
lv_errormsg := 'Toekennen van een plaats';
IF pgebouwkey = -1
THEN
lv_errorhint := 'Onbekend gebouw voor persoon/RIN: ' || prin;
fac.imp_writelog (p_import_key, 'W', lv_errormsg, lv_errorhint);
RETURN;
END IF;
-- komt de nieuwe werkplek al voor bij een van de bestaande werkplekken?
SELECT COUNT (*)
INTO lv_nr_werkplek
FROM prs_perslidwerkplek pw, prs_werkplek w, alg_ruimte r, alg_verdieping v
WHERE pw.prs_werkplek_key = w.prs_werkplek_key
AND nvl(w.prs_werkplek_virtueel, 0) <> 1
AND w.prs_alg_ruimte_key = r.alg_ruimte_key
AND r.alg_verdieping_key = v.alg_verdieping_key
AND prs_perslid_key = pkey
AND v.alg_gebouw_key = pgebouwkey;
IF lv_nr_werkplek > 0
THEN
-- nieuwe werkplek bestaat al als een van de werkplekken.
lv_errorhint := 'Ongewijzigd gebouw voor persoon/RIN: ' || prin;
fac.imp_writelog (p_import_key, 'I', lv_errormsg, lv_errorhint);
RETURN;
END IF;
-- verwijder de bestaande werkplekken.
-- HdZ (6-8-2009: werkplekken mogen nog niet verwijderd worden via de koppeling.
-- werkplekken worden nog vaak handmatig aangemaakt.
--DELETE prs_perslidwerkplek WHERE prs_perslid_key = pkey;
-- Er moet wat gebeuren, plaatsen of verplaatsen
-- Vooralsnog even (bij)plaatsen
-- De gebouwkey is bekend, dus het gebouw ook.
-- Dan zoeken we naar de laagste verdieping en laagste ruimtenr
-- en dan maken we daarvoor een werkplek aan
IF lv_nr_werkplek = 0
THEN
-- persoon heeft geen werkplek(ken)
BEGIN
lv_errormsg := 'Bepalen verdieping';
SELECT alg_verdieping_key
INTO lv_verdieping_key
FROM alg_verdieping
WHERE alg_gebouw_key = pgebouwkey AND alg_verdieping_verwijder IS NULL AND alg_verdieping_upper like '%BEGANE GROND%';
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_errorhint := 'Begane grond toevoegen voor persoon/RIN: ' || prin;
INSERT INTO alg_verdieping
(alg_gebouw_key, alg_verdieping_omschrijving, alg_verdieping_volgnr, alg_verdieping_code)
VALUES (pgebouwkey, c_verdieping_omschr_default, 0, '0')
RETURNING alg_verdieping_key
INTO lv_verdieping_key;
END;
-- lv_verdieping_key bekend
BEGIN
-- zoek de laagste ruimte op deze verdieping
SELECT alg_ruimte_key
INTO lv_ruimte_key
FROM alg_ruimte
WHERE alg_verdieping_key = lv_verdieping_key
AND alg_ruimte_verwijder IS NULL
AND alg_ruimte_nr = (SELECT MIN (alg_ruimte_nr)
FROM alg_ruimte
WHERE alg_verdieping_key = lv_verdieping_key AND alg_ruimte_verwijder IS NULL);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_errorhint := 'Ruimte toevoegen voor persoon/RIN: ' || prin;
-- Noot: de srtruimte 1 moet bestaan
INSERT INTO alg_ruimte
(alg_verdieping_key, alg_srtruimte_key, alg_ruimte_nr, alg_ruimte_omschrijving)
VALUES (lv_verdieping_key, c_srtruimte_default, c_ruimte_code, c_ruimte_omschr_default)
RETURNING alg_ruimte_key
INTO lv_ruimte_key;
END;
-- lv_ruimte_key bekend
BEGIN
SELECT prs_werkplek_key
INTO lv_werkplek_key
FROM prs_werkplek
WHERE prs_alg_ruimte_key = lv_ruimte_key
AND prs_werkplek_volgnr = c_werkplek_volgnr_default;
-- Altijd werkplek met deze notatie!
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_errorhint := 'Werkplek toevoegen voor persoon/RIN: ' || prin;
-- WEL/NIET VIRTUEEL?
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, lv_ruimte_key, 0)
RETURNING prs_werkplek_key
INTO lv_werkplek_key;
-- Altijd werkplek met deze notatie!
END;
-- lv_werkplek_key bekend
-- 11-12-2009/MvdH - Unique constraint exception igv. virtuele werkplek? Volgens mij wel, maar niet opgelost!
INSERT INTO prs_perslidwerkplek
(prs_perslid_key, prs_werkplek_key, prs_perslidwerkplek_bezetting)
VALUES (pkey, lv_werkplek_key, 0);
END IF;
END;
PROCEDURE update_adres
AS
CURSOR cadressen
IS
SELECT DISTINCT
substr(bezoekadresplaats || '-' || bezoekadresnaam,1,30) adres_naam
, substr(bezoekadresnaam || ' ' || bezoekadresnummer,1,35) adres_bezoek_adres
, substr(bezoekadrespostcode,1,12) adres_bezoek_postcode
, substr(bezoekadresplaats, 1, 30) adres_bezoek_plaats
FROM rwsn_imp_idm_pers
WHERE bezoekadrespostcode IS NOT NULL;
ladreskey NUMBER (10);
l_newcount NUMBER;
l_impcount NUMBER;
v_errormsg VARCHAR (200);
oracle_err_mes VARCHAR2 (150);
currentversion fac_module.fac_module_version%TYPE;
BEGIN
FOR rc IN cadressen
LOOP
-- Bestaat deze al?
-- Er is geen key, dus checken we op alle velden
-- Een update is dus nvt
BEGIN
SELECT mld_adres_key
INTO ladreskey
FROM mld_adres
WHERE mld_adres_naam = rc.adres_naam
AND mld_adres_bezoek_postcode = rc.adres_bezoek_postcode
AND mld_adres_bezoek_adres = rc.adres_bezoek_adres
AND mld_adres_bezoek_plaats = rc.adres_bezoek_plaats;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
ladreskey := -1;
END;
-- DBMS_OUTPUT.put_line (rc.adres_naam);
IF ladreskey = -1
THEN
INSERT INTO mld_adres
(mld_adres_naam,
mld_adres_bezoek_adres,
mld_adres_bezoek_postcode,
mld_adres_bezoek_plaats,
mld_adres_afleveradres
)
VALUES (rc.adres_naam, rc.adres_bezoek_adres, rc.adres_bezoek_postcode, rc.adres_bezoek_plaats, 1);
fac.imp_writelog (p_import_key, 'I', 'Adres is toegevoegd', rc.adres_naam);
END IF;
END LOOP;
-- Zoek de locatiekey bij het adres op basis van postcode
-- Als er meerdere locaties matchen pak ik de oudste (=grootste?)
UPDATE mld_adres
SET alg_locatie_key =
(SELECT MIN (l.alg_locatie_key)
FROM alg_locatie l
WHERE l.alg_locatie_postcode = mld_adres_bezoek_postcode
AND UPPER(SUBSTR(RTRIM(l.alg_locatie_adres), INSTR(RTRIM(l.alg_locatie_adres), ' ', -1))) = UPPER(SUBSTR(mld_adres_bezoek_adres, INSTR(mld_adres_bezoek_adres, ' ', -1)))
AND l.alg_locatie_verwijder IS NULL)
WHERE mld_adres_verwijder IS NULL AND alg_locatie_key IS NULL;
END;
PROCEDURE update_dienstverbandguid(p_prs_perslid_key IN NUMBER, p_dienstverbandguid IN VARCHAR2)
AS
v_prs_kenmerk_key NUMBER;
v_prs_kenmerklink_key NUMBER;
BEGIN
BEGIN
-- check for dienstverbandguid kenmerk
SELECT prs_kenmerk_key
INTO v_prs_kenmerk_key
FROM prs_v_aanwezigkenmerk
WHERE prs_kenmerk_omschrijving = 'DienstverbandGUID';
EXCEPTION WHEN NO_DATA_FOUND THEN
INSERT INTO prs_kenmerk
( PRS_KENMERK_NIVEAU
, PRS_KENMERK_VOLGNR
, PRS_KENMERK_OMSCHRIJVING
, PRS_KENMERK_KENMERKTYPE
, PRS_KENMERK_LENGTE)
VALUES ( 'P'
, 10
, 'DienstverbandGUID'
, 'C'
, 49
)
RETURNING prs_kenmerk_key
INTO v_prs_kenmerk_key;
END;
BEGIN
SELECT prs_kenmerklink_key
INTO v_prs_kenmerklink_key
FROM prs_kenmerklink
WHERE prs_kenmerk_key = v_prs_kenmerk_key
AND prs_link_key = p_prs_perslid_key
AND prs_kenmerklink_niveau = 'P';
EXCEPTION WHEN NO_DATA_FOUND THEN
INSERT INTO PRS_KENMERKLINK
( PRS_LINK_KEY
, PRS_KENMERKLINK_NIVEAU
, PRS_KENMERK_KEY
, PRS_KENMERKLINK_WAARDE)
VALUES ( p_prs_perslid_key
, 'P'
, v_prs_kenmerk_key
, p_dienstverbandguid);
END;
UPDATE prs_kenmerklink
SET prs_kenmerklink_waarde = p_dienstverbandguid
WHERE prs_kenmerklink_key = v_prs_kenmerklink_key;
END;
----------------------
----------------------
----------------------
----------------------
----------------------
-- MAIN PROCEDURE
----------------------
----------------------
----------------------
----------------------
----------------------
BEGIN
SELECT MAX (fac_module_version)
INTO currentversion
FROM fac_module;
fac.imp_writelog (p_import_key,
'I',
'Facilitor IDM_PERS import version ' || currentversion,
'$Revision$'
);
-- -- #Import
SELECT COUNT (*)
INTO v_perslid_count_imp
FROM rwsn_imp_idm_pers;
-- Informatieve logging, zien we gelijk hoe laat het was
fac.imp_writelog (p_import_key, 'S', 'Aantal ingelezen personen: ' || TO_CHAR (v_perslid_count_imp), '');
-- #Actieve personen m<>t<EFBFBD>RIN
SELECT COUNT (*)
INTO v_perslid_count_fclt
FROM prs_v_aanwezigperslid p, prs_v_aanwezigkenmerklink kl
WHERE p.prs_perslid_key = kl.prs_link_key AND kl.prs_kenmerk_key = c_rin_kkey;
-- Check het aantal regels, stop als onvoldoende (=bestaand maar ongeldig bestand)
IF v_perslid_count_imp = 0
THEN
fac.imp_writelog (p_import_key, 'E', 'Het importbestand is ongeldig. Import afgebroken', '');
RETURN;
END IF;
update_adres ();
-- Begin met het ontmantelen van vervallen personen
FOR rec_prs_del IN c_prs_del
LOOP
BEGIN
v_perslid_key := rec_prs_del.prs_perslid_key;
v_errormsg := 'Verwijderen van persoon NIET gelukt';
v_errorhint := 'Heeft persoon met key ' || TO_CHAR (v_perslid_key) || ' historie?';
SELECT SUM (x.aant)
INTO v_count
FROM (SELECT COUNT ( * ) aant
FROM prs_v_verplichting_refcheck pv
WHERE pv.prs_perslid_key = v_perslid_key
UNION
SELECT COUNT ( * ) aant
FROM fac_tracking t
WHERE t.prs_perslid_key = v_perslid_key) x;
IF v_count = 0
THEN
-- Persoon heeft geen enkele (actuele of historische) verplichting
v_errorhint := 'Verwijderen van persoon met key ' || TO_CHAR (v_perslid_key);
DELETE FROM prs_perslid
WHERE prs_perslid_key = v_perslid_key;
--Via trigger!
--DELETE FROM prs_kenmerklink
-- WHERE prs_link_key = v_perslid_key AND prs_kenmerklink_niveau = 'P';
fac.imp_writelog (p_import_key,
'I',
'Persoon verwijderd; RIN: ' || rec_prs_del.rin,
'');
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
UPDATE prs_perslid
SET prs_perslid_naam = SUBSTR ('INACTIEF:' || prs_perslid_naam, 1, 30),
prs_perslid_oslogin = NULL
WHERE prs_perslid_key = v_perslid_key AND prs_perslid_naam NOT LIKE 'INACTIEF:%';
fac.imp_writelog (p_import_key,
'I',
'Persoon INACTIEF; RIN: ' || rec_prs_del.rin,
'');
ELSE
-- Er zijn geen actieve verplichtingen, wel historische
BEGIN
UPDATE prs_perslid
SET prs_perslid_verwijder = SYSDATE
WHERE prs_perslid_key = v_perslid_key;
fac.imp_writelog (p_import_key,
'I',
'Persoon verwijderd; RIN: ' || rec_prs_del.rin,
'');
EXCEPTION
WHEN OTHERS
THEN
-- Kennelijk heeft persoon toch ernstige verplichtingen
v_errorhint :=
'Persoon heeft nog (max. '
|| TO_CHAR (v_count)
|| ') verplichtingen; RIN: '
|| rec_prs_del.rin;
fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
END;
END IF;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg := 'Delete exception ' || oracle_err_mes;
fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
END;
END LOOP;
COMMIT;
-- Ga verder met het toevoegen of bijwerken
FOR rec_prs_upd IN c_prs_upd
LOOP
BEGIN
-- Init
v_update := TRUE; -- wordt PER RECORD false bij funest gebrek aan vervulde randvoorwaarden
v_afdeling_key := 0;
v_srtperslid_key := 0;
v_perslid_key := 0;
v_errormsg := 'Fout bij bepalen randvoorwaarden';
-- *** Controle verplichte gegevens + ophalen extra informatie ***
-- Controle: RIN
IF rec_prs_upd.rin IS NULL
THEN
v_errorhint := 'Persoon heeft geen RIN; achternaam: ' || rec_prs_upd.prs_perslid_naam;
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
v_update := FALSE;
END IF;
-- Controle: PRS_PERSLID_NAAM
IF v_update AND rec_prs_upd.prs_perslid_naam IS NULL
THEN
v_errorhint := 'Persoon heeft geen achternaam; RIN: ' || rec_prs_upd.rin;
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
v_update := FALSE;
END IF;
-- Controle: Persoon reactiveren of is er al een actieve persoon met dezelfde RIN?
IF v_update AND rec_prs_upd.prs_perslid_verwijder IS NOT NULL
THEN
v_errorhint :=
'Bepalen reactivatie persoon/RIN: ' || rec_prs_upd.rin;
-- Is er al een actieve persoon met dezelfde RIN?
SELECT COUNT (p.prs_perslid_key)
INTO v_prs_key_cnt
FROM prs_v_aanwezigperslid p, prs_v_aanwezigkenmerklink kl
WHERE p.prs_perslid_key = kl.prs_link_key
AND kl.prs_kenmerk_key = c_rin_kkey
AND kl.prs_kenmerklink_waarde LIKE rec_prs_upd.rin
AND p.prs_perslid_key != rec_prs_upd.prs_perslid_key;
IF v_prs_key_cnt > 0
THEN
-- Waarde(n) gevonden, dus is er al een actieve persoon met dezelfde RIN!
-- => Geen update
v_update := FALSE;
ELSE
-- Kennelijk is er geen actieve persoon met dezelfde RIN!
-- => Wel update (prs_perslid_verwijder op NULL zetten)
fac.imp_writelog (
p_import_key,
'I',
'Persoon reactiveren; RIN: ' || rec_prs_upd.rin,
''
);
END IF;
END IF;
-- Controle: PRS_AFDELING_NAAM
v_errorhint := 'De afdeling kan niet bepaald worden ' || rec_prs_upd.prs_afdeling_naam;
IF v_update
THEN
BEGIN
-- Bepaal de afdelingskey; afdelingen worden met een andere import beheerd
SELECT prs_afdeling_key
INTO v_afdeling_key
FROM prs_afdeling
WHERE prs_afdeling_naam = rec_prs_upd.prs_afdeling_naam AND prs_afdeling_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_update := FALSE;
v_errorhint :=
'Afdeling '
|| rec_prs_upd.prs_afdeling_naam
|| ' bestaat niet; persoon/RIN: '
|| rec_prs_upd.rin;
-- Kennelijk is de afdeling niet gevonden
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
WHEN OTHERS
THEN
v_update := FALSE;
v_errorhint := 'Kan Afdeling ' || rec_prs_upd.prs_afdeling_naam || ' niet eenduidig bepalen?!';
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
END IF;
v_errorhint := 'Bepaling functie';
-- Controle: PRS_SRTPERSLID_OMSCHRIJVING
IF v_update
THEN
BEGIN
v_srtperslid_omschr := rec_prs_upd.prs_srtperslid_omschrijving;
-- Bepaal de key van de functie
SELECT prs_srtperslid_key
INTO v_srtperslid_key
FROM prs_srtperslid
WHERE prs_srtperslid_upper = UPPER (v_srtperslid_omschr) AND prs_srtperslid_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
fac.imp_writelog (p_import_key,
'I',
'Functie ' || v_srtperslid_omschr || ' toegevoegd',
v_errorhint
);
-- Functie bestaat kennelijk niet, maak 'm maar aan
INSERT INTO prs_srtperslid
(prs_srtperslid_omschrijving)
VALUES (v_srtperslid_omschr);
-- Wat is de key van deze nieuwe geworden?
SELECT prs_srtperslid_key
INTO v_srtperslid_key
FROM prs_srtperslid
WHERE prs_srtperslid_omschrijving = v_srtperslid_omschr AND prs_srtperslid_verwijder IS NULL;
WHEN OTHERS
THEN
v_errorhint :=
'Functie '
|| v_srtperslid_omschr
|| ' kan niet bepaald worden; persoon/RIN: '
|| rec_prs_upd.rin;
v_update := FALSE;
END;
END IF;
IF rec_prs_upd.partnernaam IS NULL THEN
-- als de partnernaam niet gevuld is dan kunnen we deze ook niet gebruiken.
lnaampresentatie := rec_prs_upd.prs_perslid_naam;
ltussenvoegselpres := rec_prs_upd.prs_perslid_tussenvoegsel;
ELSE
-- Bepaal de te gebruiken achternaamformattering
CASE LPAD (rec_prs_upd.aanduidingnaamgebruik, 1, '0')
WHEN '0'
THEN
BEGIN
-- code 0 = [aanhef, titel, voorletters,] voorvoegsels, achternaam
-- Opgem. naam Mevr. T. de Haan
lnaampresentatie := rec_prs_upd.prs_perslid_naam;
ltussenvoegselpres := rec_prs_upd.prs_perslid_tussenvoegsel;
END;
WHEN '1'
THEN
BEGIN
--Code 1 = [aanhef, titel, voorletters,] 2e voorvoegsels, 2e naam(partnernaam) voorvoegsels, achternaam
--Opgem. naam Mevr. T. Bronsgeest-de Haan
lnaampresentatie :=
rec_prs_upd.partnernaam
|| '-'
|| rec_prs_upd.prs_perslid_tussenvoegsel
|| ' '
|| rec_prs_upd.prs_perslid_naam;
ltussenvoegselpres := rec_prs_upd.partnertussenvoegsel;
END;
WHEN '2'
THEN
BEGIN
--Code 2 = [aanhef, titel, voorletters,] voorvoegsels, achternaam, 2e voorvoegsels, 2e naam(partnernaam)
--Opgem. naam Mevr. T. de Haan-Bronsgeest
lnaampresentatie :=
rec_prs_upd.prs_perslid_naam
|| '-'
|| rec_prs_upd.partnertussenvoegsel
|| ' '
|| rec_prs_upd.partnernaam;
ltussenvoegselpres := rec_prs_upd.prs_perslid_tussenvoegsel;
END;
WHEN '3'
THEN
BEGIN
--code 3 = [aanhef, titel, voorletters,] 2e voorvoegsels, 2e naam(partnernaam)
--Opgem. naam Mevr. T. Bronsgeest
lnaampresentatie := rec_prs_upd.partnernaam;
ltussenvoegselpres := rec_prs_upd.partnertussenvoegsel;
END;
ELSE
BEGIN
-- code 0 = [aanhef, titel, voorletters,] voorvoegsels, achternaam
-- Opgem. naam Mevr. T. de Haan
lnaampresentatie := rec_prs_upd.prs_perslid_naam;
ltussenvoegselpres := rec_prs_upd.prs_perslid_tussenvoegsel;
fac.imp_writelog (p_import_key,
'W',
'Ongedefinieerd naamformattering (AanduidingNaamGebruik) '
|| rec_prs_upd.aanduidingnaamgebruik,
'Default (0) wordt gehanteerd.'
);
END;
END CASE;
END IF;
lnaampresentatie := substrb (lnaampresentatie,1,30);
v_errorhint := 'E-mail';
lemail := handle_email (rec_prs_upd.email);
v_errorhint := 'Aanmeldnaam';
handle_login (rec_prs_upd.loginnaam, rec_prs_upd.prs_perslid_key, llogin1, llogin2);
-- *** Daadwerkelijk insert/update prs_perslid ***
IF v_update
THEN
BEGIN
IF rec_prs_upd.prs_perslid_key IS NULL
THEN
v_errormsg := 'Persoon kan niet worden toegevoegd';
INSERT INTO prs_perslid
(prs_perslid_naam,
prs_perslid_tussenvoegsel,
prs_perslid_voorletters,
prs_perslid_voornaam,
prs_perslid_telefoonnr,
prs_perslid_authenticatie,
prs_perslid_nr,
prs_perslid_titel,
prs_srtperslid_key,
prs_afdeling_key,
prs_perslid_oslogin,
prs_perslid_oslogin2,
prs_perslid_mobiel,
prs_perslid_email,
prs_perslid_ingangsdatum,
prs_perslid_einddatum,
fac_profiel_key
)
VALUES (lnaampresentatie,
ltussenvoegselpres,
rec_prs_upd.prs_perslid_voorletters,
rec_prs_upd.prs_perslid_voornaam,
rec_prs_upd.prs_perslid_telefoonnr,
rec_prs_upd.personeelsnummer,
rec_prs_upd.dienstverbandid,
rec_prs_upd.prs_perslid_titel,
v_srtperslid_key,
v_afdeling_key,
llogin1,
llogin2,
rec_prs_upd.mobielnummer,
lemail,
rec_prs_upd.begindatum,
rec_prs_upd.einddatum,
c_default_profiel_key
)
RETURNING prs_perslid_key
INTO v_perslid_key;
v_errormsg := 'Fout bij toevoegen RIN';
INSERT INTO prs_kenmerklink (prs_link_key,
prs_kenmerklink_niveau,
prs_kenmerk_key,
prs_kenmerklink_waarde)
VALUES (v_perslid_key,
'P',
c_rin_kkey,
rec_prs_upd.rin);
fac.imp_writelog (p_import_key,
'I',
'Nieuw persoon toegevoegd',
'Naam/RIN: '
|| ltussenvoegselpres || ' ' || lnaampresentatie
|| '/'
|| rec_prs_upd.rin
);
ELSE
v_errormsg := 'Persoon kan niet worden gewijzigd';
UPDATE prs_perslid
SET prs_perslid_naam = lnaampresentatie,
prs_perslid_tussenvoegsel = ltussenvoegselpres,
prs_perslid_voorletters = rec_prs_upd.prs_perslid_voorletters,
prs_perslid_voornaam = NVL (rec_prs_upd.prs_perslid_voornaam, prs_perslid_voornaam),
prs_perslid_telefoonnr = rec_prs_upd.prs_perslid_telefoonnr,
prs_perslid_titel = rec_prs_upd.prs_perslid_titel,
prs_srtperslid_key = v_srtperslid_key,
prs_afdeling_key = v_afdeling_key,
prs_perslid_verwijder = NULL,
prs_perslid_oslogin = llogin1,
prs_perslid_oslogin2 = COALESCE (prs_perslid_oslogin2, llogin2), -- RWSN#21033!
prs_perslid_mobiel = rec_prs_upd.mobielnummer,
prs_perslid_email = lemail,
prs_perslid_ingangsdatum = rec_prs_upd.begindatum,
prs_perslid_einddatum = rec_prs_upd.einddatum,
prs_perslid_nr = rec_prs_upd.dienstverbandid
WHERE prs_perslid_key = rec_prs_upd.prs_perslid_key
AND ( prs_perslid_naam <> lnaampresentatie
OR NVL (prs_perslid_tussenvoegsel, '-') <> NVL (ltussenvoegselpres, '-')
OR NVL (prs_perslid_voorletters, '-') <> NVL (rec_prs_upd.prs_perslid_voorletters, '-')
OR NVL (prs_perslid_voornaam, '-') <> NVL (rec_prs_upd.prs_perslid_voornaam, '-')
OR NVL (prs_perslid_telefoonnr, '-') <> NVL (rec_prs_upd.prs_perslid_telefoonnr, '-')
OR NVL (prs_perslid_titel, '-') <> NVL (rec_prs_upd.prs_perslid_titel, '-')
OR prs_srtperslid_key <> v_srtperslid_key
OR prs_afdeling_key <> v_afdeling_key
OR NVL (prs_perslid_oslogin, '-') <> NVL (llogin1, '-')
OR (prs_perslid_oslogin2 IS NULL AND llogin2 IS NOT NULL) -- RWSN#21033!
OR NVL (prs_perslid_oslogin2, '-') <> NVL (llogin2, '-')
OR NVL (prs_perslid_mobiel, '-') <> NVL (rec_prs_upd.mobielnummer, '-')
OR NVL (prs_perslid_email, '-') <> NVL (lemail, '-')
OR NVL (prs_perslid_ingangsdatum, to_date('01012000', 'ddmmyyyy')) <> NVL (rec_prs_upd.begindatum, to_date('01012000', 'ddmmyyyy'))
OR NVL (prs_perslid_einddatum, to_date('01012000', 'ddmmyyyy')) <> NVL (rec_prs_upd.einddatum, to_date('01012000', 'ddmmyyyy'))
OR NVL (prs_perslid_nr, '-') <> NVL (rec_prs_upd.dienstverbandid, '-')
OR rec_prs_upd.prs_perslid_verwijder IS NOT NULL
);
v_perslid_key := rec_prs_upd.prs_perslid_key;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := v_errormsg || ' - ' || oracle_err_mes;
v_errorhint := 'Persoon/RIN: ' || rec_prs_upd.rin;
v_update := FALSE;
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
END IF;
-- v_perslid_key is nu zeker bekend; zoniet, dan is v_update dus FALSE
-- en gaan we niet verder aanpassen/aanmaken
IF v_perslid_key <> 0
THEN
-- RWSN#24870: Per RWSN49 vervallen.
-- ----------------------------------------------------------
-- DID-stuff: autorisatie van personen op basis van dienst!!!
-- En, ALLEEN als persoon een login heeft (niet altijd zo)!!!
-- ----------------------------------------------------------
-- RWSN#24870-einde!
v_errorhint := 'Update dienstverbandguid persoon/RIN: ' || rec_prs_upd.rin;
update_dienstverbandguid(v_perslid_key, rec_prs_upd.dienstverbandguid);
v_errorhint := 'Locatiebepaling persoon/RIN: ' || rec_prs_upd.rin;
IF rec_prs_upd.bezoekadrespostcode IS NOT NULL
THEN
v_newgebouwkey := getgebouwkey (rec_prs_upd.bezoekadrespostcode, rec_prs_upd.bezoekadresnummer);
handle_location (v_perslid_key, v_newgebouwkey, rec_prs_upd.rin);
END IF;
v_buffercount := v_buffercount + 1;
IF v_buffercount >= c_commitbuffer
THEN
COMMIT;
v_buffercount := 0;
END IF;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := 'Local exception ' || oracle_err_mes;
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
END LOOP;
SELECT COUNT ( * )
INTO v_perslid_newcount_fclt
FROM prs_v_aanwezigperslid p, prs_v_aanwezigkenmerklink kl
WHERE p.prs_perslid_key = kl.prs_link_key
AND kl.prs_kenmerk_key = c_rin_kkey;
fac.imp_writelog (
p_import_key,
'S',
'Aantal actieve personen met RIN vooraf: '
|| TO_CHAR (v_perslid_count_fclt)
|| ' nu: '
|| TO_CHAR (v_perslid_newcount_fclt),
'');
SELECT COUNT ( * )
INTO v_perslid_newcount_fclt -- misbruik
FROM prs_v_aanwezigperslid p
WHERE NOT EXISTS
(SELECT 1
FROM prs_v_aanwezigkenmerklink
WHERE prs_link_key = p.prs_perslid_key
AND prs_kenmerk_key = c_rin_kkey);
fac.imp_writelog (
p_import_key,
'S',
'Aantal actieve personen zonder RIN (nu): '
|| TO_CHAR (v_perslid_newcount_fclt),
'');
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := 'Global exception ' || oracle_err_mes;
fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
END;
/
BEGIN adm.systrackscript('$Workfile: rwsn52.sql $', '$Revision$', 0); END;
/
BEGIN fac.registercustversion('RWSN', 52); END;
/
COMMIT;
spool off