-- -- $Id$ -- -- Script containing customer specific db-configuration for UWVA. -- 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; COLUMN fcltcusttxt NEW_VALUE fcltcusttxt NOPRINT; WHENEVER SQLERROR CONTINUE; SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL; SPOOL &fcltlogfile WHENEVER SQLERROR EXIT; SELECT adm.checkscriptcust('&dbuser') AS fcltcusttxt FROM DUAL; WHENEVER SQLERROR CONTINUE; --------------------------------------- PROMPT &fcltcusttxt --------------------------------------- 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 -- en worden inactieve KPN niet meer meegegeven (nog steeds?). -- UWVA#75874: Check op 50% voortaan tegen alleen actieve/niet verlopen KPN. 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 -- WHERE prs_kostenplaats_verwijder IS NULL -- AND prs_kostenplaats_module = 'PRS' -- 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 (dus alle parent-afdelingen) -- toegevoegd kunnen worden, voordat 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 status = 'A' AND niv2_code IS NOT NULL AND fac.safe_to_number (afdeling) > 0 ORDER BY 1; v_errormsg VARCHAR (200); oracle_err_mes VARCHAR2 (200); 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.5; -- 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 AND prs_kostenplaats_omschrijving NOT LIKE 'INACTIEF:%' AND COALESCE (prs_kostenplaats_eind, SYSDATE + 1) > TRUNC (SYSDATE); -- 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 OR (prs_kostenplaats_omschrijving LIKE 'INACTIEF:' AND prs_kostenplaats_eind < SYSDATE); -- 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_verwijder IS NULL AND prs_afdeling_upper = UPPER (rc.afdeling) AND prs_afdeling_parentkey 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_verwijder IS NULL AND prs_afdeling_upper = UPPER (rc.afdeling); UPDATE prs_afdeling SET prs_bedrijf_key = c_prs_bedrijfkey, prs_afdeling_parentkey = NULL WHERE prs_afdeling_verwijder IS NULL AND prs_afdeling_key = lniv2_codekey; 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 prs_kostenplaats_key INTO lkostenplaatskey FROM prs_kostenplaats WHERE prs_kostenplaats_verwijder IS NULL AND prs_kostenplaats_upper = UPPER (rc.afdeling); EXCEPTION WHEN NO_DATA_FOUND THEN BEGIN -- Er bestaat geen actuele kostenplaats. -- UWVA#647: Misschien een (onterecht) verwijderde? SELECT prs_kostenplaats_key INTO lkostenplaatskey FROM prs_kostenplaats WHERE prs_kostenplaats_upper = UPPER (rc.afdeling); EXCEPTION WHEN NO_DATA_FOUND THEN -- Kostenplaats bestaat echt nog niet. lkostenplaatskey := -1; WHEN TOO_MANY_ROWS THEN -- Meer dan n verwijderde instantie, dan heeft iemand zeer -- waarschijnlijk 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 verwijderde instanties; pak de oudste. SELECT MIN (prs_kostenplaats_key) INTO lkostenplaatskey FROM prs_kostenplaats WHERE 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, 200); 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_verwijder = NULL, prs_kostenplaats_eind = NULL, prs_kostenplaats_nr = rc.afdeling, prs_kostenplaats_omschrijving = rc.omschrijving WHERE prs_kostenplaats_key = lkostenplaatskey; ELSE UPDATE prs_kostenplaats SET prs_kostenplaats_eind = SYSDATE, prs_kostenplaats_omschrijving = SUBSTR ('INACTIEF:' || rc.omschrijving, 1, 60) 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 kostenplaats gegarandeerd en is lkostenplaatskey geldig. BEGIN -- Let op (UWVA#178): -- Hoewel wij afdelingen altijd hergebruiken, kan het door handmatig -- beheer gebeuren dat een afdeling dubbel voorkomt, 1x verwijderd en -- 1x 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 nooit -- NO_DATA_FOUND op, ook als niets wordt gevonden. -- Daarom een COALESCE met -1. SELECT COALESCE (MAX (prs_afdeling_key), -1) INTO lafdelingkey FROM prs_afdeling WHERE prs_afdeling_upper = UPPER (rc.afdeling); EXCEPTION WHEN NO_DATA_FOUND THEN lafdelingkey := -1; END; -- We hoeven nu alleen nog maar de afdeling aan te maken als het een PRS- -- kostenplaats is. IF isafdelingskostenplaats (rc.afdeling) THEN -- Als l_created = TRUE, dan is kostenplaats net aangemaakt. Als het -- een divisie (cluster) betreft, dan is 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 PRS- -- kostenplaats actief is, want dan moet er een afdeling bij bestaan. -- [Zo worden afdelingen, die - om wat voor reden ook - eerder niet -- zijn toegevoegd, deze run wel toegevoegd (met l_created gebeurde -- dat alleen in de run waarin de PRS-kostenplaats werd 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, 200); 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 en kostenplaats. BEGIN SELECT COUNT ( * ) INTO v_count FROM prs_kostenplaats WHERE prs_kostenplaats_verwijder IS NULL AND prs_kostenplaats_key = lkostenplaatskey; IF (v_count > 0) THEN UPDATE prs_kostenplaats SET prs_kostenplaats_verwijder = SYSDATE WHERE prs_kostenplaats_verwijder IS NULL AND prs_kostenplaats_key = lkostenplaatskey; 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_verwijder IS NULL AND prs_afdeling_key = lafdelingkey; IF (v_count > 0) THEN UPDATE prs_afdeling SET prs_afdeling_verwijder = SYSDATE WHERE prs_afdeling_verwijder IS NULL AND prs_afdeling_key = lafdelingkey; 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, 200); 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 PRS-kostenplaats. -- Ergo: zo mogelijk opruimen. -- UWVA#32268: Niet PRS-kostenplaatsen worden vanuit deze import -- nooit meer als afdeling aangemaakt! Hier gebeurt in -- principe dus nooit iets (tenzij handmatig een ALG- -- of PRJ-kostenplaats 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, 200); 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_verwijder IS NULL AND prs_afdeling_upper = UPPER (rc.afdeling); -- TODO: MAX, omdat ...? SELECT MAX (dparent.prs_afdeling_key) INTO lparentkey FROM prs_afdeling dparent WHERE dparent.prs_afdeling_verwijder IS NULL AND dparent.prs_afdeling_upper = UPPER (rc.parent); -- 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 (met 3 ICT-afdelingen -- in die 6e laag, onder 'Servicedesk ICT'). -- Haal die dus 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_verwijder IS NULL AND dparent.prs_afdeling_key = lparentkey; UPDATE prs_afdeling SET prs_bedrijf_key = NULL, prs_afdeling_parentkey = lparentkey 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_bedrijf_key = NULL, prs_afdeling_parentkey = lparentkey 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, 200); 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_verwijder IS NULL AND UPPER (k.prs_kostenplaats_nr) NOT LIKE '__UWV' AND k.prs_kostenplaats_nr = i.afdeling(+) AND i.afdeling IS NULL; 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 email 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, ''); 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', 'W', 'P', 'S')) ip -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? 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 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', 'P', 'S')) -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? 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'; /*** NIEUW: ABS-import ombutsen naar PSHCM-import! ***/ -- PSHCM importfunctie, herziene versie volgens UWVA#79055. -- Werkn.ID|Roepnaam|Initialen|Voorkeur achternaam|Achternaam|Tussenvoegsel|Achternaam partner|Voorvoegsel|Geslacht|Type medewerker|Kostenplaatscode|Functienaam |LocatieID|KA-account|E-mailadres -- 055406 |Pieter |PCM |Foortse |Foortse | | | |M |I |430132 |sr. functioneelbeheerder CC|GAMSG0 |PFO006 |Pieter.Foortse@uwv.nl -- IIQ -- EMPNUM,GRPFNAME,GRPID,ACCNT -- Type medewerker hetzelfde behalve W=P en S is nieuw! -- prefname nickname titel accnt altaccnt funcdscr telno mobnr faxnr email initials prefix empnum costcent gender type location id grpfname grpid lastname spousename spouseprefix /* 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) SELECT prs_perslid_naam, prs_kenmerk11, prs_perslid_tussenvoegsel FROM fac_imp_perslid WHERE prs_perslid_naam != prs_kenmerk11; SELECT x.prs_srtperslid_omschrijving, COUNT ( * ) FROM fac_imp_perslid x WHERE NOT EXISTS (SELECT 1 FROM prs_v_aanwezigsrtperslid WHERE prs_srtperslid_omschrijving = x.prs_srtperslid_omschrijving) GROUP BY x.prs_srtperslid_omschrijving; SELECT x.prs_afdeling_naam, COUNT ( * ) FROM fac_imp_perslid x WHERE NOT EXISTS (SELECT 1 FROM prs_afdeling WHERE prs_afdeling_verwijder IS NULL AND prs_afdeling_naam = x.prs_afdeling_naam) GROUP BY x.prs_afdeling_naam; SELECT COUNT (fac_usrdata_key) et_check FROM fac_v_aanwezigusrdata WHERE fac_usrtab_key = 301 -- c_usrtab_employeetype_key AND fac_usrdata_upper IN ('C', 'I', 'E', 'F', 'D', 'K', 'W'); SELECT COUNT (DISTINCT (prs_kenmerk1)) v_perslid_count_imp FROM fac_imp_perslid WHERE SUBSTR (prs_kenmerk1, 1, 1) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W'); SELECT COUNT ( * ) FROM fac_imp_perslid; SELECT DISTINCT prs_kenmerk1 FROM fac_imp_perslid; SELECT COUNT (DISTINCT prs_perslid_nr) v_perslid_count_imp FROM fac_imp_perslid WHERE prs_kenmerk1 IN ('C', 'I', 'E', 'F', 'D', 'K', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? ; SELECT COUNT ( * ) v_perslid_count_fac FROM prs_v_aanwezigperslid p, prs_v_aanwezigkenmerklink kl, fac_v_aanwezigusrdata ud WHERE (p.prs_perslid_nr IS NOT NULL OR p.prs_perslid_oslogin IS NOT NULL) AND p.prs_perslid_key = kl.prs_link_key AND kl.prs_kenmerk_key = 1040 AND kl.prs_kenmerklink_waarde = ud.fac_usrdata_key AND ud.fac_usrtab_key = 301 AND ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'K', 'P', 'S'); SELECT (24792 / 24538) FROM DUAL; -- Zet 'Type medewerker'-letter in personeelsnummer voor alle personen in -- importbestand! --UPDATE fac_imp_perslid -- SET prs_perslid_nr = COALESCE (prs_kenmerk1, '?') || '-' || prs_perslid_nr; -- Wis 'Type medewerker'-letter in personeelsnummer voor alle personen in -- Facilitor! Of beter via eenmalig script? --SELECT prs_perslid_nr, SUBSTR (prs_perslid_nr, 3) -- FROM prs_perslid -- WHERE prs_perslid_verwijder IS NULL -- AND prs_perslid_nr IS NOT NULL -- AND SUBSTR (prs_perslid_nr, 1, 2) IN ('C-', 'I-', 'E-', 'F-', 'D-', 'K-', 'W-', 'S-'); --UPDATE prs_perslid -- SET prs_perslid_nr = SUBSTR (prs_perslid_nr, 3) --, prs_perslid_tussenvoegsel = NULL??? -- WHERE prs_perslid_verwijder IS NULL -- AND prs_perslid_nr IS NOT NULL -- AND SUBSTR (prs_perslid_nr, 1, 2) IN ('C-', 'I-', 'E-', 'F-', 'D-', 'K-', 'W-', 'S-'); */ --Werkn.ID|Roepnaam|Initialen|Voorkeur achternaam|Achternaam|Tussenvoegsel|Achternaam partner|Voorvoegsel|Geslacht|Type medewerker|Kostenplaatscode|Functienaam|LocatieID|KA-account|E-mailadres --1=219997|2=Florian|3=FR|4=ten Hagen|5=Hagen|6=ten|7|8|9=M|10=I|11=430132|12=sr. functioneelbeheerder CC|13=GAMSG0|14=FHA038|15=Florian.tenHagen@uwv.nl CREATE OR REPLACE PROCEDURE uwva_import_pshcm (p_import_key IN NUMBER) AS v_errormsg VARCHAR2 (1000) := '-'; oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); BEGIN -- Geslacht-kolom op F wijzigen naar V! v_errormsg := 'Fout bijwerken geslacht (F->V)'; UPDATE fac_imp_file SET fac_imp_file_line = SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, '|', 1, 8)) || 'V' || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, '|', 1, 9)) WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1 AND SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, '|', 1, 8) + 1, 1) = 'F'; -- Generieke import. -- De sequence array staat beschreven in PRS_PAC.SRC bij de import_perslid-PROCEDURE. --'%Werkn.ID|Roepnaam|Initialen|Voorkeur achternaam|Achternaam|Tussenvoegsel|Achternaam partner|Voorvoegsel|Geslacht|Type medewerker|Kostenplaatscode|Functienaam|LocatieID|KA-account|E-mailadres%' v_errormsg := 'Fout inlezen PSHCM-bestand'; prs.import_perslid ( p_import_key, '0;0;0;0;0;0;11;4;0;2;' -- 11=Kostenplaatscode[63 nieuwe afdelingen???]/4=Voorkeur achternaam/2=Roepnaam || '3;0;0;0;9;0;0;15;0;1;' -- 3=Initialen/9=Geslacht/15=E-mailadres/1=Werkn.ID || '12;14;0;0;0;0;10;13;5;6;' -- 12=Functienaam[41 nieuwe functies???]/14=KA-account/10=Type medewerker/13=LocatieID[altijd gevuld???]/5=Achternaam/6=Tussenvoegsel || '7;8;0;0;0;0;0;0;0;0;' -- 7=Achternaam partner/8=Voorvoegsel [partner] || '0;0;0;0;0;0', '%Werkn.ID|Roepnaam|Initialen|Voorkeur achternaam|Achternaam|Tussenvoegsel|Achternaam partner|Voorvoegsel|Geslacht|Type medewerker|Kostenplaatscode|Functienaam|LocatieID|KA-account|E-mailadres%'); -- prs_perslid_naam = Voorkeur achternaam (voorheen Prefname) -- prs_perslid_tussenvoegsel = [initieel leeg!] -- prs_kenmerk3 = Achternaam (voorheen Lastname) -- prs_kenmerk4 = Tussenvoegsel (voorheen Prefix) -- prs_kenmerk5 = Achternaam partner (voorheen Spousename) -- prs_kenmerk6 = Voorvoegsel (voorheen Spouseprefix) /* 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, */ v_errormsg := 'Fout bijwerken tussenvoegsel'; UPDATE fac_imp_perslid i SET i.prs_perslid_tussenvoegsel = DECODE ( COALESCE (INSTR (i.prs_perslid_naam, i.prs_kenmerk5), 0), 0, TRIM (i.prs_kenmerk4), DECODE ( INSTR (i.prs_perslid_naam, i.prs_kenmerk3), 0, TRIM (i.prs_kenmerk6), CASE WHEN INSTR (i.prs_perslid_naam, i.prs_kenmerk3) <= INSTR (i.prs_perslid_naam, i.prs_kenmerk5) THEN TRIM (i.prs_kenmerk4) ELSE TRIM (i.prs_kenmerk6) END)) WHERE i.fac_import_key = p_import_key; v_errormsg := 'Fout bijwerken achternaam'; UPDATE fac_imp_perslid i SET i.prs_perslid_naam = DECODE ( SUBSTR (i.prs_perslid_naam, 1, COALESCE (LENGTH (i.prs_perslid_tussenvoegsel), 60)), i.prs_perslid_tussenvoegsel, TRIM(SUBSTR (i.prs_perslid_naam, LENGTH (i.prs_perslid_tussenvoegsel) + 1)), i.prs_perslid_naam) WHERE i.fac_import_key = p_import_key; v_errormsg := 'Fout bijwerken rest'; UPDATE fac_imp_perslid i SET i.prs_perslid_oslogin = (SELECT MIN (COALESCE (i.prs_perslid_oslogin, prs_perslid_oslogin)) FROM prs_v_aanwezigperslid WHERE prs_perslid_nr = i.prs_perslid_nr), i.prs_perslid_dienstverband = (SELECT MIN (COALESCE (prs_perslid_dienstverband, i.prs_perslid_dienstverband)) FROM prs_v_aanwezigperslid WHERE prs_perslid_nr = i.prs_perslid_nr), i.prs_perslid_telefoonnr = (SELECT MIN (COALESCE (prs_perslid_telefoonnr, i.prs_perslid_telefoonnr)) FROM prs_v_aanwezigperslid WHERE prs_perslid_nr = i.prs_perslid_nr), i.prs_perslid_mobiel = (SELECT MIN (COALESCE (prs_perslid_mobiel, i.prs_perslid_mobiel)) FROM prs_v_aanwezigperslid WHERE prs_perslid_nr = i.prs_perslid_nr), i.prs_perslid_email = (SELECT MIN (COALESCE (prs_perslid_email, i.prs_perslid_email)) FROM prs_v_aanwezigperslid WHERE prs_perslid_nr = i.prs_perslid_nr) WHERE i.fac_import_key = p_import_key AND EXISTS (SELECT 1 FROM prs_v_aanwezigperslid WHERE prs_perslid_nr = i.prs_perslid_nr); EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_errormsg, 'Inleesproces personen afgebroken!'); END uwva_import_pshcm; / CREATE OR REPLACE PROCEDURE uwva_update_pshcm (p_import_key IN NUMBER) AS c_employeetype_key NUMBER (10) := 1040; -- Type Medewerker/C(ontract), I(ntern), E(xtern), F(lexplek), D(ummy), K(etenpartner), W(onga)=P en S(?) c_usrtab_employeetype_key NUMBER (10) := 301; -- Type_medewerker c_usrdata_onbekend_key NUMBER (10) := 4889; c_usrdata_onbekend_omschr VARCHAR2 (60) := 'ONBEKEND'; c_usrtab_pandcoderegio_key NUMBER (10) := 782; c_usrtab_regiovinder_key NUMBER (10) := 783; c_regio_key NUMBER (10) := 1193; c_maxvariation NUMBER := 20; c_def_pandcode_ketenpartner VARCHAR2 (6) := 'GAMSG3'; c_srtgebouw_default NUMBER := 1; c_verdieping_omschr_default VARCHAR2 (30) := 'BG'; c_ruimte_code VARCHAR2 (12) := '_000'; c_ruimte_omschr_default VARCHAR2 (30) := 'Onbekend'; c_commitbuffer NUMBER (10) := 5000; -- Om de zoveel committen -- Voor budgethouders (uit voormalige budgethouderimport) c_kpn_maxvariation NUMBER := 0.5; -- Max new/old ratio to prevent undesired changes c_grp_budgh_key NUMBER := 1061; v_errormsg VARCHAR2 (1000); oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_count NUMBER; v_count_cursor NUMBER; currentversion fac_module.fac_module_version%TYPE; v_perslid_count_imp NUMBER; v_perslid_count_fac NUMBER; v_budgethouder_key NUMBER (10); v_aktie VARCHAR2 (10); v_update BOOLEAN; v_new_gebouw_key NUMBER (10); v_gebouw_code VARCHAR2 (12); v_verdieping_key NUMBER (10); v_ruimte_key NUMBER (10); v_ruimte_nr VARCHAR2 (20); -- Voor budgethouders (uit voormalige budgethouderimport) l_oldcount NUMBER; l_impcount NUMBER; l_impcount_prj NUMBER; nrbh1 NUMBER; nrbh2 NUMBER; v_time VARCHAR2 (50); -- Verwijderen personen die niet meer in importbestand voorkomen. -- Dubbele nummers? Dan wordt iemand mogelijk niet verwijderd/INACTIEF! CURSOR c_prs_del IS SELECT p.prs_perslid_key, pf.prs_perslid_naam_full, p.prs_perslid_nr, COUNT (vp.prs_perslid_key) verplichtingen FROM prs_v_aanwezigperslid p, prs_v_perslid_fullnames_all pf, prs_v_aanwezigkenmerklink tm, fac_v_aanwezigusrdata tm_ud, prs_v_verplichting_keys vp WHERE p.prs_perslid_apikey IS NULL -- Voor de zekerheid! AND p.prs_perslid_key = pf.prs_perslid_key AND p.prs_perslid_key = tm.prs_link_key AND tm.prs_kenmerk_key = c_employeetype_key AND fac.safe_to_number (tm.prs_kenmerklink_waarde) = tm_ud.fac_usrdata_key AND tm_ud.fac_usrtab_key = c_usrtab_employeetype_key AND tm_ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? K wordt niet verwijderd (en via PSHCM vooralsnog ook niet meer aangeleverd)! AND p.prs_perslid_key = vp.prs_perslid_key(+) AND NOT EXISTS (SELECT 1 FROM fac_imp_perslid WHERE UPPER (prs_perslid_nr) = UPPER (p.prs_perslid_nr)) GROUP BY p.prs_perslid_key, pf.prs_perslid_naam_full, p.prs_perslid_nr ORDER BY 1; -- Wijzigen kenmerkveld=Type medewerker. CURSOR c_prs_upd_typemdw IS SELECT p.prs_perslid_key, pf.prs_perslid_naam_full, p.prs_perslid_nr, tm_ud.fac_usrdata_code old_type, x.prs_kenmerk1 new_type, (SELECT fac_usrdata_key FROM fac_v_aanwezigusrdata WHERE fac_usrtab_key = c_usrtab_employeetype_key AND fac_usrdata_code = x.prs_kenmerk1) new_type_key FROM fac_imp_perslid x, prs_v_aanwezigperslid p, prs_v_perslid_fullnames_all pf, (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = c_employeetype_key) tm, (SELECT * FROM fac_v_aanwezigusrdata WHERE fac_usrtab_key = c_usrtab_employeetype_key AND fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S')) tm_ud -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? WHERE x.prs_perslid_nr = p.prs_perslid_nr AND p.prs_perslid_apikey IS NULL -- Voor de zekerheid! AND p.prs_perslid_key = pf.prs_perslid_key AND p.prs_perslid_key = tm.prs_link_key(+) AND fac.safe_to_number (tm.prs_kenmerklink_waarde) = tm_ud.fac_usrdata_key(+) AND COALESCE (tm_ud.fac_usrdata_code, '#') != x.prs_kenmerk1 ORDER BY 1; -- Afnemen budgethouderschap/mandaat als afdeling gewijzigd. CURSOR c_prs_upd_mandaat IS SELECT '[' || x.prs_perslid_naam_full || '|' || x.prs_perslid_nr || '] ' aanduiding, x.prs_perslid_key, fac.safe_to_number (x.prs_kenmerk7) old_afdeling_key, kp.budgethouderschap, pk.mandaat FROM (SELECT p.prs_perslid_key, pf.prs_perslid_naam_full, p.prs_perslid_nr, x.prs_kenmerk7 FROM fac_imp_perslid x, prs_v_aanwezigperslid p, prs_v_perslid_fullnames_all pf, prs_v_aanwezigkenmerklink tm, fac_v_aanwezigusrdata tm_ud WHERE x.prs_perslid_nr = p.prs_perslid_nr AND p.prs_perslid_apikey IS NULL -- Voor de zekerheid! AND p.prs_perslid_key = pf.prs_perslid_key AND p.prs_perslid_key = tm.prs_link_key AND tm.prs_kenmerk_key = c_employeetype_key AND fac.safe_to_number (tm.prs_kenmerklink_waarde) = tm_ud.fac_usrdata_key AND tm_ud.fac_usrtab_key = c_usrtab_employeetype_key AND tm_ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? AND p.prs_afdeling_key != fac.safe_to_number (x.prs_kenmerk7)) x LEFT JOIN ( SELECT prs_perslid_key, COUNT ( * ) budgethouderschap FROM prs_v_aanwezigkostenplaats GROUP BY prs_perslid_key) kp ON x.prs_perslid_key = kp.prs_perslid_key LEFT JOIN ( SELECT prs_perslid_key, COUNT ( * ) mandaat FROM prs_perslidkostenplaats GROUP BY prs_perslid_key) pk ON x.prs_perslid_key = pk.prs_perslid_key WHERE kp.budgethouderschap > 0 OR pk.mandaat > 0 ORDER BY 1; -- Bijwerken HRM-WP van personen uit import volgens ontvangen pandcode. 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, prs_kenmerk2 pandcode, -- LocatieID=Gebouwkostenplaats! tm_ud.fac_usrdata_code employeetype, '[' || p.prs_perslid_naam || '|' || p.prs_perslid_nr || '|' || p.prs_perslid_oslogin || '|' || l.alg_locatie_code || '] ' aanduiding FROM fac_imp_perslid x, prs_v_aanwezigperslid p, prs_v_aanwezigkostenplaats kp, alg_v_aanweziggebouw g, alg_locatie l, prs_v_aanwezigkenmerklink tm, fac_v_aanwezigusrdata tm_ud WHERE x.prs_perslid_nr = p.prs_perslid_nr AND x.prs_kenmerk2 = kp.prs_kostenplaats_nr AND kp.prs_kostenplaats_key = g.prs_kostenplaats_key AND g.alg_locatie_key = l.alg_locatie_key AND p.prs_perslid_key = tm.prs_link_key AND tm.prs_kenmerk_key = c_employeetype_key AND fac.safe_to_number (tm.prs_kenmerklink_waarde) = tm_ud.fac_usrdata_key AND tm_ud.fac_usrtab_key = c_usrtab_employeetype_key AND tm_ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S')) hrmloc -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? 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? ; -- UWVA#20232: Bijwerken Regio-kenmerkveld van personen uit import als deze -- leeg is of afwijkt van het gebouw waar ze zitten (hun HRM-WP -- hebben). CURSOR c_prs_regio IS SELECT '[' || TO_CHAR (hpw.prs_perslid_key) || '|' || r.prs_kenmerklink_waarde || '|' || COALESCE (rv.fac_usrdata_omschr, c_usrdata_onbekend_omschr) || '] ' aanduiding, hpw.prs_perslid_key, g.alg_gebouw_code, r.prs_kenmerklink_key, 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_v_aanwezigkenmerklink tm, -- Type Medwerker fac_v_aanwezigusrdata tm_ud, (SELECT * FROM prs_v_aanwezigkenmerklink WHERE prs_kenmerk_key = c_regio_key) r, -- WAS prs_werkplek w, alg_v_onrgoed_boom ogb, alg_gebouw g, (SELECT * FROM fac_v_aanwezigusrdata WHERE fac_usrtab_key = c_usrtab_pandcoderegio_key) pcr, (SELECT * FROM fac_v_aanwezigusrdata WHERE fac_usrtab_key = c_usrtab_regiovinder_key) rv -- WORDT WHERE hpw.prs_perslid_key = tm.prs_link_key AND tm.prs_kenmerk_key = c_employeetype_key AND fac.safe_to_number (tm.prs_kenmerklink_waarde) = tm_ud.fac_usrdata_key AND tm_ud.fac_usrtab_key = c_usrtab_employeetype_key AND tm_ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? AND hpw.prs_perslid_key = r.prs_link_key(+) AND hpw.prs_werkplek_key = w.prs_werkplek_key AND w.prs_alg_ruimte_key = ogb.alg_ruimte_key AND ogb.alg_gebouw_key = g.alg_gebouw_key AND g.alg_gebouw_code = pcr.fac_usrdata_code(+) AND pcr.fac_usrdata_omschr = rv.fac_usrdata_omschr(+) AND (r.prs_kenmerklink_waarde IS NULL OR fac.safe_to_number (r.prs_kenmerklink_waarde) != COALESCE (rv.fac_usrdata_key, c_usrdata_onbekend_key)) ORDER BY 1; -- UWVA#20033: Bijwerken functienamen (hoofdletters matchen). CURSOR c_functie IS SELECT DISTINCT sp.prs_srtperslid_key, x.prs_srtperslid_omschrijving funcdscr FROM prs_srtperslid sp, fac_imp_perslid x WHERE sp.prs_srtperslid_upper = UPPER (x.prs_srtperslid_omschrijving) AND sp.prs_srtperslid_omschrijving != x.prs_srtperslid_omschrijving; -- UWVA#23788: Loggen pandcodes (incl. aantal personen) in importbestand, -- waarvoor geen kostenplaats en/of gebouw kan worden bepaald. CURSOR c_pandcode_onbekend IS SELECT x.prs_kenmerk2 pandcode, kp.prs_kostenplaats_nr, COUNT (*) aantal FROM fac_imp_perslid x, prs_v_aanwezigkostenplaats kp, alg_v_aanweziggebouw g WHERE x.prs_kenmerk2 IS NOT NULL AND x.prs_kenmerk2 = kp.prs_kostenplaats_nr(+) AND kp.prs_kostenplaats_key = g.prs_kostenplaats_key(+) AND g.alg_gebouw_key IS NULL GROUP BY x.prs_kenmerk2, kp.prs_kostenplaats_nr ORDER BY 1; /* -- UWVA#20021: Voormalige budgethouderimport, zover de relatie kostenplaats -- en persoon (evt. leeg) kan worden gelegd. CURSOR c_budgethouder IS SELECT kp.prs_kostenplaats_key, imp.afdeling 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 kp, prs_v_aanwezigperslid p WHERE imp.afdeling = kp.prs_kostenplaats_nr AND imp.perslid_nr = p.prs_perslid_nr(+) ORDER BY 2; -- Logging onbekende kostenplaatsen. CURSOR c_kpn_onbekend IS SELECT kp.prs_kostenplaats_key, imp.afdeling prs_kostenplaats_nr, imp.perslid_nr prs_perslid_nr FROM uwva_imp_kpn imp, prs_v_aanwezigkostenplaats kp WHERE imp.afdeling = kp.prs_kostenplaats_nr(+) AND kp.prs_kostenplaats_nr IS NULL AND imp.afdeling IS NOT NULL AND imp.status = 'A' ORDER BY 2; */ -- Nieuwe werkplek aanmaken voor persoon en eventuele oude werkplek daarna -- verwijderen. 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 v_werkplek_volgnr NUMBER (10); v_new_werkplek_key NUMBER (10); BEGIN -- UWVA#21256: Bepaal laagst beschikbare WP-volgnr (om te voorkomen dat -- WP-volgnr hoger wordt dan past in prs_werkplek_volgnr). v_errormsg := 'Fout bepalen volgnummer nieuwe werkplek in ruimte ' || in_ruimte_nr; 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 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; -- UWVA#21256: ABS-werkplek heeft altijd bezettingvolgnr 2. -- Da's hoger dan Vinder-import (die gebruikt 3 en 4), maar laat 1 over -- om handmatig een hoofdwerkplek in te stellen. IF in_wp_oud_key IS NULL THEN -- Insert v_errormsg := 'Fout 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); ELSE -- Update v_errormsg := 'Fout 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 verwijderen oude werkplek (' || in_wp_oud_key || ')'; DELETE FROM prs_werkplek WHERE prs_werkplek_key = in_wp_oud_key; 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, 'W', v_errormsg, 'uwva_upsert_wp'); END; BEGIN v_errormsg := 'Fout controleren inhoud'; -- Init SELECT MAX (fac_module_version) INTO currentversion FROM fac_module; fac.imp_writelog (p_import_key, 'S', 'Facilitor PSHCM-import versie ' || currentversion, '$Revision$'); -- Aantal potentieel matchbare personen in importbestand! SELECT COUNT (DISTINCT prs_perslid_nr) INTO v_perslid_count_imp FROM fac_imp_perslid -- WHERE prs_kenmerk1 IN ('C', 'I', 'E', 'F', 'D', 'K', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? ; -- Aantal potentieel matchbare personen in Facilitor! -- WEG:Dus mt personeelsnummer en/of account en met juiste werknemertype. -- Dus mt personeelsnummer en met juiste werknemertype. SELECT DECODE (COUNT ( * ), 0, 1, COUNT ( * )) INTO v_perslid_count_fac FROM prs_v_aanwezigperslid p, prs_v_aanwezigkenmerklink tm, fac_v_aanwezigusrdata tm_ud WHERE --WEG:(p.prs_perslid_nr IS NOT NULL OR p.prs_perslid_oslogin IS NOT NULL) p.prs_perslid_nr IS NOT NULL AND p.prs_perslid_key = tm.prs_link_key AND tm.prs_kenmerk_key = c_employeetype_key AND fac.safe_to_number (tm.prs_kenmerklink_waarde) = tm_ud.fac_usrdata_key AND tm_ud.fac_usrtab_key = c_usrtab_employeetype_key AND tm_ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? ; IF ((100 * ABS (v_perslid_count_imp - v_perslid_count_fac) / v_perslid_count_fac) > c_maxvariation) THEN fac.imp_writelog (p_import_key, 'W', 'Verschil tussen te importeren (' || TO_CHAR (v_perslid_count_fac) || ') en actieve (' || TO_CHAR (v_perslid_count_imp) || ') personen te groot', 'Afwijking bedraagt ' || TO_CHAR (100 * ABS (v_perslid_count_imp - v_perslid_count_fac) / v_perslid_count_fac, '9999999D9') || '%' ); RETURN; END IF; -- Verwijderen personen (onder import-regime) niet meer in importbestand! FOR rec IN c_prs_del LOOP BEGIN v_errormsg := 'Fout verwijderen persoon ' || rec.prs_perslid_naam_full || '/' || rec.prs_perslid_nr; prs.delete_perslid (p_import_key, rec.prs_perslid_key); IF rec.verplichtingen > 0 -- Actuele verplichtingen? THEN -- UWVA#20219: 'Toon in gids' uitvinken, ook als persoon al INACTIEF. v_errormsg := 'Fout verwijderen gidsvermelding van ' || rec.prs_perslid_naam_full || '/' || rec.prs_perslid_nr; UPDATE prs_perslid SET prs_perslid_ingids = NULL WHERE prs_perslid_key = rec.prs_perslid_key; -- UWA#249970: Notificatie naar budgethouder. v_errormsg := 'Fout notificeren budgethouder van ' || rec.prs_perslid_naam_full || '/' || rec.prs_perslid_nr; SELECT kp.prs_perslid_key INTO v_budgethouder_key FROM prs_perslid p, prs_afdeling a, prs_kostenplaats kp WHERE p.prs_perslid_key = rec.prs_perslid_key AND p.prs_afdeling_key = a.prs_afdeling_key AND a.prs_kostenplaats_key = kp.prs_kostenplaats_key; fac.putnotificationsrtprio (88602, -- pfrom (UWVA#37656: Met usesenderasreplyto=true haalt psender niets uit en moet pfrom zijn gevuld: 88602=_EMAIL-user) v_budgethouder_key, -- pto 'CUST21', -- pcode 1675, -- pref (naar UWVA_V_RAP_UITDIENST) NULL, -- poptmessage NULL, -- poptstatus NULL, -- poptemail NULL, -- poptmobile rec.prs_perslid_key, -- pxref 2, -- pprio 'infobeheer.fi@uwv.nl'); -- psender 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, 'W', v_errormsg, 'Verwijderen personen'); END; END LOOP; /* -- Markeren nieuwe medewerkers in fac_imp_perslid/prs_kenmerk2 voordat deze -- worden aangemaakt via prs.update_perslid() en niet te onderscheiden zijn -- van bijgewerkte medewerkers (behalve op datum?)! UPDATE fac_imp_perslid x SET x.prs_kenmerkx = 'Nieuw' WHERE NOT EXISTS (SELECT 1 FROM prs_v_aanwezigperslid p, prs_v_aanwezigkenmerklink kl, fac_v_aanwezigusrdata ud, prs_afdeling a WHERE p.prs_perslid_key = kl.prs_link_key AND kl.prs_kenmerk_key = c_employeetype_key AND fac.safe_to_number (kl.prs_kenmerklink_waarde) = ud.fac_usrdata_key AND ud.fac_usrtab_key = c_usrtab_employeetype_key AND ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? AND p.prs_afdeling_key = a.prs_afdeling_key AND a.prs_afdeling_verwijder IS NULL AND p.prs_perslid_nr = x.prs_perslid_nr); -- TODO:Logging??? */ -- Bewaren huidige afdeling in fac_imp_perslid/prs_kenmerk7 voordat deze -- zou kunnen worden gewijzigd via prs.update_perslid()! v_errormsg := 'Fout bewaren huidige afdeling'; UPDATE fac_imp_perslid x SET x.prs_kenmerk7 = (SELECT TO_CHAR (a.prs_afdeling_key) FROM prs_v_aanwezigperslid p, prs_v_aanwezigkenmerklink kl, fac_v_aanwezigusrdata ud, prs_afdeling a WHERE p.prs_perslid_key = kl.prs_link_key AND kl.prs_kenmerk_key = c_employeetype_key AND fac.safe_to_number (kl.prs_kenmerklink_waarde) = ud.fac_usrdata_key AND ud.fac_usrtab_key = c_usrtab_employeetype_key AND ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? AND p.prs_afdeling_key = a.prs_afdeling_key AND a.prs_afdeling_verwijder IS NULL AND p.prs_perslid_nr = x.prs_perslid_nr) WHERE EXISTS (SELECT 1 FROM prs_v_aanwezigperslid p, prs_v_aanwezigkenmerklink kl, fac_v_aanwezigusrdata ud, prs_afdeling a WHERE p.prs_perslid_key = kl.prs_link_key AND kl.prs_kenmerk_key = c_employeetype_key AND fac.safe_to_number (kl.prs_kenmerklink_waarde) = ud.fac_usrdata_key AND ud.fac_usrtab_key = c_usrtab_employeetype_key AND ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? AND p.prs_afdeling_key = a.prs_afdeling_key AND a.prs_afdeling_verwijder IS NULL AND p.prs_perslid_nr = x.prs_perslid_nr); -- TODO:Logging??? -- Generieke update op personeelsnummer (NR), geen WPs verwijderen (NULL) -- en incl. kenmerkvelden (1)! v_errormsg := 'Fout generieke update'; prs.update_perslid (p_import_key, 'NR', NULL, 1); -- *** Bijwerken persoonsgegevens (niet ondersteund door standaard import). -- Wijzigen persoonskenmerk=Type medewerker. v_count_cursor := 0; v_errormsg := 'Fout bijwerken Type medewerker'; FOR rec IN c_prs_upd_typemdw LOOP BEGIN v_errormsg := '[' || rec.prs_perslid_naam_full || '|' || rec.prs_perslid_nr || '] Fout bijwerken kenmerk=Type medewerker'; prs.upsertkenmerk (c_employeetype_key, rec.prs_perslid_key, rec.new_type_key); -- Type medewerker v_count_cursor := v_count_cursor + 1; END; END LOOP; fac.imp_writelog (p_import_key, 'S', 'Type medewerker/#bijgewerkt: ' || TO_CHAR (v_count_cursor), ''); -- Afnemen gidsvermelding voor - nieuw aangemaakte! - K(etenpartners). -- TODO:Alleen initieel??? v_errormsg := 'Fout afnemen gidsvermelding voor K(etenpartners)'; UPDATE prs_perslid p SET prs_perslid_ingids = NULL WHERE p.prs_perslid_aanmaak > SYSDATE - (1 / 24) -- Afgelopen uur aangemaakt (beetje sketchy, maar vooruit) AND EXISTS -- In importbestand (SELECT 1 FROM fac_imp_perslid WHERE prs_perslid_nr = p.prs_perslid_nr) AND EXISTS -- K(etenpartner) (SELECT 1 FROM prs_v_aanwezigkenmerklink kl, fac_v_aanwezigusrdata ud WHERE kl.prs_kenmerk_key = c_employeetype_key AND kl.prs_kenmerklink_waarde = ud.fac_usrdata_key AND ud.fac_usrtab_key = c_usrtab_employeetype_key AND ud.fac_usrdata_code = 'K' AND kl.prs_link_key = p.prs_perslid_key); -- TODO:Logging??? -- Afnemen/toekennen Medewerker-groep (key=1601) aan iedereen met een Type -- medewerker gezet op 'C', 'I', 'E', 'F', 'D', 'K', 'W', 'P' of 'S'! v_errormsg := 'Fout afnemen Medewerker-autorisatiegroep'; DELETE FROM fac_gebruikersgroep gg WHERE gg.fac_groep_key = 1601 -- Medewerker-autorisatiegroep AND NOT EXISTS (SELECT 1 FROM fac_imp_perslid x, prs_v_aanwezigperslid p, prs_v_aanwezigkenmerklink tm, fac_v_aanwezigusrdata tm_ud WHERE x.prs_perslid_nr = p.prs_perslid_nr AND p.prs_perslid_key = tm.prs_link_key AND tm.prs_kenmerk_key = c_employeetype_key AND fac.safe_to_number (tm.prs_kenmerklink_waarde) = tm_ud.fac_usrdata_key AND tm_ud.fac_usrtab_key = c_usrtab_employeetype_key AND tm_ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? AND p.prs_perslid_key = x.prs_perslid_key); -- TODO:Logging??? v_errormsg := 'Fout toekennen Medewerker-autorisatiegroep'; INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key) SELECT 1601, p.prs_perslid_key -- Medewerker-autorisatiegroep FROM fac_imp_perslid x, prs_v_aanwezigperslid p, prs_v_aanwezigkenmerklink tm, fac_v_aanwezigusrdata tm_ud WHERE x.prs_perslid_nr = p.prs_perslid_nr AND p.prs_perslid_key = tm.prs_link_key AND tm.prs_kenmerk_key = c_employeetype_key AND fac.safe_to_number (tm.prs_kenmerklink_waarde) = tm_ud.fac_usrdata_key AND tm_ud.fac_usrtab_key = c_usrtab_employeetype_key AND tm_ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? AND NOT EXISTS -- Niet al in Medewerker-autorisatiegroep! (SELECT 1 FROM fac_gebruikersgroep WHERE fac_groep_key = 1601 -- Medewerker-autorisatiegroep AND prs_perslid_key = p.prs_perslid_key); -- TODO:Logging??? -- Afnemen budgethouderschap/mandaat als afdeling gewijzigd en voorbereiden -- CUST13. -- UWVA#22892: Verwijder eerst de bewaarde mandaten (Eigen tabel met key=3) -- en rapportage-links (hidden kenmerk met key=1111) uit -- voorgaande import. Per persoon die deze run naar een andere -- afdeling verhuist, worden weer nieuwe records toegevoegd. v_errormsg := 'Fout afnemen budgethouderschap/mandaat'; DELETE FROM fac_usrdata WHERE fac_usrtab_key = 3; DELETE FROM prs_kenmerklink WHERE prs_kenmerklink_niveau = 'P' AND prs_kenmerk_key = 1111; v_count_cursor := 0; FOR rec IN c_prs_upd_mandaat LOOP BEGIN v_errormsg := 'Fout verwijderen budgethouderschap'; IF COALESCE (rec.budgethouderschap, 0) > 0 THEN UPDATE prs_kostenplaats SET prs_perslid_key = NULL WHERE prs_perslid_key = rec.prs_perslid_key; fac.imp_writelog (p_import_key, 'I', rec.aanduiding || 'Budgethouderschap/#vervallen: ' || TO_CHAR (rec.budgethouderschap), 'Mandaatschoning'); END IF; v_errormsg := 'Fout verwijderen mandaat'; IF COALESCE (rec.mandaat, 0) > 0 THEN -- UWVA#22892: Bewaren - deze PSHCM-import! - verwijderde mandaten -- tbv. CUST13-noti en link persoon aan rapportage met -- verwijderde mandaten (met key=555). INSERT INTO fac_usrdata (fac_usrtab_key, fac_usrdata_code, fac_usrdata_omschr, fac_usrdata_volgnr, fac_usrdata_prijs) SELECT 3, -- MANDAATREMINDER TO_CHAR (pk.prs_perslid_key) || '-' || TO_CHAR (COALESCE (pk.prs_kostenplaats_key, 0)), TO_CHAR (rec.old_afdeling_key), -- Oude afdeling COALESCE (pk.prs_perslidkostenplaats_boeken, 0), COALESCE (pk.prs_perslidkostenplaats_inzage, 0) FROM prs_perslidkostenplaats pk, prs_kostenplaats kp WHERE pk.prs_kostenplaats_key = kp.prs_kostenplaats_key(+) AND pk.prs_perslid_key = rec.prs_perslid_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 (rec.prs_perslid_key, 'P', 1111, -- MANDAATREMINDER '555'); -- UWVA_V_RAP_GESCHOOND_MANDAAT DELETE FROM prs_perslidkostenplaats WHERE prs_perslid_key = rec.prs_perslid_key; fac.imp_writelog (p_import_key, 'I', rec.aanduiding || 'Mandaat/#vervallen: ' || TO_CHAR (rec.mandaat), 'Mandaatschoning'); END IF; v_count_cursor := v_count_cursor + 1; END; END LOOP; fac.imp_writelog (p_import_key, 'S', 'Mandaatschoning/#personen: ' || TO_CHAR (v_count_cursor), ''); -- UWVA#30547: K(etenpartners) krijgen geen (zelden een) locatie mee vanuit -- PSHCM, 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 K-personen GAMSG3 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. v_errormsg := 'Fout toewijzen AMSG3-werkplek voor K(etenpartners)'; UPDATE fac_imp_perslid SET prs_kenmerk2 = c_def_pandcode_ketenpartner WHERE prs_kenmerk1 = 'K' AND prs_kenmerk2 IS NULL; -- Bijwerken HRM-WP van personen uit import volgens ontvangen pandcode. -- Cursor levert alleen personen waarvoor iets moet gebeuren! v_count_cursor := 0; v_errormsg := 'Fout bijwerken HRM-WP'; FOR rec_wp IN c_prs_wp LOOP BEGIN v_errormsg := 'NONE'; v_aktie := '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 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 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 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 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 K(etenpartners) niet 'het eerste gebouw' -- kiezen, maar het gebouw volgens de cursor (AMGS3). v_new_gebouw_key := rec_wp.alg_gebouw_key; ELSE v_errormsg := 'Fout 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_gebouw_code := '0'; v_errormsg := 'Fout toevoegen gebouw op locatie/pandcode ' || rec_wp.alg_locatie_key || '/' || rec_wp.pandcode; 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 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 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 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 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_count_cursor := v_count_cursor + 1; IF MOD (v_count_cursor, c_commitbuffer) = 0 THEN COMMIT; 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, 'W', rec_wp.aanduiding || v_errormsg, 'WP'); END; END LOOP; fac.imp_writelog (p_import_key, 'S', 'WP/#bijgewerkt: ' || TO_CHAR (v_count_cursor), ''); -- UWVA#20232: Bijwerken Regio-kenmerkveld van personen uit import als deze -- leeg is of afwijkt van het gebouw waar ze zitten (hun HRM-WP -- hebben). v_count_cursor := 0; FOR rec_regio IN c_prs_regio LOOP BEGIN IF (rec_regio.prs_kenmerklink_key IS NULL) THEN v_errormsg := 'Fout toevoegen Regio-kenmerkveld'; 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, TO_CHAR (rec_regio.fac_usrdata_key)); ELSE v_errormsg := 'Fout bijwerken Regio-kenmerkveld'; UPDATE prs_kenmerklink SET prs_kenmerklink_waarde = TO_CHAR (rec_regio.fac_usrdata_key) WHERE prs_kenmerklink_key = rec_regio.prs_kenmerklink_key; END IF; v_count_cursor := v_count_cursor + 1; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 100); v_errormsg := v_errormsg || '( ORACLE error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'W', rec_regio.aanduiding || v_errormsg, 'Regio'); END; END LOOP; fac.imp_writelog (p_import_key, 'S', 'Regio/#bijgewerkt: ' || TO_CHAR (v_count_cursor), ''); COMMIT; -- Loggen aantal personen voor en na import. SELECT COUNT ( * ) INTO v_count FROM prs_v_aanwezigperslid p, prs_v_aanwezigkenmerklink tm, fac_v_aanwezigusrdata tm_ud WHERE p.prs_perslid_nr IS NOT NULL AND p.prs_perslid_key = tm.prs_link_key AND tm.prs_kenmerk_key = c_employeetype_key AND fac.safe_to_number (tm.prs_kenmerklink_waarde) = tm_ud.fac_usrdata_key AND tm_ud.fac_usrtab_key = c_usrtab_employeetype_key AND tm_ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? ; fac.imp_writelog (p_import_key, 'S', 'PSHCM-personen/#voor: ' || TO_CHAR (v_perslid_count_fac) || ' => #na: ' || TO_CHAR (v_count), ''); -- Loggen aantal personen zonder personeelsnummer. SELECT COUNT ( * ) INTO v_count FROM prs_v_aanwezigperslid WHERE prs_perslid_nr IS NULL; fac.imp_writelog (p_import_key, 'S', 'Personen/#zonder personeelsnummer: ' || TO_CHAR (v_count), ''); -- Verwijderen ongebruikte functies. v_errormsg := 'Fout verwijderen functies'; DELETE FROM prs_srtperslid sp WHERE NOT EXISTS (SELECT 1 FROM prs_perslid WHERE prs_srtperslid_key = sp.prs_srtperslid_key); -- UWVA#23714: Logisch verwijderen functies die alleen verwijderde personen -- nog hebben. v_errormsg := 'Fout logisch verwijderen functies'; UPDATE prs_srtperslid sp SET sp.prs_srtperslid_verwijder = SYSDATE WHERE sp.prs_srtperslid_verwijder IS NULL AND NOT EXISTS (SELECT 1 FROM prs_v_aanwezigperslid WHERE prs_srtperslid_key = sp.prs_srtperslid_key); -- Ook verwijderen 'Alternatieve functie'-kenmerkvelden (key=1192) die naar -- niet-meer-bestaande functies verwijzen. DELETE FROM prs_kenmerklink kl WHERE prs_kenmerk_key = 1192 -- Alternatieve functie 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: Bijwerken functieomschrijvingen (hoofdletters matchen). FOR rec_func IN c_functie LOOP BEGIN v_errormsg := 'Fout bijwerken functie: ' || rec_func.funcdscr; 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, 200); v_errormsg := v_errormsg || ' (ORACLE error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'W', v_errormsg, 'Functie'); END; END LOOP; -- UWVA#23788: Loggen pandcodes (incl. aantal personen) in importbestand, -- waarvoor geen kostenplaats en/of gebouw kan worden bepaald. FOR rec IN c_pandcode_onbekend LOOP BEGIN v_errormsg := 'Fout loggen onbekende pandcodes'; IF (rec.prs_kostenplaats_nr IS NULL) -- Kostenplaats onbekend? THEN fac.imp_writelog (p_import_key, 'W', 'Kostenplaats onbekend: ' || rec.pandcode || ' (' || TO_CHAR (rec.aantal) || ' personen)', 'Pandcode onbekend'); ELSE fac.imp_writelog (p_import_key, 'W', 'Geen gebouw met kostenplaats: ' || rec.pandcode || ' (' || TO_CHAR (rec.aantal) || ' personen)', 'Pandcode onbekend'); 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, 'W', v_errormsg, 'Pandcode onbekend'); END; END LOOP; -- 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', 'Importproces PSHCM voltooid', v_time); 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 PSHCM afgebroken!'); END uwva_update_pshcm; / -- UWVA#18115: ABS-import herzien. -- UWVA#19010: Aanvullingen voor Vinder. -- UWVA#79055: Meeste verplaatst naar PSHCM-import (live per 27-9-2024) en -- daarna ABS-import omgebutst naar nieuwe formaat (4 kolommen: -- EMPNUM;GRPFNAME;GRPID;ACCNT). CREATE OR REPLACE PROCEDURE uwva_import_abs (p_import_key IN NUMBER) AS c_delim VARCHAR2 (1) := ';'; -- Field seperator c_commitbuffer NUMBER := 2000; -- Om de zoveel committen v_newline VARCHAR2 (1000); -- Import line v_errormsg VARCHAR2 (1000) := ''; oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); header_found BOOLEAN := FALSE; v_count_import NUMBER (10) := 0; v_buffercount NUMBER (10) := 0; -- De importvelden v_empnum VARCHAR2 (100); v_grpfname VARCHAR2 (100); v_grpid VARCHAR2 (100); v_account VARCHAR2 (100); CURSOR c1 IS SELECT * FROM fac_imp_file WHERE fac_import_key = p_import_key ORDER BY fac_imp_file_index; BEGIN -- Clear my previous imported rows DELETE FROM uwva_imp_abs; FOR rec1 IN c1 LOOP BEGIN v_newline := rec1.fac_imp_file_line; fac.imp_getfield (v_newline, c_delim, v_empnum); fac.imp_getfield (v_newline, c_delim, v_grpfname); fac.imp_getfield (v_newline, c_delim, v_grpid); fac.imp_getfield (v_newline, c_delim, v_account); -- Skip until the header is found IF (header_found = FALSE) THEN IF UPPER (v_empnum) = 'EMPNUM' AND UPPER (v_grpfname) = 'GRPFNAME' AND UPPER (v_grpid) = 'GRPID' AND UPPER (v_account) = 'ACCNT' THEN header_found := TRUE; END IF; ELSE INSERT INTO uwva_imp_abs (empnum, -- Personeelsnummer (zonder prefix zoals in importbestand+Facilitor) grpfname, grpid, account) VALUES (TRIM (v_empnum), SUBSTR (v_grpfname, 1, 40), SUBSTR (v_grpid, 1, 40), UPPER (SUBSTR (v_account, 1, 30))); v_count_import := v_count_import + 1; END IF; 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; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_errormsg, 'Inleesproces ABSIIQ afgebroken!'); END; / -- Functie om werknemertype te bepalen. CREATE OR REPLACE PACKAGE uwva_abs AS FUNCTION get_employeetype (perslid_key IN NUMBER, employeetype_key IN NUMBER) RETURN VARCHAR2; END uwva_abs; / CREATE OR REPLACE PACKAGE BODY uwva_abs AS FUNCTION get_employeetype (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_kenmerklink km, fac_usrdata ud WHERE km.prs_link_key = perslid_key AND km.prs_kenmerk_key = employeetype_key AND fac.safe_to_number (km.prs_kenmerklink_waarde) = ud.fac_usrdata_key; RETURN vf_employeetype; EXCEPTION WHEN OTHERS THEN RETURN ''; END get_employeetype; END uwva_abs; / -- UWVA#18115: ABS-import herzien (en met UWVA#19010 nog Vinder-aanvullingen). -- UWVA#79055: ABS-import gesplitst. Meeste verhuisd naar PSHCM-import en wat -- overblijft op basis van de personeelsnummer (ipv. ABS-ID)! CREATE OR REPLACE PROCEDURE uwva_update_abs (p_import_key IN NUMBER) AS -- Constanten c_grp_default_key NUMBER (10) := 241; c_grp_budgh_key NUMBER := 1061; c_grp_medewerker_key NUMBER := 1601; c_employeetype_key NUMBER (10) := 1040; -- Het flexkenmerk dat het employeetype registreert [W is P geworden en S is nieuw!] -- C(contract), I(intern), E(extern), F(flexplek), D(dummy), K(ketenpartner), W(wonga), P(?), S(?) c_usrtab_employeetype_key NUMBER (10) := 301; -- Dat is een referentiekenmerk naar fac_userdata die we opzoeken -- Voor budgethouders (uit voormalige budgethouderimport) l_oldcount NUMBER; l_impcount NUMBER; l_impcount_prj NUMBER; c_kpn_maxvariation NUMBER := 0.5; -- Max new/old ratio to prevent undesired changes nrbh1 NUMBER; nrbh2 NUMBER; c_maxvariation NUMBER := 80; c_commitbuffer NUMBER := 5000; -- Om de zoveel committen v_buffercount NUMBER := 0; v_time VARCHAR2 (50); /* C??? I E F D??? K??? W??? P S B??? L??? M??? T??? CURSOR c_prs_upd IS SELECT x.empnum, x.account, p.prs_perslid_key, COUNT (*) aantal FROM uwva_imp_abs x, prs_v_aanwezigperslid p WHERE 1 = 1 --AND SUBSTR (x.empnum, 1, 1) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? AND x.empnum != '000000' -- Of K helemaal uitsluiten? AND x.empnum = p.prs_perslid_nr(+) GROUP BY x.empnum, x.account, p.prs_perslid_key; */ CURSOR c_prs_upd IS SELECT DISTINCT empnum, account FROM uwva_imp_abs WHERE empnum != '000000' -- Of K helemaal uitsluiten? UNION -- UWVA#86694: Niet iedereen in ABS(IIQ)-bestand, dus doen alsof! SELECT p.prs_perslid_nr empnum, p.prs_perslid_oslogin account FROM prs_v_aanwezigperslid p, prs_v_aanwezigkenmerklink km, fac_v_aanwezigusrdata ud WHERE p.prs_perslid_nr != '000000' -- Of K helemaal uitsluiten? AND p.prs_perslid_key = km.prs_link_key AND km.prs_kenmerk_key = c_employeetype_key AND fac.safe_to_number (km.prs_kenmerklink_waarde) = ud.fac_usrdata_key AND ud.fac_usrtab_key = c_usrtab_employeetype_key AND ud.fac_usrdata_code IN ('C', 'I', 'E', 'F', 'D', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? ; -- Gegeven persoon (Personeelsnummer en perslid_key), bepaal op basis van de rollen -- die deze persoon heeft, welke autorisatiegroepen 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_persnr 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.empnum = in_persnr 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', 'P', 'S')) -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? ; -- Gegeven persoon (Personeelsnummer en perslid_key), bepaal op basis van de rollen -- die deze persoon heeft, welke autorisatiegroepen 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_persnr 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.empnum = in_persnr 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', 'P', 'S')) -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? 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; -- 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 imp.perslid_nr = p.prs_perslid_nr(+) -- Personeelsnummer (zonder prefix zoals in KPN-importbestand+Facilitor) ORDER BY 2; -- Onbekende kostenplaats CURSOR c_kpn_onbekend IS SELECT kpn.prs_kostenplaats_key, imp.afdeling prs_kostenplaats_nr, imp.perslid_nr imp_perslid_nr FROM uwva_imp_kpn imp, prs_v_aanwezigkostenplaats kpn WHERE imp.afdeling IS NOT NULL AND imp.status = 'A' AND imp.afdeling = kpn.prs_kostenplaats_nr(+) AND kpn.prs_kostenplaats_nr IS NULL ORDER BY 2; rec_upd c_prs_upd%ROWTYPE; rec_groep c_groep%ROWTYPE; rec_rol c_rol%ROWTYPE; rec_rnu c_rol_not_used%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); currentversion fac_module.fac_module_version%TYPE; v_perslid_count_imp NUMBER; v_perslid_count_fclt NUMBER; v_count NUMBER (10); v_update BOOLEAN; v_perslid_key NUMBER (10); v_prs_omschr VARCHAR2 (150); v_profiel_key NUMBER (10); v_profiel_omschr VARCHAR2 (30); v_limiet NUMBER (10); BEGIN -- 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 (empnum)) INTO v_perslid_count_imp FROM uwva_imp_abs ; -- Aantal actieve, potentieel matchbare personen in Facilitor -- (dus mt 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_v_aanwezigperslid WHERE (prs_perslid_nr IS NOT NULL OR prs_perslid_oslogin IS NOT NULL) AND uwva_abs.get_employeetype (prs_perslid_key, c_employeetype_key) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? ; 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; -- *** Update *** FOR rec_upd IN c_prs_upd LOOP BEGIN -- Init v_errormsg := 'Update init'; v_update := TRUE; v_perslid_key := 0; v_prs_omschr := 'Personeelsnummer/Login: ' || rec_upd.empnum || '/' || rec_upd.account; -- *** Matching *********************************** -- NB: zie uitleg bij cursor IF v_update THEN -- *** Matching op Personeelsnummer *** v_errormsg := 'Uniek Personeelsnummer'; -- Check of empnum=Personeelsnummer wel uniek is in importbestand -- Een persoon kan vaker in het importbestandvoorkomen, met alle gegevens behalve de rol hetzelfde. -- Daarom SELECT DISTINCT op 'empnum' en (omdat die ook uniek moet zijn) 'account'! SELECT COUNT(*) INTO v_count FROM (SELECT DISTINCT empnum, account FROM uwva_imp_abs WHERE empnum = rec_upd.empnum); -- Niet uniek (en wel in importbestand!) --> error IF v_count > 1 THEN v_errorhint := 'Personeelsnummer is niet uniek in importbestand. ' || v_prs_omschr; fac.imp_writelog (p_import_key, 'W', v_errormsg, v_errorhint); v_update := FALSE; -- Wel uniek (of niet in importbestand!) --> komt het ook (uniek) voor in Facilitor? ELSE v_errormsg := 'Matching op Personeelsnummer'; -- 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 Personeelsnummer 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 WHERE prs_perslid_nr = rec_upd.empnum AND uwva_abs.get_employeetype (prs_perslid_key, c_employeetype_key) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? ; -- Persoon zou met PSHCM-import reeds moeten zijn aangemaakt! IF v_count = 1 THEN v_errormsg := 'Fout bepalen persoon (obv. Personeelsnummer)'; SELECT prs_perslid_key INTO v_perslid_key FROM prs_v_aanwezigperslid WHERE prs_perslid_nr = rec_upd.empnum AND uwva_abs.get_employeetype (prs_perslid_key, c_employeetype_key) IN ('C', 'I', 'E', 'F', 'D', 'K', 'W', 'P', 'S') -- W is P geworden en S is nieuw! Komen C, D en K nog voor??? ; -- Is niet uniek --> error ELSE v_errorhint := 'Kan Personeelsnummer 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; -- *** Rol(len) *************************************************************************** -- Als persoon uniek bepaald (v_perslid_key gevuld), dan v_update=TRUE! 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, uwva_provisioning up, fac_profiel fp WHERE uia.empnum = rec_upd.empnum AND uia.grpfname = up.uwva_rol_omschr AND up.fac_profiel_key = fp.fac_profiel_key; -- 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, uwva_provisioning up, fac_profiel fp WHERE uia.empnum = rec_upd.empnum AND uia.grpfname = up.uwva_rol_omschr AND up.fac_profiel_key = fp.fac_profiel_key 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 -- *** Autorisatiegroepen ********************* -- Verwijder alle rechten, die iemand volgens ABS niet heeft. FOR rec_groep IN c_groep (rec_upd.empnum, v_perslid_key) LOOP v_errormsg := 'Rol->Autgroep 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.empnum, v_perslid_key) LOOP v_errormsg := 'Rol->Autgroep 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.account 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; -- 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; COMMIT; -- *** Budgethouders **************************************************************************** -- UWVA#20021: Onderstaande was voorheen een aparte budgethouder-import. Sinds het smoelenboek -- zijn de importbestanden voor de KPN- en budgethouderimports samengevoegd tot n bestand met -- de mandateringsboom, inclusief volledige organisatiestructuur. De KPN-import 'maakt' voortaan -- de afdelingen en kostenplaatsen (PRS 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)! -- UWVA#75874: Check op 50% voortaan tegen alleen actieve/niet verlopen KPN. -- How many active records are now present? SELECT COUNT ( * ) INTO l_oldcount FROM prs_kostenplaats WHERE prs_kostenplaats_verwijder IS NULL AND prs_kostenplaats_omschrijving NOT LIKE 'INACTIEF:%' AND COALESCE (prs_kostenplaats_eind, SYSDATE + 1) > TRUNC (SYSDATE); -- 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_verwijder IS NULL AND prs_kostenplaats_key = rec_budgh.prs_kostenplaats_key; -- 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 || '" '; -- 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 1 FROM fac_gebruikersgroep WHERE fac_groep_key = c_grp_budgh_key AND prs_perslid_key = rec_budgh.prs_perslid_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; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 100); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, '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.imp_perslid_nr || '": kostenplaats komt niet voor'; fac.imp_writelog (p_import_key, 'W', 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 gg WHERE gg.fac_groep_key = c_grp_budgh_key AND NOT EXISTS (SELECT 1 FROM uwva_imp_kpn imp, prs_v_aanwezigperslid p WHERE imp.perslid_nr = p.prs_perslid_nr -- Personeelsnummer (zonder prefix zoals in KPN-importbestand+Facilitor) AND p.prs_perslid_key = gg.prs_perslid_key); SELECT COUNT ( * ) INTO nrbh2 FROM fac_gebruikersgroep WHERE fac_groep_key = c_grp_budgh_key; fac.imp_writelog ( p_import_key, 'S', TO_CHAR (nrbh1 - nrbh2) || ' budgethouder(s) uit autorisatiegroep ' || TO_CHAR (c_grp_budgh_key) || ' verwijderd.', ''); END IF; -- Einde voormalige budgethoudersimport fac.imp_writelog (p_import_key, 'S', 'Import voltooid', v_time); 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, ''), 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 p.prs_perslid_key, p.prs_perslid_naam, p.prs_perslid_tussenvoegsel, p.prs_perslid_voorletters, p.prs_perslid_voornaam, p.prs_perslid_nr, p.prs_perslid_oslogin, p.prs_perslid_email, p.prs_perslid_telefoonnr, p.prs_perslid_mobiel, p.prs_perslid_geslacht, p.prs_perslid_ingids, wpg.alg_locatie_code, wpg.alg_gebouw_code, wpg.alg_verdieping_code, wpg.alg_ruimte_nr, pf.prs_perslid_naam_full, --afd.prs_afdeling_naam6 afdeling, afd.prs_afdeling_naam || '-' || afd.prs_afdeling_omschrijving afdeling, --div.prs_afdeling_naam6 divisie, div.prs_afdeling_naam || '-' || div.prs_afdeling_omschrijving divisie, sp.prs_srtperslid_omschrijving FROM prs_v_aanwezigperslid p, prs_v_perslid_fullnames pf, --prs_v_aanwezigafdeling afd, prs_afdeling afd, prs_v_afdeling_boom ab, --prs_v_aanwezigafdeling div, prs_afdeling div, prs_v_hoofdperslidwerkplek hpwp, prs_v_werkplek_gegevens wpg, prs_v_aanwezigsrtperslid sp WHERE p.prs_perslid_key = pf.prs_perslid_key AND p.prs_afdeling_key = afd.prs_afdeling_key AND p.prs_afdeling_key = ab.prs_afdeling_key AND ab.prs_afdeling_key1 = div.prs_afdeling_key AND p.prs_perslid_key = hpwp.prs_perslid_key(+) AND hpwp.prs_werkplek_key = wpg.prs_werkplek_key(+) AND p.prs_srtperslid_key = sp.prs_srtperslid_key) pl LEFT JOIN (SELECT prs_link_key, fac_usrdata_omschr emptype FROM fac_usrdata, prs_kenmerklink WHERE fac_usrtab_key = 301 -- 301 = Type_medewerker (fac_usrtab) AND prs_kenmerk_key = 1040 -- 1040 = Type Medewerker (R) 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 LEFT JOIN (SELECT prs_link_key, fac_usrdata_omschr regio FROM fac_usrdata, prs_kenmerklink WHERE fac_usrtab_key = 783 -- 783 = RegioVinder (fac_usrtab) AND prs_kenmerk_key = 1193 -- 1193 = Regio (R) 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 LEFT 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 -- 1173 = Alternatieve afdeling (S) 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 LEFT JOIN (SELECT prs_link_key, prs_srtperslid_omschrijving alt_functie FROM prs_kenmerklink, prs_v_aanwezigsrtperslid WHERE prs_kenmerk_key = 1192 -- 1192 = Alternatieve functie (S) AND prs_srtperslid_key = prs_kenmerklink_waarde AND prs_kenmerklink_verwijder IS NULL) f4 ON pl.prs_perslid_key = f4.prs_link_key LEFT JOIN (SELECT prs_link_key, prs_kenmerklink_waarde faxnr FROM prs_kenmerklink WHERE prs_kenmerk_key = 7 -- 7 = Faxnr (C) AND prs_kenmerklink_verwijder IS NULL) f7 ON pl.prs_perslid_key = f7.prs_link_key LEFT JOIN (SELECT prs_link_key, fac_usrdata_omschr maandag FROM fac_usrdata, prs_kenmerklink WHERE fac_usrtab_key = 761 -- 761 = AanwezigOp (fac_usrtab) AND prs_kenmerk_key = 1163 -- 1163 = Maandag (R) 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 LEFT JOIN (SELECT prs_link_key, fac_usrdata_omschr dinsdag FROM fac_usrdata, prs_kenmerklink WHERE fac_usrtab_key = 761 -- 761 = AanwezigOp (fac_usrtab) AND prs_kenmerk_key = 1164 -- 1164 = Dinsdag (R) 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 LEFT JOIN (SELECT prs_link_key, fac_usrdata_omschr woensdag FROM fac_usrdata, prs_kenmerklink WHERE fac_usrtab_key = 761 -- 761 = AanwezigOp (fac_usrtab) AND prs_kenmerk_key = 1165 -- 1165 = Woensdag (R) 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 LEFT JOIN (SELECT prs_link_key, fac_usrdata_omschr donderdag FROM fac_usrdata, prs_kenmerklink WHERE fac_usrtab_key = 761 -- 761 = AanwezigOp (fac_usrtab) AND prs_kenmerk_key = 1166 -- 1166 = Donderdag (R) 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 LEFT JOIN (SELECT prs_link_key, fac_usrdata_omschr vrijdag FROM fac_usrdata, prs_kenmerklink WHERE fac_usrtab_key = 761 -- 761 = AanwezigOp (fac_usrtab) AND prs_kenmerk_key = 1167 -- 1167 = Vrijdag (R) 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 autorisatiegroepen 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