Files
Customer/UWVA/uwva_prs.sql
Maarten van der Heide 4a66a862f2 UWVA#75874 KPN-import/Verschil te groot
svn path=/Customer/trunk/; revision=58387
2022-12-18 15:24:08 +00:00

7057 lines
290 KiB
SQL
Raw Blame History

--
-- $Id$
--
-- Script containing customer specific sql for UWVA (UWV Amsterdam)
-- related to ABS/KPN/VINDER/PROVISIONING/PHONEBOOK.
DEFINE thisfile = 'UWVA_PRS.SQL'
DEFINE dbuser = '^UWVA'
SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
WHENEVER SQLERROR EXIT;
SELECT adm.scriptspoolfile('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL;
WHENEVER SQLERROR CONTINUE;
SPOOL &fcltlogfile
SET DEFINE OFF
------ payload begin ------
-- UWVA#15040 Import van projectkostenplaatsen die niet voorkomen in de KPN import
CREATE OR REPLACE PROCEDURE uwva_import_kpn_prj (p_import_key IN NUMBER)
AS
CURSOR c_cursor IS
SELECT *
FROM fac_imp_file
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_file_index;
next_record c_cursor%ROWTYPE;
v_newline VARCHAR2 (1000); -- Input line
v_field VARCHAR2 (100);
v_fielddelimitor VARCHAR2 (1);
v_errormsg VARCHAR (200);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
header_is_valid NUMBER;
v_afdeling VARCHAR2 (100);
v_status VARCHAR2 (100);
v_omschrijving VARCHAR2 (100);
v_boekingsunit VARCHAR2 (100);
v_project VARCHAR2 (100);
BEGIN
v_fielddelimitor := ';';
header_is_valid := 0;
DELETE FROM uwva_imp_kpn_prj;
FOR NEXT_RECORD IN c_cursor
LOOP
BEGIN
v_newline := next_record.FAC_IMP_FILE_LINE;
fac.imp_getfield (v_newline, v_fielddelimitor, v_boekingsunit);
fac.imp_getfield (v_newline, v_fielddelimitor, v_project);
fac.imp_getfield (v_newline, v_fielddelimitor, v_omschrijving);
fac.imp_getfield (v_newline, v_fielddelimitor, v_status);
fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling);
IF ( header_is_valid = 0
AND v_afdeling = 'Afdeling'
AND v_status = 'Status op ingangsdatum'
AND v_omschrijving = 'Omschrijving'
AND v_boekingsunit = 'BU'
AND v_project = 'Project')
THEN
header_is_valid := 1;
ELSE
IF ( header_is_valid = 1
AND v_afdeling <> ' '
AND v_project <> ' ')
THEN
IF (LENGTH (v_afdeling) >= 6) -- lengte van kostenplaats moet minimaal 6 posities zijn.
THEN
INSERT INTO uwva_imp_kpn_prj (project,
afdeling,
status,
omschrijving,
boekingsunit)
VALUES (SUBSTR (v_project, 1, 30),
SUBSTR (v_afdeling, 1, 6),
SUBSTR (v_status, 1, 1),
SUBSTR (v_omschrijving, 1, 60),
SUBSTR (v_boekingsunit, 1, 6));
ELSE
fac.imp_writelog (p_import_key, 'E', 'Invalid import file', 'Er is een ongeldige Projectkostenplaats aangetroffen in het importbestand:' || SUBSTR (v_project, 1, 30));
-- UWVA#23269: Hier stond uwva_imp_kpn en dat leek mij niet goed (zeker met 't
-- vervolg in uwva_update_abs() zoals dat tegenwoordig het geval is)!!!
DELETE FROM uwva_imp_kpn_prj; -- maak uwva_imp_kpn_prj weer leeg.
EXIT; -- kostenplaats niet 6 posities; voorloopnullen kunnen weggevallen zijn.
END IF;
END IF;
END IF;
END;
END LOOP;
IF (header_is_valid = 0)
THEN
fac.imp_writelog (p_import_key, 'E', 'Invalid import file', 'Er is geen geldige Header aangetroffen en in het importbestand');
END IF;
-- UWVA#41977: Import robuust gemaakt tegen dubbele aanlevering van KPN_PRJ-bestand.
DELETE FROM fac_imp_file
WHERE fac_import_key = p_import_key;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_import_key, 'E', v_errormsg, '');
END;
/
CREATE OR REPLACE PROCEDURE uwva_update_kpn_prj (p_import_key IN NUMBER)
AS
BEGIN
-- update wordt door de uwva_update_kpn procedure uitgevoerd.
NULL;
END;
/
-- UWVA#7 Import van kostenplaatsen
-- UWVA#20021 Nu met organisatiestructuur en budgethouders + mandaten
-- (waardoor budgethouderimport overbodig wordt)
CREATE OR REPLACE PROCEDURE uwva_import_kpn (p_import_key IN NUMBER)
AS
CURSOR c_cursor IS
SELECT *
FROM fac_imp_file
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_file_index;
next_record c_cursor%ROWTYPE;
v_newline VARCHAR2 (1000); -- Input line
v_field VARCHAR2 (100);
v_fielddelimitor VARCHAR2 (1);
v_errormsg VARCHAR (200);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
header_is_valid NUMBER;
v_empty VARCHAR2 (100);
v_afdeling VARCHAR2 (100);
v_status VARCHAR2 (100);
v_omschrijving VARCHAR2 (100);
v_niv2_code VARCHAR2 (100);
v_niv2_oms VARCHAR2 (100);
v_niv3_code VARCHAR2 (100);
v_niv4_code VARCHAR2 (100);
v_niv5_code VARCHAR2 (100);
v_niv6_code VARCHAR2 (100);
v_niv7_code VARCHAR2 (100);
v_perslid_nr VARCHAR2 (100);
v_mandaatcode VARCHAR2 (100);
v_date1 VARCHAR2 (20);
v_date2 VARCHAR2 (20);
BEGIN
v_fielddelimitor := ';';
header_is_valid := 0;
DELETE FROM uwva_imp_kpn;
FOR next_record IN c_cursor LOOP
BEGIN
v_newline := next_record.FAC_IMP_FILE_LINE;
fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling);
fac.imp_getfield (v_newline, v_fielddelimitor, v_omschrijving);
fac.imp_getfield (v_newline, v_fielddelimitor, v_niv2_code);
fac.imp_getfield (v_newline, v_fielddelimitor, v_niv2_oms);
fac.imp_getfield (v_newline, v_fielddelimitor, v_niv3_code);
fac.imp_getfield (v_newline, v_fielddelimitor, v_niv4_code);
fac.imp_getfield (v_newline, v_fielddelimitor, v_niv5_code);
fac.imp_getfield (v_newline, v_fielddelimitor, v_niv6_code);
fac.imp_getfield (v_newline, v_fielddelimitor, v_niv7_code);
fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_nr);
fac.imp_getfield (v_newline, v_fielddelimitor, v_mandaatcode);
fac.imp_getfield (v_newline, v_fielddelimitor, v_date1);
fac.imp_getfield (v_newline, v_fielddelimitor, v_date2);
IF ( header_is_valid = 0
AND v_afdeling = 'code_eenheid' --code_eenheid
AND v_omschrijving = 'naam_eenheid' --naam_eenheid
AND v_niv2_code = 'code_eenheid_niveau_2' --code_eenheid_niveau_2
AND v_niv2_oms = 'naam_eenheid_nivo_2' --naam_eenheid_nivo_2
AND v_niv3_code = 'code_eenheid_niveau_3' --code_eenheid_niveau_3
AND v_niv4_code = 'code_eenheid_niveau_4' --code_eenheid_niveau_4
AND v_niv5_code = 'code_eenheid_niveau_5' --code_eenheid_niveau_5
AND v_niv6_code = 'code_eenheid_niveau_6' --code_eenheid_niveau_6
AND v_niv7_code = 'code_eenheid_niveau_7' --code_eenheid_niveau_7
AND v_perslid_nr = 'wnr_leidinggevende' --wnr_leidinggevende
AND v_mandaatcode = 'code_mandaat' --code_mandaat
AND v_date1 = 'start_datum' --start_datum
AND v_date2 = 'eind_datum' --eind_datum
)
THEN
header_is_valid := 1;
ELSE
IF (header_is_valid = 1 AND v_afdeling != ' ')
THEN
IF (LENGTH (v_afdeling) >= 6) -- lengte van kostenplaats moet minimaal 6 posities zijn.
THEN
IF (SYSDATE >= TO_DATE (v_date1, 'dd-mm-yyyy') AND SYSDATE <= TO_DATE (v_date2, 'dd-mm-yyyy'))
THEN v_status := 'A';
ELSE v_status := 'I';
END IF;
INSERT INTO uwva_imp_kpn
(afdeling,
status,
omschrijving,
niv2_code,
niv3_code,
niv4_code,
niv5_code,
niv6_code,
niv7_code,
perslid_nr,
mandaatcode
)
VALUES (SUBSTR (v_afdeling, 1, 6), SUBSTR (v_status, 1, 1),
SUBSTR (v_omschrijving, 1, 60),
-- Het laagste niveau afdeling dat in iedere regel wordt meegegeven
-- is de afdeling waar die regel over gaat. We willen alleen de parent
-- en bovenliggende afdelingen hebben, dus laat de huidige afdeling maar
-- weg (zodat we in de update een coalesce kunnen gebruiken om de parent
-- te bepalen!)
DECODE(v_niv2_code, v_afdeling, NULL, SUBSTR (v_niv2_code, 1, 6) ),
DECODE(v_niv3_code, v_afdeling, NULL, SUBSTR (v_niv3_code, 1, 6) ),
DECODE(v_niv4_code, v_afdeling, NULL, SUBSTR (v_niv4_code, 1, 6) ),
DECODE(v_niv5_code, v_afdeling, NULL, SUBSTR (v_niv5_code, 1, 6) ),
DECODE(v_niv6_code, v_afdeling, NULL, SUBSTR (v_niv6_code, 1, 6) ),
DECODE(v_niv7_code, v_afdeling, NULL, SUBSTR (v_niv7_code, 1, 6) ),
SUBSTR (v_perslid_nr, 1, 16), SUBSTR(v_mandaatcode, 1, 6)
);
ELSE
fac.imp_writelog (p_import_key, 'E', 'Invalid import file', 'Er is een ongeldige Kostenplaats aangetroffen in het importbestand. Een kostenplaats moet uit 6 posities bestaan. kostenplaats:' || SUBSTR (v_afdeling, 1, 6));
DELETE FROM uwva_imp_kpn; -- maak uwva_imp_kpn weer leeg.
EXIT; -- kostenplaats heeft geen 6 posities. Voorloopnullen kunnen weggevallen zijn.
END IF;
END IF;
END IF;
END;
END LOOP;
IF (header_is_valid = 0)
THEN
fac.imp_writelog (p_import_key, 'E', 'Invalid import file', 'Er is geen geldige Header aangetroffen en in het importbestand');
END IF;
-- UWVA#41977: Import robuust gemaakt tegen dubbele aanlevering van KPN-bestand.
DELETE FROM fac_imp_file
WHERE fac_import_key = p_import_key;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_import_key, 'E', v_errormsg, '');
END;
/
-- UWVA#20021: KPN-import met organisatiestructuur
-- UWVA#23718 Door overgang naar Peoplesoft is het importbestand gewijzigd:
-- inactieve kostenplaatsen worden niet meer meegegeven.
CREATE OR REPLACE PROCEDURE uwva_update_kpn (p_import_key IN NUMBER)
AS
-- UWVA#32268: Project- en gebouwkostenplaatsen (= alfanumeriek) niet meer
-- eerst aanmaken als cluster en dan direct weer verwijderen.
CURSOR cclusters
IS
SELECT afdeling,
status,
omschrijving,
niv2_code,
'PRS' TYPE
FROM uwva_imp_kpn
WHERE status = 'A' AND niv2_code IS NULL AND fac.safe_to_number (afdeling) > 0
ORDER BY 1;
-- UWVA#16503: KPN_PRJ-kostenplaatsen dominant over KPN-kostenplaatsen!
-- UWVA#23718: quick fix; alleen nog actieve kostenplaatsen in import, dus
-- inactieve kostenplaatsen zijn kostenplaatsen die alleen nog
-- in Facilitor voorkomen.
CURSOR ckostenplaatsen
IS
SELECT 1, afdeling,
status,
omschrijving,
COALESCE (niv2_code, afdeling) boekingsunit,
'PRS' type
FROM uwva_imp_kpn
UNION
SELECT 2, project,
status,
omschrijving,
boekingsunit,
'PRJ' type
FROM uwva_imp_kpn_prj
--UNION
--SELECT 1, prs_kostenplaats_nr afdeling,
-- 'I' status,
-- prs_kostenplaats_omschrijving omschrijving,
-- NULL boekingsunit,
-- 'PRS' type
-- FROM prs_kostenplaats k
-- WHERE prs_kostenplaats_module = 'PRS'
-- AND prs_kostenplaats_verwijder IS NULL
-- AND prs_kostenplaats_upper NOT IN (SELECT afdeling FROM uwva_imp_kpn)
UNION
SELECT 3, k.prs_kostenplaats_nr afdeling,
'I' status,
k.prs_kostenplaats_omschrijving omschrijving,
NULL boekingsunit,
k.prs_kostenplaats_module type
FROM prs_kostenplaats k
WHERE k.prs_kostenplaats_module IN ('PRS', 'ALG', 'PRJ') -- UWVA#31020: Ook ALG + PRJ inactiveren!
AND k.prs_kostenplaats_verwijder IS NULL
--AND prs_kostenplaats_upper NOT IN (SELECT afdeling FROM uwva_imp_kpn)
AND NOT EXISTS (SELECT 1 FROM uwva_imp_kpn WHERE UPPER (afdeling) = k.prs_kostenplaats_upper)
AND NOT EXISTS (SELECT 1 FROM uwva_imp_kpn_prj WHERE UPPER (project) = k.prs_kostenplaats_upper)
ORDER BY 1, 2;
-- Aparte cursor, zodat eerst alle afdelingen (en dus alle parent-afdelingen)
-- toegevoegd kunnen worden, voor dat parent-child links worden vastgelegd.
-- niveau6 geeft aan of een afdeling op afdelingsniveau 6 zou komen (en dus naar niveau
-- 5 gehaald moet worden, door 'm naast z'n parent te zetten.
CURSOR cstructuur
IS
SELECT afdeling,
omschrijving,
COALESCE (niv7_code, niv6_code, niv5_code, niv4_code, niv3_code, niv2_code) parent,
DECODE (niv6_code, NULL, 0, 1) niveau6
FROM uwva_imp_kpn
WHERE niv2_code IS NOT NULL
AND status = 'A'
AND fac.safe_to_number (afdeling) > 0
ORDER BY 1;
v_errormsg VARCHAR (200);
oracle_err_mes VARCHAR2 (150);
c_maxvariation NUMBER;
c_prs_bedrijfkey NUMBER;
currentversion fac_module.fac_module_version%TYPE;
l_oldcount NUMBER;
l_oldcountverw NUMBER;
l_impcount NUMBER;
l_impcountverw NUMBER;
l_impcount_prj NUMBER;
l_newcount NUMBER;
l_newcountverw NUMBER;
l_manualcount NUMBER;
l_created BOOLEAN; -- In deze sessie aangemaakt!
l_inactivated BOOLEAN; -- In deze sessie inactief gemaakt of gebleven!
lniv2_codekey NUMBER (10);
lkostenplaatskey NUMBER (10);
lafdelingkey NUMBER (10);
lparentkey NUMBER (10);
v_count NUMBER;
FUNCTION isafdelingskostenplaats (kpn IN VARCHAR2)
RETURN BOOLEAN
IS
BEGIN
RETURN fac.safe_to_number (kpn) > 0;
END isafdelingskostenplaats;
BEGIN
c_maxvariation := 0.6; -- Max new/old ratio to prevent undesired changes
c_prs_bedrijfkey := 1; -- Key of own UWV bedrijf
SELECT MAX (fac_module_version) INTO currentversion FROM fac_module;
fac.imp_writelog (p_import_key,
'I',
'Facilitor KPN import version ' || currentversion,
'$Revision$');
-- How many active records are now present?
SELECT COUNT ( * )
INTO l_oldcount
FROM prs_kostenplaats
WHERE prs_kostenplaats_verwijder IS NULL;
-- How many inactive records are now present? (for summary only)
SELECT COUNT ( * )
INTO l_oldcountverw
FROM prs_kostenplaats
WHERE prs_kostenplaats_verwijder IS NOT NULL;
-- How many (in)active records are imported?
SELECT COUNT ( * )
INTO l_impcount
FROM uwva_imp_kpn
WHERE status = 'A';
SELECT COUNT ( * )
INTO l_impcountverw
FROM uwva_imp_kpn
WHERE status != 'A';
SELECT COUNT ( * )
INTO l_impcount_prj
FROM uwva_imp_kpn_prj
WHERE status = 'A';
--IF 1 - ((l_impcount + l_impcount_prj) / l_oldcount) > c_maxvariation
IF (ABS ( (l_impcount + l_impcount_prj) - l_oldcount) >
c_maxvariation * l_oldcount)
THEN
fac.imp_writelog (
p_import_key,
'E',
'Het verschil tussen de actieve kostenplaatsen ('
|| TO_CHAR (l_oldcount)
|| ') en geimporteerde aantallen ('
|| TO_CHAR (l_impcount + l_impcount_prj)
|| ') is te groot',
'Zie Specificaties: De afwijking is teveel en bedraagt '
|| TO_CHAR (
( (l_oldcount - (l_impcount + l_impcount_prj) ) / l_oldcount ) * 100,
'999D9'
)
|| '%.'
);
RETURN;
END IF;
-- Clusters (actieve)
FOR rc IN cclusters
LOOP
-- Bestaat deze al?
BEGIN
SELECT prs_afdeling_key
INTO lniv2_codekey
FROM prs_afdeling
WHERE prs_afdeling_upper = UPPER (rc.afdeling)
AND prs_afdeling_parentkey IS NULL
AND prs_afdeling_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Misschien is het een BU die nu nog als afdeling (child) staat
-- geregistreerd; die wordt dan nu gepromoveerd tot BU
BEGIN
SELECT prs_afdeling_key
INTO lniv2_codekey
FROM prs_afdeling
WHERE prs_afdeling_upper = UPPER (rc.afdeling)
AND prs_afdeling_verwijder IS NULL;
UPDATE prs_afdeling
SET prs_afdeling_parentkey = NULL,
prs_bedrijf_key = c_prs_bedrijfkey
WHERE prs_afdeling_key = lniv2_codekey
AND prs_afdeling_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
lniv2_codekey := -1;
END;
WHEN OTHERS
THEN
lniv2_codekey := -1;
END;
IF lniv2_codekey = -1
THEN
-- Bestaat nog niet
INSERT INTO prs_afdeling (prs_afdeling_naam,
prs_afdeling_omschrijving,
prs_bedrijf_key,
prs_afdeling_parentkey)
VALUES (rc.afdeling,
rc.omschrijving,
c_prs_bedrijfkey,
NULL);
ELSE
-- Niet heel belangrijk: omschrijving (re)setten
UPDATE prs_afdeling
SET prs_afdeling_omschrijving = rc.omschrijving
WHERE prs_afdeling_key = lniv2_codekey
AND prs_afdeling_omschrijving != rc.omschrijving;
END IF;
END LOOP;
-- Clusters (toplevel afdelingen) geregeld
---
-- Afdelingen/kostenplaatsen
---
FOR rc IN ckostenplaatsen
LOOP
l_created := (1 = 0);
l_inactivated := (1 = 0);
-- Bestaat deze al?
BEGIN
SELECT k.prs_kostenplaats_key
INTO lkostenplaatskey
FROM prs_kostenplaats k
WHERE k.prs_kostenplaats_upper = UPPER (rc.afdeling)
AND k.prs_kostenplaats_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
BEGIN
-- Er bestaat geen actuele kostenplaats. Misschien een (onterecht
-- handmatig/automatisch) verwijderde? (UWVA#647)
SELECT k.prs_kostenplaats_key
INTO lkostenplaatskey
FROM prs_kostenplaats k
WHERE k.prs_kostenplaats_upper = UPPER (rc.afdeling);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Kostenplaats bestaat echt nog niet
lkostenplaatskey := -1;
WHEN TOO_MANY_ROWS
THEN
-- Meerdere verwijderde instanties. Daar heeft zeer
-- waarschijnlijk iemand iets handmatig niet goed gedaan
fac.imp_writelog (
p_import_key,
'W',
'Kostenplaats komt vaker voor (handmatige mutatie!)',
rc.afdeling || '/' || rc.omschrijving
);
-- Er zijn dus louter verwijderden; pak de oorspronkelijkste
SELECT MIN (k.prs_kostenplaats_key)
INTO lkostenplaatskey
FROM prs_kostenplaats k
WHERE k.prs_kostenplaats_upper = UPPER (rc.afdeling);
END;
WHEN OTHERS
THEN
fac.imp_writelog (
p_import_key,
'W',
'Kan kostenplaats niet eenduidig bepalen',
rc.afdeling || '/' || rc.omschrijving
);
END;
IF lkostenplaatskey = -1 AND rc.status = 'A'
THEN
-- Bestaat nog niet en moet gaan bestaan
BEGIN
-- Module wordt voor oude kostenplaatsen aan het einde op de juiste
-- waarde gezet
INSERT INTO prs_kostenplaats (
prs_kostenplaats_nr,
prs_kostenplaats_omschrijving,
prs_kostenplaats_module
)
VALUES (rc.afdeling, rc.omschrijving, rc.TYPE)
RETURNING prs_kostenplaats_key
INTO lkostenplaatskey;
fac.imp_writelog (p_import_key,
'I',
'Kostenplaats is toegevoegd',
rc.afdeling || '/' || rc.omschrijving);
l_created := (1 = 1);
EXCEPTION
WHEN OTHERS
THEN
oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
fac.imp_writelog (
p_import_key,
'E',
'Kostenplaats kan niet toegevoegd worden ' || v_errormsg,
rc.afdeling || '/' || rc.omschrijving
);
END;
ELSE
-- Bestaat al wel
IF rc.status = 'A'
THEN
-- (Re)Activeer de kostenplaats
UPDATE prs_kostenplaats
SET prs_kostenplaats_omschrijving = rc.omschrijving,
prs_kostenplaats_verwijder = NULL,
prs_kostenplaats_nr = rc.afdeling,
prs_kostenplaats_eind = NULL
WHERE prs_kostenplaats_key = lkostenplaatskey;
ELSE
UPDATE prs_kostenplaats
SET prs_kostenplaats_omschrijving =
SUBSTR ('INACTIEF:' || rc.omschrijving, 1, 60),
prs_kostenplaats_eind = SYSDATE
WHERE prs_kostenplaats_key = lkostenplaatskey
AND prs_kostenplaats_omschrijving NOT LIKE 'INACTIEF%';
UPDATE prs_kostenplaats
SET prs_kostenplaats_eind = SYSDATE
WHERE prs_kostenplaats_key = lkostenplaatskey
AND prs_kostenplaats_eind IS NULL -- UWVA#31020/MVH!
AND prs_kostenplaats_omschrijving LIKE 'INACTIEF%';
l_inactivated := (1 = 1);
END IF;
END IF;
-- Nu bestaat de kostenplaats gegarandeerd al, en is lkostenplaatskey geldig.
BEGIN
-- Let op (UWVA#178): Hoewel wij afdeling altijd hergebruiken kan het
-- door handmatig beheer wel voorkomen dat een afdeling dubbel voorkomt,
-- 1 keer verwijderd en 1 keer actueel
-- Om dan de juiste te nemen en too_many-rows te vermijden, gebruiken we
-- hier nu deze GROUP BY expressie
-- UWVA#22805: MAX() levert altijd een resultaat, dus treedt geen
-- NO_DATA_FOUND op, ook als niets wordt gevonden. Daarom een coalesce
-- met -1.
SELECT COALESCE( MAX(d1.prs_afdeling_key), -1)
INTO lafdelingkey
FROM prs_afdeling d1
WHERE d1.prs_afdeling_upper = UPPER (rc.afdeling);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
lafdelingkey := -1;
END;
-- We hoeven nu alleen nog maar een afdeling aan te maken als het een PRS-
-- kostenplaats is
IF isafdelingskostenplaats (rc.afdeling)
THEN
-- Als l_created = TRUE, dan is de kostenplaats net aangemaakt. Als het
-- een divisie (cluster) betreft, dan is de afdeling ook net aangemaakt
-- en moeten we die dus niet nog een keer aanmaken, maar updaten!
-- UWVA#22805: l_created = TRUE impliceert dus v_count > 0 (want voor een
-- nieuwe "divisie-kostenplaats" is al een "divisie-afdeling" aangemaakt,
-- dus die afdeling bestaat al!). Relevanter is of de afdelingskosten-
-- plaats actief is, want dan moet er een afdeling bij bestaan. (Zo
-- worden afdelingen die - om wat voor reden dan ook - eerder niet zijn
-- toegevoegd, in de huidige run wel toegevoegd (met l_created gebeurde
-- dat alleen in de run waarin de kostenplaats wordt aangemaakt).
SELECT COUNT(*)
INTO v_count
FROM prs_afdeling
WHERE prs_afdeling_upper = UPPER (rc.afdeling);
IF (rc.status = 'A' AND v_count = 0)
THEN
-- Kostenplaats is actief, maar afdeling bestaat nog niet
BEGIN
INSERT INTO prs_afdeling (prs_afdeling_naam,
prs_afdeling_omschrijving,
prs_kostenplaats_key,
prs_bedrijf_key)
SELECT rc.afdeling,
rc.omschrijving,
k.prs_kostenplaats_key,
1 -- 'Intern'
FROM prs_kostenplaats k
WHERE k.prs_kostenplaats_upper = UPPER (rc.afdeling);
fac.imp_writelog (p_import_key,
'I',
'Afdeling is toegevoegd',
rc.afdeling || '/' || rc.omschrijving);
EXCEPTION
WHEN OTHERS
THEN
oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
fac.imp_writelog (
p_import_key,
'E',
'Afdeling kan niet worden toegevoegd ' || v_errormsg,
rc.afdeling
|| '/'
|| rc.omschrijving
|| ' [key='
|| lafdelingkey
|| ']'
);
END;
ELSE
-- Kostenplaats en afdeling bestonden al wel
IF l_inactivated
THEN
-- Bepaal aantal verplichtingen op afdeling als som van:
-- 1. #voorkomens in PRS_V_AFD_VERPLICHTING
-- 2. #voorkomens in PRS_RUIMTEAFDELING
-- 3. #voorkomens van afdeling-kinderen in PRS_RUIMTEAFDELING
SELECT SUM (x.aantal)
INTO v_count
FROM (SELECT COUNT ( * ) aantal
FROM prs_v_afd_verplichting av
WHERE av.prs_afdeling_key = lafdelingkey
UNION ALL
SELECT COUNT ( * ) aantal
FROM prs_v_aanwezigruimteafdeling ra
WHERE ra.prs_afdeling_key = lafdelingkey
UNION ALL
SELECT COUNT ( * ) aantal
FROM prs_v_aanwezigafdeling a,
prs_v_aanwezigruimteafdeling ra
WHERE a.prs_afdeling_parentkey = lafdelingkey
AND a.prs_afdeling_key =
ra.prs_afdeling_key) x;
-- Als v_count>0, dan bestaan er nog verplichtingen en wordt de
-- afdeling INACTIEF gemaakt!
IF v_count > 0
THEN
-- Maak (of houd) afdeling INACTIEF
UPDATE prs_afdeling
SET prs_afdeling_naam = rc.afdeling,
prs_afdeling_omschrijving =
SUBSTR ('INACTIEF:' || rc.omschrijving, 1, 60),
prs_kostenplaats_key = lkostenplaatskey
WHERE prs_afdeling_key = lafdelingkey
AND prs_afdeling_omschrijving NOT LIKE 'INACTIEF%';
ELSE
-- Verwijder afdeling <20>n kostenplaats
BEGIN
SELECT COUNT(*)
INTO v_count
FROM prs_kostenplaats
WHERE prs_kostenplaats_key = lkostenplaatskey
AND prs_kostenplaats_verwijder IS NULL;
IF (v_count > 0)
THEN
UPDATE prs_kostenplaats
SET prs_kostenplaats_verwijder = SYSDATE
WHERE prs_kostenplaats_key = lkostenplaatskey
AND prs_kostenplaats_verwijder IS NULL;
fac.imp_writelog (p_import_key, 'I',
'Kostenplaats is verwijderd',
rc.afdeling || '/' || rc.omschrijving);
END IF;
SELECT COUNT(*)
INTO v_count
FROM prs_afdeling
WHERE prs_afdeling_key = lafdelingkey
AND prs_afdeling_verwijder IS NULL;
IF (v_count > 0)
THEN
UPDATE prs_afdeling
SET prs_afdeling_verwijder = SYSDATE
WHERE prs_afdeling_key = lafdelingkey
AND prs_afdeling_verwijder IS NULL;
fac.imp_writelog (p_import_key, 'I',
'Afdeling is verwijderd',
rc.afdeling || '/' || rc.omschrijving);
END IF;
EXCEPTION
WHEN OTHERS
THEN
fac.imp_writelog (
p_import_key,
'E',
'Afdeling ' || rc.afdeling
|| ' kan niet worden verwijderd (heeft nog personen)',
rc.afdeling
|| '/'
|| rc.omschrijving
|| ' [key='
|| lafdelingkey
|| ']'
);
UPDATE prs_afdeling
SET prs_afdeling_naam = rc.afdeling,
prs_afdeling_omschrijving =
SUBSTR ('INACTIEF:' || rc.omschrijving,
1,
60),
prs_kostenplaats_key = lkostenplaatskey
WHERE prs_afdeling_key = lafdelingkey;
END;
END IF;
ELSE
BEGIN
-- Just update this one
UPDATE prs_afdeling
SET prs_afdeling_naam = rc.afdeling,
prs_afdeling_omschrijving = rc.omschrijving,
prs_kostenplaats_key = lkostenplaatskey,
prs_afdeling_verwijder = NULL
WHERE prs_afdeling_key = lafdelingkey;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
fac.imp_writelog (
p_import_key,
'E',
'Afdeling kan niet worden bijgewerkt ' || v_errormsg,
rc.afdeling
|| '/'
|| rc.omschrijving
|| ' [key='
|| lafdelingkey
|| ']'
);
END;
END IF;
END IF;
ELSE
BEGIN
-- Hier kunnen geen mensen bij horen, want geen afdelingskostenplaats
-- Ergo: zo mogelijk opruimen
-- UWVA#32268: Niet-afdelingskostenplaatsen worden vanuit deze import
-- nooit meer als afdeling aangemaakt! Hier gebeurt in
-- principe dus nooit iets (tenzij handmatig een project-
-- of gebouwkostenplaats als afdeling is toegevoegd die
-- toevallig ook voorkomt in het importbestand).
UPDATE prs_afdeling
SET prs_afdeling_verwijder = SYSDATE
WHERE prs_afdeling_key = lafdelingkey;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
fac.imp_writelog (
p_import_key,
'W',
'Afdeling kan niet vervallen (heeft nog personen)',
rc.afdeling
|| '/'
|| rc.omschrijving
|| ' [key='
|| lafdelingkey
|| ']'
);
END;
END IF;
END LOOP;
-- Organisatiestructuur vastleggen
FOR rc IN cstructuur
LOOP
BEGIN
lafdelingkey := NULL;
lparentkey := NULL;
SELECT prs_afdeling_key
INTO lafdelingkey
FROM prs_afdeling
WHERE prs_afdeling_upper = UPPER (rc.afdeling)
AND prs_afdeling_verwijder IS NULL;
-- TODO: MAX, omdat ...?
SELECT MAX (dparent.prs_afdeling_key)
INTO lparentkey
FROM prs_afdeling dparent
WHERE dparent.prs_afdeling_upper = UPPER (rc.parent)
AND dparent.prs_afdeling_verwijder IS NULL;
-- Obv importfile alleen update parent uitvoeren indien de
-- ouder niet zichzelf is
IF lparentkey != lafdelingkey AND lparentkey IS NOT NULL
THEN
-- UWV's organisatiestructuur heeft 6 lagen ipv; er zijn 3 ICT-afdelingen in die 6e laag,
-- onder "Servicedesk ICT".
-- Haal die dus <20><>n laag omhoog (oftewel zet 'niveau-6' afdelingen naast
-- hun parent in afdelingsniveau 5)
IF (rc.niveau6 = 1)
THEN
BEGIN
SELECT MAX (dparent.prs_afdeling_parentkey)
INTO lparentkey
FROM prs_afdeling dparent
WHERE dparent.prs_afdeling_key = lparentkey
AND dparent.prs_afdeling_verwijder IS NULL;
UPDATE prs_afdeling
SET prs_afdeling_parentkey = lparentkey,
prs_bedrijf_key = NULL
WHERE prs_afdeling_key = lafdelingkey;
fac.imp_writelog (p_import_key,
'I',
'Niveau-6 afdeling aan parent van parentafdeling gekoppeld: ',
rc.afdeling || '/' || rc.omschrijving || ' (' ||rc.parent || ')');
EXCEPTION
WHEN NO_DATA_FOUND
THEN
fac.imp_writelog (p_import_key,
'W',
'Kan parent van parentafdeling niet vinden',
rc.afdeling || '/' || rc.omschrijving || ' ('|| rc.parent || ')');
WHEN OTHERS
THEN
fac.imp_writelog (p_import_key,
'W',
'Fout bij bepalen parent van parentafdeling',
rc.afdeling || '/' || rc.omschrijving || ' ('|| rc.parent || ')');
END;
ELSE
UPDATE prs_afdeling
SET prs_afdeling_parentkey = lparentkey,
prs_bedrijf_key = NULL
WHERE prs_afdeling_key = lafdelingkey;
END IF;
ELSE
fac.imp_writelog (p_import_key,
'W',
'Fout bij vastleggen parentafdeling',
rc.afdeling || '/' || rc.omschrijving || ' ('|| rc.parent || ')');
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
fac.imp_writelog (
p_import_key,
'W',
'Fout bij bepalen (parent-)afdeling',
rc.afdeling
|| '/'
|| rc.omschrijving
|| ' [key='
|| lafdelingkey
|| '], parent: '
|| rc.parent
|| ' [' || lparentkey || ']'
);
END;
END LOOP;
-- For summary only
SELECT COUNT ( * )
INTO l_newcount
FROM prs_kostenplaats
WHERE prs_kostenplaats_verwijder IS NULL;
SELECT COUNT ( * )
INTO l_newcountverw
FROM prs_kostenplaats
WHERE prs_kostenplaats_verwijder IS NOT NULL;
fac.imp_writelog (
p_import_key,
'S',
'Aantal ingelezen kostenplaatsen: '
|| TO_CHAR (l_impcount)
|| '(actief) + '
|| TO_CHAR (l_impcountverw)
|| '(inactief) = '
|| TO_CHAR (l_impcount + l_impcountverw),
''
);
fac.imp_writelog (
p_import_key,
'S',
'Aantal actieve kostenplaatsen vooraf: '
|| TO_CHAR (l_oldcount)
|| ' nu: '
|| TO_CHAR (l_newcount),
''
);
fac.imp_writelog (
p_import_key,
'S',
'Aantal inactieve kostenplaatsen vooraf: '
|| TO_CHAR (l_oldcountverw)
|| ' nu: '
|| TO_CHAR (l_newcountverw),
''
);
-- Bonus logging
SELECT COUNT ( * )
INTO l_manualcount
FROM prs_kostenplaats k, uwva_imp_kpn i
WHERE k.prs_kostenplaats_nr = i.afdeling(+)
AND i.afdeling IS NULL
AND k.prs_kostenplaats_verwijder IS NULL
AND UPPER (k.prs_kostenplaats_nr) NOT LIKE '__UWV';
fac.imp_writelog (
p_import_key,
'S',
'Aantal actieve kostenplaatsen niet via import: '
|| TO_CHAR (l_manualcount),
''
);
-- Update kostenplaatsgroep voor combinatievalidatie
UPDATE prs_kostenplaats
SET prs_kostenplaatsgrp_key = '61', prs_kostenplaats_module = 'PRJ'
WHERE prs_kostenplaats_nr LIKE 'PKPU%';
UPDATE prs_kostenplaats
SET prs_kostenplaatsgrp_key = '61', prs_kostenplaats_module = 'PRJ'
WHERE prs_kostenplaats_nr LIKE 'PKUN%';
UPDATE prs_kostenplaats
SET prs_kostenplaatsgrp_key = '27', prs_kostenplaats_module = 'PRJ'
WHERE prs_kostenplaats_nr LIKE 'P%'
AND (prs_kostenplaatsgrp_key != 61 OR prs_kostenplaatsgrp_key IS NULL);
UPDATE prs_kostenplaats
SET prs_kostenplaatsgrp_key = '24', prs_kostenplaats_module = 'ALG'
WHERE prs_kostenplaats_nr LIKE 'G%';
UPDATE prs_kostenplaats
SET prs_kostenplaatsgrp_key = '25', prs_kostenplaats_module = 'PRJ'
WHERE prs_kostenplaats_nr LIKE 'H%';
UPDATE prs_kostenplaats
SET prs_kostenplaatsgrp_key = '27', prs_kostenplaats_module = 'PRJ'
WHERE prs_kostenplaats_nr LIKE 'U%';
UPDATE prs_kostenplaats
SET prs_kostenplaatsgrp_key = '25', prs_kostenplaats_module = 'PRJ'
WHERE prs_kostenplaats_nr LIKE 'I%';
UPDATE prs_kostenplaats
SET prs_kostenplaatsgrp_key = '22', prs_kostenplaats_module = 'PRJ'
WHERE (prs_kostenplaats_nr LIKE 'S%'
AND prs_kostenplaats_upper NOT IN
('S30006',
'S30007',
'S30008',
'S30011',
'S30015',
'S30046',
'S30056',
'S30065',
'S30080',
'S30083',
'S30115',
'S30116',
'S30121',
'S30122',
'S30130',
'S30132'))
OR prs_kostenplaats_nr LIKE 'T%';
UPDATE prs_kostenplaats
SET prs_kostenplaatsgrp_key = '23', prs_kostenplaats_module = 'PRJ'
WHERE prs_kostenplaats_nr LIKE 'S%'
AND prs_kostenplaats_upper IN
('S30006',
'S30007',
'S30008',
'S30011',
'S30015',
'S30046',
'S30056',
'S30065',
'S30080',
'S30083',
'S30115',
'S30116',
'S30121',
'S30122',
'S30130',
'S30132');
UPDATE prs_kostenplaats
SET prs_kostenplaatsgrp_key = '21', prs_kostenplaats_module = 'PRS'
WHERE fac.safe_to_number (prs_kostenplaats_nr) IS NOT NULL;
-- Alle kostenplaatsen uit de kpn_prj import zijn projectkostenplaatsen.
UPDATE prs_kostenplaats k
SET k.prs_kostenplaatsgrp_key = '27',
k.prs_kostenplaats_module = 'PRJ'
WHERE EXISTS (SELECT project
FROM uwva_imp_kpn_prj
WHERE project = k.prs_kostenplaats_nr);
COMMIT;
-- UWVA#15374: Automatisch bijwerken "kpn-based" legenda's
INSERT INTO cad_legendawaarde (cad_legenda_key,
cad_legendawaarde_value,
cad_legendawaarde_rgb,
cad_legendawaarde_omschr)
SELECT DISTINCT
181,
SUBSTR (a.prs_afdeling_naam6, 1, 60), -- HV-Divisie
TO_CHAR (
DBMS_UTILITY.get_hash_value (
SUBSTR (a.prs_afdeling_naam6, 1, 60),
0,
POWER (2, 24)
),
'0XXXXX'
),
SUBSTR (a.prs_afdeling_naam6, 1, 60)
FROM prs_v_aanwezigafdeling a
WHERE a.prs_afdeling_parentkey IS NULL
AND NOT EXISTS
(SELECT cl.cad_legendawaarde_value
FROM cad_legendawaarde cl
WHERE cl.cad_legendawaarde_value = SUBSTR (a.prs_afdeling_naam6, 1, 60)
AND cl.cad_legenda_key = 181);
INSERT INTO cad_legendawaarde (cad_legenda_key,
cad_legendawaarde_value,
cad_legendawaarde_rgb,
cad_legendawaarde_omschr)
SELECT DISTINCT
182,
SUBSTR (a.prs_afdeling_naam6, 1, 60), -- HV-Afdeling
TO_CHAR (
DBMS_UTILITY.get_hash_value (
SUBSTR (a.prs_afdeling_naam6, 1, 60),
0,
POWER (2, 24)
),
'0XXXXX'
),
SUBSTR (a.prs_afdeling_naam6, 1, 60)
FROM prs_v_aanwezigafdeling a
WHERE a.prs_afdeling_parentkey IS NOT NULL
AND NOT EXISTS
(SELECT cl.cad_legendawaarde_value
FROM cad_legendawaarde cl
WHERE cl.cad_legendawaarde_value = SUBSTR (a.prs_afdeling_naam6, 1, 60)
AND cl.cad_legenda_key = 182);
END;
/
-- USRRAP views tbv UWVA#7
/* Formatted on 2005/02/16 11:26 (Formatter Plus v4.8.5) */
CREATE OR REPLACE VIEW uwva_v_kpn_01_teverwijderenafd (personeelsnr, persoon, afdeling, omschrijving, vervallen)
AS
SELECT prs_perslid_nr, pf.prs_perslid_naam_full, prs_afdeling_naam, prs_afdeling_omschrijving,
DECODE (d.prs_afdeling_verwijder, NULL, '', 'INACTIEF')
FROM prs_afdeling d, prs_perslid p, uwva_imp_kpn i, prs_v_perslid_fullnames_all pf
WHERE p.prs_afdeling_key = d.prs_afdeling_key
AND i.afdeling = d.prs_afdeling_naam
AND i.status <> 'A'
AND p.prs_perslid_verwijder IS NULL
AND pf.prs_perslid_key = p.prs_perslid_key;
CREATE OR REPLACE VIEW uwva_v_kpn_03_vervallenafd (hide_f_vervaldatum,
vervaldatum,
afdeling,
omschrijving
)
AS
SELECT SYSDATE - d.prs_afdeling_verwijder,
TO_CHAR (d.prs_afdeling_verwijder, 'YYYY-MM-DD'),
d.prs_afdeling_naam, d.prs_afdeling_omschrijving
FROM prs_afdeling d
WHERE d.prs_afdeling_verwijder IS NOT NULL;
CREATE OR REPLACE VIEW uwva_v_kpn_04_openverpl
(fclt_f_servicepunt, fclt_f_locatie, kostenplaats, omschrijving, vervaldatum,
verplichting, item, fclt_3d_locatie_key)
AS
SELECT di.alg_district_omschrijving fclt_f_servicepunt,
l.alg_locatie_code fclt_f_locatie,
k.prs_kostenplaats_nr,
k.prs_kostenplaats_omschrijving,
TO_CHAR (k.prs_kostenplaats_verwijder, 'YYYY-MM-DD'),
NVL (t.fac_message_text, pv.fac_message_code),
item,
pv.locatie_key
FROM prs_v_kp_verplichting pv,
fac_message t,
prs_kostenplaats k,
alg_locatie l,
alg_district di
WHERE pv.prs_kostenplaats_key = k.prs_kostenplaats_key
AND pv.locatie_key = l.alg_locatie_key
AND l.alg_district_key = di.alg_district_key
AND pv.fac_message_code = t.fac_message_code(+)
AND k.prs_kostenplaats_verwijder IS NOT NULL;
CREATE OR REPLACE PROCEDURE UWVA_import_cis (
p_import_key IN NUMBER
)
AS
-- constanten
c_fielddelimitor VARCHAR2 (1) := ';'; -- Field seperator
-- import
v_newline VARCHAR2 (1000); -- Import line
v_field VARCHAR2 (100); -- Import field
header_is_valid BOOLEAN;
v_aantal NUMBER;
-- foutafhandeling
v_errormsg VARCHAR (200);
v_errorhint VARCHAR (200);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_errmes VARCHAR(1024);
-- De importvelden
v_prs_perslid_nr VARCHAR2(16 BYTE);
v_prs_perslid_bsn VARCHAR2(10 BYTE);
v_prs_perslid_naam VARCHAR2(60 BYTE);
v_prs_perslid_oslogin VARCHAR2(30 BYTE);
v_prs_perslid_email VARCHAR2(200 BYTE);
v_teller NUMBER;
CURSOR c1 IS
SELECT *
FROM fac_imp_file
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_file_index;
rec1 c1%ROWTYPE;
BEGIN
-- Init
header_is_valid := FALSE;
-- Clear my previous imported rows
DELETE FROM UWVA_imp_cis;
BEGIN
v_teller := 0;
OPEN c1;
IF c1%ISOPEN THEN
v_teller := 1;
LOOP
BEGIN
v_errmes := 'Fout FETCH te importeren rij';
FETCH c1 INTO rec1;
EXIT WHEN c1%NOTFOUND;
v_errmes := 'Fout opvragen te importeren rij';
v_newline := rec1.fac_imp_file_line;
fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_nr);
fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_bsn);
fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_naam);
fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_oslogin);
fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_email);
-- Skip until a valid header is found
IF ( header_is_valid = FALSE
AND v_prs_perslid_naam LIKE 'Volledige naam'
)
THEN
header_is_valid := TRUE;
ELSIF (header_is_valid)
THEN
INSERT INTO UWVA_imp_cis
(prs_perslid_nr
,prs_perslid_bsn
,prs_perslid_naam
,prs_perslid_oslogin
,prs_perslid_email
)
VALUES (SUBSTR (RTRIM(v_prs_perslid_nr), 1, 16)
,SUBSTR (RTRIM(v_prs_perslid_bsn), 1, 10)
,SUBSTR (RTRIM(v_prs_perslid_naam), 1, 60)
,SUBSTR (RTRIM(v_prs_perslid_oslogin), 1, 30)
,SUBSTR (RTRIM(v_prs_perslid_email), 1, 200)
);
END IF;
header_is_valid := TRUE;
COMMIT;
IF (NOT header_is_valid)
THEN
fac.imp_writelog (p_import_key,
'E',
'Invalid import file',
'Er is geen geldige header aangetroffen in het importbestand'
);
END IF;
COMMIT; -- alles is goed gegaan
END;
END LOOP;
END IF;
CLOSE c1;
SELECT count(*)
INTO v_aantal
FROM FAC_IMP_FILE
WHERE fac_import_key = p_import_key;
fac.imp_writelog (p_import_key, 'S', 'Aantal ingelezen uit cis bestand: '|| v_aantal, '');
SELECT COUNT (*)
INTO v_aantal
FROM prs_v_aanwezigperslid
WHERE prs_perslid_naam NOT LIKE 'INA%' AND prs_perslid_nr IS NOT NULL;
fac.imp_writelog (p_import_key, 'S', 'Aantal actieve personen in Facilitor met pers.nr: '|| v_aantal, '');
SELECT COUNT (*)
INTO v_aantal
FROM prs_perslid p, uwva_imp_cis cis
WHERE prs_perslid_verwijder IS NULL
AND p.prs_perslid_naam NOT LIKE 'INACT%'
AND p.prs_perslid_nr IS NOT NULL
AND cis.prs_perslid_nr = p.prs_perslid_nr;
fac.imp_writelog (p_import_key, 'S', 'Match personeelsnummer: '|| v_aantal, '');
SELECT COUNT (*)
INTO v_aantal
FROM prs_perslid p, uwva_imp_cis cis
WHERE prs_perslid_verwijder IS NULL
AND p.prs_perslid_naam NOT LIKE 'INACT%'
AND p.prs_perslid_nr IS NOT NULL
AND cis.prs_perslid_nr = p.prs_perslid_nr
AND LTRIM (RTRIM (UPPER (cis.prs_perslid_oslogin))) =
LTRIM (RTRIM (UPPER (p.prs_perslid_oslogin)))
AND cis.prs_perslid_oslogin IS NOT NULL
AND p.prs_perslid_oslogin IS NOT NULL;
fac.imp_writelog (p_import_key, 'S', 'Match personeelsnummer en logincode: '|| v_aantal, '');
SELECT COUNT (*)
INTO v_aantal
FROM prs_perslid p, uwva_imp_cis cis
WHERE prs_perslid_verwijder IS NULL -- 18550
AND p.prs_perslid_naam NOT LIKE 'INACT%'
AND p.prs_perslid_nr IS NOT NULL
AND cis.prs_perslid_nr = p.prs_perslid_nr
AND LTRIM (RTRIM (UPPER (cis.prs_perslid_email))) =
LTRIM (RTRIM (UPPER (p.prs_perslid_email)))
AND cis.prs_perslid_email IS NOT NULL
AND p.prs_perslid_email IS NOT NULL;
fac.imp_writelog (p_import_key, 'S', 'Match personeelsnummer en email: '|| v_aantal, '');
COMMIT;
END;
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
fac.imp_writelog (p_import_key,
'E',
'Personen import: '|| v_errmes,
'Oracle foutmelding (' || oracle_err_num || '/' || oracle_err_mes || ')'
);
COMMIT; -- Logging opslaan
END;
/
/* Formatted on 2005/10/11 14:25 (Formatter Plus v4.8.5) */
CREATE OR REPLACE PROCEDURE UWVA_update_cis (p_import_key IN NUMBER)
AS
CURSOR c_login
IS
SELECT p.prs_perslid_nr, cis.prs_perslid_oslogin, p.prs_perslid_login
FROM prs_perslid p, uwva_imp_cis cis
WHERE prs_perslid_verwijder IS NULL
AND p.prs_perslid_naam NOT LIKE 'INACT%'
AND p.prs_perslid_nr IS NOT NULL
AND cis.prs_perslid_nr = p.prs_perslid_nr
AND LTRIM (RTRIM (UPPER (NVL(cis.prs_perslid_oslogin, 'is leeg')))) <>
LTRIM (RTRIM (UPPER (NVL(p.prs_perslid_oslogin, 'is leeg'))))
AND cis.prs_perslid_oslogin IS NOT NULL;
CURSOR c_email
IS
SELECT p.prs_perslid_nr, cis.prs_perslid_email
FROM prs_perslid p, uwva_imp_cis cis
WHERE prs_perslid_verwijder IS NULL
AND p.prs_perslid_naam NOT LIKE 'INACT%'
AND p.prs_perslid_nr IS NOT NULL
AND cis.prs_perslid_nr = p.prs_perslid_nr
AND LTRIM (RTRIM (UPPER (NVL(cis.prs_perslid_email,'geenmail')))) <>
LTRIM (RTRIM (UPPER (NVL(p.prs_perslid_email,'geenmail'))))
AND cis.prs_perslid_email IS NOT NULL
AND NOT (substr(cis.prs_perslid_email,7,1)='@')
AND fac.safe_to_number(substr(cis.prs_perslid_email, 4,3)) is null;
v_aantal NUMBER(10);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_errmes VARCHAR(1024);
v_errormsg VARCHAR (200);
BEGIN
v_aantal := 0;
FOR rc IN c_login
LOOP
-- Bestaat deze al?
BEGIN
IF rc.prs_perslid_login < to_date ('20070101', 'yyyymmdd') OR
rc.prs_perslid_login is NULL THEN
UPDATE prs_perslid
SET prs_perslid_oslogin = null
WHERE prs_perslid_oslogin = UPPER(rc.prs_perslid_oslogin);
UPDATE prs_perslid
SET prs_perslid_oslogin = rc.prs_perslid_oslogin
WHERE prs_perslid_nr = rc.prs_perslid_nr
AND prs_perslid_verwijder is null;
v_aantal := v_aantal + 1;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
fac.imp_writelog (p_import_key,
'E',
'Kan login niet aanpassen ' || v_errormsg,
'Personeelsnummer: ' || rc.prs_perslid_nr || ' login: ' || rc.prs_perslid_oslogin
);
END;
COMMIT;
END LOOP;
fac.imp_writelog (p_import_key,
'S',
'Aantal aangepaste logins: ' || v_aantal,
''
);
v_aantal := 0;
FOR rc IN c_email
LOOP
BEGIN
UPDATE prs_perslid
SET prs_perslid_email = rc.prs_perslid_email
WHERE prs_perslid_nr = rc.prs_perslid_nr
AND prs_perslid_verwijder is null;
v_aantal := v_aantal + 1;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
fac.imp_writelog (p_import_key,
'E',
'Kan emailadres niet aanpassen ' || v_errormsg,
'Personeelnummer: ' || rc.prs_perslid_nr || ' email: ' || rc.prs_perslid_email
);
END;
COMMIT;
END LOOP;
fac.imp_writelog (p_import_key,
'S',
'Aantal aangepaste emailadressen: ' || v_aantal,
''
);
commit;
END;
/
/* UWVA#15279 - Importfunctie tbv. het bijwerken van persoonsgegevens! */
CREATE OR REPLACE PROCEDURE uwva_import_prs (
p_import_key IN NUMBER
)
IS
c_delim VARCHAR2 (1) := ';';
v_newline VARCHAR2 (1000); -- Input line
v_aanduiding VARCHAR2 (200);
v_errorhint VARCHAR2 (1000);
v_errormsg VARCHAR2 (1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
header_is_valid NUMBER := 0;
v_ongeldig NUMBER (1);
v_wp_ongeldig NUMBER (1);
v_count_tot NUMBER (10);
v_count_import NUMBER (10);
v_count NUMBER (10);
-- De importvelden:
v_prs_perslid_nr VARCHAR2 (255);
v_prs_perslid_oslogin VARCHAR2 (255);
v_prs_perslid_oslogin2 VARCHAR2 (255);
v_prs_perslid_telefoonnr VARCHAR2 (255);
v_prs_perslid_mobiel VARCHAR2 (255);
v_prs_perslid_email VARCHAR2 (255);
v_alg_locatie_code VARCHAR2 (255);
v_alg_gebouw_code VARCHAR2 (255);
v_alg_verdieping_volgnr VARCHAR2 (255); -- C10
v_alg_verdieping_volgnr_n NUMBER (3); -- N3
v_alg_ruimte_nr VARCHAR2 (255); -- C10
CURSOR c1
IS
SELECT *
FROM fac_imp_file
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_file_index;
BEGIN
DELETE FROM uwva_imp_prs;
COMMIT;
v_count_tot := 0;
v_count_import := 0;
FOR rec1 IN c1
LOOP
BEGIN
v_newline := rec1.fac_imp_file_line;
v_aanduiding := '';
v_errorhint := 'Fout bij opvragen te importeren rij';
v_errormsg := '';
v_ongeldig := 0;
v_wp_ongeldig := 0;
-- Lees alle veldwaarden
-- 01
fac.imp_getfield (v_newline, c_delim, v_prs_perslid_nr);
-- 02
fac.imp_getfield (v_newline, c_delim, v_prs_perslid_oslogin);
-- 03
fac.imp_getfield (v_newline, c_delim, v_prs_perslid_oslogin2);
-- 04
fac.imp_getfield (v_newline, c_delim, v_prs_perslid_telefoonnr);
-- 05
fac.imp_getfield (v_newline, c_delim, v_prs_perslid_mobiel);
-- 06
fac.imp_getfield (v_newline, c_delim, v_prs_perslid_email);
-- 07
fac.imp_getfield (v_newline, c_delim, v_alg_locatie_code);
-- 08
fac.imp_getfield (v_newline, c_delim, v_alg_gebouw_code);
-- 09
fac.imp_getfield (v_newline, c_delim, v_alg_verdieping_volgnr);
-- 10
fac.imp_getfield (v_newline, c_delim, v_alg_ruimte_nr);
--
v_aanduiding :=
'[' || COALESCE (v_prs_perslid_nr, v_prs_perslid_oslogin)
|| '] ';
-- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
-- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
-- Ik negeer alles totdat ik een geldige header ben gepasseerd.
IF (header_is_valid = 0)
THEN
IF UPPER (v_prs_perslid_nr) = 'PERSONEELSNUMMER'
AND UPPER (v_prs_perslid_oslogin) = 'LOGINNAAM'
AND UPPER (v_prs_perslid_oslogin2) = 'ALT-LOGINNAAM'
AND UPPER (v_prs_perslid_telefoonnr) = 'TELEFOONNUMMER'
AND UPPER (v_prs_perslid_mobiel) = 'MOBIEL'
AND UPPER (v_prs_perslid_email) = 'EMAIL'
AND UPPER (v_alg_locatie_code) = 'LOCATIECODE'
AND UPPER (v_alg_gebouw_code) = 'GEBOUWCODE'
AND UPPER (v_alg_verdieping_volgnr) = 'VERDIEPINGNUMMER'
AND UPPER (v_alg_ruimte_nr) = 'RUIMTENUMMER'
THEN
header_is_valid := 1;
END IF;
ELSE
v_count_tot := v_count_tot + 1;
-- Controleer alle veldwaarden
v_errorhint := 'Ongeldig personeelsnummer';
v_prs_perslid_nr := TRIM (v_prs_perslid_nr);
IF LENGTH (v_prs_perslid_nr) > 16
THEN
v_ongeldig := 1;
fac.imp_writelog
(p_import_key,
'W',
v_aanduiding || 'Personeelsnummer te lang',
'Personeelsnummer is primair verplicht; regel wordt overgeslagen!'
);
COMMIT;
END IF;
--
v_errorhint := 'Ongeldige loginnaam';
v_prs_perslid_oslogin := TRIM (v_prs_perslid_oslogin);
IF LENGTH (v_prs_perslid_oslogin) > 30
THEN
IF v_prs_perslid_nr IS NULL
THEN
v_ongeldig := 1;
fac.imp_writelog
(p_import_key,
'W',
v_aanduiding || 'Loginnaam te lang',
'Loginnaam is secundair verplicht; regel wordt overgeslagen!'
);
ELSE
v_prs_perslid_oslogin := NULL;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || 'Loginnaam te lang',
'Loginnaam wordt niet bijgewerkt'
);
END IF;
COMMIT;
END IF;
--
IF ( v_ongeldig = 0
AND v_prs_perslid_nr IS NULL
AND v_prs_perslid_oslogin IS NULL
)
THEN
v_ongeldig := 1;
fac.imp_writelog
(p_import_key,
'W',
v_aanduiding || 'Personeelsnummer en loginnaam onbekend',
'Personeelsnummer of loginnaam is verplicht; regel wordt overgeslagen!'
);
COMMIT;
END IF;
--
v_errorhint := 'Ongeldige tweede loginnaam';
v_prs_perslid_oslogin2 := TRIM (v_prs_perslid_oslogin2);
IF LENGTH (v_prs_perslid_oslogin2) > 30
THEN
v_prs_perslid_oslogin2 := NULL;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || 'Tweede loginnaam te lang',
'Tweede loginnaam wordt niet bijgewerkt'
);
COMMIT;
END IF;
--
v_errorhint := 'Ongeldig telefoonnummer';
v_prs_perslid_telefoonnr := TRIM (v_prs_perslid_telefoonnr);
IF LENGTH (v_prs_perslid_telefoonnr) > 15
THEN
v_prs_perslid_telefoonnr := NULL;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || 'Telefoonnummer te lang',
'Telefoonnummer wordt niet bijgewerkt'
);
COMMIT;
END IF;
--
v_errorhint := 'Ongeldig mobiel nummer';
v_prs_perslid_mobiel := TRIM (v_prs_perslid_mobiel);
IF LENGTH (v_prs_perslid_mobiel) > 15
THEN
v_prs_perslid_mobiel := NULL;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || 'Mobiel nummer te lang',
'Mobiel nummer wordt niet bijgewerkt'
);
COMMIT;
END IF;
--
v_errorhint := 'Ongeldig e-mailadres';
v_prs_perslid_email := TRIM (v_prs_perslid_email);
IF LENGTH (v_prs_perslid_email) > 50
THEN
v_prs_perslid_email := NULL;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || 'E-mailadres te lang',
'E-mailadres wordt niet bijgewerkt'
);
COMMIT;
END IF;
--
v_errorhint :=
'Ongeldige locatiecode [' || v_alg_locatie_code || ']';
v_alg_locatie_code := TRIM (v_alg_locatie_code);
IF LENGTH (v_alg_locatie_code) > 5
THEN
v_alg_locatie_code := NULL;
v_wp_ongeldig := 1;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || 'Locatiecode te lang',
'Werkplek wordt niet bijgewerkt'
);
COMMIT;
END IF;
--
v_errorhint :=
'Ongeldige gebouwcode [' || v_alg_gebouw_code || ']';
v_alg_gebouw_code := TRIM (v_alg_gebouw_code);
IF LENGTH (v_alg_gebouw_code) > 10
THEN
v_wp_ongeldig := 1;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || 'Gebouwcode te lang',
'Werkplek wordt niet bijgewerkt'
);
COMMIT;
END IF;
--
v_errorhint :=
'Ongeldig verdiepingnummer [' || v_alg_verdieping_volgnr || ']';
v_alg_verdieping_volgnr := TRIM (v_alg_verdieping_volgnr);
BEGIN
v_alg_verdieping_volgnr_n :=
ROUND (fac.safe_to_number (v_alg_verdieping_volgnr));
IF v_alg_verdieping_volgnr_n NOT BETWEEN -999 AND 999
THEN
v_wp_ongeldig := 1;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding
|| 'Verdiepingnummer groter dan 3 posities',
'Werkplek wordt niet bijgewerkt'
);
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
v_errorhint
|| 'ORACLE (error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
v_wp_ongeldig := 1;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || v_errormsg,
'Werkplek wordt niet bijgewerkt'
);
COMMIT;
END;
--
v_errorhint := 'Ongeldig ruimtenummer [' || v_alg_ruimte_nr || ']';
v_alg_ruimte_nr := TRIM (v_alg_ruimte_nr);
IF LENGTH (v_alg_ruimte_nr) > 10
THEN
v_wp_ongeldig := 1;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || 'Ruimtenummer te lang',
'Werkplek wordt niet bijgewerkt'
);
COMMIT;
END IF;
SELECT DECODE (v_alg_locatie_code, NULL, 0, 1)
+ DECODE (v_alg_gebouw_code, NULL, 0, 1)
+ DECODE (v_alg_verdieping_volgnr_n, NULL, 0, 1)
+ DECODE (v_alg_ruimte_nr, NULL, 0, 1)
INTO v_count
FROM DUAL;
IF v_count MOD 4 <> 0
THEN
v_wp_ongeldig := 1;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || 'Werkplekgegevens onvolledig',
'Werkplek wordt niet bijgewerkt'
);
COMMIT;
END IF;
-- Insert geformatteerde import record
IF v_ongeldig = 0
THEN
BEGIN
v_errorhint :=
'Fout bij toevoegen regel aan importtabel UWVA_IMP_PRS';
IF v_wp_ongeldig = 1
THEN
INSERT INTO uwva_imp_prs
(prs_perslid_nr, prs_perslid_oslogin,
prs_perslid_oslogin2,
prs_perslid_telefoonnr,
prs_perslid_mobiel, prs_perslid_email
)
VALUES (v_prs_perslid_nr, v_prs_perslid_oslogin,
v_prs_perslid_oslogin2,
v_prs_perslid_telefoonnr,
v_prs_perslid_mobiel, v_prs_perslid_email
);
ELSE
INSERT INTO uwva_imp_prs
(prs_perslid_nr, prs_perslid_oslogin,
prs_perslid_oslogin2,
prs_perslid_telefoonnr,
prs_perslid_mobiel, prs_perslid_email,
alg_locatie_code, alg_gebouw_code,
alg_verdieping_volgnr, alg_ruimte_nr
)
VALUES (v_prs_perslid_nr, v_prs_perslid_oslogin,
v_prs_perslid_oslogin2,
v_prs_perslid_telefoonnr,
v_prs_perslid_mobiel, v_prs_perslid_email,
v_alg_locatie_code, v_alg_gebouw_code,
v_alg_verdieping_volgnr_n, v_alg_ruimte_nr
);
END IF;
COMMIT;
v_count_import := v_count_import + 1;
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,
'W',
v_aanduiding || v_errormsg,
v_errorhint
);
COMMIT;
END;
END IF;
END IF;
END;
END LOOP;
IF (header_is_valid = 0)
THEN
fac.imp_writelog (p_import_key,
'E',
'Ongeldig importbestand',
'Geen header of header niet volgens specificatie!'
);
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 :=
'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || v_errormsg,
v_errorhint
);
COMMIT;
END uwva_import_prs;
/
CREATE OR REPLACE PROCEDURE uwva_update_prs (
p_import_key IN NUMBER
)
IS
v_aanduiding VARCHAR2 (200);
v_errorhint VARCHAR2 (1000);
v_errormsg VARCHAR2 (1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_count_tot NUMBER (10);
v_count_error NUMBER (10);
v_count NUMBER (10);
--
v_perslid_key NUMBER (10);
v_locatie_key NUMBER (10);
v_gebouw_key NUMBER (10);
v_verdieping_key NUMBER (10);
v_ruimte_key NUMBER (10);
v_wp_key NUMBER (10);
v_wp_volgnr NUMBER (3);
v_wp_oms VARCHAR2 (30);
-- Dubbele nummers/logins in import? Dan wordt dezelfde persoon 2x (of meer) bijgewerkt!
CURSOR cperslid
IS
SELECT ip.prs_perslid_nr, ip.prs_perslid_oslogin,
ip.prs_perslid_oslogin2, ip.prs_perslid_telefoonnr,
ip.prs_perslid_mobiel, ip.prs_perslid_email
FROM uwva_imp_prs ip;
-- Dubbele nummers/logins in import? Dan krijgt iemand mogelijk de verkeerde plaats(en)!
-- NB. Import garandeert dat als locatie niet leeg, dan ook gebouw t/m ruimte niet leeg!
CURSOR cwp
IS
SELECT ip.prs_perslid_nr, ip.prs_perslid_oslogin, ip.alg_locatie_code,
ip.alg_gebouw_code, ip.alg_verdieping_volgnr, ip.alg_ruimte_nr
FROM uwva_imp_prs ip
WHERE ip.alg_locatie_code IS NOT NULL;
-- Alle actieve personen met personeelsnummer (ie. de import-doelgroep) zonder een werkplek
CURSOR cnowp
IS
SELECT p.prs_perslid_key, p.prs_perslid_nr, p.prs_perslid_naam,
p.prs_perslid_voornaam
FROM prs_v_aanwezigperslid p
WHERE p.prs_perslid_nr IS NOT NULL
AND p.prs_perslid_naam NOT LIKE 'INACTIEF:%'
AND NOT EXISTS (SELECT 1
FROM prs_perslidwerkplek pw
WHERE pw.prs_perslid_key = p.prs_perslid_key);
BEGIN
v_count_tot := 0;
v_count_error := 0;
FOR recperslid IN cperslid
LOOP
BEGIN
v_count_tot := v_count_tot + 1;
v_aanduiding :=
'['
|| COALESCE (recperslid.prs_perslid_nr,
recperslid.prs_perslid_oslogin
)
|| '] ';
v_errorhint := 'Fout bij bepalen persoon';
IF recperslid.prs_perslid_nr IS NOT NULL
THEN
SELECT COUNT (*), MAX (prs_perslid_key)
INTO v_count, v_perslid_key
FROM prs_perslid
WHERE prs_perslid_verwijder IS NULL
AND UPPER (prs_perslid_nr) = UPPER (recperslid.prs_perslid_nr);
ELSE
SELECT COUNT (*), MAX (prs_perslid_key)
INTO v_count, v_perslid_key
FROM prs_perslid
WHERE prs_perslid_verwijder IS NULL
AND UPPER (prs_perslid_oslogin) = UPPER (recperslid.prs_perslid_oslogin);
END IF;
IF (v_count = 1)
THEN
v_errorhint := 'Fout bij wijzigen persoon';
UPDATE prs_perslid
SET prs_perslid_oslogin =
COALESCE (recperslid.prs_perslid_oslogin,
prs_perslid_oslogin
),
prs_perslid_oslogin2 =
COALESCE (recperslid.prs_perslid_oslogin2,
prs_perslid_oslogin2
),
prs_perslid_telefoonnr =
COALESCE (recperslid.prs_perslid_telefoonnr,
prs_perslid_telefoonnr
),
prs_perslid_mobiel =
COALESCE (recperslid.prs_perslid_mobiel,
prs_perslid_mobiel
),
prs_perslid_email =
COALESCE (recperslid.prs_perslid_email,
prs_perslid_email
)
WHERE prs_perslid_key = v_perslid_key;
ELSE
IF (v_count = 0)
THEN
fac.imp_writelog (p_import_key,
'W',
v_aanduiding
|| ' Persoon niet bekend in Facilitor',
v_errorhint
);
ELSE -- (v_count > 1)
fac.imp_writelog (p_import_key,
'W',
v_aanduiding
|| ' Persoon niet 1-duidig te bepalen',
v_errorhint
);
END IF;
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 :=
'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || v_errormsg,
v_errorhint
);
COMMIT;
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),
''
);
COMMIT;
v_count_tot := 0;
v_count_error := 0;
FOR recwp IN cwp
LOOP
BEGIN
v_count_tot := v_count_tot + 1;
v_aanduiding :=
'['
|| COALESCE (recwp.prs_perslid_nr, recwp.prs_perslid_oslogin)
|| '] ';
v_errorhint := 'Fout bij bepalen persoon';
IF recwp.prs_perslid_nr IS NOT NULL
THEN
SELECT COUNT (*), MAX (prs_perslid_key)
INTO v_count, v_perslid_key
FROM prs_perslid
WHERE prs_perslid_verwijder IS NULL
AND UPPER (prs_perslid_nr) = UPPER (recwp.prs_perslid_nr);
ELSE
SELECT COUNT (*), MAX (prs_perslid_key)
INTO v_count, v_perslid_key
FROM prs_perslid
WHERE prs_perslid_verwijder IS NULL
AND UPPER (prs_perslid_oslogin) = UPPER (recwp.prs_perslid_oslogin);
END IF;
IF (v_count = 1)
THEN
v_errorhint := 'Fout bij bepalen locatie';
SELECT alg_locatie_key
INTO v_locatie_key
FROM alg_v_aanweziglocatie
WHERE UPPER (alg_locatie_code) = UPPER (recwp.alg_locatie_code);
v_errorhint := 'Fout bij bepalen gebouw';
SELECT alg_gebouw_key
INTO v_gebouw_key
FROM alg_v_aanweziggebouw
WHERE alg_locatie_key = v_locatie_key
AND UPPER (alg_gebouw_code) = UPPER (recwp.alg_gebouw_code);
v_errorhint := 'Fout bij bepalen verdieping';
SELECT alg_verdieping_key
INTO v_verdieping_key
FROM alg_v_aanwezigverdieping
WHERE alg_gebouw_key = v_gebouw_key
AND UPPER (alg_verdieping_volgnr) = UPPER (recwp.alg_verdieping_volgnr);
v_errorhint := 'Fout bij bepalen ruimte';
SELECT alg_ruimte_key
INTO v_ruimte_key
FROM alg_v_aanwezigruimte r
WHERE r.alg_verdieping_key = v_verdieping_key
AND UPPER (r.alg_ruimte_nr) = UPPER (recwp.alg_ruimte_nr);
-- Persoon verhuist naar/krijgt nieuwe werkplek in betreffende gebouw!
v_errorhint := 'Fout bij verhuizen naar nieuwe werkplek';
PRS.movetoruimte (v_perslid_key, v_ruimte_key, 'G');
--ELSE
--Niets, want dat is dan al gemeld in voorgaande loop!
END IF;
EXCEPTION
WHEN OTHERS
THEN
v_count_error := v_count_error + 1;
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg :=
'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || v_errormsg,
v_errorhint
);
COMMIT;
END;
END LOOP;
fac.imp_writelog (p_import_key,
'S',
'Werkplek: verwerkte regels zonder foutmelding: '
|| TO_CHAR (v_count_tot - v_count_error),
''
);
fac.imp_writelog (p_import_key,
'S',
'Werkplek: verwerkte regels met foutmelding: '
|| TO_CHAR (v_count_error),
''
);
COMMIT;
FOR recnowp IN cnowp
LOOP
BEGIN
fac.imp_writelog (p_import_key,
'I',
'Persoon met nummer ['
|| recnowp.prs_perslid_nr
|| '] en naam ['
|| recnowp.prs_perslid_naam
|| ', '
|| recnowp.prs_perslid_voornaam
|| '] heeft geen werkplek',
'Geen werkplek'
);
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg :=
'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'W',
v_errormsg,
v_errorhint
);
COMMIT;
END;
END LOOP;
END uwva_update_prs;
/
--UWVA#30448: PWP-import
/* Formatted on 12-12-2014 14:45:15 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE uwva_import_pwp (p_import_key IN NUMBER)
AS
c_delim VARCHAR2 (1) := ';';
v_newline VARCHAR2 (1000); -- Input line
v_errormsg VARCHAR2 (1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_aanduiding VARCHAR2 (200) := '';
header_is_valid NUMBER := 0;
v_count_tot NUMBER (10) := 0;
v_count_import NUMBER (10) := 0;
v_ongeldig NUMBER (1) := 0;
-- De importvelden
v_login VARCHAR2 (255); -- C30/prs_perslid_oslogin
v_locatie VARCHAR2 (255); -- C10/alg_locatie_code
v_gebouw VARCHAR2 (255); -- C12/alg_gebouw_code
v_verdiepingcode VARCHAR2 (255); -- C10/alg_verdieping_code
v_ruimtenr VARCHAR2 (255); -- C10/alg_ruimte_nr
v_pwp_volgnr VARCHAR2 (255); -- N2/prs_perslidwerkplek_volgnr
v_bezetting VARCHAR2 (255); -- N3/prs_perslidwerkplek_bezetting
-- Overige velden:
CURSOR c1
IS
SELECT *
FROM fac_imp_file
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_file_index;
BEGIN
DELETE FROM uwva_imp_pwp;
COMMIT;
FOR rec1 IN c1
LOOP
BEGIN
v_newline := rec1.fac_imp_file_line;
v_errormsg := 'Fout bij opvragen importregel';
v_aanduiding := '';
v_ongeldig := 0;
-- Lees alle veldwaarden
-- LOGIN;LOCATIE;GEBOUW;VERDIEPINGCODE;RUIMTENR;PWP_VOLGNR;BEZETTING
fac.imp_getfield (v_newline, c_delim, v_login);
fac.imp_getfield (v_newline, c_delim, v_locatie);
fac.imp_getfield (v_newline, c_delim, v_gebouw);
fac.imp_getfield (v_newline, c_delim, v_verdiepingcode);
fac.imp_getfield (v_newline, c_delim, v_ruimtenr);
fac.imp_getfield (v_newline, c_delim, v_pwp_volgnr);
fac.imp_getfield (v_newline, c_delim, v_bezetting);
v_aanduiding :=
'['
|| v_login
|| '|'
|| v_gebouw
|| '|'
|| v_verdiepingcode
|| '|'
|| v_ruimtenr
|| '|'
|| TO_CHAR (v_pwp_volgnr)
|| '|'
|| TO_CHAR (v_bezetting)
|| '] ';
-- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
-- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
-- Ik negeer alles totdat ik een geldige header ben gepasseerd.
IF (header_is_valid = 0)
THEN
IF UPPER (TRIM (v_login)) = 'LOGIN'
AND UPPER (TRIM (v_locatie)) = 'LOCATIE'
AND UPPER (TRIM (v_gebouw)) = 'GEBOUW'
AND UPPER (TRIM (v_verdiepingcode)) = 'VERDIEPINGCODE'
AND UPPER (TRIM (v_ruimtenr)) = 'RUIMTENR'
AND UPPER (TRIM (v_pwp_volgnr)) = 'PWP_VOLGNR'
AND UPPER (TRIM (v_bezetting)) = 'BEZETTING'
THEN
header_is_valid := 1;
END IF;
ELSE
v_count_tot := v_count_tot + 1;
-- Controleer alle veldwaarden
v_errormsg := 'Login ongeldig/ongedefinieerd of te lang';
v_login := TRIM (v_login);
IF v_login IS NULL OR LENGTH (v_login) > 30
THEN
v_ongeldig := 1;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || v_errormsg,
'Regel wordt overgeslagen!');
END IF;
--
v_errormsg := 'Locatie ongeldig/ongedefinieerd of te lang';
v_locatie := TRIM (v_locatie);
IF v_locatie IS NULL OR LENGTH (v_locatie) > 10
THEN
v_ongeldig := 1;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || v_errormsg,
'Regel wordt overgeslagen!');
END IF;
--
v_errormsg := 'Gebouw ongeldig/ongedefinieerd of te lang';
v_gebouw := TRIM (v_gebouw);
IF v_gebouw IS NULL OR LENGTH (v_gebouw) > 12
THEN
v_ongeldig := 1;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || v_errormsg,
'Regel wordt overgeslagen!');
END IF;
--
v_errormsg := 'Verdieping ongeldig/ongedefinieerd of te lang';
v_verdiepingcode := TRIM (v_verdiepingcode);
IF v_verdiepingcode IS NULL OR LENGTH (v_verdiepingcode) > 10
THEN
v_ongeldig := 1;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || v_errormsg,
'Regel wordt overgeslagen!');
END IF;
--
v_errormsg := 'Ruimtenr ongeldig/ongedefinieerd of te lang';
v_ruimtenr := TRIM (v_ruimtenr);
IF v_ruimtenr IS NULL OR LENGTH (v_ruimtenr) > 10
THEN
v_ongeldig := 1;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || v_errormsg,
'Regel wordt overgeslagen!');
END IF;
--
v_errormsg := 'PWP-volgnr ongeldig';
v_pwp_volgnr := TRIM (v_pwp_volgnr);
IF v_pwp_volgnr IS NOT NULL AND COALESCE (fac.safe_to_number (v_pwp_volgnr), -1) NOT BETWEEN 0 AND 99
THEN
v_pwp_volgnr := NULL;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || v_errormsg,
'Volgnummer wordt genegeerd!');
END IF;
--
v_errormsg := 'Bezetting ongeldig/ongedefinieerd';
v_bezetting := TRIM (v_bezetting);
IF COALESCE (fac.safe_to_number (v_bezetting), -1) NOT BETWEEN 0 AND 100
THEN
v_ongeldig := 1;
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || v_errormsg,
'Regel wordt overgeslagen!');
END IF;
-- Insert geformatteerde import record
IF (v_ongeldig = 0)
THEN
BEGIN
v_errormsg := 'Fout wegschrijven importregel';
INSERT INTO uwva_imp_pwp (login,
locatie,
gebouw,
verdiepingcode,
ruimtenr,
pwp_volgnr,
bezetting)
VALUES (v_login,
v_locatie,
v_gebouw,
v_verdiepingcode,
v_ruimtenr,
fac.safe_to_number (v_pwp_volgnr),
fac.safe_to_number (v_bezetting));
v_count_import := v_count_import + 1;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg :=
v_errormsg
|| ' ORACLE (error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || v_errormsg,
'');
END;
END IF;
END IF;
END;
END LOOP;
IF (header_is_valid = 0)
THEN
fac.imp_writelog (p_import_key,
'E',
'Ongeldig importbestand',
'Geen header of header niet volgens specificatie!');
ELSE
fac.imp_writelog (
p_import_key,
'S',
'Inleesproces/#ingelezen importregels: ' || TO_CHAR (v_count_tot),
'');
fac.imp_writelog (
p_import_key,
'S',
'Inleesproces/#ongeldige niet ingelezen 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, 200);
v_errormsg :=
v_errormsg
|| 'ORACLE (error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || v_errormsg,
'Inleesproces PWP afgebroken!');
END;
/
CREATE OR REPLACE PROCEDURE uwva_update_pwp (p_import_key IN NUMBER)
AS
-- Cursor loopt - op login/locatie/gebouw/verdiepingcode/ruimtenr! - over
-- alle ingelezen regels.
CURSOR c1
IS
SELECT *
FROM uwva_imp_pwp
ORDER BY 1, 2, 3, 4, 5;
v_errormsg VARCHAR2 (1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_aanduiding VARCHAR2 (200);
v_count NUMBER (10) := 0;
v_count_tot NUMBER (10) := 0;
v_count_upd NUMBER (10) := 0;
v_perslid_key prs_perslid.prs_perslid_key%TYPE;
v_locatie_key alg_locatie.alg_locatie_key%TYPE;
v_gebouw_key alg_gebouw.alg_gebouw_key%TYPE;
v_verdieping_key alg_verdieping.alg_verdieping_key%TYPE;
v_ruimte_key alg_ruimte.alg_ruimte_key%TYPE;
v_pwp_key prs_perslidwerkplek.prs_perslidwerkplek_key%TYPE;
BEGIN
-- Loop over alle ingelezen PWP-regels.
FOR rec1 IN c1
LOOP
BEGIN
v_aanduiding :=
'['
|| rec1.login
|| '|'
|| rec1.gebouw
|| '|'
|| rec1.verdiepingcode
|| '|'
|| rec1.ruimtenr
|| '|'
|| TO_CHAR (rec1.pwp_volgnr)
|| '|'
|| TO_CHAR (rec1.bezetting)
|| '] ';
v_count_tot := v_count_tot + 1;
v_errormsg := 'Fout bepalen persoon';
SELECT prs_perslid_key
INTO v_perslid_key
FROM prs_v_aanwezigperslid
WHERE prs_perslid_oslogin = UPPER (rec1.login)
OR prs_perslid_oslogin2 = UPPER (rec1.login);
v_errormsg := 'Fout bepalen locatie';
SELECT alg_locatie_key
INTO v_locatie_key
FROM alg_v_aanweziglocatie
WHERE UPPER (alg_locatie_code) = UPPER (rec1.locatie);
v_errormsg := 'Fout bepalen gebouw';
SELECT alg_gebouw_key
INTO v_gebouw_key
FROM alg_v_aanweziggebouw
WHERE alg_gebouw_upper = UPPER (rec1.gebouw)
AND alg_locatie_key = v_locatie_key;
v_errormsg := 'Fout bepalen verdiepingcode';
SELECT alg_verdieping_key
INTO v_verdieping_key
FROM alg_v_aanwezigverdieping
WHERE UPPER (alg_verdieping_code) = UPPER (rec1.verdiepingcode)
AND alg_gebouw_key = v_gebouw_key;
v_errormsg := 'Fout bepalen ruimtenr';
SELECT alg_ruimte_key
INTO v_ruimte_key
FROM alg_v_aanwezigruimte
WHERE alg_ruimte_upper_nr = UPPER (rec1.ruimtenr)
AND alg_verdieping_key = v_verdieping_key;
v_errormsg := 'Fout bepalen bestaande werkplek op locatie';
SELECT COUNT ( * )
INTO v_count
FROM prs_perslidwerkplek pwp,
prs_werkplek wp,
alg_ruimte r,
alg_verdieping v,
alg_gebouw g
WHERE pwp.prs_perslid_key = v_perslid_key
AND pwp.prs_werkplek_key = wp.prs_werkplek_key
AND wp.prs_alg_ruimte_key = r.alg_ruimte_key
AND r.alg_verdieping_key = v.alg_verdieping_key
AND v.alg_gebouw_key = g.alg_gebouw_key
AND g.alg_locatie_key = v_locatie_key;
-- Als op locatie reeds een bestaande WP, dan niet nog een toewijzen.
IF (v_count = 0)
THEN
v_errormsg := 'Fout toewijzen werkplek';
PRS.movetoruimte (v_perslid_key, v_ruimte_key, NULL);
v_errormsg := 'Fout bepalen werkplek';
SELECT pwp.prs_perslidwerkplek_key
INTO v_pwp_key
FROM prs_perslidwerkplek pwp, prs_werkplek wp
WHERE pwp.prs_perslid_key = v_perslid_key
AND pwp.prs_werkplek_key = wp.prs_werkplek_key
AND wp.prs_werkplek_virtueel = 0 -- Alleen echte plekken
AND wp.prs_werkplek_type = 0 -- Alleen vaste plekken
AND wp.prs_alg_ruimte_key = v_ruimte_key;
v_errormsg := 'Fout bijwerken werkplek';
UPDATE prs_perslidwerkplek
SET prs_perslidwerkplek_volgnr = rec1.pwp_volgnr,
prs_perslidwerkplek_bezetting = rec1.bezetting
WHERE prs_perslidwerkplek_key = v_pwp_key;
v_count_upd := v_count_upd + 1;
ELSE
fac.imp_writelog (p_import_key,
'I',
v_aanduiding || 'Werkplek ongewijzigd',
'');
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg :=
v_errormsg
|| ' ORACLE (error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || v_errormsg,
'');
END;
END LOOP;
fac.imp_writelog (p_import_key,
'S',
'PWPs/#ingelezen: ' || TO_CHAR (v_count_tot),
'');
fac.imp_writelog (p_import_key,
'S',
'PWPs/#toegevoegd: ' || TO_CHAR (v_count_upd),
'');
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg :=
v_errormsg
|| ' ORACLE (error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'E',
v_errormsg,
'Importproces PWP afgebroken!');
END;
/
/* Formatted on 17-2-2014 11:48:12 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW uwva_v_email_schrijfwijzer
(
prs_key,
fac_id,
imp_id,
imp_empnum,
imp_nickname,
imp_lastname,
imp_spousename,
fac_email,
imp_email,
sw_email
)
AS
SELECT DISTINCT
p.prs_perslid_key,
kl.prs_kenmerklink_waarde,
ip.id,
ip.empnum,
ip.nickname,
ip.lastname,
ip.spousename,
p.prs_perslid_email,
ip.email,
DECODE (
INSTR (COALESCE (p.prs_perslid_email, ip.email), '@'),
NULL, -- geen email bekend -> ongewijzigd
COALESCE (p.prs_perslid_email, ip.email),
0, -- geen '@' in email -> ongewijzigd
COALESCE (p.prs_perslid_email, ip.email),
CASE -- email met een '@'
WHEN INSTR (COALESCE (p.prs_perslid_email, ip.email) || '.', '.') <
INSTR (COALESCE (p.prs_perslid_email, ip.email), '@')
THEN -- . voor @ (dus meeste gevallen)
REPLACE (
REPLACE (
REPLACE (
REPLACE (
INITCAP(SUBSTR (LOWER(COALESCE (p.prs_perslid_email, ip.email)),
1,
INSTR (COALESCE (p.prs_perslid_email, ip.email), '.', -1, 2) - 1))
|| SUBSTR (LOWER(COALESCE (p.prs_perslid_email, ip.email)),
INSTR (COALESCE (p.prs_perslid_email, ip.email), '.', -1, 2)),
INITCAP(REPLACE (COALESCE (nickname, vnaam), ' ', '') || '.'),
REPLACE (INITCAP (COALESCE (nickname, vnaam)), ' ', '') || '.'),
LOWER(SUBSTR (TRIM (COALESCE (lastname, anaam)),
1,
INSTR (TRIM (COALESCE (lastname, anaam)), ' ') - 1)),
SUBSTR (INITCAP (TRIM (COALESCE (lastname, anaam))),
1,
INSTR (TRIM (COALESCE (lastname, anaam)), ' ') - 1)),
LOWER(SUBSTR (TRIM (COALESCE (lastname, anaam)),
INSTR (TRIM (COALESCE (lastname, anaam)), ' ', -1) + 1)),
SUBSTR (INITCAP (TRIM (COALESCE (lastname, anaam))),
INSTR (TRIM (COALESCE (lastname, anaam)), ' ', -1) + 1)),
LOWER (REPLACE (spousename, ' ', '')),
REPLACE (INITCAP (spousename), ' ', ''))
ELSE -- geen . voor @ (bkwi.nl/uwv.local; <30!) -> ongewijzigd
COALESCE (p.prs_perslid_email, ip.email)
END)
email_schrijfwijzer
FROM (SELECT prs_perslid_key,
REPLACE (prs_perslid_email, '$', '@') prs_perslid_email,
prs_perslid_voornaam vnaam,
prs_perslid_naam anaam
FROM prs_v_aanwezigperslid) p
LEFT JOIN prs_v_aanwezigkenmerklink kl
ON p.prs_perslid_key = kl.prs_link_key
AND kl.prs_kenmerk_key = 1232 -- ABS-ID
FULL JOIN (SELECT *
FROM uwva_imp_abs
WHERE SUBSTR (empnum, 1, 1) IN ('C', 'I', 'E', 'F', 'D', 'K')) ip
ON kl.prs_kenmerklink_waarde = ip.id;
/* Formatted on 4-7-2016 16:45:15 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW uwva_v_rap_uitdienst
(
extra_key,
perslid_nr,
absid,
perslid_naam_full,
kpn_nr,
kpn_oms,
verplichting
)
AS -- Voorgaande import uitdienst <20>n lopende/actuele verplichtingen!
SELECT p.prs_perslid_key,
p.prs_perslid_nr,
kl2.prs_kenmerklink_waarde,
pf.prs_perslid_naam_full,
kp.prs_kostenplaats_nr,
kp.prs_kostenplaats_omschrijving,
lcl.fac_locale_xsl_tekst || ' ' || vp.item
FROM prs_v_aanwezigperslid p,
prs_afdeling a,
prs_kostenplaats kp,
prs_v_perslid_fullnames_all pf,
prs_v_verplichting vp, --_keys vp,
prs_kenmerklink kl1,
prs_kenmerklink kl2,
fac_locale_xsl lcl
WHERE p.prs_afdeling_key = a.prs_afdeling_key
AND a.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
AND p.prs_perslid_key = pf.prs_perslid_key
AND p.prs_perslid_key = vp.prs_perslid_key(+)
AND p.prs_perslid_key = kl1.prs_link_key
AND kl1.prs_kenmerk_key = 1040 -- Type Medewerker
AND kl1.prs_kenmerklink_waarde IN
(SELECT TO_CHAR (fac_usrdata_key)
FROM fac_usrdata
WHERE fac_usrtab_key = 301 -- Type_medewerker
AND fac_usrdata_upper IN ('C', 'I', 'E', 'F', 'D', 'K', 'W'))
AND p.prs_perslid_key = kl2.prs_link_key
AND kl2.prs_kenmerk_key = 1232 -- ABS-ID
AND NOT EXISTS (SELECT 1
FROM uwva_imp_abs uia
WHERE uia.id = kl2.prs_kenmerklink_waarde)
AND vp.fac_message_code = lcl.fac_locale_xsl_label
AND lcl.fac_locale_xsl_lang = 'NL';
-- ABS importfunctie, herziene versie volgens UWVA#18115, met aanvullingen voor Vinder (UWVA#19010)
CREATE OR REPLACE PROCEDURE uwva_import_abs (p_import_key IN NUMBER)
AS
CURSOR c1
IS
SELECT *
FROM fac_imp_file
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_file_index;
v_newline VARCHAR2 (1000); -- Import line
v_field VARCHAR2 (100); -- Import field
v_fielddelimitor VARCHAR2 (1) := ';'; -- Field seperator
v_count_import NUMBER (10);
v_count NUMBER;
v_errormsg VARCHAR2 (200);
v_errorhint VARCHAR2 (200);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_buffercount NUMBER := 0;
c_commitbuffer NUMBER := 2000; -- om de zoveel committen
-- De importvelden
v_prefname VARCHAR2 (100);
v_lastname VARCHAR2 (100);
v_prefix VARCHAR2 (100);
v_spousename VARCHAR2 (100);
v_spouseprefix VARCHAR2 (100);
v_nickname VARCHAR2 (100);
v_titel VARCHAR2 (100);
v_account VARCHAR2 (100);
v_altaccnt VARCHAR2 (100);
v_funcdscr VARCHAR2 (100);
v_telno VARCHAR2 (100);
v_mobno VARCHAR2 (100);
v_faxno VARCHAR2 (100);
v_email VARCHAR2 (255);
v_initials VARCHAR2 (100);
v_empnum VARCHAR2 (100);
v_costcent VARCHAR2 (100);
v_gender VARCHAR2 (100);
v_employeetype VARCHAR2 (100);
v_pandcode VARCHAR2 (100);
v_grpfname VARCHAR2 (100);
v_grpid VARCHAR2 (100);
v_id VARCHAR2 (100);
header_found BOOLEAN := FALSE;
BEGIN
-- Clear my previous imported rows
DELETE FROM uwva_imp_abs;
v_count_import := 0;
FOR rec1 IN c1
LOOP
BEGIN
v_newline := rec1.fac_imp_file_line;
fac.imp_getfield (v_newline, v_fielddelimitor, v_prefname); -- prefname
fac.imp_getfield (v_newline, v_fielddelimitor, v_nickname); -- nickname
fac.imp_getfield (v_newline, v_fielddelimitor, v_titel); -- titel
fac.imp_getfield (v_newline, v_fielddelimitor, v_account); -- accnt
fac.imp_getfield (v_newline, v_fielddelimitor, v_altaccnt); -- altaccnt
fac.imp_getfield (v_newline, v_fielddelimitor, v_funcdscr); -- funcdscr
fac.imp_getfield (v_newline, v_fielddelimitor, v_telno); -- telno
fac.imp_getfield (v_newline, v_fielddelimitor, v_mobno); -- mobnr
fac.imp_getfield (v_newline, v_fielddelimitor, v_faxno); -- faxnr
fac.imp_getfield (v_newline, v_fielddelimitor, v_email); -- email
fac.imp_getfield (v_newline, v_fielddelimitor, v_initials); -- initials
fac.imp_getfield (v_newline, v_fielddelimitor, v_prefix); -- prefix
fac.imp_getfield (v_newline, v_fielddelimitor, v_empnum); -- empnum
fac.imp_getfield (v_newline, v_fielddelimitor, v_costcent); -- costcent
fac.imp_getfield (v_newline, v_fielddelimitor, v_gender); -- gender
fac.imp_getfield (v_newline, v_fielddelimitor, v_employeetype); -- type
fac.imp_getfield (v_newline, v_fielddelimitor, v_pandcode); -- location
fac.imp_getfield (v_newline, v_fielddelimitor, v_id); -- id
fac.imp_getfield (v_newline, v_fielddelimitor, v_grpfname); -- grpfname
fac.imp_getfield (v_newline, v_fielddelimitor, v_grpid); -- grpid
fac.imp_getfield (v_newline, v_fielddelimitor, v_lastname); -- lastname
fac.imp_getfield (v_newline, v_fielddelimitor, v_spousename); -- spousename
fac.imp_getfield (v_newline, v_fielddelimitor, v_spouseprefix); -- spouseprefix
-- Skip until the header is found
IF (header_found = FALSE)
THEN
IF UPPER (v_prefname) = 'PREFNAME' -- PREFNAME
AND UPPER (v_nickname) = 'NICKNAME' -- NICKNAME
AND UPPER (v_titel) = 'TITEL' -- TITEL
AND UPPER (v_account) = 'ACCNT' -- ACCNT
AND UPPER (v_altaccnt) = 'ALTACCNT' -- ALTACCNT
AND UPPER (v_funcdscr) = 'FUNCDSCR' -- FUNCDSCR
AND UPPER (v_telno) = 'TELNO' -- TELNO
AND UPPER (v_mobno) = 'MOBNR' -- MOBNR
AND UPPER (v_faxno) = 'FAXNR' -- FAXNR
AND UPPER (v_email) = 'EMAIL' -- EMAIL
AND UPPER (v_initials) = 'INITIALS' -- INITIALS
AND UPPER (v_prefix) = 'PREFIX' -- PREFIX
AND UPPER (v_empnum) = 'EMPNUM' -- EMPNUM
AND UPPER (v_costcent) = 'COSTCENT' -- COSTCENT
AND UPPER (v_gender) = 'GENDER' -- GENDER
AND UPPER (v_employeetype) = 'TYPE' -- TYPE
AND UPPER (v_pandcode) = 'LOCATION' -- LOCATION
AND UPPER (v_id) = 'ID' -- ID
AND UPPER (v_grpfname) = 'GRPFNAME' -- GRPFNAME
AND UPPER (v_grpid) = 'GRPID' -- GRPID
AND UPPER (v_lastname) = 'LASTNAME' -- LASTNAME
AND UPPER (v_spousename) = 'SPOUSENAME' -- SPOUSENAME
AND UPPER (v_spouseprefix) = 'SPOUSEPREFIX' -- SPOUSEPREFIX
THEN
header_found := TRUE;
END IF;
ELSE
INSERT INTO uwva_imp_abs (id,
prefname,
nickname,
titel,
account,
funcdscr,
telno,
mobno,
faxno,
email,
initials,
prefix,
empnum, -- personeelsnummer incl. prefix voor werknemertype (zoals in importbestand)
empnum_noprefix, -- personeelsnummer excl. prefix voor werknemertype (zoals initieel in Facilitor)
costcent,
gender,
employeetype,
pandcode,
grpfname,
grpid,
lastname,
spousename,
spouseprefix)
VALUES (fac.safe_to_number(v_id), -- flexkenmerk heeft type Numeriek, dus hier vast omzetten (voorloopnullen eraf)
SUBSTR (v_prefname, 1, 100), -- kan samenvoeging van voor- en achternaam bevatten, dus lekker lang laten
SUBSTR (v_nickname, 1, 30),
SUBSTR (v_titel, 1, 15),
UPPER ( SUBSTR (v_account, 1, 30) ), -- UPPER, dat scheelt executietijd bij update_abs, ivm indexing e.d.
SUBSTR ( TRIM (v_funcdscr), 1, 60),
SUBSTR (v_telno, 1, 20),
SUBSTR (v_mobno, 1, 20),
SUBSTR (v_faxno, 1, 20),
SUBSTR (v_email, 1, 200),
SUBSTR (v_initials, 1, 10),
SUBSTR (v_prefix, 1, 15),
UPPER ( SUBSTR (v_empnum, 1, 16) ), -- UPPER, dat scheelt executietijd bij update_abs, ivm indexing e.d.
UPPER ( SUBSTR (v_empnum, 3, 16) ), -- UPPER, dat scheelt executietijd bij update_abs, ivm indexing e.d.
LPAD (v_costcent, 6, 0),
UPPER ( SUBSTR (v_gender, 1, 1) ), -- UPPER, dat scheelt executietijd bij update_abs, ivm indexing e.d.
UPPER ( SUBSTR (v_empnum, 1, 1) ), -- UPPER, dat scheelt executietijd bij update_abs, ivm indexing e.d.
SUBSTR (v_pandcode, 1, 6),
SUBSTR (v_grpfname, 1, 40),
SUBSTR (v_grpid, 1, 40),
SUBSTR (v_lastname, 1, 30),
SUBSTR (v_spousename, 1, 30),
SUBSTR (v_spouseprefix, 1, 15));
v_count_import := v_count_import + 1;
END IF;
-- Elke c_commitbuffer regels committen
v_buffercount := v_buffercount + 1;
IF (v_buffercount >= c_commitbuffer)
THEN
COMMIT;
v_buffercount := 0;
END IF;
END;
END LOOP;
IF (header_found = FALSE)
THEN
fac.imp_writelog (p_import_key,
'E',
'Ongeldig importbestand',
'Geen header of header niet volgens specificatie!'
);
ELSE
fac.imp_writelog (p_import_key,
'S',
'Aantal ingelezen regels: '
|| TO_CHAR (v_count_import),
''
);
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := 'OTHERS (error '
|| oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_import_key,
'E',
v_errormsg,
'');
END;
/
-- Functies om werknemertype te bepalen en flexkenmerken op te halen
CREATE OR REPLACE PACKAGE uwva_abs
AS
FUNCTION get_flexval (p_import_key IN NUMBER, perslid_key IN NUMBER, flex_key IN NUMBER) RETURN VARCHAR2;
FUNCTION get_employeetype (p_import_key IN NUMBER, perslid_key IN NUMBER, employeetype_key IN NUMBER) RETURN VARCHAR2;
END uwva_abs;
/
CREATE OR REPLACE PACKAGE BODY uwva_abs
AS
FUNCTION get_flexval (p_import_key IN NUMBER, perslid_key IN NUMBER, flex_key IN NUMBER) RETURN VARCHAR2
IS
vf_flexval VARCHAR(60) := '';
BEGIN
SELECT prs_kenmerklink_waarde
INTO vf_flexval
FROM prs_kenmerklink
WHERE prs_link_key = perslid_key
AND prs_kenmerk_key = flex_key
AND prs_kenmerklink_verwijder IS NULL;
RETURN vf_flexval;
EXCEPTION
WHEN OTHERS
THEN
RETURN '';
END get_flexval;
FUNCTION get_employeetype (p_import_key IN NUMBER, perslid_key IN NUMBER, employeetype_key IN NUMBER) RETURN VARCHAR2
IS
vf_employeetype VARCHAR(5) := '';
BEGIN
SELECT ud.fac_usrdata_upper
INTO vf_employeetype
FROM prs_perslid p,
prs_kenmerklink km,
fac_usrdata ud
WHERE km.prs_link_key = p.prs_perslid_key
AND km.prs_kenmerk_key = employeetype_key
AND ud.fac_usrdata_key = km.prs_kenmerklink_waarde
AND p.prs_perslid_key = perslid_key;
RETURN vf_employeetype;
EXCEPTION
WHEN OTHERS
THEN
RETURN '';
END get_employeetype;
END uwva_abs;
/
-- ABS importfunctie, herziene versie volgens UWVA#18115, met aanvullingen voor Vinder (UWVA#19010)
CREATE OR REPLACE PROCEDURE uwva_update_abs (p_import_key IN NUMBER)
AS
-- Constanten
et_check INTEGER;
c_functie_onbekend VARCHAR2 (60) := 'Functie onbekend in ABS';
c_absid_key NUMBER (10) := 1232; -- PROD
c_grp_default_key NUMBER (10) := 241; -- PROD
c_employeetype_key NUMBER (10) := 1040; -- Het flexkenmerk dat het employeetype registreert
-- C(contract), I(intern), E(extern), F(flexplek), D(dummy), K(ketenpartner), W(wonga)
c_usrtab_employeetype_key NUMBER (10) := 301; -- Dat is een referentiekenmerk naar fac_userdata die we opzoeken
c_usrtab_pandcodes_key NUMBER (10) := 1; -- Het flexkenmerk dat de pandcode registreert
c_usrtab_pandcoderegio_key NUMBER (10) := 782;
c_usrtab_regiovinder_key NUMBER (10) := 783;
c_usrdata_onbekend_omschr VARCHAR2 (60) := 'ONBEKEND';
c_usrdata_onbekend_key NUMBER (10) := 4889;
c_regio_key NUMBER (10) := 1193;
c_faxnr_key NUMBER (10) := 7;
c_srtgebouw_default INTEGER := 1;
c_srtruimte_default INTEGER := 1;
c_ruimte_code VARCHAR2 (4) := '_000';
c_ruimte_omschr_default VARCHAR2 (16) := 'Onbekend';
c_verdieping_omschr_default VARCHAR2 (16) := 'BG';
c_werkplek_volgnr_default INTEGER := 1;
c_prs_werkplek_omschrijving VARCHAR2 (16) := 'imp';
c_def_pandcode_ketenpartner VARCHAR2 (6) := 'GAMSG3';
-- Voor budgethouders (uit voormalige budgethouderimport)
c_kpn_maxvariation NUMBER := 0.5; -- Max new/old ratio to prevent undesired changes
l_oldcount NUMBER;
l_impcount NUMBER;
l_impcount_prj NUMBER;
c_grp_budgh_key NUMBER := 1061;
c_grp_medewerker_key NUMBER := 1601;
nrbh1 NUMBER;
nrbh2 NUMBER;
c_maxvariation NUMBER := 20;
c_commitbuffer NUMBER := 5000; -- om de zoveel committen
v_buffercount NUMBER := 0;
v_time VARCHAR2 (50);
v_deelkey NUMBER (10);
v_deeloms VARCHAR2 (60);
v_deelstat VARCHAR2 (60);
-- Alle personen in Facilitor die (nog) geen ABS-ID (het unieke ID binnen ABS) hebben.
-- Deze personen worden gematcht op basis van: 1) account
-- 2) personeelsnr-met-prefix
-- 3) personeelsnr-zonder-prefix + type
-- Hierbij worden alle medewerkertypen (en mensen zonder type) aangepast, dus ook types
-- die ABS vervolgens niet aanpast(!).
-- Mensen die niet gevonden kunnen worden, krijgen type 'P'.
CURSOR c_prs_no_absid
IS
SELECT prs_perslid_key, prs_perslid_naam, prs_perslid_oslogin, prs_perslid_nr
FROM prs_perslid
WHERE prs_perslid_key IN
(SELECT prs_perslid_key
FROM prs_v_aanwezigperslid
MINUS
SELECT prs_link_key
FROM prs_v_aanwezigkenmerklink
WHERE prs_kenmerk_key = c_absid_key
AND prs_kenmerklink_waarde IS NOT NULL
MINUS
SELECT prs_link_key
FROM prs_v_aanwezigkenmerklink
WHERE prs_kenmerk_key = c_employeetype_key
AND prs_kenmerklink_waarde = 24747) -- X(derden)
ORDER BY 1;
-- Om te kunnen bepalen wat we met mensen moeten doen, moeten we weten welk werknemertype iemand heeft.
-- Het type in Facilitor kan leeg zijn (sowieso bij de eerste import), dus we proberen dit aan te
-- vullen vanuit het importbestand. Zodra het type gevuld is, kunnen we kijken of iemand I,E,C,F,D,K,W
-- is en of hij/zij bijgewerkt/verwijderd moet worden.
CURSOR c_prs_no_type
IS
SELECT prs_perslid_key,
prs_perslid_naam,
uwva_abs.get_flexval( p_import_key, prs_perslid_key, c_absid_key ) absid,
prs_perslid_oslogin,
prs_perslid_nr
FROM prs_perslid
WHERE prs_perslid_key IN
(SELECT prs_perslid_key
FROM prs_v_aanwezigperslid
MINUS
SELECT prs_link_key
FROM prs_kenmerklink
WHERE prs_kenmerk_key = c_employeetype_key
AND prs_kenmerklink_waarde IS NOT NULL)
;
-- Welke personen vervallen uit Facilitor? Zij die niet in het ingelezen bestand voorkomen
-- en wel van een employeetype zijn dat uit ABS had moeten komen (I, E, C, F, D, K of W dus).
-- We matchen daarbij op ABS-ID, dus personen zonder ABS-ID worden ook verwijderd.
CURSOR c_prs_del
IS
SELECT pl.prs_perslid_key,
pl.prs_perslid_naam_full prs_perslid_naam,
pl.prs_perslid_oslogin,
pl.prs_perslid_nr,
pl.absid
-- Personen in Facilitor waarvoor ABS leidend is (en die dus
-- in het importbestand zouden moeten voorkomen)
FROM (SELECT p.*,
pf.prs_perslid_naam_full,
km2.prs_kenmerklink_waarde absid
FROM prs_v_perslid_fullnames_all pf,
prs_kenmerklink km1,
prs_kenmerklink km2,
prs_v_aanwezigperslid p
WHERE km1.prs_link_key = p.prs_perslid_key
AND km2.prs_link_key(+) = p.prs_perslid_key
AND km1.prs_kenmerk_key = c_employeetype_key
AND km2.prs_kenmerk_key(+) = c_absid_key
AND fac.safe_to_number (km1.prs_kenmerklink_waarde) IN
(SELECT fac_usrdata_key
FROM fac_usrdata
WHERE fac_usrtab_key = c_usrtab_employeetype_key
AND fac_usrdata_upper IN
('C', 'I', 'E', 'F', 'D', 'K', 'W'))
AND pf.prs_perslid_key = p.prs_perslid_key) pl
-- Match op ABS-ID
LEFT OUTER JOIN uwva_imp_abs uia
ON pl.absid = uia.id
-- Iedereen die niet matcht (en dus niet in ABS voorkomt)
WHERE uia.id IS NULL
;
-- Alle personen uit het importbestand met een type waarvoor ABS leidend is (C, I, E, F, D, K of W).
-- Deze types noem ik hieronder voor het gemak even ABS-types.
-- Iedere persoon wordt bij het doorlopen van de cursor gematched met Facilitor, als volgt:
-- * Personen in ABS z<>nder ABS-type worden volledig genegeerd
-- * Personen in Facilitor met types L, O, P, X (dus g<><67>n ABS-type) worden volledig genegeerd. Om
-- dergelijke personen wel met ABS te kunnen laten matchen, moeten ze eerst handmatig worden
-- gemuteerd in Facilitor.
-- * Matching tussen personen in ABS en Facilitor vindt plaats op basis van het ABS-ID (het ID is
-- een uniek nummer in ABS, dat middels een flexkenmerk in Facilitor is opgenomen. Dit kenmerk
-- wordt door bovenstaande cursor (aan)gevuld. NB: matching vind niet in de cursor plaats,
-- omdat een ABS-ID niet uniek hoeft te zijn in Facilitor en omdat uit te voeren acties afhangen
-- van het medewerkertype in Facilitor.
-- * Personen met een ABS-ID (en account of persoonsnummer-met-prefix?) dat /niet uniek/ is, worden /niet/
-- gemuteerd! Dit om te voorkomen dat de verkeerde persoon bijgewerkt wordt.
-- * Als een persoon in Facilitor w<>l een ABS-type heeft, maar dit wijkt af van het ABS-type in
-- ABS, dan wordt het type in Facilitor bijgewerkt (bijv van E naar I).
CURSOR c_prs_upd
IS
SELECT DISTINCT
--SUBSTR (prefname, 1, 30) prs_perslid_naam,
TRIM (prefname) prs_perslid_naam,
nickname prs_perslid_voornaam,
titel prs_perslid_titel,
account prs_perslid_oslogin,
funcdscr prs_srtperslid_omschrijving,
telno prs_perslid_telefoonnr,
mobno prs_perslid_mobiel,
faxno prs_perslid_faxnr,
email email,
initials prs_perslid_voorletters,
DECODE (
COALESCE (INSTR (prefname, spousename), 0),
0, TRIM (prefix),
DECODE (
INSTR (prefname, lastname),
0, TRIM (spouseprefix),
CASE
WHEN INSTR (prefname, lastname) <= INSTR (prefname, spousename)
THEN
TRIM (prefix)
ELSE
TRIM (spouseprefix)
END))
prs_perslid_tussenvoegsel,
empnum prs_perslid_nr,
empnum_noprefix prs_perslid_nr_noprefix,
costcent prs_afdeling_naam,
DECODE (gender, 'M', 1, 'V', 0, NULL) prs_perslid_geslacht,
SUBSTR (empnum, 1, 1) employeetype,
pandcode,
id,
sw.sw_email
FROM (SELECT *
FROM uwva_imp_abs
WHERE SUBSTR (empnum, 1, 1) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W')) ip
LEFT JOIN -- UWVA#27483: E-mail volgens schrijfwijzer (INSERT-only)!
uwva_v_email_schrijfwijzer sw
ON ip.id = sw.imp_id;
CURSOR c_prs_wp
IS
SELECT hrmloc.prs_perslid_key,
hrmloc.alg_locatie_key,
hrmloc.alg_gebouw_key,
hrmloc.pandcode,
hrmloc.employeetype,
hrmloc.aanduiding,
COALESCE (hrmall.aant, 0) hrmall_wp_aant,
hrmall.pw_key hrmall_pw_key,
COALESCE (faclo1.aant, 0) facloc_wp_aant,
faclo2.pw_key facloc_pw_key,
faclo2.volgnr facloc_volgnr,
COALESCE (facall.aant, 0) facall_wp_aant,
facall.pw_key facall_pw_key
FROM (SELECT DISTINCT
p.prs_perslid_key,
l.alg_locatie_key,
g.alg_gebouw_key,
uia.pandcode,
et.fac_usrdata_upper employeetype,
p.prs_perslid_naam || '/' || p.prs_perslid_nr || '/' || p.prs_perslid_oslogin || '/' || l.alg_locatie_code
aanduiding
FROM prs_v_aanwezigperslid p, -- update HRM-WP van..
prs_kenmerklink km1, -- ..personen met ABS-ID
uwva_imp_abs uia, -- (..in import en Facilitor)
prs_kostenplaats kp, -- ..en HRM-pandcode bestaat
alg_gebouw g, -- (..in import en Facilitor)
alg_locatie l,
prs_kenmerklink km2, -- ..en type C/I/E/F/D/K/W!
(SELECT *
FROM fac_usrdata
WHERE fac_usrtab_key = c_usrtab_employeetype_key
AND fac_usrdata_upper IN ('C', 'I', 'E', 'F', 'D', 'K', 'W')) et
WHERE p.prs_perslid_key = km1.prs_link_key
AND km1.prs_kenmerk_key = c_absid_key
AND km1.prs_kenmerklink_verwijder IS NULL
AND km1.prs_kenmerklink_waarde = uia.id
AND uia.pandcode = kp.prs_kostenplaats_nr
AND kp.prs_kostenplaats_verwijder IS NULL
AND kp.prs_kostenplaats_key = g.prs_kostenplaats_key
AND g.alg_gebouw_verwijder IS NULL
AND g.alg_locatie_key = l.alg_locatie_key
AND l.alg_locatie_verwijder IS NULL
AND p.prs_perslid_key = km2.prs_link_key
AND km2.prs_kenmerk_key = c_employeetype_key
AND km2.prs_kenmerklink_verwijder IS NULL
AND fac.safe_to_number (km2.prs_kenmerklink_waarde) = et.fac_usrdata_key) hrmloc
LEFT JOIN ( SELECT pw.prs_perslid_key,
COUNT ( * ) aant, -- >1 -> PW-key irrelevant
MAX (pw.prs_perslidwerkplek_key) pw_key
FROM prs_perslidwerkplek pw, prs_werkplek wp
WHERE pw.prs_perslidwerkplek_volgnr = 2
AND pw.prs_werkplek_key = wp.prs_werkplek_key
AND wp.prs_werkplek_virtueel = 0
GROUP BY pw.prs_perslid_key) hrmall
ON hrmloc.prs_perslid_key = hrmall.prs_perslid_key
LEFT JOIN ( SELECT pw.prs_perslid_key,
g.alg_locatie_key,
COUNT ( * ) aant -- >1 -> PW/volgnr RELEVANT!
FROM prs_perslidwerkplek pw, prs_werkplek wp, alg_v_onrgoed_boom ogb, alg_v_aanweziggebouw g
WHERE pw.prs_werkplek_key = wp.prs_werkplek_key
AND wp.prs_werkplek_virtueel = 0
AND wp.prs_alg_ruimte_key = ogb.alg_ruimte_key
AND ogb.alg_gebouw_key = g.alg_gebouw_key
GROUP BY pw.prs_perslid_key, g.alg_locatie_key) faclo1
ON hrmloc.prs_perslid_key = faclo1.prs_perslid_key
AND hrmloc.alg_locatie_key = faclo1.alg_locatie_key
LEFT JOIN (SELECT pw.prs_perslid_key,
g.alg_locatie_key,
pw.prs_perslidwerkplek_key pw_key, -- laagste/oudste PW!
pw.prs_perslidwerkplek_volgnr volgnr -- ter info: volgnr
FROM prs_perslidwerkplek pw, prs_werkplek wp, alg_v_onrgoed_boom ogb, alg_v_aanweziggebouw g
WHERE pw.prs_werkplek_key = wp.prs_werkplek_key
AND wp.prs_werkplek_virtueel = 0
AND wp.prs_alg_ruimte_key = ogb.alg_ruimte_key
AND ogb.alg_gebouw_key = g.alg_gebouw_key
AND NOT EXISTS
(SELECT 1
FROM prs_perslidwerkplek pw2, prs_werkplek wp2, alg_v_onrgoed_boom ogb2, alg_v_aanweziggebouw g2
WHERE pw2.prs_perslid_key = pw.prs_perslid_key
AND pw2.prs_werkplek_key = wp2.prs_werkplek_key
AND wp2.prs_werkplek_virtueel = 0
AND wp2.prs_alg_ruimte_key = ogb2.alg_ruimte_key
AND ogb2.alg_gebouw_key = g2.alg_gebouw_key
AND g2.alg_locatie_key = g.alg_locatie_key
AND COALESCE (pw2.prs_perslidwerkplek_volgnr, 10000 + pw2.prs_perslidwerkplek_key) <
COALESCE (pw.prs_perslidwerkplek_volgnr, 10000 + pw.prs_perslidwerkplek_key)))
faclo2
ON hrmloc.prs_perslid_key = faclo2.prs_perslid_key
AND hrmloc.alg_locatie_key = faclo2.alg_locatie_key
LEFT JOIN ( SELECT pw.prs_perslid_key,
COUNT ( * ) aant, -- >1 -> PW-key irrelevant
MAX (pw.prs_perslidwerkplek_key) pw_key
FROM prs_perslidwerkplek pw, prs_werkplek wp
WHERE pw.prs_werkplek_key = wp.prs_werkplek_key
AND wp.prs_werkplek_virtueel = 0
GROUP BY pw.prs_perslid_key) facall
ON hrmloc.prs_perslid_key = facall.prs_perslid_key
WHERE COALESCE (hrmall.aant, 0) != 1 -- geen/teveel HRM-WP
OR COALESCE (faclo1.aant, 0) != 1 -- geen/teveel WP op HRM-locatie
OR COALESCE (hrmall.pw_key, 0) != COALESCE (faclo2.pw_key, 0) -- niet dezelfde?
;
-- Gegeven een persoon (ABS-ID en perslid_key), bepaal op basis van de rollen
-- die deze persoon heeft, welke authorisatiegroepen verwijderd moeten worden.
-- UWVA#20021: negeer daarbij de groep 'Budgethouders' (key 1061); daar gaat ABS
-- niet over. (Die groep wordt onderaan de import door de voormalige budgethouder-
-- import geregeld.)
-- UWVA#30547: Ketenpartners (type K) hebben voortaan beperktere rechten dan 'normale'
-- medewerkers. Daarom alleen andere medewerkertypes in groep 'Medewerker' laten.
CURSOR c_groep (in_absid VARCHAR2, in_perslid_key NUMBER)
IS
SELECT fg.fac_groep_key, fg.fac_groep_omschrijving
FROM fac_gebruikersgroep fgg, fac_groep fg
WHERE fgg.fac_groep_key = fg.fac_groep_key
AND fgg.prs_perslid_key = in_perslid_key
AND fgg.fac_groep_key != c_grp_default_key
AND fgg.fac_groep_key != c_grp_budgh_key
MINUS
(SELECT DISTINCT fg.fac_groep_key, fg.fac_groep_omschrijving
FROM uwva_imp_abs uia, uwva_provisioning up, fac_groep fg
WHERE up.fac_groep_key = fg.fac_groep_key
AND up.uwva_rol_omschr = uia.grpfname
AND uia.id = in_absid
UNION
SELECT fac_groep_key, fac_groep_omschrijving
FROM fac_groep fg, prs_kenmerklink km, fac_usrdata ud
WHERE fg.fac_groep_key = c_grp_medewerker_key
AND km.prs_link_key = in_perslid_key
AND km.prs_kenmerk_key = c_employeetype_key
AND km.prs_kenmerklink_verwijder IS NULL
AND ud.fac_usrtab_key = c_usrtab_employeetype_key
AND ud.fac_usrdata_verwijder IS NULL
AND ud.fac_usrdata_key(+) = fac.safe_to_number(km.prs_kenmerklink_waarde)
AND ud.fac_usrdata_upper IN ('C', 'I', 'E', 'F', 'D', 'W'));
-- Gegeven een persoon (ABS-ID en perslid_key), bepaal op basis van de rollen
-- die deze persoon heeft, welke authorisatiegroepen nog ontbreken.
-- UWVA#30547: Ketenpartners (type K) hebben voortaan beperktere rechten dan 'normale'
-- medewerkers. Daarom alleen de andere medewerkertypes in groep 'Medewerker' zetten.
CURSOR c_rol (in_absid VARCHAR2, in_perslid_key NUMBER)
IS
(SELECT DISTINCT fg.fac_groep_key, fg.fac_groep_omschrijving
FROM uwva_imp_abs uia, uwva_provisioning up, fac_groep fg
WHERE up.fac_groep_key = fg.fac_groep_key
AND up.uwva_rol_omschr = uia.grpfname
AND uia.id = in_absid
UNION
SELECT fac_groep_key, fac_groep_omschrijving
FROM fac_groep fg, prs_kenmerklink km, fac_usrdata ud
WHERE fg.fac_groep_key = c_grp_medewerker_key
AND km.prs_link_key = in_perslid_key
AND km.prs_kenmerk_key = c_employeetype_key
AND km.prs_kenmerklink_verwijder IS NULL
AND ud.fac_usrtab_key = c_usrtab_employeetype_key
AND ud.fac_usrdata_verwijder IS NULL
AND ud.fac_usrdata_key(+) = fac.safe_to_number(km.prs_kenmerklink_waarde)
AND ud.fac_usrdata_upper IN ('C', 'I', 'E', 'F', 'D', 'W'))
MINUS
SELECT fg.fac_groep_key, fg.fac_groep_omschrijving
FROM fac_gebruikersgroep fgg, fac_groep fg
WHERE fgg.fac_groep_key = fg.fac_groep_key
AND fgg.prs_perslid_key = in_perslid_key;
-- Door ABS niet meer gebruikte rollen, die toch nog in de provisioning-tabel
-- voorkomen.
CURSOR c_rol_not_used
IS
SELECT DISTINCT uwva_rol_omschr rol FROM uwva_provisioning
MINUS
SELECT DISTINCT grpfname rol FROM uwva_imp_abs;
CURSOR c_functie
IS
SELECT DISTINCT sp.prs_srtperslid_key, uia.funcdscr
FROM prs_srtperslid sp, uwva_imp_abs uia
WHERE sp.prs_srtperslid_upper = UPPER (uia.funcdscr)
AND sp.prs_srtperslid_omschrijving != uia.funcdscr;
-- Personen met ABS-type waarvan het flexveld 'Regio' afwijkt van het
-- gebouw waar de zitten, of die nog geen flexveld hebben.
CURSOR c_prs_regio
IS
SELECT *
FROM (SELECT hpw.prs_perslid_key,
g.alg_gebouw_code,
COALESCE (rv.fac_usrdata_key, c_usrdata_onbekend_key)
fac_usrdata_key,
COALESCE (rv.fac_usrdata_omschr, c_usrdata_onbekend_omschr)
fac_usrdata_omschr
FROM prs_v_hoofdperslidwerkplek hpw,
prs_werkplek w,
alg_v_onrgoed_boom ogb,
alg_gebouw g,
fac_usrdata pcr,
fac_usrdata rv,
prs_kenmerklink emp
WHERE w.prs_werkplek_key = hpw.prs_werkplek_key
AND w.prs_alg_ruimte_key = ogb.alg_ruimte_key
AND g.alg_gebouw_key = ogb.alg_gebouw_key
AND pcr.fac_usrdata_code(+) = g.alg_gebouw_code
AND rv.fac_usrdata_omschr(+) = pcr.fac_usrdata_omschr
AND pcr.fac_usrtab_key(+) = c_usrtab_pandcoderegio_key
AND rv.fac_usrtab_key(+) = c_usrtab_regiovinder_key
AND emp.prs_link_key = hpw.prs_perslid_key
AND emp.prs_kenmerk_key = c_employeetype_key
AND fac.safe_to_number (emp.prs_kenmerklink_waarde) IN
(SELECT fac_usrdata_key
FROM fac_usrdata
WHERE fac_usrtab_key = c_usrtab_employeetype_key
AND fac_usrdata_upper IN
('C', 'I', 'E', 'F', 'D', 'K', 'W'))) wprv
LEFT OUTER JOIN
(SELECT prs_link_key, prs_kenmerklink_key, prs_kenmerklink_waarde
FROM prs_kenmerklink kl
WHERE prs_kenmerklink_verwijder IS NULL
AND kl.prs_kenmerk_key = c_regio_key) km
ON km.prs_link_key = wprv.prs_perslid_key
WHERE km.prs_kenmerklink_waarde != wprv.fac_usrdata_key
OR km.prs_kenmerklink_waarde IS NULL;
-- UWVA#23788: (tijdelijke) logging die de pandcodes in het importbestand uitlijst,
-- waarvoor geen kostenplaats danwel gebouw gevonden kan worden, met het aantal personen.
CURSOR c_pandcode_onbekend
IS
SELECT pandcode,
prs_kostenplaats_nr,
COUNT (account) aantal
FROM (SELECT DISTINCT account,
uia.pandcode,
kp.prs_kostenplaats_nr
FROM uwva_imp_abs uia,
prs_v_aanwezigkostenplaats kp,
alg_v_aanweziggebouw g
WHERE uia.pandcode IS NOT NULL
AND uia.pandcode = kp.prs_kostenplaats_nr(+)
AND kp.prs_kostenplaats_key = g.prs_kostenplaats_key(+)
AND g.alg_gebouw_key IS NULL)
GROUP BY pandcode, prs_kostenplaats_nr
ORDER BY 1;
-- UWVA#20021: voormalige budgethouderimport
-- Record for update: relatie kostenplaats en persoon (evt leeg) kan worden gelegd.
CURSOR c_budgethouder
IS
SELECT kpn.prs_kostenplaats_key,
kpn.prs_kostenplaats_nr,
p.prs_perslid_key,
imp.perslid_nr imp_perslid_nr,
imp.mandaatcode imp_mandaatcode
FROM uwva_imp_kpn imp,
prs_v_aanwezigkostenplaats kpn,
prs_v_aanwezigperslid p
WHERE imp.afdeling = kpn.prs_kostenplaats_nr
AND p.prs_perslid_nr(+) = imp.perslid_nr
ORDER BY 2;
-- Onbekende kostenplaats
CURSOR c_kpn_onbekend
IS
SELECT kpn.prs_kostenplaats_key,
imp.afdeling prs_kostenplaats_nr,
imp.perslid_nr prs_perslid_nr
FROM uwva_imp_kpn imp,
prs_v_aanwezigkostenplaats kpn
WHERE imp.afdeling = kpn.prs_kostenplaats_nr(+)
AND kpn.prs_kostenplaats_nr IS NULL
AND imp.afdeling IS NOT NULL
AND imp.status = 'A'
ORDER BY 2;
v_prs_omschr VARCHAR2 (150);
v_perslid prs_perslid%ROWTYPE;
v_perslid_key NUMBER (10);
v_perslid_type VARCHAR2 (10);
v_prs_key_cnt NUMBER (10);
v_srtperslid_key NUMBER (10);
v_srtperslid_db_oms VARCHAR2 (60);
v_afdeling_key NUMBER (10);
v_profiel_key NUMBER (10);
v_profiel_omschr VARCHAR2 (30);
v_limiet NUMBER (10);
v_groep_key NUMBER (10);
v_groep_omschr VARCHAR2 (30);
v_locatie_key NUMBER (10);
v_gebouw_key NUMBER (10);
v_verdieping_key NUMBER (10);
v_ruimte_key NUMBER (10);
v_ruimte_nr VARCHAR2 (10);
v_werkplek_key NUMBER (10);
v_new_werkplek_key NUMBER (10);
v_werkplek_volgnr NUMBER (10);
v_pwp_key NUMBER (10);
v_pwp_volgnr NUMBER (10);
v_gebouw_code VARCHAR2 (10);
v_srtperslid_omschr VARCHAR (60);
v_srtperslid_upper VARCHAR (60);
recl c_prs_no_type%ROWTYPE;
rec_id c_prs_no_absid%ROWTYPE;
rec_del c_prs_del%ROWTYPE;
rec_upd c_prs_upd%ROWTYPE;
rec_groep c_groep%ROWTYPE;
rec_rol c_rol%ROWTYPE;
rec_rnu c_rol_not_used%ROWTYPE;
rec_func c_functie%ROWTYPE;
rec_regio c_prs_regio%ROWTYPE;
rec_pcon c_pandcode_onbekend%ROWTYPE;
rec_budgh c_budgethouder%ROWTYPE;
rec_kpnon c_kpn_onbekend%ROWTYPE;
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (250);
v_errormsg VARCHAR2 (1024);
v_errorhint VARCHAR2 (1024);
v_action VARCHAR (10);
v_count NUMBER (10);
v_count_regio_edit NUMBER (10);
v_count_regio_add NUMBER (10);
v_update BOOLEAN;
v_aktie VARCHAR (10);
v_prsMatched BOOLEAN;
v_perslid_count_imp NUMBER;
v_perslid_count_fclt NUMBER;
v_perslid_newcount_fclt NUMBER;
currentversion fac_module.fac_module_version%TYPE;
l_validatie NUMBER;
o_afdeling_key NUMBER (10); -- huidige (oude) afdeling
l_nrkps NUMBER;
v_nr_werkplek NUMBER;
v_current_locatie_key NUMBER;
v_new_locatie_key NUMBER;
v_new_gebouw_key NUMBER;
v_prs_kenmerklink_key NUMBER;
v_imp_account VARCHAR2 (30);
v_imp_empnum VARCHAR2 (16);
v_imp_prefname VARCHAR2 (30);
v_imp_employeetype VARCHAR2 (30);
v_imp_absid NUMBER;
v_emptype VARCHAR2 (5);
v_validtype BOOLEAN;
v_budgh_key NUMBER;
v_achternaam VARCHAR2 (60);
PROCEDURE uwva_set_werknemertype(perslid_key IN NUMBER, perslid_naam IN VARCHAR2, werknemertype IN VARCHAR2, logstr IN VARCHAR2, logtype in VARCHAR2)
AS
BEGIN
-- Kijk of meegegeven werknemertype in Facilitor bestaat
SELECT COUNT (*)
INTO v_count
FROM fac_usrdata
WHERE fac_usrtab_key = c_usrtab_employeetype_key
AND fac_usrdata_upper = werknemertype;
IF (v_count = 0)
THEN
-- Geen bekend werknemertype --> ERROR
v_validtype := FALSE;
fac.imp_writelog (p_import_key,
'W',
logstr || '. Naam: ' || perslid_naam,
'Onbekend werknemertype "' || werknemertype || '"! Graag toevoegen in Eigen tabel!');
ELSE
v_validtype := TRUE;
END IF;
-- Kijk of er al een werknemertype is gedefinieerd voor perslid
SELECT COUNT(*)
INTO v_count
FROM prs_perslid p,
prs_kenmerklink km
WHERE p.prs_perslid_key = km.prs_link_key
AND km.prs_kenmerk_key = c_employeetype_key
AND p.prs_perslid_key = perslid_key;
IF (v_count = 0)
THEN
---- Nog geen type --> maak aan (waarde: werknemertype)
INSERT INTO prs_kenmerklink
(prs_link_key,
prs_kenmerklink_niveau,
prs_kenmerk_key,
prs_kenmerklink_waarde
)
VALUES (perslid_key,
'P',
c_employeetype_key,
(SELECT fac_usrdata_key
FROM fac_usrdata
WHERE fac_usrtab_key = c_usrtab_employeetype_key
AND fac_usrdata_upper = werknemertype)
);
IF v_validtype
AND logstr IS NOT NULL AND logtype IS NOT NULL
THEN
fac.imp_writelog (p_import_key,
UPPER (logtype),
logstr || '. Naam: ' || perslid_naam,
'Type ' || werknemertype || ' aangemaakt');
END IF;
ELSE
-- Al een type gedefinieerd --> dat wordt dan werknemertype
SELECT prs_kenmerklink_key
INTO v_prs_kenmerklink_key
FROM prs_perslid p,
prs_kenmerklink km
WHERE p.prs_perslid_key = km.prs_link_key
AND km.prs_kenmerk_key = c_employeetype_key
AND p.prs_perslid_key = perslid_key;
UPDATE prs_kenmerklink
SET prs_kenmerklink_waarde = (SELECT fac_usrdata_key
FROM fac_usrdata
WHERE fac_usrtab_key = c_usrtab_employeetype_key
AND fac_usrdata_upper = werknemertype)
WHERE prs_kenmerklink_key = v_prs_kenmerklink_key;
IF v_validtype
AND logstr IS NOT NULL AND logtype IS NOT NULL
THEN
fac.imp_writelog (p_import_key,
UPPER (logtype),
logstr || '. Naam: ' || perslid_naam,
'Type gewijzigd naar ' || werknemertype);
END IF;
END IF;
EXCEPTION
WHEN OTHERS
THEN
fac.imp_writelog (p_import_key,
'W',
perslid_naam || ':',
'Fout bij toevoegen/wijzigen werknemertype');
END;
PROCEDURE uwva_set_flexveld(perslid_key IN NUMBER, perslid_naam IN VARCHAR2, flexkey IN NUMBER, flexval IN VARCHAR2)
AS
BEGIN
v_errormsg := perslid_naam || ': Fout bij toevoegen/wijzigen flexveld (key/waarde: '
|| flexkey || '/' || flexval || ')';
-- Bestaat flexkenmerk?
SELECT COUNT(*)
INTO v_count
FROM prs_kenmerk
WHERE prs_kenmerk_key = flexkey;
IF (v_count = 0)
THEN
fac.imp_writelog (p_import_key,
'W',
'Onbekend flexkenmerk met key ' || flexkey,
'Graag aanmaken');
RETURN;
END IF;
-- Kijk of flexveld al is gedefinieerd voor perslid
SELECT COUNT(*)
INTO v_count
FROM prs_kenmerklink
WHERE prs_kenmerk_key = flexkey
AND prs_link_key = perslid_key;
IF (v_count = 0)
THEN
BEGIN
v_errormsg := perslid_naam || ': Fout bij toevoegen flexveld (key/waarde: '
|| flexkey || '/' || flexval || ')';
-- Flexveld nog niet gevuld --> maak aan (waarde: flexval)
INSERT INTO prs_kenmerklink
(prs_link_key,
prs_kenmerklink_niveau,
prs_kenmerk_key,
prs_kenmerklink_waarde
)
VALUES (perslid_key,
'P',
flexkey,
flexval
);
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := 'ins_flex: (ORACLE error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'W',
v_errormsg,
v_errorhint);
END;
ELSE
BEGIN
v_errormsg := perslid_naam || ': Fout bij wijzigen flexveld (key/waarde: '
|| flexkey || '/' || flexval || ')';
-- Flexveld al gevuld --> overschrijven
SELECT prs_kenmerklink_key
INTO v_prs_kenmerklink_key
FROM prs_kenmerklink
WHERE prs_kenmerk_key = flexkey
AND prs_link_key = perslid_key;
UPDATE prs_kenmerklink
SET prs_kenmerklink_waarde = flexval
WHERE prs_kenmerklink_key = v_prs_kenmerklink_key;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := 'upd_flex: (ORACLE error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'W',
v_errormsg,
v_errorhint);
END;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 130);
v_errorhint := 'set_flex: (ORACLE error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'W',
v_errormsg,
v_errorhint);
END;
PROCEDURE uwva_upsert_wp(in_perslid_key IN NUMBER,
in_ruimte_key IN NUMBER, in_ruimte_nr IN VARCHAR2,
in_wp_oud_key IN NUMBER)
AS
BEGIN
-- Persoon krijgt wp op fictieve of echte ruimte.
-- (Nieuwe werkplek aanmaken, eventuele oude wp daarna verwijderen)
v_errormsg := 'Fout bij bepalen volgnummer nieuwe werkplek in ruimte ' || in_ruimte_nr;
-- UWVA#21256: De werkplekvolgnummers worden hoger dan past in prs_werkplek_volgnr.
-- Voortaan dus het laagste beschikbare volgnummer gebruiken.
SELECT COALESCE (MIN (pw1.prs_werkplek_volgnr), 0) + 1
INTO v_werkplek_volgnr
FROM prs_werkplek pw1
WHERE pw1.prs_alg_ruimte_key = in_ruimte_key
AND NOT EXISTS
(SELECT 1
FROM prs_werkplek pw2
WHERE pw2.prs_alg_ruimte_key = pw1.prs_alg_ruimte_key
AND pw2.prs_werkplek_volgnr = pw1.prs_werkplek_volgnr + 1);
v_errormsg := 'Fout bij toevoegen nieuwe werkplek in ruimte ' || in_ruimte_nr;
INSERT INTO prs_werkplek (prs_werkplek_module,
prs_werkplek_volgnr,
prs_werkplek_omschrijving,
prs_werkplek_virtueel,
prs_alg_ruimte_key)
VALUES ('PRR',
v_werkplek_volgnr,
'',
0,
in_ruimte_key)
RETURNING prs_werkplek_key
INTO v_new_werkplek_key;
--fac.imp_writelog (p_import_key, 'D',
-- 'in_perslid_key/in_ruimte_key/in_wp_oud_key'
-- || '/' || in_perslid_key
-- || '/' || in_ruimte_key
-- || '/' || in_wp_oud_key,
-- 'upsert: Nieuwe wp #'||v_new_werkplek_key||' ('
-- ||'PRR, '||v_werkplek_volgnr||', ,0 , '||in_ruimte_key||')'
-- );
--UWVA#21256: ABS-werkplek heeft /altijd/ volgnr 2. (Da's hoger dan de Vinder-import (die heeft 3 en
-- 4 gebruikt), maar laat volgnr 1 over om met de hand een hoofdwerkplek in te stellen
IF (in_wp_oud_key IS NOT NULL)
THEN
-- Update
v_errormsg := 'Fout bij verplaatsen persoon naar nieuwe werkplek in ruimte ' || in_ruimte_nr;
UPDATE prs_perslidwerkplek
SET prs_perslidwerkplek_volgnr = 2,
prs_werkplek_key = v_new_werkplek_key
WHERE prs_werkplek_key = in_wp_oud_key
AND prs_perslid_key = in_perslid_key;
v_errormsg := 'Fout bij verwijderen oude werkplek (' || in_wp_oud_key || ')';
DELETE FROM prs_werkplek
WHERE prs_werkplek_key = in_wp_oud_key;
--fac.imp_writelog (p_import_key, 'D',
-- 'in_perslid_key/in_ruimte_key/in_wp_oud_key'
-- || '/' || in_perslid_key
-- || '/' || in_ruimte_key
-- || '/' || in_wp_oud_key,
-- 'upsert: pwp bijgewerkt ('
-- ||'volgnr='||v_pwp_volgnr||', wp_key='||v_new_werkplek_key||'), '
-- || 'wp #'||in_wp_oud_key||' verwijderd'
-- );
ELSE
-- Insert
v_errormsg := 'Fout bij koppelen persoon aan nieuwe werkplek in ruimte ' || in_ruimte_nr || '.';
INSERT INTO prs_perslidwerkplek ( prs_perslid_key,
prs_werkplek_key,
prs_perslidwerkplek_bezetting,
prs_perslidwerkplek_volgnr)
VALUES (in_perslid_key, v_new_werkplek_key, 100, 2);
--fac.imp_writelog (p_import_key, 'D',
-- 'in_perslid_key/in_ruimte_key/in_wp_oud_key'
-- || '/' || in_perslid_key
-- || '/' || in_ruimte_key
-- || '/' || in_wp_oud_key,
-- 'upsert: Nieuwe pwp ('
-- ||in_perslid_key||', '||v_new_werkplek_key||', 100, '||v_pwp_volgnr||')'
-- );
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 130);
fac.imp_writelog (p_import_key,
'W',
v_errormsg
|| ' set_wp: (ORACLE error ' || oracle_err_num
|| '/' || oracle_err_mes
|| ')',
v_errorhint
|| '/' || in_perslid_key
|| '/' || in_ruimte_key
|| '/' || in_wp_oud_key
);
END;
BEGIN
-- Rapportlogs van meer dan een maand geleden wegdoen
-- Klopt de eigen tabel Werknemertype?
SELECT COUNT (fac_usrdata_key)
INTO et_check
FROM fac_usrdata
WHERE fac_usrtab_key = c_usrtab_employeetype_key
AND fac_usrdata_upper IN ('C', 'I', 'E', 'F', 'D', 'K', 'W');
IF et_check != 6
THEN
fac.imp_writelog (p_import_key,
'W',
'Gebruikerstabel werknemertype is onvolledig',
'$Revision$'
);
END IF;
-- Init
SELECT MAX (fac_module_version)
INTO currentversion
FROM fac_module;
fac.imp_writelog (p_import_key,
'S',
'Facilitor ABS import versie '
|| currentversion,
'$Revision$'
);
-- Aantal potentieel matchbare personen in importbestand
SELECT COUNT ( DISTINCT(id) )
INTO v_perslid_count_imp
FROM uwva_imp_abs
WHERE SUBSTR(empnum, 1, 1) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W');
-- Aantal actieve, potentieel matchbare personen in Facilitor
-- (dus m<>t account en/of personeelsnummer en met een juist werknemertype)
-- (DECODE ivm vermijden deling door 0)
SELECT DECODE (COUNT (*), 0, 1, COUNT (*))
INTO v_perslid_count_fclt
FROM prs_perslid
WHERE ( prs_perslid_nr IS NOT NULL
OR prs_perslid_oslogin IS NOT NULL)
AND prs_perslid_verwijder IS NULL
AND uwva_abs.get_employeetype(p_import_key, prs_perslid_key, c_employeetype_key) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W');
-- v_perslid_count_fclt is heel klein (<<100) bij de initiele situatie, omdat dan nog vrijwel niemand een type heeft.
IF ( v_perslid_count_fclt < 100 )
THEN
-- Check of het importbestand wel geldig is, om narigheden te voorkomen.
SELECT COUNT(*)
INTO v_count
FROM imp_log
WHERE imp_log_applicatie = 'ABS'
AND imp_log_omschrijving = 'Ongeldig importbestand';
IF (v_count > 0)
THEN
fac.imp_writelog (p_import_key, 'S',
'Ongeldig importbestand bij initi<74>le import',
'Verwerking wordt afgebroken.'
);
RETURN;
ELSE
fac.imp_writelog (p_import_key, 'S',
'Initi<EFBFBD>le import',
'Controle aantal personen wordt overgeslagen.'
);
END IF;
ELSE
IF ( (100 * ABS (v_perslid_count_imp - v_perslid_count_fclt) / v_perslid_count_fclt ) > c_maxvariation )
THEN
fac.imp_writelog (p_import_key, 'W',
'Het verschil tussen de actieve personen ('
|| TO_CHAR (v_perslid_count_fclt)
|| ') en te importeren aantallen ('
|| TO_CHAR (v_perslid_count_imp)
|| ') is te groot',
'Zie Specificaties: De afwijking is teveel en bedraagt '
|| TO_CHAR (100 * ABS (v_perslid_count_fclt - v_perslid_count_imp) / v_perslid_count_fclt, '9999999D9')
|| '%.'
);
RETURN;
END IF;
END IF;
-- *** Personen zonder ABS-ID *****************************************************************
FOR rec_id IN c_prs_no_absid
LOOP
BEGIN
v_errormsg := 'Personen zonder ABS-ID';
v_prs_omschr := 'Achternaam/persoonsnr/login: '
|| rec_id.prs_perslid_naam
|| '/' || rec_id.prs_perslid_nr
|| '/' || rec_id.prs_perslid_oslogin;
IF (rec_id.prs_perslid_oslogin IS NULL AND rec_id.prs_perslid_nr IS NULL)
THEN
-- Geen account en personeelsnummer --> probleemgeval --> werknemertype = P
v_errormsg := 'Probleemgevallen';
--uwva_set_werknemertype(rec_id.prs_perslid_key,
-- rec_id.prs_perslid_naam || '/' || rec_id.prs_perslid_nr,
-- 'P',
-- 'Probleemgeval: geen account en personeelsnummer',
-- 'W');
fac.imp_writelog (p_import_key, 'W', 'ABS-ID: geen account en geen persoonsnr', v_prs_omschr);
ELSE
-- Account en/of personeelsnummer --> probeer te matchen
v_errorhint := 'Bepalen uniek persoon. ' || v_prs_omschr;
-- Komt account van deze persoon uniek voor in het importbestand?
-- Een persoon kan vaker in het importbestandvoorkomen, met alle gegevens behalve de rol hetzelfde.
-- Daarom SELECT DISTINCT op alle gegevens behalve rol!
SELECT COUNT(*)
INTO v_count
FROM (SELECT DISTINCT account, empnum, prefname, id
FROM uwva_imp_abs
WHERE account = rec_id.prs_perslid_oslogin);
-- Uniek account gevonden --> update persoon
IF (v_count = 1)
THEN
v_errorhint := 'Update ID (adhv account)';
SELECT DISTINCT account, empnum, prefname, id
INTO v_imp_account, v_imp_empnum, v_imp_prefname, v_imp_absid
FROM uwva_imp_abs
WHERE account = rec_id.prs_perslid_oslogin;
-- ABS-ID
uwva_set_flexveld(rec_id.prs_perslid_key, rec_id.prs_perslid_naam, c_absid_key, v_imp_absid);
fac.imp_writelog (p_import_key, 'I', 'ABS-ID ' || v_imp_absid || ' gevuld obv account', v_prs_omschr);
-- Geen account gevonden --> Komt personeelsnummer uniek voor in het importbestand?
ELSIF (v_count = 0)
THEN
SELECT COUNT(*)
INTO v_count
FROM (SELECT DISTINCT account, empnum, prefname, id
FROM uwva_imp_abs
WHERE empnum = rec_id.prs_perslid_nr OR empnum_noprefix = rec_id.prs_perslid_nr);
-- Uniek personeelsnummer gevonden --> is dat nummer ook uniek in Facilitor?
IF (v_count = 1)
THEN
SELECT COUNT(*)
INTO v_count
FROM prs_v_aanwezigperslid
WHERE prs_perslid_nr = rec_id.prs_perslid_nr;
-- Uniek personeelsnummer in zowel importbestand als Facilitor. It's a match! --> update persoon
IF (v_count = 1)
THEN
v_errorhint := 'Update ID (adhv pers#)';
SELECT DISTINCT account, empnum, prefname, id
INTO v_imp_account, v_imp_empnum, v_imp_prefname, v_imp_absid
FROM uwva_imp_abs
WHERE empnum = rec_id.prs_perslid_nr OR empnum_noprefix = rec_id.prs_perslid_nr;
-- ABS-ID
uwva_set_flexveld(rec_id.prs_perslid_key, rec_id.prs_perslid_naam, c_absid_key, v_imp_absid);
fac.imp_writelog (p_import_key, 'I', 'ABS-ID ' || v_imp_absid || ' gevuld obv personeelsnr', v_prs_omschr);
ELSE
fac.imp_writelog (p_import_key, 'W', 'ABS-ID: geen match', v_prs_omschr);
END IF;
END IF;
END IF;
END IF;
-- Elke c_commitbuffer regels committen
v_buffercount := v_buffercount + 1;
IF (v_buffercount >= c_commitbuffer)
THEN
COMMIT;
v_buffercount := 0;
END IF;
END;
END LOOP;
COMMIT;
-- *** Personen zonder werknemertype *************************************************************
-- Probeer werknemertype van mensen zonder type te achterhalen en updaten
-- Matching: op ABS-ID.
-- Personen in de database z<>nder ABS-ID, kunnen niet gematcht worden met de personen in het
-- importbestand. Deze personen dienen werknemertype P te krijgen, zodat ze handmatig nagelopen
-- kunnen worden.
-- (Personen z<>nder ABS-ID, zijn <20>f al van een type dat nagekeken moet worden (D, L, O, P, U, X, Z),
-- <20>f van type I, E, C, F of W(?) zodat ze automatisch verwijderd worden.)
FOR recl IN c_prs_no_type
LOOP
BEGIN
v_errormsg := 'Personen zonder type';
v_prs_omschr := 'Achternaam/persoonsnr/login/ABS-ID: '
|| recl.prs_perslid_naam
|| '/' || recl.prs_perslid_nr
|| '/' || recl.prs_perslid_oslogin
|| '/' || recl.absid;
IF (recl.absid IS NULL)
THEN
-- Geen ABS-ID --> probleemgeval --> werknemertype = P
v_errormsg := 'Probleemgevallen';
uwva_set_werknemertype(recl.prs_perslid_key,
recl.prs_perslid_naam || '/' || recl.prs_perslid_nr,
'P',
'Probleemgeval: geen ABS-ID',
'W');
ELSE
-- ABS-ID --> probeer te matchen
v_errorhint := 'Bepalen uniek persoon. ' || v_prs_omschr;
-- Komt ABS-ID van deze persoon uniek voor in het importbestand?
-- Een persoon kan vaker in het importbestandvoorkomen, met alle gegevens behalve de rol hetzelfde.
-- Daarom SELECT DISTINCT op ABS-ID en (omdat die ook uniek moet zijn) accountnaam!
SELECT COUNT(*)
INTO v_count
FROM (SELECT DISTINCT id,
account
FROM uwva_imp_abs
WHERE id = recl.absid );
-- Uniek ABS-ID gevonden --> is dat nummer ook uniek in Facilitor?
IF (v_count = 1)
THEN
SELECT COUNT(*)
INTO v_count
FROM prs_kenmerklink
WHERE prs_kenmerk_key = c_absid_key
AND prs_kenmerklink_waarde = recl.absid
AND prs_kenmerklink_verwijder IS NULL;
-- Uniek ABS-ID in zowel importbestand als Facilitor. It's a match! --> update persoon
IF (v_count = 1)
THEN
v_errorhint := 'Update type';
SELECT DISTINCT id,
employeetype
INTO v_imp_absid, v_imp_employeetype
FROM uwva_imp_abs
WHERE id = recl.absid;
-- Werknemertype
uwva_set_werknemertype(recl.prs_perslid_key,
recl.prs_perslid_naam || '/' || recl.prs_perslid_nr,
v_imp_employeetype,
v_errorhint,
'I');
-- Geen uniek ABS-ID in Facilitor! Kan dus niet zeker weten of gegevens in importbestand
-- wel voor deze persoon zijn... --> ERROR
ELSE
v_errorhint := 'Ander persoon met hetzelfde ABS-ID in Facilitor';
uwva_set_werknemertype(recl.prs_perslid_key,
recl.prs_perslid_naam || '/' || recl.prs_perslid_nr,
'P',
v_errorhint,
'W');
END IF;
-- ABS-ID niet gevonden --> Persoon komt niet in import voor, dus type kan niet bepaald worden --> type 'O'
ELSIF (v_count = 0)
THEN
v_errorhint := 'Persoon niet gevonden in importbestand';
uwva_set_werknemertype(recl.prs_perslid_key,
recl.prs_perslid_naam || '/' || recl.prs_perslid_nr,
'O',
v_errorhint || ', account/ABS-ID: '
|| recl.prs_perslid_oslogin || '/' || recl.absid,
'W');
-- ABS-ID komt meermalen voor en is dus NIET uniek! --> ERROR (type probleemgeval)
ELSE
v_errorhint := 'Kan personeelsnummer niet eenduidig bepalen in importbestand';
uwva_set_werknemertype(recl.prs_perslid_key,
recl.prs_perslid_naam || '/' || recl.prs_perslid_nr,
'P',
v_errorhint,
'W');
END IF;
END IF;
-- Elke c_commitbuffer regels committen
v_buffercount := v_buffercount + 1;
IF (v_buffercount >= c_commitbuffer)
THEN
COMMIT;
v_buffercount := 0;
END IF;
END;
END LOOP;
COMMIT;
-- *** Personen verwijderen die niet in het importbestand voorkomen *****************************
-- Delete
v_errormsg := 'Try to open cursor';
v_action := 'DELETE';
FOR rec_del IN c_prs_del
LOOP
BEGIN
v_errormsg := 'Verwijderen van de persoon is NIET gelukt';
v_prs_omschr := 'Achternaam/persoonsnr/login/ABS-ID: '
|| rec_del.prs_perslid_naam
|| '/' || rec_del.prs_perslid_nr
|| '/' || rec_del.prs_perslid_oslogin
|| '/' || rec_del.absid;
v_perslid_key := rec_del.prs_perslid_key;
BEGIN
v_errorhint := 'SP zoeken';
-- Zoek welk SP verantwoordelijk is voor deze persoon
-- Deze wordt gerapporteerd, zodat vertek kan worden afgehandeld
SELECT MIN (alg_gebouw_key)
INTO v_gebouw_key
FROM prs_v_werkplek_gegevens w,
prs_perslidwerkplek pw
WHERE w.prs_werkplek_key = pw.prs_werkplek_key
AND pw.prs_perslid_key = v_perslid_key;
fac.imp_writelog (p_import_key,
'R',
rec_del.prs_perslid_naam || '/' || rec_del.prs_perslid_nr,
v_gebouw_key
);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
END;
-- *** Budgethouderschap ***
v_errorhint := 'Budgethouderschap zoeken';
-- N.a.v. UWVA#16008: verwijder budgethouderschappen van persoon (budgethouderimport zou dit vanzelf weer moeten vullen).
-- Voor hoeveel kostenplaatsen is deze persoon budgethouder?
SELECT COUNT(*)
INTO v_count
FROM prs_kostenplaats
WHERE prs_perslid_key = rec_del.prs_perslid_key;
IF (v_count > 0)
THEN
v_errorhint := 'Budgethouderschap verwijderen';
UPDATE prs_kostenplaats
SET prs_perslid_key = NULL
WHERE prs_perslid_key = rec_del.prs_perslid_key;
fac.imp_writelog (p_import_key,
'W',
'Budgethouderschap van te verwijderen persoon ('||v_count||' stuks) vervallen.',
v_prs_omschr);
END IF;
-- *** Vervangers ***
v_errorhint := 'Vervangers zoeken';
-- N.a.v. UWVA#16617: koppelingen met vervangers dienen ook verwijderd te worden
SELECT COUNT(*)
INTO v_count
FROM prs_collega
WHERE prs_perslid_key = rec_del.prs_perslid_key
OR prs_perslid_key_alt = rec_del.prs_perslid_key;
IF (v_count > 0)
THEN
v_errorhint := 'Vervangers verwijderen';
DELETE FROM prs_collega
WHERE prs_perslid_key = rec_del.prs_perslid_key
OR prs_perslid_key_alt = rec_del.prs_perslid_key;
fac.imp_writelog (p_import_key,
'I',
'Te verwijderen persoon heeft vervanger(s). Koppeling(en) verwijderd.',
v_prs_omschr);
END IF;
-- *** Verplichtingen ***
v_errorhint := 'Verplichtingen zoeken';
SELECT COUNT (*)
INTO v_count
FROM (SELECT prs_perslid_key FROM prs_v_verplichting_refcheck
UNION ALL
SELECT cnt_prs_perslid_key prs_perslid_key
FROM cnt_v_aanwezigcontract
WHERE cnt_contract_status = 0 -- NIET Gesloten!
AND cnt_contract_looptijd_tot >= SYSDATE) vp
WHERE vp.prs_perslid_key = v_perslid_key;
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);
-- UWVA#41099: Oplossen "audit-problemen"
--DELETE FROM prs_perslid
-- WHERE prs_perslid_key = v_perslid_key;
PRS.delete_perslid (p_import_key, v_perslid_key);
fac.imp_writelog (p_import_key,
'I',
'Persoon verwijderd.',
v_prs_omschr);
ELSE
v_errorhint := 'Actuele verplichtingen zoeken';
-- Controleer of er ACTUELE verplichtingen zijn
SELECT COUNT (*)
INTO v_count
FROM (SELECT prs_perslid_key FROM prs_v_verplichting_keys
UNION ALL
SELECT cnt_prs_perslid_key prs_perslid_key
FROM cnt_v_aanwezigcontract
WHERE cnt_contract_status = 0 -- NIET Gesloten!
AND cnt_contract_looptijd_tot >= SYSDATE) vp
WHERE vp.prs_perslid_key = v_perslid_key;
IF v_count > 0
THEN
v_errorhint := 'Persoon inactief markeren';
-- Persoon inactief maken (alleen als nog niet inactief)
UPDATE prs_perslid
SET prs_perslid_naam = SUBSTR ('INACTIEF:'|| prs_perslid_naam, 1, 30),
prs_perslid_oslogin = NULL,
prs_perslid_oslogin2 = NULL
WHERE prs_perslid_key = v_perslid_key
AND prs_perslid_naam NOT LIKE 'INACTIEF:%';
-- UWVA#20219: 'Toon in gids' uitzetten, ook als persoon al inactief is
UPDATE prs_perslid
SET prs_perslid_ingids = NULL
WHERE prs_perslid_key = v_perslid_key;
fac.imp_writelog
(p_import_key,
'I',
'Persoon als INACTIEF gemarkeerd of was al INACTIEF gemarkeerd.',
v_prs_omschr);
-- UWA#249970: notificatie naar budgethouder
SELECT k.prs_perslid_key
INTO v_budgh_key
FROM prs_perslid p,
prs_afdeling a,
prs_kostenplaats k
WHERE a.prs_afdeling_key = p.prs_afdeling_key
AND k.prs_kostenplaats_key = a.prs_kostenplaats_key
AND p.prs_perslid_key = v_perslid_key;
fac.putnotificationsrtprio (88602, -- pfrom (UWVA#37656: Met usesenderasreplyto=true haalt psender niets uit en moet pfrom zijn gevuld: 88602=_EMAIL-user)
v_budgh_key, -- pto
'CUST21', -- pcode
1675, -- pref (naar UWVA_V_RAP_UITDIENST)
NULL, -- poptmessage
NULL, -- poptstatus
NULL, -- poptemail
NULL, -- poptmobile
v_perslid_key, -- pxref
2, -- pprio
'infobeheer.fi@uwv.nl'); -- psender
fac.trackaction ('PRSUPD', v_perslid_key, NULL, NULL, 'Persoon INACTIEF');
ELSE
BEGIN
v_errorhint := 'Persoon logisch verwijderen';
UPDATE prs_perslid
SET prs_perslid_verwijder = SYSDATE
WHERE prs_perslid_key = v_perslid_key;
fac.imp_writelog (p_import_key,
'I',
'Persoon ge<67>nactiveerd.',
v_prs_omschr);
fac.trackaction ('PRSDEL', v_perslid_key, NULL, NULL, NULL);
EXCEPTION
WHEN OTHERS
THEN
-- Kennelijk heeft de persoon toch ernstige verplichtingen
v_errorhint := 'Persoon heeft nog (max. '
|| TO_CHAR (v_count)
|| ') verplichtingen. ' || v_prs_omschr;
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 (DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, 1, 100 )
|| '|'
|| SUBSTR (SQLERRM, 1, 100);
v_errormsg := '(ORACLE error '
|| oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
END LOOP;
COMMIT;
-- UWVA#22892: Eerst alle bewaarde mandaten (eigen tabel met key=3) en
-- usrrap-relaties (hidden kenmerk met key=1111) uit voorgaande
-- import verwijderen. Per persoon die deze run naar een andere
-- afdeling verhuist, worden deze dan weer records toegevoegd.
DELETE FROM fac_usrdata
WHERE fac_usrtab_key = 3;
DELETE FROM prs_kenmerklink
WHERE prs_kenmerklink_niveau = 'P' AND prs_kenmerk_key = 1111;
-- *** Update ***********************************************************************************
v_errormsg := 'Try to open cursor';
v_action := 'UPDATE';
FOR rec_upd IN c_prs_upd
LOOP
BEGIN
v_errormsg := 'Update init';
v_prs_omschr := 'Achternaam/persoonsnr/login/ABS-ID: '
|| rec_upd.prs_perslid_naam
|| '/' || rec_upd.prs_perslid_nr
|| '/' || rec_upd.prs_perslid_oslogin
|| '/' || rec_upd.id;
-- Init
v_update := TRUE;
v_prsMatched := FALSE;
v_afdeling_key := 0;
v_srtperslid_key := NULL;
v_perslid := NULL;
v_perslid_key := 0;
-- *** Matching ***********************************
-- NB: zie uitleg bij cursor
IF v_update
THEN
-- *** Matching op ABS-ID ***
v_errormsg := 'Uniek ABS-ID';
-- Check of ABS-ID wel uniek is in importbestand
-- Een persoon kan vaker in het importbestandvoorkomen, met alle gegevens behalve de rol hetzelfde.
-- Daarom SELECT DISTINCT op ABS-ID en (omdat die ook uniek moet zijn) accountnaam!
SELECT COUNT(*)
INTO v_count
FROM (SELECT DISTINCT id,
account
FROM uwva_imp_abs
WHERE id = rec_upd.id );
-- Niet uniek --> error
IF (v_count != 1)
THEN
v_errorhint := 'ABS-ID is niet uniek in importbestand. ' || v_prs_omschr;
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
v_update := FALSE;
-- Wel uniek --> komt het ook (uniek) voor in Facilitor?
ELSE
v_errormsg := 'Matching op ABS-ID';
-- Probeer persoon op ABS-ID te matchen
-- NB: dit doorzoekt alleen personen in Facilitor met een ABS-type, maar een persoon
-- met een ander type kan best deze ABS-ID hebben (bijv. O of P).
-- Type buiten beschouwing laten?
-- Extragratis bonus is om die persoon-met-een-ander type dan te rapporteren,
-- of als P te markeren.
SELECT COUNT(*)
INTO v_count
FROM prs_v_aanwezigperslid ap,
prs_kenmerklink km
WHERE km.prs_link_key = ap.prs_perslid_key
AND km.prs_kenmerk_key = c_absid_key
AND km.prs_kenmerklink_waarde = rec_upd.id
AND uwva_abs.get_employeetype(p_import_key, prs_perslid_key, c_employeetype_key)
IN ('C', 'I', 'E', 'F', 'D', 'K', 'W');
-- Komt niet voor --> INSERT
IF (v_count = 0)
THEN
v_aktie := 'INSERT';
-- Komt uniek voor --> match! --> UPDATE
ELSIF (v_count = 1)
THEN
v_errormsg := 'Gegevens ophalen o.b.v. ABS-ID';
SELECT ap.*
INTO v_perslid
FROM prs_v_aanwezigperslid ap,
prs_kenmerklink km
WHERE km.prs_link_key = ap.prs_perslid_key
AND km.prs_kenmerk_key = c_absid_key
AND km.prs_kenmerklink_waarde = rec_upd.id
AND uwva_abs.get_employeetype(p_import_key, prs_perslid_key, c_employeetype_key)
IN ('C', 'I', 'E', 'F', 'D', 'K', 'W');
v_aktie := 'UPDATE';
-- ABS-ID gevonden. Klopt het type ook (of: nog)?
v_errormsg := 'Bepalen werknemertype';
v_perslid_type := uwva_abs.get_employeetype(p_import_key, v_perslid.prs_perslid_key, c_employeetype_key);
-- Als werknemertypes in ABS en Facilitor verschillen (maar wel beide C, I, E, F, D, K of W zijn),
-- dan type in Facilitor updaten.
IF (v_perslid_type != rec_upd.employeetype)
THEN
uwva_set_werknemertype(v_perslid.prs_perslid_key, rec_upd.prs_perslid_naam,
rec_upd.employeetype,
'Bijstellen werknemertype', 'I');
END IF;
-- Is niet uniek --> error
ELSE
v_errorhint := 'Kan ABS-ID niet eenduidig bepalen in Facilitor. ' || v_prs_omschr;
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
v_update := FALSE;
END IF; -- komt account (uniek) voor in FAC?
END IF; -- account uniek in ABS?
END IF;
-- *** Controle verplichte gegevens + ophalen extra informatie ***
v_errormsg := 'Ontbrekende of incorrecte verplichte gegevens. Persoon wordt overgeslagen.';
-- Controle: PRS_PERSLID_NAAM
IF v_update
AND rec_upd.prs_perslid_naam IS NULL
THEN
v_errorhint := 'Persoon heeft geen achternaam. Persoonsnummer/login/ABS-ID: '
|| rec_upd.prs_perslid_nr
|| '/' || rec_upd.prs_perslid_oslogin
|| '/' || rec_upd.id;
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
v_update := FALSE;
END IF;
---- Controle: PRS_PERSLID_OSLOGIN en PRS_PERSLID_NR
--IF v_update
-- AND rec_upd.prs_perslid_oslogin IS NULL
-- AND rec_upd.prs_perslid_nr IS NULL
--THEN
-- v_errorhint := 'Persoon heeft systeemaccount noch personeelsnummer. Achternaam: '
-- || rec_upd.prs_perslid_naam;
-- fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
-- v_update := FALSE;
--END IF;
-- Controle: PRS_AFDELING_NAAM
IF v_update
THEN
IF rec_upd.prs_afdeling_naam IS NULL
THEN
v_errorhint := 'Persoon heeft geen afdeling. ' || v_prs_omschr;
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
v_update := FALSE;
-- Check of afdelingscode wel 6 karakters lang is (ontbrekend voorloopnullen?)
ELSIF LENGTH(rec_upd.prs_afdeling_naam) != 6
THEN
v_errorhint := 'Afdeling moet 6 karakters lang zijn (' || rec_upd.prs_afdeling_naam || '). '
|| v_prs_omschr;
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
v_update := FALSE;
ELSE
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_upd.prs_afdeling_naam
AND prs_afdeling_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_errorhint := 'Afdeling ' || rec_upd.prs_afdeling_naam || ' bestaat niet. '
|| v_prs_omschr;
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
v_update := FALSE;
WHEN OTHERS
THEN
v_errorhint := 'Kan Afdeling ' || rec_upd.prs_afdeling_naam || ' niet eenduidig bepalen. '
|| v_prs_omschr;
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
v_update := FALSE;
END;
END IF;
END IF;
-- *** Controle niet-verplichte gegevens ***
-- Controle: PRS_SRTPERSLID_OMSCHRIJVING
IF v_update
THEN
-- Geen functie --> Geef standaardfunctie
IF rec_upd.prs_srtperslid_omschrijving IS NULL
THEN
v_errormsg := 'Functieomschrijving ontbreekt';
v_errorhint := 'Persoon heeft geen functieomschrijving. ' || v_prs_omschr
|| '. Persoon krijgt functie "' || c_functie_onbekend || '" toegewezen.';
fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
v_srtperslid_omschr := c_functie_onbekend;
ELSE
-- UWVA#20033: functienaam letterlijk overnemen uit ABS (afgezien van voor- en naloopspaties)
v_srtperslid_omschr := RTRIM (rec_upd.prs_srtperslid_omschrijving);
END IF;
BEGIN
v_srtperslid_upper := UPPER (v_srtperslid_omschr);
-- Bepaal de key van de functie
SELECT prs_srtperslid_key, prs_srtperslid_omschrijving
INTO v_srtperslid_key, v_srtperslid_db_oms
FROM prs_srtperslid
WHERE prs_srtperslid_upper = v_srtperslid_upper
AND prs_srtperslid_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_errormsg := 'prs_srtperslid ' || v_srtperslid_omschr || ' bestaat niet';
-- Functie bestaat kennelijk niet, maak 'm maar aan
INSERT INTO prs_srtperslid
(prs_srtperslid_omschrijving)
VALUES (v_srtperslid_omschr)
RETURNING prs_srtperslid_key
INTO v_srtperslid_key;
WHEN OTHERS
THEN
v_errorhint := 'Functie ' || v_srtperslid_omschr
|| ' kan niet bepaald worden. ' || v_prs_omschr;
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
v_update := FALSE;
END;
END IF;
-- Controle: PRS_PERSLID_EMAIL
IF v_update
AND rec_upd.email IS NULL
THEN
v_errormsg := 'E-mailadres ontbreekt';
v_errorhint := v_prs_omschr;
--fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
END IF;
---- Controle: PRS_PERSLID_MOBIEL
--IF v_update
-- AND rec_upd.prs_perslid_mobiel IS NOT NULL
-- AND rec_upd.prs_perslid_mobiel NOT LIKE '00316________'
--THEN
-- v_errormsg := 'Incorrect formaat mobielnr (' || rec_upd.prs_perslid_mobiel || ')';
-- v_errorhint := v_prs_omschr;
-- fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
--END IF;
-- Kan persoon gereactiveerd worden of is er al een persoon met hetzelfde ABS-ID actief
IF v_update
AND v_aktie = 'UPDATE'
-- UWVA#27192: logisch verwijderde personen worden niet gereactiveerd, alleen inactieve personen ("INACTIEF: ...")
AND v_perslid.prs_perslid_upper LIKE 'INACTIEF%'
--AND v_perslid.prs_perslid_verwijder IS NOT NULL
THEN
BEGIN
-- Is er al een actieve persoon met dezelfde ABS-ID
SELECT COUNT (ap.prs_perslid_key)
INTO v_prs_key_cnt
FROM prs_v_aanwezigperslid ap,
prs_kenmerklink km
WHERE km.prs_link_key = ap.prs_perslid_key
AND km.prs_kenmerk_key = c_absid_key
AND km.prs_kenmerklink_waarde = rec_upd.id
AND ap.prs_perslid_key != v_perslid.prs_perslid_key;
IF v_prs_key_cnt > 0
THEN
-- (UWVA#13270)
-- Waarde(n) gevonden: Er is al een actieve persoon met dezelfde ABS-ID gevonden: Niet updaten!!!
--v_errormsg := 'Persoon hoeft niet gereactiveerd te worden; prs_perslid_nr: ' || rec_upd.prs_perslid_nr;
--v_errorhint := 'Er bestaat al een persoon met dezelfde persooneelsnummer die actief is, GEEN ACTIE NODIG; personeelsnummer: ' || rec_upd.prs_perslid_nr;
--fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
v_update := FALSE;
ELSE
-- Kennelijk is er geen persoon gevonden met dezelfde ABS-ID
-- Persoon kan gereactiveerd worden (naam en oslogin herstellen wordt bij UPDATE statement verderop gedaan)
-- v_update := TRUE;
-- UWVA#20219: bij inactiveren wordt persoon niet meer getoond in gids. Bij reactiveren dus weer wel.
v_errormsg := 'Persoon reactiveren: tonen in gids';
UPDATE prs_perslid
SET prs_perslid_ingids = DECODE (rec_upd.employeetype, 'K', NULL, 1)
WHERE prs_perslid_key = v_perslid.prs_perslid_key;
v_errormsg := 'Persoon wordt gereactiveerd.';
fac.imp_writelog (p_import_key, 'I', v_errormsg, v_prs_omschr);
END IF;
EXCEPTION
WHEN OTHERS
THEN
v_update := FALSE;
v_errorhint := 'Fout in het vinden aantal actieve personen. ' || v_prs_omschr;
END;
END IF;
-- *** Daadwerkelijk insert/update prs_perslid ***
IF v_update
THEN
BEGIN
-- UWVA#60530: Strippen (spouse)prefix uit prefname!
IF SUBSTR (rec_upd.prs_perslid_naam, 1, COALESCE (LENGTH (rec_upd.prs_perslid_tussenvoegsel), 60)) = rec_upd.prs_perslid_tussenvoegsel
THEN
v_achternaam := SUBSTR (TRIM (SUBSTR (rec_upd.prs_perslid_naam, LENGTH (rec_upd.prs_perslid_tussenvoegsel) + 1)), 1, 60);
ELSE
v_achternaam := SUBSTR (rec_upd.prs_perslid_naam, 1, 60);
END IF;
IF v_aktie = 'INSERT'
THEN
v_errormsg := 'Persoon kan niet worden toegevoegd';
-- Bestaat dit account al?
SELECT COUNT ( * )
INTO v_count
FROM prs_perslid
WHERE prs_perslid_oslogin = rec_upd.prs_perslid_oslogin;
-- Ja --> error
IF (v_count > 0)
THEN
v_errorhint := 'Account bestaat al.';
v_update := FALSE;
fac.imp_writelog (
p_import_key,
'W',
v_errormsg,
'Persoon toevoegen: account '
|| rec_upd.prs_perslid_oslogin
|| ' bestaat al. '
|| v_prs_omschr
);
-- Nee --> toevoegen
ELSE
-- JvdM_14-10-10: "In het sheet met specificaties staat bij een aantal velden,
-- waaronder TELNO, MOBNR, FAXNR, ALTACCNT, g<><67>n actie vermeld. Hiermee
-- is bedoeld dat deze velden niet gebruikt moeten worden en dus niet voor
-- mutaties in Facilitor mogen dienen."
-- UWVA#27483: gebruik/formatteer e-mail adres volgens schrijfwijzer
-- UWVA#30417: 'prs_perslid_ingids' voor K(etenpartners) initieel onzichtbaar
INSERT INTO prs_perslid (prs_perslid_naam,
prs_perslid_tussenvoegsel,
prs_perslid_voorletters,
prs_perslid_voornaam,
--prs_perslid_telefoonnr,
--prs_perslid_mobiel,
prs_perslid_nr,
prs_perslid_titel,
prs_perslid_email,
prs_perslid_oslogin,
prs_perslid_geslacht,
prs_perslid_ingids,
prs_srtperslid_key,
prs_afdeling_key)
VALUES (v_achternaam,
rec_upd.prs_perslid_tussenvoegsel,
rec_upd.prs_perslid_voorletters,
rec_upd.prs_perslid_voornaam,
--rec_upd.prs_perslid_telefoonnr,
--rec_upd.prs_perslid_mobiel,
rec_upd.prs_perslid_nr,
rec_upd.prs_perslid_titel,
rec_upd.sw_email, -- Volgens schrijfwijzer
rec_upd.prs_perslid_oslogin,
rec_upd.prs_perslid_geslacht,
DECODE (rec_upd.employeetype, 'K', NULL, 1),
v_srtperslid_key,
v_afdeling_key)
RETURNING prs_perslid_key INTO v_perslid_key;
-- *** Employee type ***
uwva_set_werknemertype (
v_perslid_key,
rec_upd.prs_perslid_naam
|| '/'
|| rec_upd.prs_perslid_nr,
rec_upd.employeetype,
NULL,
NULL
);
-- *** ABS-ID ***
uwva_set_flexveld (
v_perslid_key,
rec_upd.prs_perslid_naam
|| '/'
|| rec_upd.prs_perslid_nr,
c_absid_key,
rec_upd.id
);
fac.imp_writelog (p_import_key,
'I',
'Persoon toegevoegd.',
v_prs_omschr);
END IF;
ELSE
v_errormsg := 'Persoon kan niet worden gewijzigd';
v_errorhint := 'Verwijderen budgetten en mandaten.';
-- Voor later gebruik bewaren (specifiek voor toevoegen werkplek)
-- (v_perslid_key wordt bij een nieuw persoon met bovenstaande INSERT gevuld
-- en wordt bij toevoegen werkplek gebruikt)
v_perslid_key := v_perslid.prs_perslid_key;
-- UWVA#687: Mandaten vervallen indien persoon naar andere afdeling verhuist
SELECT prs_afdeling_key
INTO o_afdeling_key
FROM prs_perslid
WHERE prs_perslid_key = v_perslid_key;
IF o_afdeling_key != v_afdeling_key
THEN
-- Voor hoeveel kostenplaatsen is deze budgethouder?
SELECT COUNT ( * )
INTO l_nrkps
FROM prs_kostenplaats
WHERE prs_perslid_key = v_perslid_key;
IF l_nrkps > 0
THEN
UPDATE prs_kostenplaats
SET prs_perslid_key = NULL
WHERE prs_perslid_key = v_perslid_key;
fac.imp_writelog (
p_import_key,
'I',
'Budgethouderschap van persoon ('
|| l_nrkps
|| ' stuks) vervallen vanwege afdelingswijziging.',
v_prs_omschr
);
END IF;
-- En verwijder ook alle toegekende mandaten
SELECT COUNT ( * )
INTO l_nrkps
FROM prs_perslidkostenplaats
WHERE prs_perslid_key = v_perslid_key;
IF l_nrkps > 0
THEN
-- UWVA#22892: Bewaar -deze ABS-import!- verwijderde mandaten tbv.
-- CUST13-notificatie en leg relatie van persoon naar
-- rapport met deze verwijderde mandaten.
INSERT INTO fac_usrdata (fac_usrtab_key,
fac_usrdata_code,
fac_usrdata_omschr,
fac_usrdata_volgnr,
fac_usrdata_prijs)
SELECT 3, -- Bewaarde mandaten
TO_CHAR (pk.prs_perslid_key)
|| '-'
|| TO_CHAR (COALESCE (pk.prs_kostenplaats_key, 0)),
TO_CHAR (o_afdeling_key), -- Oude afdeling
COALESCE (pk.prs_perslidkostenplaats_boeken, 0),
COALESCE (pk.prs_perslidkostenplaats_inzage, 0)
FROM prs_perslidkostenplaats pk,
prs_kostenplaats k
WHERE pk.prs_perslid_key = v_perslid_key
AND pk.prs_kostenplaats_key =
k.prs_kostenplaats_key(+)
ORDER BY pk.prs_perslid_key,
pk.prs_kostenplaats_key;
INSERT INTO prs_kenmerklink (prs_link_key,
prs_kenmerklink_niveau,
prs_kenmerk_key,
prs_kenmerklink_waarde)
VALUES (v_perslid_key,
'P',
1111, -- usrrap-relatie
'555'); -- UWVA_V_RAP_GESCHOOND_MANDAAT-key
DELETE FROM prs_perslidkostenplaats
WHERE prs_perslid_key = v_perslid_key;
fac.imp_writelog (
p_import_key,
'I',
'Mandaten van persoon ('
|| l_nrkps
|| ' stuks) vervallen vanwege afdelingswijziging.',
v_prs_omschr
);
END IF;
END IF;
v_errorhint := 'Bijwerken persoon.';
-- Kijk of persoon bijgewerkt moet worden
-- JvdM_14-10-10: "In het sheet met specificaties staat bij een aantal velden,
-- waaronder TELNO, MOBNR, FAXNR, ALTACCNT, g<><67>n actie vermeld. Hiermee
-- is bedoeld dat deze velden niet gebruikt moeten worden en dus niet voor
-- mutaties in Facilitor mogen dienen."
-- UWVA#19010: e-mail updaten als leeg in Facilitor (alleen aanvullen dus)!
-- UWVA#19189: voornaam updaten als leeg in Facilitor (alleen aanvullen dus)!
-- UWVA#19957: voornaam overschrijven als gevuld in ABS (geslacht ook)!
IF (v_perslid.prs_perslid_naam != v_achternaam
OR COALESCE (v_perslid.prs_perslid_nr, '-') !=
COALESCE (rec_upd.prs_perslid_nr, '-')
OR COALESCE (v_perslid.prs_perslid_oslogin, '-') !=
COALESCE (rec_upd.prs_perslid_oslogin, '-')
OR COALESCE (v_perslid.prs_perslid_tussenvoegsel, '-') !=
COALESCE (rec_upd.prs_perslid_tussenvoegsel, '-')
OR COALESCE (v_perslid.prs_perslid_voorletters, '-') !=
COALESCE (rec_upd.prs_perslid_voorletters, '-')
OR COALESCE (v_perslid.prs_perslid_voornaam, '-') !=
COALESCE (rec_upd.prs_perslid_voornaam, '-')
OR COALESCE (v_perslid.prs_perslid_titel, '-') !=
COALESCE (rec_upd.prs_perslid_titel, '-')
OR COALESCE (v_perslid.prs_perslid_email, '-') !=
COALESCE (v_perslid.prs_perslid_email,
rec_upd.email,
'-')
OR COALESCE (v_perslid.prs_perslid_geslacht, -1) !=
COALESCE (rec_upd.prs_perslid_geslacht, -1)
OR COALESCE (v_perslid.prs_srtperslid_key, 0) !=
COALESCE (v_srtperslid_key, 0)
OR v_perslid.prs_afdeling_key != v_afdeling_key
OR v_perslid.prs_perslid_verwijder IS NOT NULL)
THEN
BEGIN
-- Moet het account gewijzigd worden?
-- #UWVA20003: als v_perslid.- of rec_upd.prs_perslid_oslogin is NULL, was
-- onderstaande conditie altijd FALSE en werd account dus niet bijgewerkt.
-- Concateneren met een loze string lost dit op.
IF (v_perslid.prs_perslid_oslogin || '-' !=
rec_upd.prs_perslid_oslogin || '-')
THEN
v_errorhint := 'Bijwerken account.';
-- Ja --> Bestaat dit account al?
SELECT COUNT ( * )
INTO v_count
FROM prs_perslid
WHERE prs_perslid_oslogin =
rec_upd.prs_perslid_oslogin;
IF (v_count = 0)
THEN
-- Nee --> Update
v_errorhint := 'Update account.';
UPDATE prs_perslid
SET prs_perslid_oslogin =
rec_upd.prs_perslid_oslogin
WHERE prs_perslid_key = v_perslid_key;
ELSE
-- Ja --> error
v_errorhint := 'Dubbel account.';
v_update := FALSE;
fac.imp_writelog (
p_import_key,
'W',
v_errormsg,
'Account bijwerken: '
|| rec_upd.prs_perslid_oslogin
|| ' bestaat al. Werknemertype P wordt gezet. '
|| v_prs_omschr
);
uwva_set_werknemertype (
v_perslid_key,
rec_upd.prs_perslid_naam
|| '/'
|| rec_upd.prs_perslid_nr,
'P',
NULL,
NULL
);
END IF;
END IF;
-- UWVA#19010: e-mail updaten als leeg in Facilitor (alleen aanvullen dus)!
-- UWVA#19957: voornaam overschrijven als gevuld in ABS (geslacht ook)!
-- UWVA#23124: kwaliteit gegevens in ABS is dusdanig dat ABS voor alles
-- leidend is, muv e-mail. Dat wordt soms handmatig aangepast in Facilitor,
-- dus alleen vullen, niet overschrijven.
-- Personen die al bestonden en veranderd zijn in Ketenpartner (K) krijgen geen vinkje ingids.
UPDATE prs_perslid
SET prs_perslid_naam = v_achternaam,
prs_perslid_nr = rec_upd.prs_perslid_nr,
prs_perslid_tussenvoegsel = rec_upd.prs_perslid_tussenvoegsel,
prs_perslid_voorletters = rec_upd.prs_perslid_voorletters,
prs_perslid_voornaam = rec_upd.prs_perslid_voornaam,
prs_perslid_titel = rec_upd.prs_perslid_titel,
prs_perslid_email = COALESCE (prs_perslid_email, rec_upd.email),
prs_perslid_geslacht = rec_upd.prs_perslid_geslacht,
prs_perslid_ingids = DECODE (rec_upd.employeetype, 'K', NULL, 1),
prs_srtperslid_key = v_srtperslid_key,
prs_afdeling_key = v_afdeling_key,
prs_perslid_verwijder = NULL
WHERE prs_perslid_key = v_perslid_key;
-- *** Employee type ***
uwva_set_werknemertype (
v_perslid_key,
rec_upd.prs_perslid_naam
|| '/'
|| rec_upd.prs_perslid_nr,
rec_upd.employeetype,
NULL,
NULL
);
EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN
v_update := FALSE;
fac.imp_writelog (
p_import_key,
'W',
v_errormsg,
'Account '
|| rec_upd.prs_perslid_oslogin
|| ' bestaat al. Werknemertype P wordt gezet. '
|| v_prs_omschr
);
uwva_set_werknemertype (
v_perslid_key,
rec_upd.prs_perslid_naam
|| '/'
|| rec_upd.prs_perslid_nr,
'P',
NULL,
NULL
);
WHEN OTHERS
THEN
v_update := FALSE;
fac.imp_writelog (
p_import_key,
'W',
v_errormsg,
'Fout bij updaten persoon' || v_prs_omschr
);
END;
END IF;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
'update: '
|| SUBSTR (DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, 1, 100);
v_errorhint :=
'(ORACLE error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| '). '
|| v_prs_omschr;
v_update := FALSE;
fac.imp_writelog (p_import_key,
'W',
v_errormsg,
v_errorhint);
END;
END IF;
-- *** Rol(len) ***************************************************************************
--v_update := FALSE;--TODO
IF v_update
THEN
BEGIN
-- *** Profiel/Limiet ***********************
-- Kan ik uit de rol(len) die deze persoon heeft een profiel/limiet afleiden?
-- (i.e. bepaal aantal rollen van persoon dat naar een profiel verwijst)
v_errormsg := 'Aantal profielen bepalen';
SELECT COUNT(*)
INTO v_count
FROM uwva_imp_abs uia,
prs_kenmerklink km,
uwva_provisioning up,
fac_profiel fp
WHERE fp.fac_profiel_key = up.fac_profiel_key
AND up.uwva_rol_omschr = uia.grpfname
AND km.prs_link_key = v_perslid_key
AND km.prs_kenmerk_key = c_absid_key
AND uia.id = km.prs_kenmerklink_waarde;
-- Ja --> bepaal profiel met hoogste limiet
IF (v_count > 0)
THEN
v_errormsg := 'Rol->Profiel+Limiet';
SELECT fac_profiel_key, fac_profiel_omschrijving, limiet
INTO v_profiel_key, v_profiel_omschr, v_limiet
FROM ( SELECT DISTINCT
fp.fac_profiel_key,
fp.fac_profiel_omschrijving,
COALESCE (fp.fac_profiel_limiet,
(SELECT MAX (fpw.fac_profielwaarde_limiet)
FROM fac_profielwaarde fpw
WHERE fp.fac_profiel_key = fpw.fac_profiel_key))
limiet
FROM uwva_imp_abs uia,
prs_kenmerklink km,
uwva_provisioning up,
fac_profiel fp
WHERE fp.fac_profiel_key = up.fac_profiel_key
AND up.uwva_rol_omschr = uia.grpfname
AND km.prs_link_key = v_perslid_key
AND km.prs_kenmerk_key = c_absid_key
AND uia.id = km.prs_kenmerklink_waarde
ORDER BY limiet DESC)
WHERE ROWNUM = 1;
v_errormsg := 'Wijzigen limiet';
UPDATE prs_perslid
SET fac_profiel_key = v_profiel_key
WHERE prs_perslid_key = v_perslid_key;
fac.imp_writelog (p_import_key,
'I',
v_prs_omschr,
'Profiel gewijzigd: '||v_profiel_omschr||' ('||v_profiel_key||'): E '||v_limiet||',-');
-- Nee --> Verwijder eventueel aanwezige profiel(limiet)en
ELSE
v_errormsg := 'Verwijderen profiel(-limiet)';
UPDATE prs_perslid
SET fac_profiel_key = NULL
WHERE prs_perslid_key = v_perslid_key;
--fac.imp_writelog (p_import_key,
-- 'I',
-- v_prs_omschr,
-- 'Profiel verwijderd.');
END IF; -- v_count>0
-- *** Authorisatiegroepen *********************
-- Verwijder alle rechten, die iemand volgens ABS niet heeft.
FOR rec_groep IN c_groep (rec_upd.id, v_perslid_key)
LOOP
v_errormsg := 'Rol->Authgroep verwijderen';
DELETE FROM fac_gebruikersgroep
WHERE fac_groep_key = rec_groep.fac_groep_key
AND prs_perslid_key = v_perslid_key;
fac.imp_writelog (p_import_key,
'I',
v_prs_omschr,
'Groep verwijderd: ' || rec_groep.fac_groep_omschrijving||' (#'||rec_groep.fac_groep_key||')');
END LOOP;
-- Voeg alle rechten-volgens-ABS toe, die iemand nog niet heeft.
FOR rec_rol IN c_rol (rec_upd.id, v_perslid_key)
LOOP
v_errormsg := 'Rol->Authgroep toevoegen';
INSERT INTO fac_gebruikersgroep
(fac_groep_key, prs_perslid_key)
VALUES (rec_rol.fac_groep_key, v_perslid_key);
fac.imp_writelog (p_import_key,
'I',
v_prs_omschr,
'Groep toegevoegd: ' || rec_rol.fac_groep_omschrijving||' (#'||rec_rol.fac_groep_key||')');
END LOOP;
-- Iedereen uit ABS met een oslogin moet ook groep _default krijgen, als 'ie die nog niet heeft
IF (rec_upd.prs_perslid_oslogin IS NOT NULL)
THEN
v_errormsg := '_default toevoegen?';
SELECT COUNT (*)
INTO v_count
FROM fac_gebruikersgroep fgg
WHERE fgg.prs_perslid_key = v_perslid_key
AND fac_groep_key = c_grp_default_key;
IF (v_count = 0)
THEN
v_errormsg := '_default toevoegen';
INSERT INTO fac_gebruikersgroep
(fac_groep_key, prs_perslid_key)
VALUES (c_grp_default_key, v_perslid_key);
END IF;
END IF;
EXCEPTION
WHEN OTHERS
THEN
fac.imp_writelog (p_import_key,
'W',
'Rollen: ' || v_errormsg,
v_prs_omschr);
END;
END IF; -- v_update
v_buffercount := v_buffercount + 1;
IF v_buffercount >= c_commitbuffer
THEN
COMMIT;
v_buffercount := 0;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := v_errorhint
|| ' {' || v_errormsg || '}';
v_errormsg := '(ORACLE error '
|| oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
END LOOP;
COMMIT;
-- UWVA#30547: Ketenpartners krijgen geen (zelden een) werkplek mee vanuit ABS, maar moeten wel een werkplek
-- in AMSG3 krijgen, met in basis dezelfde voorwaarden als een normale HRM-werkplek. Verschil is dat een normale
-- HRM-werkplek wordt toegewezen in het eerste gebouw op de locatie (hier AMSG0), terwijl dat hier expliciet AMSG3
-- moet zijn. Daarom in de importtabel voor alle personen met type K 'GAMSG3' als pandcode invullen, zodat de
-- locatie klopt, en daarna bij het bepalen van het gebouw 'hard' AMSG3 gebruiken ipv 'het eerste gebouw'. De rest
-- gaat daarna vanzelf.
UPDATE uwva_imp_abs
SET pandcode = c_def_pandcode_ketenpartner
WHERE employeetype = 'K'
AND pandcode IS NULL;
-- *** Update HRM-WP voor personen **************************************************************
v_errormsg := 'Try to open cursor c_prs_wp ';
-- Cursor levert alleen personen waarvoor iets moet gebeuren!
FOR rec_wp IN c_prs_wp
LOOP
BEGIN
v_aktie := 'NONE';
v_errormsg := 'NONE';
-- Eerst eens de huidige HRM-WP(s) opruimen, tenzij dit toevallig
-- de laagste/oudste WP op beoogde HRM-locatie is (dan behouden).
-- Per 5.3.2/FSN#26947 verdwijnt via trigger vanzelf de bezetting!
v_errormsg := 'Fout bij verwijderen (oude) HRM-WP(s)';
DELETE FROM prs_werkplek wp
WHERE EXISTS
(SELECT 1
FROM prs_perslidwerkplek pw
WHERE pw.prs_perslid_key = rec_wp.prs_perslid_key
AND pw.prs_werkplek_key = wp.prs_werkplek_key
AND pw.prs_perslidwerkplek_volgnr = 2
AND pw.prs_perslidwerkplek_key != COALESCE (rec_wp.facloc_pw_key, 0));
-- Gekke situatie (zou niet mogen voorkomen), maar even loggen.
IF (rec_wp.hrmall_wp_aant > 1)
THEN
fac.imp_writelog (
p_import_key, 'I',
rec_wp.aanduiding || ': >1 HRM-WP; opruiming uitgevoerd!',
'WP'
);
END IF;
-- Het aantal WP(s) op HRM-locatie bepaalt wat er moet gebeuren.
IF (rec_wp.facloc_wp_aant = 0) -- Geen enkele WP op HRM-locatie!
THEN
-- Als persoon totaal maar 1 WP had, dan "verhuist" die nu naar de
-- nieuwe HRM-WP (en blijft het totaal bij 1 WP).
-- Was die ene WP een HRM-WP, dan is die hierboven reeds opgeruimd
-- (en hoeft dat hier niet nog eens).
IF (rec_wp.facall_wp_aant = 1 AND rec_wp.hrmall_wp_aant <> 1)
THEN
-- Per 5.3.2 verdwijnt via trigger vanzelf de bezetting!
v_errormsg := 'Fout bij verwijderen enige WP op andere locatie';
DELETE FROM prs_werkplek wp
WHERE prs_werkplek_key =
(SELECT prs_werkplek_key
FROM prs_perslidwerkplek
WHERE prs_perslidwerkplek_key = rec_wp.facall_pw_key);
END IF;
v_aktie := 'INSERT';
ELSE -- Een of meer WP op HRM-locatie!
v_errormsg := 'Fout bij promoveren WP op HRM-locatie';
UPDATE prs_perslidwerkplek
SET prs_perslidwerkplek_volgnr = 2
WHERE prs_perslidwerkplek_key = rec_wp.facloc_pw_key;
fac.imp_writelog (
p_import_key, 'I',
rec_wp.aanduiding || ': Bestaande WP op HRM-locatie naar 2',
'WP'
);
IF (rec_wp.facloc_wp_aant > 1) -- Teveel WP op HRM-locatie!
THEN
-- Per 5.3.2 verdwijnt via trigger vanzelf de bezetting!
v_errormsg := 'Fout bij verwijderen overige WP op HRM-locatie';
DELETE FROM prs_werkplek wp
WHERE EXISTS
(SELECT 1
FROM prs_perslidwerkplek pw
WHERE pw.prs_perslid_key = rec_wp.prs_perslid_key
AND pw.prs_werkplek_key = wp.prs_werkplek_key
AND pw.prs_perslidwerkplek_key != rec_wp.facloc_pw_key);
fac.imp_writelog (
p_import_key, 'I',
rec_wp.aanduiding || ': Overige WP(s) op HRM-locatie weg',
'WP'
);
END IF;
END IF;
v_update := TRUE;
IF (v_aktie = 'INSERT')
THEN
-- Dan hebben we hier dus te maken met een persoon die nog geen
-- HRM-WP heeft op de via pandcode voorgeschreven HRM-locatie. Hier
-- moeten we een gebouw, verdieping, ruimte en werkplek bij zoeken.
BEGIN
IF (rec_wp.employeetype = 'K')
THEN
-- UWVA#30547: Voor ketenpartners niet het 'eerste' gebouw kiezen,
-- maar het gebouw bij de pandcode (AMGS3). Dat is al bepaald in de cursor.
v_new_gebouw_key := rec_wp.alg_gebouw_key;
ELSE
v_errormsg :=
'Fout bij bepalen gebouw op locatie/pandcode '
|| rec_wp.alg_locatie_key
|| '/'
|| rec_wp.pandcode;
SELECT MIN (alg_gebouw_code)
INTO v_gebouw_code
FROM alg_v_aanweziggebouw
WHERE alg_locatie_key = rec_wp.alg_locatie_key
AND COALESCE (alg_gebouw_vervaldatum, SYSDATE) > TRUNC (SYSDATE);
SELECT alg_gebouw_key
INTO v_new_gebouw_key
FROM alg_v_aanweziggebouw
WHERE alg_locatie_key = rec_wp.alg_locatie_key
AND alg_gebouw_code = v_gebouw_code;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_errormsg :=
'Fout bij toevoegen gebouw op locatie/pandcode '
|| rec_wp.alg_locatie_key
|| '/'
|| rec_wp.pandcode;
v_gebouw_code := '0';
INSERT INTO alg_gebouw (alg_locatie_key,
alg_srtgebouw_key,
alg_gebouw_code,
alg_gebouw_naam)
VALUES (rec_wp.alg_locatie_key,
c_srtgebouw_default,
v_gebouw_code,
'Onbekend')
RETURNING alg_gebouw_key INTO v_new_gebouw_key;
WHEN OTHERS
THEN
fac.imp_writelog (p_import_key, 'W',
rec_wp.aanduiding || v_errormsg,
'WP');
v_update := FALSE;
END;
IF v_update
THEN
BEGIN
v_errormsg :=
'Fout bij bepalen verdieping in gebouw '
|| v_gebouw_code;
SELECT alg_verdieping_key
INTO v_verdieping_key
FROM alg_v_aanwezigverdieping
WHERE alg_gebouw_key = v_new_gebouw_key
AND alg_verdieping_volgnr = 0; -- Begane grond!
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_errormsg :=
'Fout bij toevoegen verdieping in gebouw '
|| v_gebouw_code;
INSERT INTO alg_verdieping (alg_gebouw_key,
alg_verdieping_omschrijving,
alg_verdieping_volgnr,
alg_verdieping_code)
VALUES (v_new_gebouw_key,
c_verdieping_omschr_default,
0,
'0')
RETURNING alg_verdieping_key
INTO v_verdieping_key;
WHEN OTHERS
THEN
fac.imp_writelog (p_import_key, 'W',
rec_wp.aanduiding || v_errormsg,
'WP');
v_update := FALSE;
END;
END IF;
IF v_update
THEN
BEGIN
v_errormsg :=
'Fout bij bepalen ruimte in gebouw '
|| v_gebouw_code
|| ' (verdieping '
|| TO_CHAR (v_verdieping_key)
|| ').';
SELECT alg_ruimte_key, alg_ruimte_nr
INTO v_ruimte_key, v_ruimte_nr
FROM alg_v_aanwezigruimte
WHERE alg_verdieping_key = v_verdieping_key
AND alg_ruimte_nr = c_ruimte_code;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_errormsg :=
'Fout bij toevoegen ruimte in gebouw '
|| v_gebouw_code
|| ' (verdieping '
|| TO_CHAR (v_verdieping_key)
|| ').';
INSERT INTO alg_ruimte (alg_verdieping_key,
alg_ruimte_nr,
alg_ruimte_omschrijving)
VALUES (v_verdieping_key,
c_ruimte_code,
c_ruimte_omschr_default)
RETURNING alg_ruimte_key, alg_ruimte_nr
INTO v_ruimte_key, v_ruimte_nr;
WHEN OTHERS
THEN
fac.imp_writelog (p_import_key, 'W',
rec_wp.aanduiding || v_errormsg,
'WP');
v_update := FALSE;
END;
END IF;
IF v_update
THEN
uwva_upsert_wp (rec_wp.prs_perslid_key,
v_ruimte_key, v_ruimte_nr,
NULL);
fac.imp_writelog (p_import_key, 'I',
rec_wp.aanduiding || ': HRM-WP aangemaakt',
'WP');
END IF;
END IF;
--UWVA#23124: Verhuisbericht naar intermediair Abonnementen
--UWVA#39432: Per overgang Infotrading naar P&C ongewijzigd
--UWVA#58768: Opschonen ABO-funtionaliteit
v_buffercount := v_buffercount + 1;
IF v_buffercount >= c_commitbuffer
THEN
COMMIT;
v_buffercount := 0;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := 'WP {' || v_errormsg || '}';
v_errormsg :=
rec_wp.aanduiding
|| '(ORACLE error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'W',
v_errormsg,
v_errorhint);
END;
END LOOP;
COMMIT;
-- UWVA#20232: Tijdelijk(!) flexveld (Vinder-)Regio bijwerken/toevoegen
-- a.d.h.v. gebouw waar persoon werkplek heeft.
v_count_regio_edit := 0;
v_count_regio_add := 0;
FOR rec_regio IN c_prs_regio
LOOP
BEGIN
v_errorhint := 'Regio: fout! ('||rec_regio.prs_perslid_key||' in '||rec_regio.alg_gebouw_code
||': '||rec_regio.prs_kenmerklink_key||'/'||rec_regio.prs_kenmerklink_waarde||'->'||rec_regio.fac_usrdata_key
||'/'||rec_regio.fac_usrdata_omschr||')';
IF (rec_regio.prs_kenmerklink_key IS NULL)
THEN
INSERT INTO prs_kenmerklink
(prs_link_key,
prs_kenmerklink_niveau, prs_kenmerk_key,
prs_kenmerklink_waarde)
VALUES (rec_regio.prs_perslid_key,
'P', c_regio_key,
rec_regio.fac_usrdata_key);
v_count_regio_add := v_count_regio_add + 1;
ELSE
UPDATE prs_kenmerklink
SET prs_kenmerklink_waarde = rec_regio.fac_usrdata_key
WHERE prs_kenmerklink_key = rec_regio.prs_kenmerklink_key;
v_count_regio_edit := v_count_regio_edit + 1;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := v_errorhint
|| ' {' || v_errormsg || '}';
v_errormsg := 'Regio: (ORACLE error '
|| oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
END LOOP;
COMMIT;
fac.imp_writelog (p_import_key, 'S',
'Regio: ' || v_count_regio_add || ' flexvelden toegevoegd, '
|| v_count_regio_edit || ' flexvelden bijgewerkt.',
'');
SELECT COUNT (*)
INTO v_perslid_newcount_fclt
FROM prs_perslid
WHERE ( prs_perslid_nr IS NOT NULL
OR prs_perslid_oslogin IS NOT NULL)
AND prs_perslid_verwijder IS NULL
AND uwva_abs.get_employeetype(p_import_key, prs_perslid_key, c_employeetype_key) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W');
-- Vergelijking aantal personen voor en na import
-- (zelfde query als v<><76>r, anders vergelijk je appels met peren)
fac.imp_writelog (p_import_key,
'S',
'Aantal actieve personen (met account/personeelsnr en type) vooraf: '
|| TO_CHAR (v_perslid_count_fclt)
|| ' nu: '
|| TO_CHAR (v_perslid_newcount_fclt),
''
);
-- Aantal personen zonder login <20>n personeelsnummer
SELECT COUNT (*)
INTO v_perslid_newcount_fclt -- hergebruik (misbruik) variabele
FROM prs_perslid
WHERE prs_perslid_oslogin IS NULL
AND prs_perslid_nr IS NULL
AND prs_perslid_verwijder IS NULL;
fac.imp_writelog (p_import_key,
'S',
'Aantal actieve personen zonder account <20>n personeelsnr: '
|| TO_CHAR (v_perslid_newcount_fclt),
''
);
-- Ongebruikte rollen
SELECT COUNT(*)
INTO v_count
FROM (SELECT DISTINCT uwva_rol_omschr rol FROM uwva_provisioning
MINUS
SELECT DISTINCT grpfname rol FROM uwva_imp_abs);
IF (v_count > 0)
THEN
BEGIN
FOR rec_rnu IN c_rol_not_used
LOOP
fac.imp_writelog (p_import_key, 'S', 'Ongebruikte rol in provisioning-tabel', rec_rnu.rol);
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := v_errorhint
|| ' {' || v_errormsg || '}';
v_errormsg := '(ORACLE error '
|| oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
END IF;
-- *** Ongebruikte functieomschrijvingen verwijderen ********************************************
-- Functies die niemand meer heeft, compleet verwijderen
DELETE FROM prs_srtperslid sp
WHERE NOT EXISTS
(SELECT 1
FROM prs_perslid p
WHERE p.prs_srtperslid_key = sp.prs_srtperslid_key);
-- UWVA#23714: Functies die alleen verwijderde mensen nog hebben, logisch verwijderen
UPDATE prs_srtperslid sp
SET prs_srtperslid_verwijder = SYSDATE
WHERE prs_srtperslid_verwijder IS NULL
AND NOT EXISTS
(SELECT 1
FROM prs_v_aanwezigperslid
WHERE prs_srtperslid_key = sp.prs_srtperslid_key);
-- Ook kenmerken 'Alternatieve functie' (key 1192) verwijderen die naar niet-meer-bestaande
-- functies verwijzen.
DELETE FROM prs_kenmerklink kl
WHERE prs_kenmerk_key = 1192
AND NOT EXISTS
(SELECT 1
FROM prs_srtperslid
WHERE prs_srtperslid_verwijder IS NULL
AND prs_srtperslid_key = fac.safe_to_number(kl.prs_kenmerklink_waarde) );
-- UWVA#20033: Functienamen uit ABS overnemen (hoofdletters matchen)
FOR rec_func IN c_functie
LOOP
BEGIN
v_errorhint := rec_func.funcdscr;
v_errormsg := 'Functienamen bijwerken';
UPDATE prs_srtperslid
SET prs_srtperslid_omschrijving = rec_func.funcdscr
WHERE prs_srtperslid_key = rec_func.prs_srtperslid_key;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := v_errorhint
|| ' {' || v_errormsg || '}';
v_errormsg := '(ORACLE error '
|| oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
END LOOP;
-- UWVA#23788: Onbekende pandcodes
FOR rec_pcon IN c_pandcode_onbekend
LOOP
BEGIN
v_errorhint := rec_pcon.pandcode;
v_errormsg := 'Onbekende pandcodes uitlijsten';
-- Kennen we de kostenplaats niet, of het gebouw niet?
IF (rec_pcon.prs_kostenplaats_nr IS NULL)
THEN
fac.imp_writelog (p_import_key, 'W',
'Pandcode ' || rec_pcon.pandcode
|| ': onbekende kostenplaats.',
'Betreft ' || rec_pcon.aantal || ' personen.');
ELSE
fac.imp_writelog (p_import_key, 'W',
'Pandcode ' || rec_pcon.pandcode
|| ': geen gebouw bij kostenplaats.',
'Betreft ' || rec_pcon.aantal || ' personen.');
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := v_errorhint
|| ' {' || v_errormsg || '}';
v_errormsg := '(ORACLE error '
|| oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
END LOOP;
-- *** Budgethouders ****************************************************************************
-- UWVA#20021: Onderstaande was voorheen een aparte budgethouder-import. Sinds het smoelenboek
-- zijn de importbestanden voor de KPN- en budgethouderimports samengevoegd tot <20><>n bestand met
-- de mandateringsboom, inclusief volledige organisatiestructuur. De KPN-import 'maakt' voortaan
-- de afdelingen en kostenplaatsen (PRS <20>n PRJ), terwijl de ABS-import eerst de personeelsleden
-- aanmaakt en rechten geeft en vervolgens de taken van de budgethouder-import uitvoert:
-- budgethouders instellen, mandaat (profiel) instellen en personen aan de Budgethouder-autori-
-- satiegroep (key 1061) toevoegen.
-- (NB: budgethouderimport moet n<> KPN en ABS, omdat KPN de kostenplaatsen en ABS de personen
-- importeert die de budgethouderimport nodig heeft)
-- UWVA#23269: Eerst dezelfde check als in uwva_update_kpn(), want als die is overgeslagen, dan
-- ook hier overslaan (ie. geen budgethouders wijzigen)!
-- How many active records are now present?
SELECT COUNT ( * )
INTO l_oldcount
FROM prs_kostenplaats
WHERE prs_kostenplaats_verwijder IS NULL;
-- How many (in)active records are imported?
SELECT COUNT ( * )
INTO l_impcount
FROM uwva_imp_kpn
WHERE status = 'A';
SELECT COUNT ( * )
INTO l_impcount_prj
FROM uwva_imp_kpn_prj
WHERE status = 'A';
IF (ABS ( (l_impcount + l_impcount_prj) - l_oldcount) >
c_kpn_maxvariation * l_oldcount)
THEN
fac.imp_writelog (
p_import_key,
'E',
'Het verschil tussen de actieve kostenplaatsen ('
|| TO_CHAR (l_oldcount)
|| ') en geimporteerde aantallen ('
|| TO_CHAR (l_impcount + l_impcount_prj)
|| ') is te groot',
'Budgethouders niet bijgewerkt!'
);
ELSE
FOR rec_budgh IN c_budgethouder
LOOP
BEGIN
v_errormsg :=
'Fout bij wijzigen kostenplaats "'
|| rec_budgh.prs_kostenplaats_nr
|| '" met budgethouder "'
|| rec_budgh.imp_perslid_nr
|| '" ';
-- Ken budgethouder toe aan kostenplaats (of verwijder als NULL)
UPDATE prs_kostenplaats
SET prs_perslid_key = rec_budgh.prs_perslid_key
WHERE prs_kostenplaats_key = rec_budgh.prs_kostenplaats_key
AND prs_kostenplaats_verwijder IS NULL;
-- Als de kostenplaats een budgethouder heeft, stel hiervoor dan mandaat
-- en autorisatiegroep in
IF (rec_budgh.prs_perslid_key IS NOT NULL)
THEN
v_errormsg :=
'Fout bij zetten profiel budgethouder "'
|| rec_budgh.imp_perslid_nr
|| '" voor KPN "'
|| rec_budgh.prs_kostenplaats_nr
|| '" ';
-- Mandaatcode bepaalt welk profiel een budgethouder heeft
-- *lege mandaatcode --> E500,- ('Budgethouder 500', key 81)
-- *code '23bd' --> E500,-
-- *code '23m' --> E500,-
-- *overige codes --> E7000,- ('Budgethouder', key 22)
--UPDATE prs_perslid
-- SET fac_profiel_key =
-- DECODE (rec_budgh.imp_mandaatcode,
-- NULL, 81,
-- '23bd', 81,
-- '23m', 81,
-- 22)
-- WHERE prs_perslid_key = rec_budgh.prs_perslid_key;
--UWVA#36421: Flexibel - via Eigen tabel met key=1342 - toekennen van profiel aan budgethouders, als
-- geen entry wordt gevonden, dan wordt profiel met key=81 toegekend!
UPDATE prs_perslid
SET fac_profiel_key = COALESCE ((SELECT MAX (fac.safe_to_number (ud.fac_usrdata_omschr))
FROM fac_v_aanwezigusrdata ud
WHERE ud.fac_usrtab_key = 1342 AND ud.fac_usrdata_code = rec_budgh.imp_mandaatcode),
81)
WHERE prs_perslid_key = rec_budgh.prs_perslid_key;
-- UWVA#21163: Budgethouders ook mandaat geven op hun kostenplaats
-- Eerst kijken of er al een mandaat voor die kostenplaats is. Zoniet, dan toevoegen.
-- NB: bij een lege kostenplaats_key heeft de persoon al mandaat op alle kostenplaatsen!
v_errormsg :=
'Fout bij tellen mandaten van "'
|| rec_budgh.imp_perslid_nr
|| '" voor KPN "'
|| rec_budgh.prs_kostenplaats_nr
|| '" ';
SELECT COUNT ( * )
INTO v_count
FROM prs_perslidkostenplaats
WHERE prs_perslid_key = rec_budgh.prs_perslid_key
AND (prs_kostenplaats_key = rec_budgh.prs_kostenplaats_key
OR prs_kostenplaats_key IS NULL);
-- Nog geen mandaat --> toevoegen
IF (v_count = 0)
THEN
v_errormsg :=
'Fout bij toekennen mandaat voor KPN "'
|| rec_budgh.prs_kostenplaats_nr
|| '" aan budgethouder "'
|| rec_budgh.imp_perslid_nr
|| '"';
INSERT INTO prs_perslidkostenplaats (
prs_perslid_key,
prs_kostenplaats_key,
prs_perslidkostenplaats_boeken,
prs_perslidkostenplaats_inzage
)
VALUES (rec_budgh.prs_perslid_key,
rec_budgh.prs_kostenplaats_key,
1,
1);
fac.imp_writelog (
p_import_key,
'I',
'Mandaat voor budgethouder "'
|| rec_budgh.imp_perslid_nr
|| '" op KPN "'
|| rec_budgh.prs_kostenplaats_nr
|| '"',
''
);
END IF;
-- UWVA#17365: Zorg dat alle budgethouders en alleen budgethouders in
-- de groep van budgethouders zit (1/2)
v_errormsg :=
'Fout bij toekennen budgethouder "'
|| rec_budgh.imp_perslid_nr
|| '" aan autorisatiegroep budgethouders ('
|| TO_CHAR (c_grp_budgh_key)
|| ')';
INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key)
SELECT c_grp_budgh_key, rec_budgh.prs_perslid_key
FROM DUAL
WHERE NOT EXISTS
(SELECT 'x'
FROM fac_gebruikersgroep
WHERE prs_perslid_key =
rec_budgh.prs_perslid_key
AND fac_groep_key = c_grp_budgh_key);
ELSE
-- Wel een budgethouder gegeven in importbestand (perslid_nr), maar
-- persoon niet gevonden in Facilitor (geen perslid_key).
IF (rec_budgh.imp_perslid_nr IS NOT NULL)
THEN
fac.imp_writelog (
p_import_key,
'W',
'Onbekende budgethouder "'
|| rec_budgh.imp_perslid_nr
|| '" bij kostenplaats '
|| rec_budgh.prs_kostenplaats_nr,
''
);
END IF;
END IF;
v_errormsg := '';
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
v_errormsg
|| ' (error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'W',
v_errormsg,
'');
END;
END LOOP;
FOR rec_kpnon IN c_kpn_onbekend
LOOP
BEGIN
v_errormsg :=
'Fout bij wijzigen kostenplaats "'
|| rec_kpnon.prs_kostenplaats_nr
|| '" met budgethouder "'
|| rec_kpnon.prs_perslid_nr
|| '": kostenplaats komt niet voor';
fac.imp_writelog (p_import_key,
'W',
v_errormsg,
'');
v_errormsg := '';
END;
END LOOP;
SELECT COUNT ( * )
INTO nrbh1
FROM fac_gebruikersgroep
WHERE fac_groep_key = c_grp_budgh_key;
-- UWVA#17365: Zorg dat alle budgethouders en alleen budgethouders in
-- de groep van budgethouders zit (2/2)
DELETE FROM fac_gebruikersgroep
WHERE fac_groep_key = c_grp_budgh_key
AND prs_perslid_key NOT IN
(SELECT p.prs_perslid_key
FROM uwva_imp_kpn imp,
prs_v_aanwezigperslid p
WHERE p.prs_perslid_nr = imp.perslid_nr);
SELECT COUNT ( * )
INTO nrbh2
FROM fac_gebruikersgroep
WHERE fac_groep_key = c_grp_budgh_key;
fac.imp_writelog (
p_import_key,
'S',
nrbh1 - nrbh2
|| ' budgethouder(s) uit autorisatiegroep '
|| TO_CHAR (c_grp_budgh_key)
|| ' verwijderd.',
''
);
-- Einde voormalige budgethoudersimport
END IF;
COMMIT;
-- Mooie plek om de telefoonnummers, faxnummers en mobiele nummers te formatteren.
uwva.format_telefoonnummers (p_import_key);
SELECT TO_CHAR ( SYSDATE, 'YYYYMMDDHH24MISS' )
INTO v_time
FROM DUAL;
fac.imp_writelog (p_import_key, 'S', 'Import voltooid', v_time);
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := v_errorhint
|| ' {' || v_errormsg || '}';
v_errormsg := '(ORACLE error '
|| oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
END uwva_update_abs;
/
-- Persoonsgegevens met werknemertype, login en rollen (UWVA#18115)
CREATE OR REPLACE VIEW uwva_v_rap_prs_abs
(
fclt_f_type,
fclt_f_account,
persnr,
fclt_f_naam,
last_login,
aantal_rollen
)
AS
(SELECT COALESCE(emptype.fac_usrdata_omschr, '<geen type>'),
pers.prs_perslid_oslogin,
pers.prs_perslid_nr,
pers.prs_perslid_naam_full,
pers.prs_perslid_login,
TO_CHAR (0)
FROM ( (SELECT p.*, pf.prs_perslid_naam_full
FROM prs_v_perslid_fullnames_all pf, prs_perslid p
WHERE p.prs_perslid_key = pf.prs_perslid_key
AND p.prs_perslid_verwijder IS NULL) pers
LEFT OUTER JOIN
(SELECT p.prs_perslid_key, ud.fac_usrdata_omschr
FROM prs_perslid p,
prs_kenmerklink km,
fac_usrdata ud
WHERE p.prs_perslid_key = km.prs_link_key
AND km.prs_kenmerk_key = 1040
AND ud.fac_usrdata_key =
km.prs_kenmerklink_waarde
AND km.prs_kenmerklink_verwijder IS NULL
AND ud.fac_usrdata_verwijder IS NULL) emptype
ON pers.prs_perslid_key = emptype.prs_perslid_key) );
-- Inhoud eigen tabel pandcodes (UWVA#18115)
CREATE OR REPLACE VIEW uwva_v_rap_abs_pandcodes
(
key,
fclt_f_locatie,
fclt_f_pandcode
)
AS
(SELECT TO_CHAR (fac_usrdata_key), fac_usrdata_omschr, fac_usrdata_code
FROM fac_usrdata
WHERE fac_usrtab_key = 1
AND fac_usrdata_verwijder IS NULL);
COMMIT;
-- *** Oude PVIEW-rapportages, maar nu in een ABS-jasje ***
-- Toon verplichtingen van de personen die vervallen zijn volgens abs.
CREATE OR REPLACE VIEW uwva_v_imp_abs_01_verpl
(
fclt_f_servicepunt,
fclt_f_locatie,
personeelsnr,
prs_perslid_naam,
omschrijving,
verplichting,
fclt_3d_locatie_key
)
AS
SELECT di.alg_district_omschrijving fclt_f_servicepunt,
l.alg_locatie_code fclt_f_locatie,
p.prs_perslid_nr,
p.prs_perslid_naam,
COALESCE (t.fac_message_text, vp.fac_message_code) omschrijving,
vp.item verplichting,
vp.locatie_key
FROM prs_v_aanwezigperslid p,
prs_v_verplichting vp,
alg_locatie l,
alg_district di,
fac_message t
WHERE p.prs_perslid_naam LIKE 'INACTIEF:%'
AND p.prs_perslid_key = vp.prs_perslid_key
AND vp.locatie_key = l.alg_locatie_key
AND l.alg_district_key = di.alg_district_key
AND vp.fac_message_code = t.fac_message_code(+);
-- Personen die bij de laatste import zijn verwijderd (o.b.v. prs_perslid_verwijder).
CREATE OR REPLACE VIEW uwva_v_imp_abs_02_verwijderd
(
fclt_f_personeelsnummer,
fclt_f_naam,
fclt_3d_locatie_key,
fclt_f_locatie,
fclt_f_afdeling,
verwijderd,
key
)
AS
SELECT p.prs_perslid_nr,
pf.prs_perslid_naam_full,
l.alg_locatie_key,
l.alg_locatie_code,
d.prs_afdeling_naam,
TO_CHAR (p.prs_perslid_verwijder, 'YYYY-MM-DD') verwijderd,
TO_CHAR (p.prs_perslid_key)
FROM prs_perslid p,
prs_v_perslid_fullnames_all pf,
prs_afdeling d,
prs_v_werkplek_gegevens w,
prs_perslidwerkplek pw,
alg_locatie l
WHERE p.prs_perslid_nr IS NOT NULL
AND p.prs_perslid_key = pf.prs_perslid_key
AND w.prs_werkplek_key(+) = pw.prs_werkplek_key
AND p.prs_perslid_key = pw.prs_perslid_key(+)
AND w.alg_locatie_key = l.alg_locatie_key(+)
AND d.prs_afdeling_key(+) = p.prs_afdeling_key
AND SYSDATE - p.prs_perslid_verwijder < 31;
-- Personen die bij de laatste import zijn toegevoegd (o.b.v. prs_perslid_aanmaak).
CREATE OR REPLACE VIEW uwva_v_imp_abs_03_toegevoegd
(
fclt_f_personeelsnummer,
fclt_f_naam,
fclt_f_afdeling,
aanmaak,
key
)
AS
SELECT p.prs_perslid_nr,
pf.prs_perslid_naam_full,
d.prs_afdeling_naam,
TO_CHAR (p.prs_perslid_aanmaak, 'YYYY-MM-DD') aanmaak,
TO_CHAR(p.prs_perslid_key)
FROM prs_v_aanwezigperslid p,
prs_v_perslid_fullnames_all pf,
prs_afdeling d
WHERE p.prs_perslid_nr IS NOT NULL
AND d.prs_afdeling_key = p.prs_afdeling_key
AND SYSDATE - p.prs_perslid_aanmaak < 31;
-- Onbekende pandcodes in de importfile, met aantal personen
CREATE OR REPLACE VIEW uwva_v_abs_05_pponbekendloc
(
locatiecode,
aantal_personen
)
AS
SELECT ab.pandcode, COUNT (*)
FROM uwva_imp_abs ab
WHERE ab.pandcode IS NOT NULL
AND NOT EXISTS (SELECT 'x'
FROM fac_usrdata fu
WHERE ab.pandcode = fu.fac_usrdata_code)
GROUP BY ab.pandcode;
---- Personen die geimporteerd worden maar die ondertussen handmatig zijn verwijderd UWVA#679 (OBSOLETE?)
--CREATE OR REPLACE VIEW uwva_v_imp_abs_06_verwijderd
--(
-- fclt_f_personeelsnr,
-- naam,
-- voorletters,
-- fclt_3d_locatie_key,
-- fclt_f_locatie,
-- verwijderdatum,
-- importdatum,
-- KEY
--)
--AS
-- SELECT p.prs_perslid_nr, p.prs_perslid_naam, p.prs_perslid_voorletters,
-- l.alg_locatie_key, l.alg_locatie_code,
-- p.prs_perslid_verwijder verwijderdatum,
-- ab.uwva_imp_abs_aanmaak importdatum,
-- p.prs_perslid_key
-- FROM prs_perslid p,
-- uwva_imp_abs ab,
-- prs_v_werkplek_gegevens w,
-- prs_perslidwerkplek pw,
-- alg_locatie l
-- WHERE p.prs_perslid_nr = ab.empnum
-- AND p.prs_perslid_verwijder IS NOT NULL
-- AND w.prs_werkplek_key(+) = pw.prs_werkplek_key
-- AND p.prs_perslid_key = pw.prs_perslid_key(+)
-- AND w.alg_locatie_key = l.alg_locatie_key(+)
-- ORDER BY p.prs_perslid_verwijder DESC;
-- Verwijderde personen per SP en per pand (UWVA#12158)
CREATE OR REPLACE VIEW uwva_v_imp_abs_07_verwijderd
AS
SELECT d.alg_district_omschrijving fclt_f_servicepunt,
g.alg_gebouw_omschrijving gebouw,
l.imp_log_omschrijving fclt_f_medewerker,
TO_CHAR (MIN(l.imp_log_datum), 'YYYY-MM-DD') datum,
l.imp_log_hint fclt_3d_gebouw_key
FROM IMP_LOG l, ALG_GEBOUW g, ALG_LOCATIE ll, ALG_DISTRICT d
WHERE l.imp_log_applicatie = 'ABS0'
AND l.imp_log_hint = g.alg_gebouw_key
AND g.alg_locatie_key = ll.alg_locatie_key
AND ll.alg_district_key = d.alg_district_key
GROUP BY d.alg_district_omschrijving, g.alg_gebouw_omschrijving, l.imp_log_omschrijving, l.imp_log_hint;
CREATE OR REPLACE VIEW uwva_v_export_vinderdump (result, result_order)
AS
SELECT '"volledige naam";' ||
'"achternaam";' ||
'"tussenvoegsel";' ||
'"voorletters";' ||
'"voornaam";' ||
'"divisie";' ||
'"afdeling";' ||
'"functie";' ||
'"alt_divisie";' ||
'"alt_afdeling";' ||
'"alt_functie";' ||
'"persoonsnr";' ||
'"account";' ||
'"werknemertype";' ||
'"regio";' ||
'"locatie";' ||
'"gebouw";' ||
'"verdieping";' ||
'"ruimte";' ||
'"e-mail";' ||
'"telefoon";' ||
'"mobiel";' ||
'"faxnummer";' ||
'"maandag";' ||
'"dinsdag";' ||
'"woensdag";' ||
'"donderdag";' ||
'"vrijdag";' ||
'"geslacht";' ||
'"toon in gids"' result,
0 result_order
FROM DUAL
UNION ALL
SELECT '"' || prs_perslid_naam_full || '";"' ||
prs_perslid_naam || '";"' ||
prs_perslid_tussenvoegsel || '";"' ||
prs_perslid_voorletters || '";"' ||
prs_perslid_voornaam || '";"' ||
divisie || '";"' ||
afdeling || '";"' ||
prs_srtperslid_omschrijving || '";"' ||
alt_divisie || '";"' ||
alt_afdeling || '";"' ||
alt_functie || '";"' ||
prs_perslid_nr || '";"' ||
prs_perslid_oslogin || '";"' ||
emptype || '";"' ||
regio || '";"' ||
alg_locatie_code || '";"' ||
alg_gebouw_code || '";"' ||
alg_verdieping_code || '";"' ||
alg_ruimte_nr || '";"' ||
prs_perslid_email || '";"' ||
prs_perslid_telefoonnr || '";"' ||
prs_perslid_mobiel || '";"' ||
faxnr || '";"' ||
maandag || '";"' ||
dinsdag || '";"' ||
woensdag || '";"' ||
donderdag || '";"' ||
vrijdag || '";"' ||
DECODE (prs_perslid_geslacht, 0, 'V', 1, 'M', 'O') || '";"' ||
DECODE (prs_perslid_ingids, 0, 'Nee', 1, 'Ja', 'O') || '"' result,
1 result_order
FROM (SELECT apl.*,
wpg.*,
pfn.prs_perslid_naam_full,
afd.prs_afdeling_naam6 afdeling,
div.prs_afdeling_naam6 divisie,
aspl.prs_srtperslid_omschrijving
FROM prs_v_aanwezigperslid apl,
prs_v_perslid_fullnames pfn,
prs_v_aanwezigafdeling afd,
prs_v_afdeling_boom ab,
prs_v_aanwezigafdeling div,
prs_v_aanwezigsrtperslid aspl,
prs_v_hoofdperslidwerkplek hpwp,
prs_v_werkplek_gegevens wpg
WHERE pfn.prs_perslid_key = apl.prs_perslid_key
AND apl.prs_afdeling_key = afd.prs_afdeling_key
AND afd.prs_afdeling_key = ab.prs_afdeling_key
AND ab.prs_afdeling_key1 = div.prs_afdeling_key
AND apl.prs_srtperslid_key = aspl.prs_srtperslid_key
AND apl.prs_perslid_key = hpwp.prs_perslid_key(+)
AND hpwp.prs_werkplek_key = wpg.prs_werkplek_key(+)
ORDER BY prs_perslid_ingids, prs_perslid_naam_full, prs_perslid_nr) pl
--1040 = Type Medewerker (R)
-- 301 = Type_medewerker (fac_usrtab)
LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr emptype
FROM fac_usrdata, prs_kenmerklink
WHERE fac_usrtab_key = 301
AND prs_kenmerk_key = 1040
AND prs_kenmerklink_waarde = fac_usrdata_key
AND fac_usrdata_verwijder IS NULL
AND prs_kenmerklink_verwijder IS NULL) f1
ON pl.prs_perslid_key = f1.prs_link_key
--1193 = Regio (R)
-- 783 = RegioVinder (fac_usrtab)
LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr regio
FROM fac_usrdata, prs_kenmerklink
WHERE fac_usrtab_key = 783
AND prs_kenmerk_key = 1193
AND prs_kenmerklink_waarde = fac_usrdata_key
AND fac_usrdata_verwijder IS NULL
AND prs_kenmerklink_verwijder IS NULL) f2
ON pl.prs_perslid_key = f2.prs_link_key
--1173 = Alternatieve afdeling (S)
LEFT OUTER JOIN (SELECT prs_link_key,
afd.prs_afdeling_naam6 alt_afdeling,
div.prs_afdeling_naam6 alt_divisie
FROM prs_kenmerklink,
prs_v_aanwezigafdeling afd,
prs_v_afdeling_boom ab,
prs_v_aanwezigafdeling div
WHERE prs_kenmerk_key = 1173
AND afd.prs_afdeling_key = fac.safe_to_number(prs_kenmerklink_waarde)
AND ab.prs_afdeling_key = afd.prs_afdeling_key
AND div.prs_afdeling_key = ab.prs_afdeling_key1
AND prs_kenmerklink_verwijder IS NULL) f3
ON pl.prs_perslid_key = f3.prs_link_key
--1192 = Alternatieve functie (S)
LEFT OUTER JOIN (SELECT prs_link_key,
prs_srtperslid_omschrijving alt_functie
FROM prs_kenmerklink, prs_v_aanwezigsrtperslid
WHERE prs_kenmerk_key = 1192
AND prs_srtperslid_key = prs_kenmerklink_waarde
AND prs_kenmerklink_verwijder IS NULL) f4
ON pl.prs_perslid_key = f4.prs_link_key
-- 7 = Faxnr (C)
LEFT OUTER JOIN (SELECT prs_link_key, prs_kenmerklink_waarde faxnr
FROM prs_kenmerklink
WHERE prs_kenmerk_key = 7
AND prs_kenmerklink_verwijder IS NULL) f7
ON pl.prs_perslid_key = f7.prs_link_key
--1163 = Maandag (R)
-- 761 = AanwezigOp (fac_usrtab)
LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr maandag
FROM fac_usrdata, prs_kenmerklink
WHERE fac_usrtab_key = 761
AND prs_kenmerk_key = 1163
AND prs_kenmerklink_waarde = fac_usrdata_key
AND fac_usrdata_verwijder IS NULL
AND prs_kenmerklink_verwijder IS NULL) f8
ON pl.prs_perslid_key = f8.prs_link_key
--1164 = Dinsdag (R)
-- 761 = AanwezigOp (fac_usrtab)
LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr dinsdag
FROM fac_usrdata, prs_kenmerklink
WHERE fac_usrtab_key = 761
AND prs_kenmerk_key = 1164
AND prs_kenmerklink_waarde = fac_usrdata_key
AND fac_usrdata_verwijder IS NULL
AND prs_kenmerklink_verwijder IS NULL) f9
ON pl.prs_perslid_key = f9.prs_link_key
--1165 = Woensdag (R)
-- 761 = AanwezigOp (fac_usrtab)
LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr woensdag
FROM fac_usrdata, prs_kenmerklink
WHERE fac_usrtab_key = 761
AND prs_kenmerk_key = 1165
AND prs_kenmerklink_waarde = fac_usrdata_key
AND fac_usrdata_verwijder IS NULL
AND prs_kenmerklink_verwijder IS NULL) f10
ON pl.prs_perslid_key = f10.prs_link_key
--1166 = Donderdag (R)
-- 761 = AanwezigOp (fac_usrtab)
LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr donderdag
FROM fac_usrdata, prs_kenmerklink
WHERE fac_usrtab_key = 761
AND prs_kenmerk_key = 1166
AND prs_kenmerklink_waarde = fac_usrdata_key
AND fac_usrdata_verwijder IS NULL
AND prs_kenmerklink_verwijder IS NULL) f11
ON pl.prs_perslid_key = f11.prs_link_key
--1167 = Vrijdag (R)
-- 761 = AanwezigOp (fac_usrtab)
LEFT OUTER JOIN (SELECT prs_link_key, fac_usrdata_omschr vrijdag
FROM fac_usrdata, prs_kenmerklink
WHERE fac_usrtab_key = 761
AND prs_kenmerk_key = 1167
AND prs_kenmerklink_waarde = fac_usrdata_key
AND fac_usrdata_verwijder IS NULL
AND prs_kenmerklink_verwijder IS NULL) f12
ON pl.prs_perslid_key = f12.prs_link_key;
-- View voor phonebook, met contactgegevens per afdeling
CREATE OR REPLACE VIEW uwva_v_rap_afd_contact
(
fclt_f_afdeling,
fclt_f_telefoonnummer,
fclt_f_emailadres,
fclt_3d_afdeling_key
)
AS
SELECT afdeling,
telefoonnummer,
mail,
prs_afdeling_key
FROM (SELECT afd.prs_afdeling_naam6 afdeling,
kml_tel.prs_kenmerklink_waarde telefoonnummer,
kml_mail.prs_kenmerklink_waarde mail,
afd.prs_afdeling_key
FROM prs_v_aanwezigafdeling afd,
prs_kenmerklink kml_tel,
prs_kenmerklink kml_mail
WHERE kml_tel.prs_link_key(+) = afd.prs_afdeling_key
AND kml_mail.prs_link_key(+) = afd.prs_afdeling_key
AND kml_tel.prs_kenmerk_key(+) = 1212 --PROD
AND kml_mail.prs_kenmerk_key(+) = 1213) --PROD
WHERE telefoonnummer IS NOT NULL OR mail IS NOT NULL;
-- UWVA#19010: Importfuncties voor provisioning met ABS
-- (mapping van ABS-rollen op Facilitor authorisatiegroepen en profielen)
CREATE OR REPLACE PROCEDURE uwva_import_rolprofiel (p_import_key IN NUMBER)
AS
CURSOR c1
IS
SELECT *
FROM fac_imp_file
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_file_index;
v_newline VARCHAR2 (1000); -- Import line
v_field VARCHAR2 (100); -- Import field
v_fielddelimitor VARCHAR2 (1) := ';'; -- Field seperator
v_count_import NUMBER (10);
v_count NUMBER;
v_errormsg VARCHAR2 (200);
v_errorhint VARCHAR2 (200);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_buffercount NUMBER := 0;
c_commitbuffer NUMBER := 5; -- om de zoveel committen
-- De importvelden
v_rol VARCHAR2 (100);
v_profiel VARCHAR2 (100);
header_found BOOLEAN := FALSE;
BEGIN
-- Clear my previous imported rows
DELETE FROM uwva_imp_provisioning;
v_count_import := 0;
FOR rec1 IN c1
LOOP
BEGIN
v_newline := rec1.fac_imp_file_line;
fac.imp_getfield (v_newline, v_fielddelimitor, v_rol); -- rol
fac.imp_getfield (v_newline, v_fielddelimitor, v_profiel); -- profiel
-- Skip until the header is found
IF (header_found = FALSE)
THEN
IF UPPER (v_rol) = 'ROL'
AND UPPER (v_profiel) = 'PROFIELNAAM'
THEN
header_found := TRUE;
END IF;
ELSE
INSERT INTO uwva_imp_provisioning (rol,
naam)
VALUES (SUBSTR ( TRIM (v_rol), 1, 50),
SUBSTR ( TRIM (v_profiel), 1, 30));
v_count_import := v_count_import + 1;
END IF;
-- Elke c_commitbuffer regels committen
v_buffercount := v_buffercount + 1;
IF (v_buffercount >= c_commitbuffer)
THEN
COMMIT;
v_buffercount := 0;
END IF;
END;
END LOOP;
IF (header_found = FALSE)
THEN
fac.imp_writelog (p_import_key,
'W',
'Ongeldig importbestand',
'Geen header of header niet volgens specificatie!'
);
ELSE
fac.imp_writelog (p_import_key,
'S',
'Aantal ingelezen regels: '
|| TO_CHAR (v_count_import),
''
);
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := 'OTHERS (error '
|| oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_import_key,
'W',
v_errormsg,
'');
END;
/
CREATE OR REPLACE PROCEDURE uwva_import_rolgroep (p_import_key IN NUMBER)
AS
CURSOR c1
IS
SELECT *
FROM fac_imp_file
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_file_index;
v_newline VARCHAR2 (1000); -- Import line
v_field VARCHAR2 (100); -- Import field
v_fielddelimitor VARCHAR2 (1) := ';'; -- Field seperator
v_count_import NUMBER (10);
v_count NUMBER;
v_errormsg VARCHAR2 (200);
v_errorhint VARCHAR2 (200);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_buffercount NUMBER := 0;
c_commitbuffer NUMBER := 5; -- om de zoveel committen
-- De importvelden
v_rol VARCHAR2 (100);
v_groep VARCHAR2 (100);
header_found BOOLEAN := FALSE;
BEGIN
-- Clear my previous imported rows
DELETE FROM uwva_imp_provisioning;
v_count_import := 0;
FOR rec1 IN c1
LOOP
BEGIN
v_newline := rec1.fac_imp_file_line;
fac.imp_getfield (v_newline, v_fielddelimitor, v_rol); -- rol
fac.imp_getfield (v_newline, v_fielddelimitor, v_groep); -- groep
-- Skip until the header is found
IF (header_found = FALSE)
THEN
IF UPPER (v_rol) = 'ROL'
AND UPPER (v_groep) = 'AUTHORISATIEGROEPNAAM'
THEN
header_found := TRUE;
END IF;
ELSE
INSERT INTO uwva_imp_provisioning (rol,
naam)
VALUES (SUBSTR ( TRIM (v_rol), 1, 50),
SUBSTR ( TRIM (v_groep), 1, 30));
v_count_import := v_count_import + 1;
END IF;
-- Elke c_commitbuffer regels committen
v_buffercount := v_buffercount + 1;
IF (v_buffercount >= c_commitbuffer)
THEN
COMMIT;
v_buffercount := 0;
END IF;
END;
END LOOP;
IF (header_found = FALSE)
THEN
fac.imp_writelog (p_import_key,
'W',
'Ongeldig importbestand',
'Geen header of header niet volgens specificatie!'
);
ELSE
fac.imp_writelog (p_import_key,
'S',
'Aantal ingelezen regels: '
|| TO_CHAR (v_count_import),
''
);
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := 'OTHERS (error '
|| oracle_err_num || '/' || oracle_err_mes || ')';
fac.imp_writelog (p_import_key,
'W',
v_errormsg,
'');
END;
/
CREATE OR REPLACE PROCEDURE uwva_update_rolprofiel (p_import_key IN NUMBER)
AS
-- Constanten
c_num_rows NUMBER := 10;
c_maxvariation NUMBER := 20;
c_commitbuffer NUMBER := 5;
-- om de zoveel committen
v_buffercount NUMBER := 0;
CURSOR c_rol
IS
SELECT rol,
naam
FROM uwva_imp_provisioning
WHERE naam IS NOT NULL;
v_rol_omschr VARCHAR2 (100);
recl c_rol%ROWTYPE;
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_errormsg VARCHAR2 (1024);
v_errorhint VARCHAR2 (1024);
v_count NUMBER (10);
v_update BOOLEAN;
v_aktie VARCHAR (10);
currentversion fac_module.fac_module_version%TYPE;
v_rol_naam VARCHAR2 (100);
v_profiel_key NUMBER (10);
BEGIN
-- Init
SELECT MAX (fac_module_version)
INTO currentversion
FROM fac_module;
-- Zinnige data in importbestand?
SELECT COUNT(*)
INTO v_count
FROM uwva_imp_provisioning
WHERE naam IS NOT NULL;
IF (v_count = 0)
THEN
fac.imp_writelog (p_import_key,
'W',
'Importtabel is leeg!',
currentversion || ', $Revision$'
);
RETURN;
END IF;
-- Huidige mappings rol-->profiel verwijderen (dus alle regels zonder fac_groep_key)
SELECT COUNT(*)
INTO v_count
FROM uwva_provisioning
WHERE fac_groep_key IS NULL;
DELETE FROM uwva_provisioning
WHERE fac_groep_key IS NULL;
fac.imp_writelog (p_import_key,
'S',
'Provisioning-tabel (profielen): ' || v_count || ' regels verwijderd',
currentversion || ', $Revision$'
);
-- *** Rol-->Profiel ****************************************************************************
FOR recl IN c_rol
LOOP
BEGIN
v_errormsg := 'Zoek groep';
v_rol_omschr := 'Rol/Profiel: '
|| recl.rol
|| '/' || recl.naam;
v_update := TRUE;
-- Bestaat profiel in fac_profiel?
SELECT COUNT(*)
INTO v_count
FROM fac_profiel
WHERE UPPER(fac_profiel_omschrijving) = UPPER(recl.naam);
-- Nee --> error
IF (v_count = 0)
THEN
v_update := FALSE;
fac.imp_writelog (p_import_key,
'W',
'Profiel "' || recl.naam || '" bestaat niet!',
v_rol_omschr
);
ELSIF (v_count > 1)
THEN
v_update := FALSE;
fac.imp_writelog (p_import_key,
'S',
'Kan profiel "' || recl.naam || '" niet uniek bepalen!',
v_rol_omschr
);
END IF;
IF (v_update)
THEN
v_errormsg := 'Key profiel ophalen';
-- Haal profiel_key op uit fac_profiel
SELECT fac_profiel_key
INTO v_profiel_key
FROM fac_profiel
WHERE UPPER(fac_profiel_omschrijving) = UPPER(recl.naam);
v_errormsg := 'Toevoegen rol-->profiel';
-- Voeg rol-->profiel toe aan uwva_provisioning
INSERT INTO uwva_provisioning
(uwva_rol_omschr,
fac_profiel_key,
fac_groep_key)
VALUES (recl.rol,
v_profiel_key,
NULL);
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := v_errorhint
|| ' {' || v_errormsg || '}';
v_errormsg := '(ORACLE error '
|| oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
END LOOP;
SELECT COUNT(*)
INTO v_count
FROM uwva_provisioning
WHERE fac_groep_key IS NULL;
fac.imp_writelog (p_import_key,
'S',
'Provisioning-tabel (profielen): ' || v_count || ' regels toegevoegd',
currentversion || ', $Revision$'
);
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := v_errorhint
|| ' {' || v_errormsg || '}';
v_errormsg := '(ORACLE error '
|| oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
/
CREATE OR REPLACE PROCEDURE uwva_update_rolgroep (p_import_key IN NUMBER)
AS
-- Constanten
c_num_rows NUMBER := 10;
c_maxvariation NUMBER := 20;
c_commitbuffer NUMBER := 5;
-- om de zoveel committen
v_buffercount NUMBER := 0;
CURSOR c_rol
IS
SELECT rol,
naam
FROM uwva_imp_provisioning
WHERE naam IS NOT NULL;
v_rol_omschr VARCHAR2 (100);
recl c_rol%ROWTYPE;
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_errormsg VARCHAR2 (1024);
v_errorhint VARCHAR2 (1024);
v_count NUMBER (10);
v_update BOOLEAN;
v_aktie VARCHAR (10);
currentversion fac_module.fac_module_version%TYPE;
v_rol_naam VARCHAR2 (100);
v_groep_key NUMBER (10);
BEGIN
-- Init
SELECT MAX (fac_module_version)
INTO currentversion
FROM fac_module;
-- Zinnige data in importbestand?
SELECT COUNT(*)
INTO v_count
FROM uwva_imp_provisioning
WHERE naam IS NOT NULL;
IF (v_count = 0)
THEN
fac.imp_writelog (p_import_key,
'W',
'Importtabel is leeg!',
currentversion || ', $Revision$'
);
RETURN;
END IF;
-- Huidige mappings rol-->groep verwijderen (dus alle regels zonder fac_groep_key)
SELECT COUNT(*)
INTO v_count
FROM uwva_provisioning
WHERE fac_profiel_key IS NULL;
DELETE FROM uwva_provisioning
WHERE fac_profiel_key IS NULL;
fac.imp_writelog (p_import_key,
'S',
'Provisioning-tabel (groepen): ' || v_count || ' regels verwijderd',
currentversion || ', $Revision$'
);
-- *** Rol-->Groep ****************************************************************************
FOR recl IN c_rol
LOOP
BEGIN
v_errormsg := 'Zoek groep';
v_rol_omschr := 'Rol/Groep: '
|| recl.rol
|| '/' || recl.naam;
v_update := TRUE;
-- Bestaat groep in fac_groep?
SELECT COUNT(*)
INTO v_count
FROM fac_groep
WHERE UPPER(fac_groep_omschrijving) = UPPER(recl.naam);
-- Nee --> error
IF (v_count = 0)
THEN
v_update := FALSE;
fac.imp_writelog (p_import_key,
'W',
'Groep "' || recl.naam || '" bestaat niet!',
v_rol_omschr
);
ELSIF (v_count > 1)
THEN
v_update := FALSE;
fac.imp_writelog (p_import_key,
'S',
'Kan groep "' || recl.naam || '" niet uniek bepalen!',
v_rol_omschr
);
END IF;
IF (v_update)
THEN
v_errormsg := 'Key groep ophalen';
-- Haal groep_key op uit fac_groep
SELECT fac_groep_key
INTO v_groep_key
FROM fac_groep
WHERE UPPER(fac_groep_omschrijving) = UPPER(recl.naam);
v_errormsg := 'Toevoegen rol-->groep';
-- Voeg rol-->groep toe aan uwva_provisioning
INSERT INTO uwva_provisioning
(uwva_rol_omschr,
fac_profiel_key,
fac_groep_key)
VALUES (recl.rol,
NULL,
v_groep_key);
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := v_errorhint
|| ' {' || v_errormsg || '}';
v_errormsg := '(ORACLE error '
|| oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
END LOOP;
SELECT COUNT(*)
INTO v_count
FROM uwva_provisioning
WHERE fac_profiel_key IS NULL;
fac.imp_writelog (p_import_key,
'S',
'Provisioning-tabel (groepen): ' || v_count || ' regels toegevoegd',
currentversion || ', $Revision$'
);
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errorhint := v_errorhint
|| ' {' || v_errormsg || '}';
v_errormsg := '(ORACLE error '
|| oracle_err_num || '/' || oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint);
END;
/
CREATE OR REPLACE VIEW uwva_v_rap_provisioning
AS
SELECT up.uwva_rol_omschr fclt_f_rol,
fp.fac_profiel_omschrijving fclt_f_profiel,
fg.fac_groep_omschrijving fclt_f_authorisatiegroep
FROM uwva_provisioning up, fac_profiel fp, fac_groep fg
WHERE up.fac_profiel_key = fp.fac_profiel_key(+)
AND up.fac_groep_key = fg.fac_groep_key(+)
ORDER BY 1, 2, 3;
-- UWVA#21045: Vinder-export voor ABS
-- UWVA#24931: ABS-id met voorloopnullen
-- UWVA#40346: Toestel-kolom zomder data
CREATE OR REPLACE VIEW uwva_v_export_vinder2abs
(
RESULT,
result_order
)
AS
SELECT '"ABS-ID","Telefoon","Mobielnr","Toestel"', 0 FROM DUAL
UNION ALL
SELECT '"'
|| LPAD( kl1.prs_kenmerklink_waarde, 8, '0' )
|| '","'
|| p.prs_perslid_telefoonnr
|| '","'
|| p.prs_perslid_mobiel
|| '","'
|| '"',
1
FROM (SELECT *
FROM prs_perslid
WHERE prs_perslid_verwijder IS NULL) p
LEFT OUTER JOIN (SELECT *
FROM prs_kenmerklink
WHERE prs_kenmerk_key = 1232) kl1
ON kl1.prs_link_key = p.prs_perslid_key;
-- UWVA#22892: Noti geschoond mandaat naar (onder)gemandateerde bij wijziging
-- van afdeling op basis van gegevens uit eigen tabel zoals gevuld
-- tijdens ABS-import (via rapportage), zo is dat!
/* Formatted on 12-6-2012 16:18:12 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW uwva_v_rap_geschoond_mandaat
(
hide_f_prs_key,
fclt_f_prs_naam_full,
cur_afd_naam,
cur_afd_oms,
cur_kpn_nr,
cur_kpn_oms,
old_afd_naam,
old_afd_oms,
old_kpn_nr,
old_kpn_oms,
hide_f_kpn_key,
kpn_nr,
kpn_oms,
kpn_boeken,
kpn_inzage,
budgethouder
)
AS
SELECT pf.prs_perslid_key,
pf.prs_perslid_naam_full,
cur_a.prs_afdeling_naam,
cur_a.prs_afdeling_omschrijving,
cur_k.prs_kostenplaats_nr,
cur_k.prs_kostenplaats_omschrijving,
old_a.prs_afdeling_naam,
old_a.prs_afdeling_omschrijving,
old_k.prs_kostenplaats_nr,
old_k.prs_kostenplaats_omschrijving,
k.prs_kostenplaats_key,
k.prs_kostenplaats_nr,
k.prs_kostenplaats_omschrijving,
ud.boeken,
ud.inzage,
bh.prs_perslid_naam_full
FROM (SELECT fac.safe_to_number(SUBSTR (
fac_usrdata_code,
1,
INSTR (fac_usrdata_code, '-') - 1
))
prs_perslid_key,
fac.safe_to_number (fac_usrdata_omschr)
prs_afdeling_key,
fac.safe_to_number(SUBSTR (
fac_usrdata_code,
INSTR (fac_usrdata_code, '-') + 1
))
prs_kostenplaats_key,
fac_usrdata_volgnr boeken,
fac_usrdata_prijs inzage
FROM fac_v_aanwezigusrdata
WHERE fac_usrtab_key = 3
AND TRUNC (fac_usrdata_aanmaak) = TRUNC (SYSDATE)) ud,
prs_v_aanwezigperslid p,
prs_v_perslid_fullnames_all pf,
prs_afdeling cur_a,
prs_afdeling old_a,
prs_kostenplaats cur_k,
prs_kostenplaats old_k,
prs_kostenplaats k,
prs_v_perslid_fullnames_all bh
WHERE ud.prs_perslid_key = p.prs_perslid_key
AND p.prs_perslid_key = pf.prs_perslid_key
AND p.prs_afdeling_key = cur_a.prs_afdeling_key
AND cur_a.prs_kostenplaats_key = cur_k.prs_kostenplaats_key(+)
AND ud.prs_afdeling_key = old_a.prs_afdeling_key
AND old_a.prs_kostenplaats_key = old_k.prs_kostenplaats_key(+)
AND ud.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
AND k.prs_perslid_key = bh.prs_perslid_key(+);
/* Formatted on 11-6-2012 15:26:45 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW uwva_v_noti_geschoond_mandaat
(
code,
sender,
receiver,
text,
KEY,
par1,
par2,
xkey
)
AS
SELECT DISTINCT
sn.fac_srtnotificatie_code,
NULL,
x.hide_f_prs_key,
sn.fac_srtnotificatie_oms,
x.hide_f_prs_key,
NULL,
NULL,
NULL
FROM uwva_v_rap_geschoond_mandaat x, fac_srtnotificatie sn
WHERE sn.fac_srtnotificatie_code = 'CUST13';
CREATE OR REPLACE VIEW uwva_v_noti_prs_inactalg
(
code,
sender,
receiver,
text,
key,
par1,
par2,
xkey
)
AS
SELECT 'CUST26',
NULL,
p2.prs_perslid_key,
'Medewerker gekoppeld aan gesloten pand ('
|| pf.prs_perslid_naam_friendly
|| ')',
p.prs_perslid_key,
NULL,
NULL,
NULL
FROM prs_perslidwerkplek pw,
prs_werkplek w,
alg_v_allonrgoed_gegevens aog,
alg_gebouw g,
alg_srtgebouw sg,
prs_v_aanwezigperslid p,
prs_afdeling a,
prs_kostenplaats k,
prs_v_aanwezigperslid p2,
prs_v_perslid_fullnames pf
WHERE pw.prs_werkplek_key = w.prs_werkplek_key
AND w.prs_alg_ruimte_key = aog.alg_ruimte_key
AND aog.alg_gebouw_key = g.alg_gebouw_key
AND g.alg_srtgebouw_key = sg.alg_srtgebouw_key
AND sg.alg_srtgebouw_passief = 1
AND p.prs_perslid_key = pw.prs_perslid_key
AND p.prs_afdeling_key = a.prs_afdeling_key
AND a.prs_kostenplaats_key = k.prs_kostenplaats_key
AND k.prs_perslid_key = p2.prs_perslid_key
AND p.prs_perslid_key = pf.prs_perslid_key
AND pw.prs_perslidwerkplek_volgnr = 2
UNION
SELECT 'CUST27',
NULL,
p.prs_perslid_key,
'Account gekoppeld aan gesloten pand',
p.prs_perslid_key,
NULL,
NULL,
NULL
FROM prs_perslidwerkplek pw,
prs_werkplek w,
alg_v_allonrgoed_gegevens aog,
alg_gebouw g,
alg_srtgebouw sg,
prs_v_aanwezigperslid p
WHERE pw.prs_werkplek_key = w.prs_werkplek_key
AND w.prs_alg_ruimte_key = aog.alg_ruimte_key
AND aog.alg_gebouw_key = g.alg_gebouw_key
AND g.alg_srtgebouw_key = sg.alg_srtgebouw_key
AND sg.alg_srtgebouw_passief = 1
AND p.prs_perslid_key = pw.prs_perslid_key
AND pw.prs_perslidwerkplek_volgnr = 2;
------ payload end ------
SET DEFINE OFF
BEGIN adm.systrackscriptId ('$Id$', 0); END;
/
COMMIT;
SET ECHO OFF
SPOOL OFF
SET DEFINE ON
PROMPT Logfile of this upgrade is: &fcltlogfile