GOKO#70968 -- Implementatie Facilitor bij GO Kinderopvang

svn path=/Customer/trunk/; revision=55294
This commit is contained in:
Jos Migo
2022-03-15 14:19:25 +00:00
parent 2ec37d8bdf
commit 197ef7d88c

569
GOKO/goko.sql Normal file
View File

@@ -0,0 +1,569 @@
--
-- $Id$
--
-- Script containing customer specific sql statements for the FACILITOR database
DEFINE thisfile = 'goko.SQL'
DEFINE dbuser = 'GOKO'
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 ------
CREATE OR REPLACE PACKAGE GOKO
AS
-- PROCEDURE set_werkplek;
-- PROCEDURE annuleer_werkplek;
FUNCTION get_kenmerk (p_module IN VARCHAR2,
p_kenmerk_key IN NUMBER,
p_link_key IN NUMBER)
RETURN VARCHAR2;
FUNCTION get_kenmerkwaarde (p_kenmerk_type VARCHAR2,
p_kenmerkdomein_key NUMBER,
p_kenmerk_waarde VARCHAR2)
RETURN VARCHAR2;
END;
/
CREATE OR REPLACE PACKAGE BODY GOKO
AS
FUNCTION get_kenmerk (p_module IN VARCHAR2,
p_kenmerk_key IN NUMBER,
p_link_key IN NUMBER)
RETURN VARCHAR2
AS
v_kenmerk_type mld_srtkenmerk.mld_srtkenmerk_kenmerktype%TYPE;
v_kenmerk_waarde mld_kenmerkmelding.mld_kenmerkmelding_waarde%TYPE;
v_kenmerkdomein_key fac_kenmerkdomein.fac_kenmerkdomein_key%TYPE;
v_kenmerk_niveau ins_kenmerk.ins_kenmerk_niveau%TYPE;
BEGIN
CASE p_module
WHEN 'MLD'
THEN
SELECT mld_srtkenmerk_kenmerktype,
sk.fac_kenmerkdomein_key,
km.mld_kenmerkmelding_waarde
INTO v_kenmerk_type, v_kenmerkdomein_key, v_kenmerk_waarde
FROM mld_v_aanwezigkenmerkmelding km,
mld_kenmerk k,
mld_srtkenmerk sk
WHERE km.mld_melding_key = p_link_key
AND km.mld_kenmerk_key = p_kenmerk_key
AND km.mld_kenmerk_key = k.mld_kenmerk_key
AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key;
WHEN 'CNT'
THEN
SELECT cnt_srtkenmerk_kenmerktype,
sk.fac_kenmerkdomein_key,
kc.cnt_kenmerkcontract_waarde
INTO v_kenmerk_type, v_kenmerkdomein_key, v_kenmerk_waarde
FROM cnt_kenmerkcontract kc,
cnt_kenmerk k,
cnt_srtkenmerk sk
WHERE kc.cnt_contract_key = p_link_key
AND kc.cnt_kenmerk_key = p_kenmerk_key
AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
AND k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key;
WHEN 'ALG'
THEN
SELECT alg_kenmerk_kenmerktype,
k.fac_kenmerkdomein_key,
aogk.alg_onrgoedkenmerk_waarde
INTO v_kenmerk_type, v_kenmerkdomein_key, v_kenmerk_waarde
FROM alg_onrgoedkenmerk aogk, alg_kenmerk k
WHERE aogk.alg_onrgoed_key = p_link_key
AND aogk.alg_kenmerk_key = p_kenmerk_key
AND aogk.alg_kenmerk_key = k.alg_kenmerk_key;
WHEN 'INS'
THEN
SELECT k.ins_kenmerk_niveau
INTO v_kenmerk_niveau
FROM ins_kenmerk k
WHERE ins_kenmerk_key = p_kenmerk_key;
IF v_kenmerk_niveau = 'C'
THEN
SELECT sk.ins_srtkenmerk_kenmerktype,
sk.fac_kenmerkdomein_key,
ikds.ins_kmdeelsrtcontr_waarde
INTO v_kenmerk_type,
v_kenmerkdomein_key,
v_kenmerk_waarde
FROM ins_kmdeelsrtcontr ikds,
ins_kenmerk k,
ins_srtkenmerk sk
WHERE ikds.ins_kmdeelsrtcontr_key = p_link_key
AND ikds.ins_kmdeelsrtcontr_verwijder IS NULL
AND ikds.ins_kenmerk_key = p_kenmerk_key
AND ikds.ins_kenmerk_key = k.ins_kenmerk_key
AND k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key;
ELSE
SELECT sk.ins_srtkenmerk_kenmerktype,
sk.fac_kenmerkdomein_key,
ikd.ins_kenmerkdeel_waarde
INTO v_kenmerk_type,
v_kenmerkdomein_key,
v_kenmerk_waarde
FROM ins_kenmerkdeel ikd,
ins_kenmerk k,
ins_srtkenmerk sk
WHERE ikd.ins_deel_key = p_link_key
AND ikd.ins_kenmerkdeel_verwijder IS NULL
AND ikd.ins_kenmerk_key = p_kenmerk_key
AND ikd.ins_kenmerk_key = k.ins_kenmerk_key
AND k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key;
END IF;
END CASE;
RETURN goko.get_kenmerkwaarde (v_kenmerk_type,
v_kenmerkdomein_key,
v_kenmerk_waarde);
END;
FUNCTION get_kenmerkwaarde (p_kenmerk_type VARCHAR2,
p_kenmerkdomein_key NUMBER,
p_kenmerk_waarde VARCHAR2)
RETURN VARCHAR2
AS
v_result VARCHAR2 (4000);
BEGIN
IF p_kenmerk_type = 'R' OR p_kenmerk_type = 'S'
THEN
v_result :=
fac.getdomeinwaarde (p_kenmerkdomein_key, p_kenmerk_waarde);
ELSIF p_kenmerk_type = 'D'
THEN
v_result :=
TO_CHAR (fac.safe_to_date (p_kenmerk_waarde, 'dd-mm-yyyy'),
'yyyy-mm-dd');
ELSE
v_result := p_kenmerk_waarde;
END IF;
RETURN v_result;
END;
END;
/
CREATE OR REPLACE PROCEDURE goko_import_perslid (p_import_key IN NUMBER)
AS
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_errormsg VARCHAR2 (400);
v_errorhint VARCHAR2 (400);
v_aantal_in_fclt NUMBER;
-- overige variabelen
v_prs_afdeling_key NUMBER(10);
c_prs_afdeling_key NUMBER(10) := 62 ; -- Fallback-afdeling 'ONBEKEND_GOKO'
v_alg_locatie_key NUMBER(10);
v_alg_locatie_code VARCHAR2(10);
v_alg_gebouw_key NUMBER(10);
v_alg_gebouw_code VARCHAR2(12);
v_alg_verdieping_key NUMBER(10);
v_alg_verdieping_volgnr NUMBER(3);
v_alg_ruimte_key NUMBER(10);
v_alg_ruimte_nr VARCHAR2(20);
CURSOR c_afd
IS
SELECT fac_imp_file_index, prs_kenmerk1, prs_afdeling_naam
FROM fac_imp_perslid
WHERE fac_import_key = p_import_key ;
CURSOR c_loc
IS
SELECT fac_imp_file_index, prs_kenmerk4
FROM fac_imp_perslid
WHERE fac_import_key = p_import_key ;
BEGIN
-- Het aangeleverde bestand heeft de gegevens komma gescheiden ipv ;
v_errorhint := 'Delimiter goed zetten';
UPDATE fac_imp_file
SET fac_imp_file_line = REPLACE (fac_imp_file_line, ',', ';')
WHERE fac_import_key = p_import_key;
-- Het aangeleverde bestand heeft aanhalingstekens om de invoervelden..
UPDATE fac_imp_file
SET fac_imp_file_line = REPLACE (fac_imp_file_line, '"', '')
WHERE fac_import_key = p_import_key;
v_errorhint := 'Generieke update';
-- De sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid procedure
-- Voor GOKO geldt:
---
prs.import_perslid (
p_import_key,
'0;0;0;0;0;0;1;1;0;3;'
|| '0;0;0;0;0;0;0;5;0;9;'
|| '1;0;0;0;0;0;7;4;6;8;'
|| '2;0;0;0;0;0;0;0;0;0;'
|| '0;0;0;0;0;0',
'Country;UserPrincipalName;GivenName;Surname;Mail;JobTitle;Department;PhysicalDeliveryOfficeName;EmployeeId%');
-- Country;UserPrincipalName;GivenName;Surname;Mail;JobTitle;Department;PhysicalDeliveryOfficeName;EmployeeId
-- DEF. BESTAND bij GOKO : "Country","UserPrincipalName","GivenName","Surname","Mail","JobTitle","Department","PhysicalDeliveryOfficeName","EmployeeId"
v_errorhint := 'Login afleiden van emailadres';
-- Loginnaam afleiden van emailadres
UPDATE fac_imp_perslid
SET prs_perslid_oslogin =
UPPER((SUBSTR (prs_perslid_email,
0,
INSTR (prs_perslid_email, '@') - 1)))
WHERE
UPPER (prs_perslid_email) LIKE '%GO-KINDEROPVANG.NL'
AND prs_perslid_email IS NOT NULL
AND LENGTH((SUBSTR (prs_perslid_email,
0,
INSTR (prs_perslid_email, '@') - 1))) <=30 ;
v_errorhint := 'Delete record op basis klantregels';
-- Delete uit AD GO-KINDEROPVANG - Opschoning NODIG ??
/*DELETE fac_imp_perslid
WHERE UPPER (prs_kenmerk3) IN ('GEDEELD POSTVAK','GENERIEK ACCOUNT', 'OC', 'RVT', 'RESOURCES') OR prs_kenmerk3 IS NULL;
DELETE fac_imp_perslid
WHERE UPPER (prs_kenmerk5) NOT LIKE '%SINNEKINDEROPVANG.NL';
*/
v_errorhint := 'Functie goed vullen';
-- Functie is niet altijd gevuld, eerst gevuld met Gebruikerslocatie, nu vullen met kenmerk3 (of 'Onbekend').
UPDATE fac_imp_perslid
SET prs_srtperslid_omschrijving =
DECODE (prs_kenmerk3, NULL, 'Onbekend', prs_kenmerk3);
v_errorhint := 'Naam goed vullen';
-- Naam is niet altijd gevuld, eerst gevuld met Gebruikerslocatie, nu vullen met kenmerk2 (of 'Algemeen').
UPDATE fac_imp_perslid
SET prs_perslid_naam =
DECODE (prs_kenmerk2, NULL, 'Algemeen', prs_kenmerk2);
v_errorhint := 'Afdeling bepalen en vullen';
-- Afdeling bepalen waar persoon onder komt te vallen
FOR rec IN c_afd
LOOP
BEGIN
v_errorhint := 'Persoon aan Afdeling koppelen';
SELECT min(prs_afdeling_key)
INTO v_prs_afdeling_key
FROM prs_v_afdeling
WHERE UPPER(prs_afdeling_naam) = UPPER(rec.prs_kenmerk1)
AND prs_bedrijf_key = 21 -- bedrijf GOKO - !!!!!!!!
AND prs_afdeling_verwijder IS NULL ;
IF v_prs_afdeling_key IS NOT NULL THEN
UPDATE fac_imp_perslid
SET prs_afdeling_naam = (SELECT prs_afdeling_upper FROM prs_afdeling WHERE prs_afdeling_key = v_prs_afdeling_key)
WHERE fac_imp_file_index = rec.fac_imp_file_index ;
ELSE
UPDATE fac_imp_perslid
SET prs_afdeling_naam = (SELECT prs_afdeling_upper FROM prs_afdeling WHERE prs_afdeling_key = c_prs_afdeling_key)
WHERE fac_imp_file_index = rec.fac_imp_file_index ;
END IF;
END;
END LOOP;
v_errorhint := 'Locatie bepalen en vullen';
-- Default Locatie / Standplaats bepalen voor persoon
FOR rec IN c_loc
LOOP
BEGIN
v_errorhint := 'Persoon aan Locatie-Ruimte koppelen';
v_alg_locatie_key := NULL;
v_alg_gebouw_key := NULL;
v_alg_verdieping_key := NULL;
v_alg_ruimte_key := NULL;
SELECT min(alg_locatie_key)
INTO v_alg_locatie_key
FROM alg_locatie
WHERE UPPER(alg_locatie_omschrijving) = UPPER(rec.prs_kenmerk4)
AND (TRUNC(alg_locatie_vervaldatum) > TRUNC(sysdate) OR alg_locatie_vervaldatum IS NULL )
AND alg_locatie_verwijder IS NULL ;
IF v_alg_locatie_key IS NOT NULL THEN
-- Locatie_code ophalen
SELECT alg_locatie_code
INTO v_alg_locatie_code
FROM alg_locatie
WHERE alg_locatie_key = v_alg_locatie_key ;
-- Gebouw_key ophalen
SELECT min(alg_gebouw_key)
INTO v_alg_gebouw_key
FROM alg_gebouw
WHERE alg_locatie_key = v_alg_locatie_key
AND alg_gebouw_verwijder IS NULL
AND (TRUNC(alg_gebouw_vervaldatum) > TRUNC(sysdate) OR alg_gebouw_vervaldatum IS NULL ) ;
-- Om bij update dit kenmerkveld weg te kunnen schrijven naar kenmerkveld 'default standplaats'
UPDATE fac_imp_perslid
SET prs_kenmerk6 = (SELECT UPPER(alg_locatie_code) || alg_locatie_omschrijving FROM alg_locatie WHERE alg_locatie_key = v_alg_locatie_key)
WHERE fac_imp_file_index = rec.fac_imp_file_index ;
IF v_alg_gebouw_key IS NOT NULL THEN
-- Gebouw_code ophalen
SELECT alg_gebouw_code
INTO v_alg_gebouw_code
FROM alg_gebouw
WHERE alg_gebouw_key = v_alg_gebouw_key ;
-- Verdiepings_key ophalen
SELECT min(alg_verdieping_key)
INTO v_alg_verdieping_key
FROM alg_verdieping
WHERE alg_gebouw_key = v_alg_gebouw_key
AND alg_verdieping_verwijder IS NULL ;
END IF;
IF v_alg_verdieping_key IS NOT NULL THEN
-- Verdieping_volgnr ophalen
SELECT alg_verdieping_volgnr
INTO v_alg_verdieping_volgnr
FROM alg_verdieping
WHERE alg_verdieping_key = v_alg_verdieping_key ;
-- Ruimte_key ophalen
SELECT min(alg_ruimte_key)
INTO v_alg_ruimte_key
FROM alg_ruimte
WHERE alg_verdieping_key = v_alg_verdieping_key
AND alg_ruimte_verwijder IS NULL ;
END IF;
IF v_alg_ruimte_key IS NOT NULL THEN
-- Ruimte_nr ophalen
SELECT alg_ruimte_nr
INTO v_alg_ruimte_nr
FROM alg_ruimte
WHERE alg_ruimte_key = v_alg_ruimte_key ;
-- Vullen vastgoed-keten in import-tabel
UPDATE fac_imp_perslid
SET alg_locatie_code = v_alg_locatie_code,
alg_gebouw_code = v_alg_gebouw_code,
alg_verdieping_volgnr = v_alg_verdieping_volgnr,
alg_ruimte_nr = v_alg_ruimte_nr
WHERE fac_imp_file_index = rec.fac_imp_file_index ;
END IF;
ELSE
-- Geen Locatie/Vastgoedketen kunnen vinden
UPDATE fac_imp_perslid
SET prs_kenmerk6 = 'LOCATIE ONBEKEND'
WHERE fac_imp_file_index = rec.fac_imp_file_index ;
END IF;
END;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := 'Error ' || oracle_err_num || '/' || oracle_err_mes;
fac.imp_writelog (p_import_key,
'E',
v_errormsg,
v_errorhint);
END goko_import_perslid;
/
CREATE OR REPLACE PROCEDURE goko_update_perslid (p_import_key IN NUMBER)
IS
-- Alle personen verwijderen die niet meer in het import bestand voorkomen
-- Personen in de juiste autorisatiegroep zetten.
-- Match bij SINNE KINDEROPVANG is Email.
-- Geen acties tenzij het aantal records in de importtabel meer dan 50 medewerkers betreft.
CURSOR c_del
IS
SELECT p.prs_perslid_key, p.prs_perslid_nr, pf.prs_perslid_naam_full
FROM prs_perslid p, prs_v_perslid_fullnames pf
WHERE UPPER (p.prs_perslid_email) LIKE '%GO-KINDEROPVANG.NL'
AND NOT EXISTS (SELECT 1 FROM fac_imp_perslid WHERE INSTR(UPPER (p.prs_perslid_email),UPPER (prs_perslid_email) ) > 0 )
AND pf.prs_perslid_key = p.prs_perslid_key ;
CURSOR c_flex -- Voor updaten van de algemene flex-kenmerkvelden op actuele medewerkers
IS
SELECT p.prs_perslid_key, i.prs_kenmerk4
FROM prs_v_aanwezigperslid p, fac_imp_perslid i
WHERE p.prs_perslid_key = i.prs_perslid_key
ORDER BY 1;
v_count NUMBER;
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_errormsg VARCHAR2 (400);
v_errorhint VARCHAR2 (400);
BEGIN
v_errorhint := 'Niet genoeg personen in bestand, import afgebroken';
SELECT COUNT ( * ) INTO v_count FROM fac_imp_perslid;
IF v_count >= 100
THEN
v_errorhint := 'Verwerken persoonsgegevens';
-- Geldig importbestand wat betreft aantal personen
COMMIT;
-- generic update
-- 'EMAIL' betekent dat op basis van Email wordt gematched.
-- 'NULL' betekent altijd geen werkplekken verwijderen
prs.update_perslid (p_import_key, 'EMAIL', NULL);
v_errorhint := 'Verwijderen persoonsgegevens';
-- Verwijder personen die niet meer in de import voorkomen.
FOR rec IN c_del
LOOP
BEGIN
prs.delete_perslid (p_import_key, rec.prs_perslid_key);
END;
END LOOP;
FOR rec IN c_flex
LOOP
BEGIN
v_errorhint:='Fout bijwerken kenmerkveld4 - Standplaats';
PRS.upsertkenmerk (1020, rec.prs_perslid_key, rec.prs_kenmerk4); -- IN PRODUCTIE KEY = 1020
END;
END LOOP;
ELSE
fac.imp_writelog (p_import_key,
'E',
v_errormsg,
v_errorhint);
COMMIT;
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg := 'Error ' || oracle_err_num || '/' || oracle_err_mes;
fac.imp_writelog (p_import_key,
'E',
v_errormsg,
v_errorhint);
END goko_update_perslid;
/
-------------------------------
--- DOMEIN-VIEWS --------------
-------------------------------
-- Voor keuzelijstjes (kenmerk domein)
CREATE OR REPLACE VIEW goko_v_personenlijst
(
KEY,
NAAM,
PERSONEELSNUMMER
)
AS
SELECT
p.prs_perslid_key,
p.prs_perslid_voornaam || ' ' || p.prs_perslid_naam
naam,
p.prs_perslid_nr
FROM
prs_perslid p,
prs_v_afdeling a,
prs_bedrijf b
WHERE
p.prs_afdeling_key = a.prs_afdeling_key
AND a.prs_bedrijf_key = b.prs_bedrijf_key
AND b.prs_bedrijf_key = 21 -- bedrijfs_key GO-Kinderopvang
-- AND p.prs_perslid_voornaam !='TEAM' -- Voor team-accounts
ORDER BY p.prs_perslid_naam
;
CREATE OR REPLACE VIEW goko_v_kostenplaatsen
(
KEY,
OMSCHRIJVING
)
AS
SELECT
kp.prs_kostenplaats_key,
kpg.prs_kostenplaatsgrp_oms || ' - ' || kp.prs_kostenplaats_nr || ' ' || kp.prs_kostenplaats_omschrijving
omschrijving
FROM
prs_kostenplaats kp,
prs_kostenplaatsgrp kpg
WHERE
kp.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key
AND kp.prs_kostenplaats_verwijder IS NULL
AND (kp.prs_kostenplaats_eind IS NULL OR kp.prs_kostenplaats_eind > TRUNC(SYSDATE) )
AND kp.prs_kostenplaats_module = 'ALG'
ORDER BY kpg.prs_kostenplaatsgrp_oms || ' - ' || kp.prs_kostenplaats_nr || ' ' || kp.prs_kostenplaats_omschrijving
;
-------------------------------
--- RAPPORTAGES ---------------
-------------------------------
------ 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