Files
Database/PRS/PRS_PAC.SRC
Jos Groot Lipman dbd008f16b UWVA#36431 Passend mandaat opzoeken in organisatieboom savepoint
svn path=/Database/trunk/; revision=34962
2017-08-16 14:01:38 +00:00

2209 lines
94 KiB
Plaintext
Raw Blame History

#ifdef PRS
/*
* $Revision$
* $Id$
*/
CREATE OR REPLACE PACKAGE aut AS
FUNCTION fac_get_prs_same_level(userkey IN NUMBER, perslidkey IN NUMBER) RETURN NUMBER;
END aut;
/
CREATE OR REPLACE PACKAGE BODY aut AS
FUNCTION fac_get_prs_same_level(userkey IN NUMBER, perslidkey IN NUMBER) RETURN NUMBER IS
CURSOR usr_deps IS
SELECT paf.prs_afdeling_key, prs_afdeling_elder_key, niveau
FROM prs_v_afdeling_familie paf, prs_perslid pp
WHERE paf.prs_afdeling_key = pp.prs_afdeling_key
AND pp.prs_perslid_key=userkey
ORDER BY niveau DESC;
CURSOR pers_deps IS
SELECT paf.prs_afdeling_key, prs_afdeling_elder_key, niveau
FROM prs_v_afdeling_familie paf, prs_perslid pp
WHERE paf.prs_afdeling_key = pp.prs_afdeling_key
AND pp.prs_perslid_key=perslidkey
ORDER BY niveau DESC;
usr_orglevel NUMBER(1);
pers_orglevel NUMBER(1);
samelevelFound BOOLEAN;
samelevel NUMBER(1);
BEGIN
BEGIN
samelevelFound := FALSE;
FOR c1 IN usr_deps
LOOP
FOR c2 IN pers_deps
LOOP
IF c1.prs_afdeling_elder_key = c2.prs_afdeling_elder_key
THEN
samelevelFound := TRUE;
samelevel := c2.niveau;
EXIT;
END IF;
END LOOP;
IF samelevelFound
THEN
EXIT;
END IF;
END LOOP;
IF NOT samelevelFound
THEN
samelevel := 0; -- no same level found,then assume same company
END IF; -- multi_company will be detected in ASP so no problem here
EXCEPTION
WHEN OTHERS THEN
samelevel:= 9;
END;
RETURN samelevel;
END;
END aut;
/
/* Formatted on 3-11-2010 11:50:08 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PACKAGE prs
AS
FUNCTION getkpverantwoordelijke (pkostenplaats_key IN NUMBER,
pmethode IN NUMBER,
pexcludekey IN NUMBER)
RETURN NUMBER;
FUNCTION getkostenplaats (pperslid_key IN NUMBER, pmethode IN NUMBER, pexcludekey IN NUMBER)
RETURN NUMBER;
FUNCTION getprofiellimiet (pperslidkey IN NUMBER, pdisckey IN NUMBER)
RETURN NUMBER;
FUNCTION getlimietagb (pkostenplaatskey IN NUMBER, pmethode IN NUMBER, pdisckey IN NUMBER)
RETURN NUMBER;
FUNCTION getfiatteur (pkostenplaats_key IN NUMBER,
pexcludekey IN NUMBER,
pondergrens IN NUMBER,
pdisckey IN NUMBER
)
RETURN NUMBER;
PROCEDURE setpassword(pperslidkey IN NUMBER, pwachtwoord IN VARCHAR2);
FUNCTION testpassword(pperslidkey IN NUMBER, pwachtwoord IN VARCHAR2)
RETURN NUMBER;
PROCEDURE upsertkenmerk (p_kenmerk_key IN NUMBER, p_prs_key IN NUMBER, p_waarde IN VARCHAR2);
PROCEDURE movetoruimte (p_prs_key IN NUMBER, p_ruimte_key IN NUMBER, p_alg_type IN VARCHAR2, p_virtual IN NUMBER DEFAULT 0);
PROCEDURE import_perslid (p_import_key IN NUMBER, p_seq_of_columns IN VARCHAR2, p_header IN VARCHAR2);
PROCEDURE update_perslid (p_import_key IN NUMBER, p_sleutelkolom IN VARCHAR2, p_alg_type IN VARCHAR2);
PROCEDURE delete_perslid (p_import_key IN NUMBER, p_perslid_key IN NUMBER);
END prs;
/
CREATE OR REPLACE PACKAGE BODY prs
AS
-- Levert de prs_perslid_key op van de budgethouder van een kostenplaats
-- Simpele versie van getfiatteur: hij negeert limieten
FUNCTION getkpverantwoordelijke (pkostenplaats_key IN NUMBER,
pmethode IN NUMBER, -- deze gebruiken we eigenlijk niet meer sinds 2017.2
pexcludekey IN NUMBER)
RETURN NUMBER
IS
BEGIN
IF pmethode = 3 THEN
raise_application_error (-20001, 'Cannot use prs.getkpverantwoordelijke with prs_approvemethod = 3');
END IF;
RETURN getfiatteur (pkostenplaats_key,
pexcludekey,
NULL,
NULL
);
END;
-- Levert de prs_kostenplaats_key op van de persoon volgens
-- de door ons gedefinieerde regels.
-- Levert -1 op indien er geen gevonden wordt.
-- Controleert niet of de meegegeven persoon nog wel actief is
-- pmethode geeft .. inderdaad, waarbij
-- methode 1 = 1-laagsmethode via eigen afdeling - kostenplaats
-- methode 2 = n-laagsmethode via afdelingsboom
-- Met pexcludekey kan een kostenplaats_key worden opgegeven die je niet wilt
-- Dat leek me wel een aardige feature. Geef -1 mee als je geen kostenplaats wilt excluden
FUNCTION getkostenplaats (pperslid_key IN NUMBER, pmethode IN NUMBER, pexcludekey IN NUMBER)
RETURN NUMBER
IS
lkostenplaatskey prs_afdeling.prs_kostenplaats_key%TYPE;
lparentafdkey prs_afdeling.prs_afdeling_parentkey%TYPE;
BEGIN
BEGIN
SELECT COALESCE (a.prs_kostenplaats_key, -1),
a.prs_afdeling_parentkey
INTO lkostenplaatskey,
lparentafdkey
FROM prs_perslid p,
prs_afdeling a
WHERE p.prs_afdeling_key = a.prs_afdeling_key
AND p.prs_perslid_key = pperslid_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- persoon bestaat niet
RETURN -1;
END;
IF (lkostenplaatskey = -1 OR lkostenplaatskey = pexcludekey) AND pmethode = 2
-- doorloop de boom naar boven, met allerlei aannames
THEN
WHILE (lkostenplaatskey = -1 OR lkostenplaatskey = pexcludekey) AND lparentafdkey IS NOT NULL
LOOP
SELECT COALESCE (a.prs_kostenplaats_key, -1),
a.prs_afdeling_parentkey
INTO lkostenplaatskey,
lparentafdkey
FROM prs_afdeling a
WHERE a.prs_afdeling_verwijder IS NULL
AND a.prs_afdeling_key = lparentafdkey;
END LOOP;
-- nu heb ik er een of kan ik er geen vinden
END IF;
RETURN lkostenplaatskey;
END;
-- Levert de limiet (maximaal bestelbedrag) van persoon pperslidkey,
-- eventueel specifiek voor pdisckey indien dat gedefinieerd zou zijn.
FUNCTION getprofiellimiet (pperslidkey IN NUMBER, pdisckey IN NUMBER)
RETURN NUMBER
IS
llimiet fac_profiel.fac_profiel_limiet%TYPE;
BEGIN
-- de algemene limiet telt het zwaarst indien ingevuld
IF pperslidkey IS NULL
THEN
RETURN NULL;
END IF;
-- persoon wordt geacht te bestaan, profiel is optioneel
SELECT fp.fac_profiel_limiet
INTO llimiet
FROM prs_perslid p, fac_profiel fp
WHERE p.fac_profiel_key = fp.fac_profiel_key(+) AND p.prs_perslid_key = pperslidkey;
IF llimiet IS NULL AND pdisckey IS NOT NULL
THEN
-- geen algemene limiet; zoek de disciplineafhankelijke (max() to prevent no data found)
SELECT MAX (fpw.fac_profielwaarde_limiet)
INTO llimiet
FROM prs_perslid p, fac_profielwaarde fpw
WHERE p.fac_profiel_key = fpw.fac_profiel_key
AND fpw.ins_discipline_key = pdisckey
AND p.prs_perslid_key = pperslidkey;
END IF;
RETURN llimiet;
END;
-- Levert de limiet (maximaal bestelbedrag) van persoon pperslidkey i.v.m. Afdelings Gebonden Budget (AGB),
FUNCTION getlimietagb (pkostenplaatskey IN NUMBER, pmethode IN NUMBER, pdisckey IN NUMBER)
RETURN NUMBER
IS
llimiet prs_kostenplaats.prs_kostenplaats_limiet%TYPE;
BEGIN
IF pkostenplaatskey > 0
THEN
-- Er is een kostenplaats meegegeven
SELECT k.prs_kostenplaats_limiet
INTO llimiet
FROM prs_kostenplaats k
WHERE k.prs_kostenplaats_key = pkostenplaatskey;
-- AGB per kostenplaats of catalogus
IF llimiet IS NULL
THEN
BEGIN
SELECT prs_kostenplaatsdisc_limiet
INTO llimiet
FROM prs_kostenplaatsdisc
WHERE prs_kostenplaats_key = pkostenplaatskey
AND ins_discipline_key = pdisckey;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- er is geen limiet voor deze kostenplaats-discipline.
RETURN NULL;
END;
END IF;
ELSE
RETURN NULL;
END IF;
RETURN llimiet;
END;
-- Levert de prs_perslid_key op van de perslid die een item (opdracht/bestelling) van
-- discipline pdisckey boven bedrag pondergrens mag fiatteren
-- volgens de door ons gedefinieerde regels. Werkt analoog aan getkpverantwoordelijke
-- Maar houdt hierbij rekening met de profielen van de budgethouders als prs_approvemethod==3
--
-- Levert de kostenplaatsgroepverantwoordelijke op indien geen goede budgethouder
-- wordt gevonden
-- Levert -1 op indien er geen gevonden wordt.
-- pmethode geeft .. inderdaad, waarbij
-- methode 1 = 2-laagsmethode via kp - kpngroep
-- methode 2 = n-laagsmethode via afdelingsboom
-- methode 3 = als 2 maar houd rekening met de profiel van de fiatteur
-- Met pexcludekey kan een perslid_key worden opgegeven die je niet wilt
-- Geef -1 mee als je niemand wilt excluden
FUNCTION getfiatteur (pkostenplaats_key IN NUMBER,
pexcludekey IN NUMBER,
pondergrens IN NUMBER,
pdisckey IN NUMBER
)
RETURN NUMBER
IS
lkpverantwkey prs_perslid.prs_perslid_key%TYPE;
lexcludeisvervanger NUMBER;
lkpverantwlimiet fac_profiel.fac_profiel_limiet%TYPE;
afdkey prs_afdeling.prs_afdeling_key%TYPE;
parentafdkey prs_afdeling.prs_afdeling_parentkey%TYPE;
lmethode NUMBER;
BEGIN
BEGIN
SELECT COALESCE (prs_perslid_key, -1)
INTO lkpverantwkey
FROM prs_kostenplaats
WHERE prs_kostenplaats_key = pkostenplaats_key;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- kostenplaats bestaat niet
RETURN -1;
END;
-- Is de meegegeven pexcludekey wellicht een vervanger van kostenplaatsverantwoordelijke van de kostenplaats?
-- Zo ja, dan is in dat geval lkpverantwkey de pexcludekey
IF pexcludekey > 0 THEN
SELECT COUNT(prs_perslid_key)
INTO lexcludeisvervanger
FROM prs_collega
WHERE prs_perslid_key_alt = pexcludekey
AND prs_perslid_key = lkpverantwkey;
END IF;
lmethode := fac.getSetting('prs_approvemethod');
IF lmethode = 3 THEN
lkpverantwlimiet := prs.getprofiellimiet (lkpverantwkey, pdisckey);
END IF;
IF (lkpverantwkey = -1 OR lkpverantwkey = pexcludekey OR lexcludeisvervanger = 1) AND (lmethode = 2 OR lmethode = 3)
-- doorloop de boom naar boven, met allerlei aannames
THEN
-- waar hoort deze kp bij?
BEGIN
SELECT prs_afdeling_key, prs_afdeling_parentkey
INTO afdkey, parentafdkey
FROM prs_afdeling
WHERE prs_kostenplaats_key = pkostenplaats_key AND prs_afdeling_verwijder IS NULL;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- kp is niet aan een afdeling gerelateerd, dan weet ik het met deze methode niet
RETURN -1;
END;
WHILE lkpverantwkey = -1 AND parentafdkey IS NOT NULL AND (lmethode <> 3 OR lkpverantwlimiet < pondergrens)
LOOP
SELECT COALESCE (k.prs_perslid_key, -1), prs_afdeling_parentkey
INTO lkpverantwkey, parentafdkey
FROM prs_kostenplaats k, prs_afdeling a
WHERE k.prs_kostenplaats_key(+) = a.prs_kostenplaats_key
AND a.prs_afdeling_verwijder IS NULL
AND a.prs_afdeling_key = parentafdkey;
IF lmethode = 3 THEN
lkpverantwlimiet := prs.getprofiellimiet (lkpverantwkey, pdisckey);
END IF;
END LOOP;
-- nu heb ik er een of kan ik er geen vinden
END IF;
-- Nu: als ik methode 1 heb, of methode 2 niemand opleverde (ondanks afdelingskostenplaats): de kpngroepverantwoordelijke
IF lkpverantwkey = -1 OR lkpverantwkey = pexcludekey OR lexcludeisvervanger = 1 OR (lmethode = 3 AND lkpverantwlimiet < pondergrens)
THEN
-- vindt de kostenplaatsGROEPverantwoordelijke van altijd de meegegeven kp
BEGIN
SELECT COALESCE (kg.prs_perslid_key, -1)
INTO lkpverantwkey
FROM prs_kostenplaats k, prs_kostenplaatsgrp kg
WHERE prs_kostenplaats_key = pkostenplaats_key
AND kg.prs_kostenplaatsgrp_key = k.prs_kostenplaatsgrp_key
AND kg.prs_perslid_key NOT IN (lkpverantwkey, pexcludekey);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- er is geen kpgroep bij, of het is de excludekey
RETURN -1;
END;
END IF;
RETURN lkpverantwkey;
END;
PROCEDURE setpassword(pperslidkey IN NUMBER, pwachtwoord IN VARCHAR2)
IS
BEGIN
IF pwachtwoord IS NULL
THEN
UPDATE prs_perslid
SET prs_perslid_salt = NULL,
prs_perslid_wachtwoord_hash = NULL,
prs_perslid_wachtwoord_exp = NULL,
prs_perslid_otpsecret = NULL
WHERE prs_perslid_key = pperslidkey;
ELSE
UPDATE prs_perslid
SET prs_perslid_salt = DBMS_RANDOM.string ('a', 32)
WHERE prs_perslid_key = pperslidkey;
UPDATE prs_perslid
SET prs_perslid_wachtwoord_hash = fac.makehash(prs_perslid_salt || pwachtwoord),
prs_perslid_wachtwoord_exp = NULL -- of ooit: SYSDATE + fac.getsetting ('prs_password_expiration') als die is gevuld
WHERE prs_perslid_key = pperslidkey;
END IF;
END;
FUNCTION testpassword(pperslidkey IN NUMBER, pwachtwoord IN VARCHAR2)
RETURN NUMBER
IS
perslid_key prs_perslid.prs_perslid_key%TYPE;
BEGIN
IF pwachtwoord IS NULL
THEN
RETURN 0;
END IF;
BEGIN
SELECT prs_perslid_key
INTO perslid_key
FROM prs_perslid
WHERE fac.testhash(prs_perslid_wachtwoord_hash, prs_perslid_salt || pwachtwoord) = 1
AND prs_perslid_key = pperslidkey;
EXCEPTION
WHEN NO_DATA_FOUND
THEN RETURN 0;
END;
RETURN 1;
END;
-- Er wordt nu niet getrackt (wat eigenlijk niet zo goed is)
PROCEDURE upsertkenmerk (p_kenmerk_key IN NUMBER,
p_prs_key IN NUMBER,
p_waarde IN VARCHAR2)
IS
v_count NUMBER;
v_niveau VARCHAR2 (1);
BEGIN
-- niveau van prs_kenmerk ophalen, omdat deze ook in prs_kenmerklink wordt opgeslagen
SELECT prs_kenmerk_niveau
INTO v_niveau
FROM prs_kenmerk
WHERE prs_kenmerk_key = p_kenmerk_key;
SELECT COUNT ( * )
INTO v_count
FROM prs_kenmerklink
WHERE prs_link_key = p_prs_key
AND prs_kenmerk_key = p_kenmerk_key
AND prs_kenmerklink_verwijder IS NULL;
IF v_count = 1
THEN
IF p_waarde IS NULL
THEN
DELETE prs_kenmerklink
WHERE prs_link_key = p_prs_key
AND prs_kenmerk_key = p_kenmerk_key
AND prs_kenmerklink_verwijder IS NULL;
ELSE
UPDATE prs_kenmerklink
SET prs_kenmerklink_waarde = p_waarde
WHERE prs_link_key = p_prs_key
AND prs_kenmerk_key = p_kenmerk_key
AND prs_kenmerklink_verwijder IS NULL;
END IF;
ELSE
IF p_kenmerk_key IS NOT NULL AND p_waarde IS NOT NULL
THEN
INSERT INTO prs_kenmerklink (prs_kenmerk_key,
prs_link_key,
prs_kenmerklink_niveau,
prs_kenmerklink_waarde)
VALUES (p_kenmerk_key,
p_prs_key,
v_niveau,
p_waarde);
END IF;
END IF;
END;
-- Verhuist een persoon p_prs_key naar een werkplek in p_ruimte_key
-- Als er al vaste werkplekken waren binnen het niveau van p_alg_type (R,V,G,L,D,NULL,A)
-- dan worden die geleegd/gewist. Bij NULL wordt niks gewist, bij A wordt altijd gewist.
PROCEDURE movetoruimte (p_prs_key IN NUMBER,
p_ruimte_key IN NUMBER,
p_alg_type IN VARCHAR2,
p_virtual IN NUMBER DEFAULT 0)
IS
v_count NUMBER;
v_wp_key NUMBER (10);
v_wp_volgnr prs_werkplek.prs_werkplek_volgnr%TYPE;
v_ruimte_nr alg_ruimte.alg_ruimte_nr%TYPE;
v_wp_oms prs_werkplek.prs_werkplek_omschrijving%TYPE;
v_alg_key NUMBER (10);
BEGIN
-- Bepalen of werkplek gewijzigd is tov de huidige situatie
-- door te tellen hoe vaak (1) we al in de nieuwe situatie zitten
SELECT COUNT ( * )
INTO v_count
FROM prs_perslidwerkplek pw, prs_werkplek wp
WHERE pw.prs_perslid_key = p_prs_key
AND pw.prs_werkplek_key = wp.prs_werkplek_key
AND wp.prs_alg_ruimte_key = p_ruimte_key
AND wp.prs_werkplek_type = 0 -- alleen vaste plekken
AND wp.prs_werkplek_virtueel = p_virtual;
IF (v_count = 0)
THEN
-- Persoon zit nog niet op de bestemming
-- Verwijderen oude -vaste- werkplek(ken) op meegegeven niveau.
SELECT MIN(DECODE (p_alg_type,
'R', alg_ruimte_key,
'V', alg_verdieping_key,
'G', alg_gebouw_key,
'L', alg_locatie_key,
'D', alg_district_key,
NULL))
INTO v_alg_key
FROM alg_v_ruimte_gegevens_all
WHERE alg_ruimte_key = p_ruimte_key;
IF fac.getsetting ('prs_werkplek_implicit') = '0' --expliciet
THEN
-- Wis de bezetting maar laat de werkplek bestaan
DELETE FROM prs_perslidwerkplek pw
WHERE pw.prs_perslid_key = p_prs_key
AND EXISTS
(SELECT 1
FROM prs_werkplek wp,
(SELECT alg_ruimte_key,
DECODE (p_alg_type,
'R', alg_ruimte_key,
'V', alg_verdieping_key,
'G', alg_gebouw_key,
'L', alg_locatie_key,
'D', alg_district_key,
NULL)
alg_key
FROM alg_v_ruimte_gegevens_all) og
WHERE wp.prs_werkplek_key = pw.prs_werkplek_key
AND wp.prs_werkplek_virtueel = p_virtual
AND wp.prs_werkplek_type = 0 -- alleen vaste plekken
AND wp.prs_alg_ruimte_key = og.alg_ruimte_key
AND (og.alg_key = v_alg_key OR p_alg_type = 'A'));
ELSE
-- Wis de werkplek, automatisch inclusief de bezetting
DELETE FROM prs_werkplek wp
WHERE wp.prs_werkplek_virtueel = p_virtual
AND wp.prs_werkplek_type = 0 -- alleen vaste plekken
AND EXISTS
(SELECT 1
FROM prs_perslidwerkplek pw,
(SELECT alg_ruimte_key,
DECODE (p_alg_type,
'R', alg_ruimte_key,
'V', alg_verdieping_key,
'G', alg_gebouw_key,
'L', alg_locatie_key,
'D', alg_district_key,
NULL)
alg_key
FROM alg_v_ruimte_gegevens_all) og
WHERE pw.prs_perslid_key = p_prs_key
AND pw.prs_werkplek_key = wp.prs_werkplek_key
AND wp.prs_alg_ruimte_key = og.alg_ruimte_key
AND (og.alg_key = v_alg_key OR p_alg_type = 'A'));
END IF;
-- Persoon krijgt wp op de meegegeven ruimte.
IF p_ruimte_key IS NOT NULL
THEN
-- Bepalen vrije werkplek (kan alleen igv expliciete werkplekken).
IF fac.getsetting ('prs_werkplek_implicit') = '0' --expliciet
THEN
SELECT MIN (wp.prs_werkplek_key)
INTO v_wp_key
FROM prs_werkplek wp
WHERE wp.prs_alg_ruimte_key = p_ruimte_key
AND wp.prs_werkplek_virtueel = p_virtual
AND wp.prs_werkplek_type = 0 -- alleen vaste plekken
AND NOT EXISTS (SELECT 1
FROM prs_perslidwerkplek pw
WHERE pw.prs_werkplek_key = wp.prs_werkplek_key);
END IF;
IF v_wp_key IS NULL
THEN
-- Er is geen vrije (kan ook omdat we impliciet zijn), maak dan een nieuwe vrije werkplek.
SELECT MIN (ll) eerstvrije
INTO v_wp_volgnr
FROM ( SELECT LEVEL ll
FROM DUAL
CONNECT BY LEVEL <= 9999
MINUS
SELECT prs_werkplek_volgnr
FROM prs_werkplek
WHERE prs_alg_ruimte_key = p_ruimte_key);
SELECT alg_ruimte_nr
INTO v_ruimte_nr
FROM alg_ruimte
WHERE alg_ruimte_key = p_ruimte_key;
v_wp_oms := v_ruimte_nr || '/' || TO_CHAR (v_wp_volgnr);
-- Toevoegen nieuwe werkplek in meegegeven ruimte.
INSERT INTO prs_werkplek (prs_werkplek_volgnr,
prs_werkplek_omschrijving,
prs_alg_ruimte_key,
prs_werkplek_type,
prs_werkplek_virtueel)
VALUES (v_wp_volgnr, v_wp_oms, p_ruimte_key, 0, p_virtual)
RETURNING prs_werkplek_key
INTO v_wp_key;
END IF;
-- Koppelen persoon aan de (nieuwe of bestaande) vrije werkplek
INSERT INTO prs_perslidwerkplek (prs_perslid_key,
prs_werkplek_key,
prs_perslidwerkplek_bezetting)
VALUES (p_prs_key, v_wp_key, 100);
END IF;
END IF;
END;
-- Procedure om op een standaard wijze de import tabel voor personen te vullen
-- p_import_key
-- p_seq_of_columns string met puntkomma gescheiden reeks van kolomnummers waar onderstaande kolom
-- in het import bestand gevonden kan worden.
--
-- Naar analogie met de factuur import.
-- v_seq_of_columns ListOfInteger := (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 .....,46);
-- Het getal op een bepaalde postitie geeft aan in welke kolom dit veld in de csv staat
-- Voorbeeld: Als de derde waarde een 8 bevat betekent dit dat de verdieping volgnummer in kolom 8 van de csv staat.
--
-- Dus dan maar via een string, en ook op slimme wijze, nl alsof het een ingelezen perslid-record is met p_fielddelimitor
--
-- Afwijkingen op deze volgorde zijn in eigen cust_import_perslid te regelen.
--
-- Als locatiecode en gebouwcode b.v. zijn omgedraaid in het CSV-formaat,
-- dan perslid import ListOfInteger := (2,1,3,4,5,6,7,8,9,10,11,12);
-- v_seq_of_columns := '2;1;3;4;5;6;7;8;9;10;11;12';
--
-- Als locatiecode NIET in CSV staat, dan perslid import ListOfInteger := (0,2,3,4,5,6,7,8,9,10,11,12);
-- v_seq_of_columns := '0;2;3;4;5;6;7;8;9;10;11;12';
-- M.a.w. waar een 0 staat, wordt de variabele niet ingelezen en blijft LEEG.
--
-- p_header header waarop gecontroleerd moet worden. Indien null dan wordt er niet op een header gecontroleerd.
-- Het is mogelijk om wildcards in de string op te geven.
-- Standaard volgorde van de kolommen in het CSV-formaat)
-- Variabelelijst
-- v_alg_locatie_code 1
-- v_alg_gebouw_code 2
-- v_alg_verdieping_volgnr 3
-- v_alg_ruimte_nr 4
-- v_prs_werkplek_volgnr 5
-- v_prs_werkplek_omschrijving 6
-- v_prs_afdeling_naam 7
-- v_prs_perslid_naam 8
-- v_prs_perslid_tussenvoegsel 9
-- v_prs_perslid_voornaam 10
-- v_prs_perslid_voorletters 11
-- v_prs_perslid_partner_naam 12
-- v_prs_perslid_partner_tussenv 13
-- v_prs_naamgebruik_code 14 0 (default) perslid_naam en perslid_tussenvoegsel worden gebruikt
-- 1 personen die de geboortenaam van de partner icm de eigen naam willen gebruiken
-- 2 personen die de geboortenaam van de partner willen gebruiken
-- 3 personen die de eigen naam icm de geboortenaam van de partner willen gebruiken
-- v_prs_perslid_geslacht 15 Gebruik 'man', 'm' of 1 voor man en 'vrouw', 'v' of 0 voor vrouw case insensitive geen default
-- v_prs_perslid_telefoonnr 16
-- v_prs_perslid_mobiel 17
-- v_prs_perslid_email 18
-- v_prs_perslid_dienstverband 19
-- v_prs_perslid_nr 20
-- v_prs_srtperslid_omschrijving 21
-- v_prs_perslid_oslogin 22
-- v_prs_perslid_wachtwoord 23
-- v_prs_perslid_titel 24
-- v_prs_perslid_apikey 25
-- v_dummy 26
-- v_prs_kenmerk1 27
-- v_prs_kenmerk2 28
-- v_prs_kenmerk3 29
-- v_prs_kenmerk4 30
-- v_prs_kenmerk5 31
-- v_prs_kenmerk6 32
-- v_prs_kenmerk7 33
-- v_prs_kenmerk8 34
-- v_prs_kenmerk9 35
-- v_prs_kenmerk10 36
-- v_prs_kenmerk11 37
-- v_prs_kenmerk12 38
-- v_prs_kenmerk13 39
-- v_prs_kenmerk14 40
-- v_prs_kenmerk15 41
-- v_prs_kenmerk16 42
-- v_prs_kenmerk17 43
-- v_prs_kenmerk18 44
-- v_prs_kenmerk19 45
-- v_prs_kenmerk20 46
PROCEDURE import_perslid (
p_import_key IN NUMBER,
p_seq_of_columns IN VARCHAR2,
p_header IN VARCHAR2)
AS
v_newline fac_imp_file.fac_imp_file_line%TYPE; -- Input line
v_field VARCHAR2 (100);
v_fielddelimitor VARCHAR2 (1);
v_aanduiding VARCHAR2 (400);
v_errormsg VARCHAR (200);
v_errorhint VARCHAR2 (200);
v_count NUMBER (10) := 0;
v_count_tot NUMBER (10) := 0;
v_count_import NUMBER (10) := 0;
v_index NUMBER (10);
v_ongeldig NUMBER (10);
v_header_is_valid NUMBER (1) := 0;
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
-- De importvelden
v_empty VARCHAR2 (100);
v_alg_locatie_code VARCHAR2 (256);
v_alg_gebouw_code VARCHAR2 (256);
v_alg_verdieping_volgnr VARCHAR2 (256);
v_alg_ruimte_nr VARCHAR2 (256);
v_prs_werkplek_volgnr VARCHAR2 (256);
v_prs_werkplek_omschrijving VARCHAR2 (256);
v_prs_afdeling_naam VARCHAR2 (256);
v_prs_perslid_naam VARCHAR2 (256);
v_prs_perslid_tussenvoegsel VARCHAR2 (256);
v_prs_perslid_voornaam VARCHAR2 (256);
v_prs_perslid_voorletters VARCHAR2 (256);
v_prs_perslid_partner_naam VARCHAR2 (256);
v_prs_perslid_partner_tussenv VARCHAR2 (256);
v_prs_naamgebruik_code VARCHAR2 (256);
v_prs_perslid_geslacht VARCHAR2 (256);
v_prs_perslid_telefoonnr VARCHAR2 (256);
v_prs_perslid_mobiel VARCHAR2 (256);
v_prs_perslid_email VARCHAR2 (256);
v_prs_perslid_dienstverband VARCHAR2 (256);
v_prs_perslid_nr VARCHAR2 (256);
v_prs_srtperslid_omschrijving VARCHAR2 (256);
v_prs_perslid_titel VARCHAR2 (256);
v_prs_perslid_oslogin VARCHAR2 (256);
v_prs_perslid_wachtwoord VARCHAR2 (256);
v_prs_perslid_apikey VARCHAR2 (256);
v_prs_kenmerk1 VARCHAR2 (256);
v_prs_kenmerk2 VARCHAR2 (256);
v_prs_kenmerk3 VARCHAR2 (256);
v_prs_kenmerk4 VARCHAR2 (256);
v_prs_kenmerk5 VARCHAR2 (256);
v_prs_kenmerk6 VARCHAR2 (256);
v_prs_kenmerk7 VARCHAR2 (256);
v_prs_kenmerk8 VARCHAR2 (256);
v_prs_kenmerk9 VARCHAR2 (256);
v_prs_kenmerk10 VARCHAR2 (256);
v_prs_kenmerk11 VARCHAR2 (256);
v_prs_kenmerk12 VARCHAR2 (256);
v_prs_kenmerk13 VARCHAR2 (256);
v_prs_kenmerk14 VARCHAR2 (256);
v_prs_kenmerk15 VARCHAR2 (256);
v_prs_kenmerk16 VARCHAR2 (256);
v_prs_kenmerk17 VARCHAR2 (256);
v_prs_kenmerk18 VARCHAR2 (256);
v_prs_kenmerk19 VARCHAR2 (256);
v_prs_kenmerk20 VARCHAR2 (256);
v_alg_verdieping_volgnr_num NUMBER;
v_prs_werkplek_volgnr_num NUMBER;
v_prs_perslid_dienstv_num NUMBER;
v_seq_of_columns VARCHAR2 (200);
TYPE array_t IS VARRAY (46) OF NUMBER (10);
v_colnr array_t := array_t ();
CURSOR c
IS
SELECT *
FROM fac_imp_file
WHERE fac_import_key = p_import_key
ORDER BY fac_imp_file_index;
BEGIN
// JGL: Ik zou graag een WHERE fac_import_key = p_import_key hieronder
// toevoegen zodat het script ook multi-user veilig is,
// Heel veel klant-specifieke imports(/aanvullingen) controleren
// echter niet op de fac_import_key en zouden flink de fout in gaan.
// Daarom vooralsnog hier toch maar alles verwijderen
DELETE FROM fac_imp_perslid;
SELECT COALESCE (MAX (fac_imp_file_index), 0) + 1
INTO v_count
FROM fac_imp_factuur;
-- Init
v_fielddelimitor := ';';
v_seq_of_columns := p_seq_of_columns;
v_errorhint := 'Bepalen volgorde kolommen';
FOR v_index IN 1 .. 46
LOOP
v_colnr.EXTEND;
-- De volgorde de te importeren kolommen in de CSV uitlezen uit v_seq_of_columns
fac.imp_getfield (v_seq_of_columns,
v_fielddelimitor,
v_colnr (v_index));
END LOOP;
-- Indien geen header check is opgegeven, gaan we niet op zoek naar een geldige header
IF p_header IS NULL
THEN
v_header_is_valid := 1;
END IF;
FOR rec1 IN c
LOOP
BEGIN
v_errormsg := 'Fout FETCH te importeren rij';
v_newline := rec1.fac_imp_file_line;
v_errormsg := '';
v_errorhint := 'Fout opvragen te importeren rij';
v_aanduiding := '';
v_ongeldig := 0;
IF v_header_is_valid = 0
THEN
IF UPPER (v_newline) LIKE UPPER (p_header)
THEN
v_header_is_valid := 1;
END IF;
ELSE
-- Lees alle veldwaarden
v_errorhint := 'Inlezen alg_locatie_code kolom:' || v_colnr (1);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (1),
v_alg_locatie_code);
v_errorhint := 'Inlezen alg_lcoatie_code kolom:' || v_colnr (2);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (2),
v_alg_gebouw_code);
v_errorhint := 'Inlezen alg_verdieping_volgnr kolom:' || v_colnr (3);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (3),
v_alg_verdieping_volgnr);
v_errorhint := 'Inlezen alg_ruimte_nr kolom:' || v_colnr (4);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (4),
v_alg_ruimte_nr);
v_errorhint := 'Inlezen prs_werkplek_volgnr kolom:' || v_colnr (5);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (5),
v_prs_werkplek_volgnr);
v_errorhint := 'Inlezen prs_werkplek_omschrijving kolom:' || v_colnr (6);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (6),
v_prs_werkplek_omschrijving);
v_errorhint := 'Inlezen prs_afdeling_naam kolom:' || v_colnr (7);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (7),
v_prs_afdeling_naam);
v_errorhint := 'Inlezen prs_perslid_naam kolom:' || v_colnr (8);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (8),
v_prs_perslid_naam);
v_errorhint := 'Inlezen prs_perslid_tussenvoegsel kolom:' || v_colnr (9);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (9),
v_prs_perslid_tussenvoegsel);
v_errorhint := 'Inlezen prs_perslid_voornaam kolom:' || v_colnr (10);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (10),
v_prs_perslid_voornaam);
v_errorhint := 'Inlezen prs_perslid_voorletters kolom:' || v_colnr (11);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (11),
v_prs_perslid_voorletters);
v_errorhint := 'Inlezen prs_perslid_partner_naam kolom:' || v_colnr (12);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (12),
v_prs_perslid_partner_naam);
v_errorhint := 'Inlezen prs_perslid_partner_tussenv kolom:' || v_colnr (13);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (13),
v_prs_perslid_partner_tussenv);
v_errorhint := 'Inlezen prs_perslid_geslacht kolom:' || v_colnr (14);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (14),
v_prs_naamgebruik_code);
v_errorhint := 'Inlezen alg_lcoatie_code kolom:' || v_colnr (15);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (15),
v_prs_perslid_geslacht);
v_errorhint := 'Inlezen prs_perslid_telefoonnr kolom:' || v_colnr (16);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (16),
v_prs_perslid_telefoonnr);
v_errorhint := 'Inlezen prs_perslid_mobiel kolom:' || v_colnr (17);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (17),
v_prs_perslid_mobiel);
v_errorhint := 'Inlezen prs_perslid_email kolom:' || v_colnr (18);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (18),
v_prs_perslid_email);
v_errorhint := 'Inlezen prs_perslid_dienstverband kolom:' || v_colnr (19);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (19),
v_prs_perslid_dienstverband);
v_errorhint := 'Inlezen prs_perslid_nr kolom:' || v_colnr (20);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (20),
v_prs_perslid_nr);
v_errorhint := 'Inlezen prs_srtperslid_omschrijving kolom:' || v_colnr (21);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (21),
v_prs_srtperslid_omschrijving);
v_errorhint := 'Inlezen prs_perslid_oslogin kolom:' || v_colnr (22);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (22),
v_prs_perslid_oslogin);
v_errorhint := 'Inlezen prs_perslid_wachtwoord kolom:' || v_colnr (23);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (23),
v_prs_perslid_wachtwoord);
v_errorhint := 'Inlezen prs_perslid_titel kolom:' || v_colnr (24);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (24),
v_prs_perslid_titel);
v_errorhint := 'Inlezen prs_perslid_apikey kolom:' || v_colnr (25);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (25),
v_prs_perslid_apikey);
v_errorhint := 'Inlezen prs_kenmerk1 kolom:' || v_colnr (27);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (27),
v_prs_kenmerk1);
v_errorhint := 'Inlezen prs_kenmerk2 kolom:' || v_colnr (28);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (28),
v_prs_kenmerk2);
v_errorhint := 'Inlezen prs_kenmerk3 kolom:' || v_colnr (29);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (29),
v_prs_kenmerk3);
v_errorhint := 'Inlezen prs_kenmerk4 kolom:' || v_colnr (30);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (30),
v_prs_kenmerk4);
v_errorhint := 'Inlezen prs_kenmerk5 kolom:' || v_colnr (31);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (31),
v_prs_kenmerk5);
v_errorhint := 'Inlezen prs_kenmerk6 kolom:' || v_colnr (32);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (32),
v_prs_kenmerk6);
v_errorhint := 'Inlezen prs_kenmerk7 kolom:' || v_colnr (33);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (33),
v_prs_kenmerk7);
v_errorhint := 'Inlezen prs_kenmerk8 kolom:' || v_colnr (34);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (34),
v_prs_kenmerk8);
v_errorhint := 'Inlezen prs_kenmerk9 kolom:' || v_colnr (35);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (35),
v_prs_kenmerk9);
v_errorhint := 'Inlezen prs_kenmerk10 kolom:' || v_colnr (36);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (36),
v_prs_kenmerk10);
v_errorhint := 'Inlezen prs_kenmerk11 kolom:' || v_colnr (37);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (37),
v_prs_kenmerk11);
v_errorhint := 'Inlezen prs_kenmerk12 kolom:' || v_colnr (38);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (38),
v_prs_kenmerk12);
v_errorhint := 'Inlezen prs_kenmerk13 kolom:' || v_colnr (39);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (39),
v_prs_kenmerk13);
v_errorhint := 'Inlezen prs_kenmerk14 kolom:' || v_colnr (40);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (40),
v_prs_kenmerk14);
v_errorhint := 'Inlezen prs_kenmerk15 kolom:' || v_colnr (41);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (41),
v_prs_kenmerk15);
v_errorhint := 'Inlezen prs_kenmerk16 kolom:' || v_colnr (42);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (42),
v_prs_kenmerk16);
v_errorhint := 'Inlezen prs_kenmerk17 kolom:' || v_colnr (43);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (43),
v_prs_kenmerk17);
v_errorhint := 'Inlezen prs_kenmerk18 kolom:' || v_colnr (44);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (44),
v_prs_kenmerk18);
v_errorhint := 'Inlezen prs_kenmerk19 kolom:' || v_colnr (45);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (45),
v_prs_kenmerk19);
v_errorhint := 'Inlezen prs_kenmerk20 kolom:' || v_colnr (46);
fac.imp_getfield_nr (v_newline,
v_fielddelimitor,
v_colnr (46),
v_prs_kenmerk20);
v_aanduiding :=
v_prs_perslid_naam || '|' || v_prs_perslid_voornaam || '| ';
v_count_tot := v_count_tot + 1;
v_errorhint := 'Ongeldige locatiecode';
v_alg_locatie_code := TRIM (v_alg_locatie_code);
IF LENGTH (v_alg_locatie_code) > 10
THEN
v_alg_locatie_code := SUBSTR (v_alg_locatie_code, 1, 10);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Locatie-aanduiding is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_alg_locatie_code
|| ']');
END IF;
--
v_errorhint := 'Ongeldige gebouw code';
v_alg_gebouw_code := TRIM (v_alg_gebouw_code);
IF LENGTH (v_alg_gebouw_code) > 12
THEN
v_alg_gebouw_code := SUBSTR (v_alg_gebouw_code, 1, 12);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Gebouw-aanduiding is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_alg_gebouw_code
|| ']');
END IF;
--
v_errorhint := 'Ongeldig verdieping volgnummer';
v_alg_verdieping_volgnr := TRIM (v_alg_verdieping_volgnr);
IF (v_alg_verdieping_volgnr IS NULL)
THEN
v_alg_verdieping_volgnr_num :=
TO_NUMBER (v_alg_verdieping_volgnr);
ELSE
BEGIN
v_alg_verdieping_volgnr_num :=
TO_NUMBER (v_alg_verdieping_volgnr);
EXCEPTION
WHEN OTHERS
THEN
v_ongeldig := 1;
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_aanduiding || v_errormsg,
v_errorhint);
END;
END IF;
--
v_errorhint := 'Ongeldige ruimte nr';
v_alg_ruimte_nr := TRIM (v_alg_ruimte_nr);
IF LENGTH (v_alg_ruimte_nr) > 10
THEN
v_alg_ruimte_nr := SUBSTR (v_alg_ruimte_nr, 1, 10);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Ruimtenr-aanduiding is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_alg_ruimte_nr
|| ']');
END IF;
--
v_errorhint := 'Ongeldig werkplek volgnummer';
v_prs_werkplek_volgnr := TRIM (v_prs_werkplek_volgnr);
IF (v_prs_werkplek_volgnr IS NULL)
THEN
v_prs_werkplek_volgnr_num := TO_NUMBER (v_prs_werkplek_volgnr);
ELSE
BEGIN
v_alg_verdieping_volgnr_num :=
TO_NUMBER (v_alg_verdieping_volgnr);
EXCEPTION
WHEN OTHERS
THEN
v_ongeldig := 1;
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_aanduiding || v_errormsg,
v_errorhint);
END;
END IF;
--
v_errorhint := 'Ongeldige werkplek omschrijving';
v_prs_werkplek_omschrijving := TRIM (v_prs_werkplek_omschrijving);
IF LENGTH (v_prs_werkplek_omschrijving) > 30
THEN
v_prs_werkplek_omschrijving :=
SUBSTR (v_prs_werkplek_omschrijving, 1, 30);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Werkplek-aanduiding is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_werkplek_omschrijving
|| ']');
END IF;
--
v_errorhint := 'Ongeldige afdelingscode';
v_prs_afdeling_naam := TRIM (v_prs_afdeling_naam);
IF LENGTH (v_prs_afdeling_naam) > 15
THEN
v_prs_afdeling_naam := SUBSTR (v_prs_afdeling_naam, 1, 15);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Afdelingscode is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_afdeling_naam
|| ']');
ELSE
IF (v_prs_afdeling_naam IS NULL)
THEN
v_ongeldig := 1;
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || 'Afdelingscode onbekend',
'Afdelingscode moet worden opgegeven');
END IF;
END IF;
--
v_errorhint := 'Ongeldige naam persoon';
v_prs_perslid_naam := TRIM (v_prs_perslid_naam);
IF LENGTH (v_prs_perslid_naam) > 60
THEN
v_prs_perslid_naam := SUBSTR (v_prs_perslid_naam, 1, 60);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Naam persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_naam
|| ']');
ELSE
IF (v_prs_perslid_naam IS NULL)
THEN
v_ongeldig := 1;
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || 'Naam persoon onbekend',
'Naam persoon moet worden opgegeven');
END IF;
END IF;
--
v_errorhint := 'Ongeldige tussenvoegsel persoon';
v_prs_perslid_tussenvoegsel := TRIM (v_prs_perslid_tussenvoegsel);
IF LENGTH (v_prs_perslid_tussenvoegsel) > 10
THEN
v_prs_perslid_tussenvoegsel :=
SUBSTR (v_prs_perslid_tussenvoegsel, 1, 10);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Tussenvoegsel persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_tussenvoegsel
|| ']');
END IF;
--
v_errorhint := 'Ongeldige voorletters persoon';
v_prs_perslid_voorletters := TRIM (v_prs_perslid_voorletters);
IF LENGTH (v_prs_perslid_voorletters) > 15
THEN
v_prs_perslid_voorletters :=
SUBSTR (v_prs_perslid_voorletters, 1, 15);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Voorletters persoon zijn te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_voorletters
|| ']');
END IF;
--
v_errorhint := 'Voornaam persoon';
v_prs_perslid_voornaam := TRIM (v_prs_perslid_voornaam);
IF LENGTH (v_prs_perslid_voornaam) > 30
THEN
v_prs_perslid_voornaam :=
SUBSTR (v_prs_perslid_voornaam, 1, 30);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Voornaam persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_voornaam
|| ']');
END IF;
v_errorhint := 'Ongeldige partnernaam persoon';
v_prs_perslid_partner_naam := TRIM (v_prs_perslid_partner_naam);
--
IF LENGTH (v_prs_perslid_partner_naam) > 60
THEN
v_prs_perslid_partner_naam := SUBSTR (v_prs_perslid_partner_naam, 1, 60);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Partnernaam is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_partner_naam
|| ']');
END IF;
--
v_errorhint := 'Ongeldige tussenvoegsel partner';
v_prs_perslid_partner_tussenv := TRIM (v_prs_perslid_partner_tussenv);
IF LENGTH (v_prs_perslid_partner_tussenv) > 10
THEN
v_prs_perslid_partner_tussenv :=
SUBSTR (v_prs_perslid_partner_tussenv, 1, 10);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Tussenvoegsel partner is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_partner_tussenv
|| ']');
END IF;
--
v_errorhint := 'Ongeldig geslacht';
v_prs_perslid_geslacht := TRIM (v_prs_perslid_geslacht);
IF LENGTH (v_prs_perslid_geslacht) > 1
THEN
SELECT DECODE(UPPER(v_prs_perslid_geslacht), 'MAN', '1', 'VROUW', '0', NULL)
INTO v_prs_perslid_geslacht
FROM DUAL;
ELSE
IF fac.safe_to_number(v_prs_perslid_geslacht) IS NULL
THEN
SELECT DECODE(UPPER(v_prs_perslid_geslacht), 'M', '1', 'V', '0', NULL)
INTO v_prs_perslid_geslacht
FROM DUAL;
END IF;
END IF;
--
v_errorhint := 'Ongeldig dienstverband';
v_prs_perslid_dienstverband := TRIM (v_prs_perslid_dienstverband);
IF (v_prs_perslid_dienstverband IS NOT NULL)
THEN
BEGIN
v_prs_perslid_dienstv_num :=
TO_NUMBER (v_prs_perslid_dienstverband);
EXCEPTION
WHEN OTHERS
THEN
v_ongeldig := 1;
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_aanduiding || v_errormsg,
v_errorhint);
END;
END IF;
--
v_errorhint := 'Ongeldige titel persoon';
v_prs_perslid_titel := TRIM (v_prs_perslid_titel);
IF LENGTH (v_prs_perslid_titel) > 15
THEN
v_prs_perslid_titel := SUBSTR (v_prs_perslid_titel, 1, 15);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Titel persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_titel
|| ']');
END IF;
--
v_errorhint := 'Ongeldige telefoonnr. persoon';
v_prs_perslid_telefoonnr := TRIM (v_prs_perslid_telefoonnr);
IF LENGTH (v_prs_perslid_telefoonnr) > 15
THEN
v_prs_perslid_telefoonnr :=
SUBSTR (v_prs_perslid_telefoonnr, 1, 15);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Telefoonnr. persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_telefoonnr
|| ']');
END IF;
--
v_errorhint := 'Ongeldige mobielnr. persoon';
v_prs_perslid_mobiel := TRIM (v_prs_perslid_mobiel);
IF LENGTH (v_prs_perslid_mobiel) > 15
THEN
v_prs_perslid_mobiel := SUBSTR (v_prs_perslid_mobiel, 1, 15);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Mobielnr. persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_mobiel
|| ']');
END IF;
--
v_errorhint := 'Ongeldige email persoon';
v_prs_perslid_email := TRIM (v_prs_perslid_email);
IF LENGTH (v_prs_perslid_email) > 200
THEN
v_prs_perslid_email := SUBSTR (v_prs_perslid_email, 1, 200);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Email persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_email
|| ']');
END IF;
--
v_errorhint := 'Ongeldige functie persoon';
v_prs_srtperslid_omschrijving :=
TRIM (v_prs_srtperslid_omschrijving);
IF LENGTH (v_prs_srtperslid_omschrijving) > 60
THEN
v_prs_srtperslid_omschrijving :=
SUBSTR (v_prs_srtperslid_omschrijving, 1, 60);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Functie-aanduiding persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_srtperslid_omschrijving
|| ']');
ELSE
IF (v_prs_srtperslid_omschrijving IS NULL)
THEN
v_ongeldig := 1;
fac.imp_writelog (
p_import_key,
'E',
v_aanduiding || 'Functie persoon onbekend',
'Functie persoon moet worden opgegeven');
END IF;
END IF;
--
v_errorhint := 'Ongeldige persoonnr.';
v_prs_perslid_nr := TRIM (v_prs_perslid_nr);
IF LENGTH (v_prs_perslid_nr) > 16
THEN
v_prs_perslid_nr := SUBSTR (v_prs_perslid_nr, 1, 16);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Persoonnr. persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_nr
|| ']');
END IF;
--
v_errorhint := 'Ongeldige loginnaam';
v_prs_perslid_oslogin := TRIM (v_prs_perslid_oslogin);
IF LENGTH (v_prs_perslid_oslogin) > 30
THEN
v_prs_perslid_oslogin := SUBSTR (v_prs_perslid_oslogin, 1, 30);
fac.imp_writelog (
p_import_key,
'W',
v_aanduiding || 'Loginnaam persoon is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_oslogin
|| ']');
END IF;
v_errorhint := 'Ongeldig wachtwoord';
v_prs_perslid_wachtwoord := TRIM (v_prs_perslid_wachtwoord);
--
-- Insert geformatteerde import record
IF v_ongeldig = 0
THEN
v_errorhint := 'Toevoegen record';
v_errormsg :=
'Fout bij toevoegen te impoteren bedrijf/afdeling ['
|| v_prs_afdeling_naam
|| ']';
INSERT INTO fac_imp_perslid (alg_locatie_code,
alg_gebouw_code,
alg_verdieping_volgnr,
alg_ruimte_nr,
prs_werkplek_volgnr,
prs_werkplek_omschrijving,
prs_afdeling_naam,
prs_perslid_naam,
prs_perslid_tussenvoegsel,
prs_perslid_voornaam,
prs_perslid_voorletters,
prs_perslid_partner_naam,
prs_perslid_partner_tussenv,
prs_perslid_naamgebruik_code,
prs_perslid_geslacht,
prs_perslid_telefoonnr,
prs_perslid_mobiel,
prs_perslid_email,
prs_perslid_dienstverband,
prs_perslid_nr,
prs_srtperslid_omschrijving,
prs_perslid_oslogin,
prs_perslid_wachtwoord,
prs_perslid_titel,
prs_perslid_apikey,
prs_kenmerk1,
prs_kenmerk2,
prs_kenmerk3,
prs_kenmerk4,
prs_kenmerk5,
prs_kenmerk6,
prs_kenmerk7,
prs_kenmerk8,
prs_kenmerk9,
prs_kenmerk10,
prs_kenmerk11,
prs_kenmerk12,
prs_kenmerk13,
prs_kenmerk14,
prs_kenmerk15,
prs_kenmerk16,
prs_kenmerk17,
prs_kenmerk18,
prs_kenmerk19,
prs_kenmerk20,
fac_import_key,
fac_imp_file_index)
VALUES (v_alg_locatie_code,
v_alg_gebouw_code,
v_alg_verdieping_volgnr,
v_alg_ruimte_nr,
v_prs_werkplek_volgnr,
v_prs_werkplek_omschrijving,
v_prs_afdeling_naam,
v_prs_perslid_naam,
v_prs_perslid_tussenvoegsel,
v_prs_perslid_voornaam,
v_prs_perslid_voorletters,
v_prs_perslid_partner_naam,
v_prs_perslid_partner_tussenv,
COALESCE(fac.safe_to_number(v_prs_naamgebruik_code), 0),
v_prs_perslid_geslacht,
v_prs_perslid_telefoonnr,
v_prs_perslid_mobiel,
v_prs_perslid_email,
v_prs_perslid_dienstverband,
v_prs_perslid_nr,
v_prs_srtperslid_omschrijving,
v_prs_perslid_oslogin,
v_prs_perslid_wachtwoord,
v_prs_perslid_titel,
v_prs_perslid_apikey,
v_prs_kenmerk1,
v_prs_kenmerk2,
v_prs_kenmerk3,
v_prs_kenmerk4,
v_prs_kenmerk5,
v_prs_kenmerk6,
v_prs_kenmerk7,
v_prs_kenmerk8,
v_prs_kenmerk9,
v_prs_kenmerk10,
v_prs_kenmerk11,
v_prs_kenmerk12,
v_prs_kenmerk13,
v_prs_kenmerk14,
v_prs_kenmerk15,
v_prs_kenmerk16,
v_prs_kenmerk17,
v_prs_kenmerk18,
v_prs_kenmerk19,
v_prs_kenmerk20,
rec1.fac_import_key,
rec1.fac_imp_file_index);
v_count_import := v_count_import + 1;
END IF;
END IF;
END;
END LOOP;
IF v_header_is_valid = 0
THEN
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || 'Ongeldig importbestand',
'Geen geldige headerregel aanwezig');
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 := 'Error ' || oracle_err_num || '/' || oracle_err_mes;
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || v_errormsg,
v_errorhint);
END;
-- Procedure om generiek personen in te lezen of aan te passen.
-- p_sleutelkolom Bevat het veld die als sleutel bij de import dient.
-- NR - personeelsnummer
-- EMAIL - emailadres
-- LOGIN - logincode
-- APIKEY - API-key voor distributie van persoonsgegevens over FACILITORs
-- p_alg_type Werkplekken binnen dit niveau verwijderen
-- NULL - geen werkplekken verwijderen
-- A - altijd vaste werkplek verwijderen
-- R,V,G,L,D - werkplek(en) op dit niveau verwijderen
PROCEDURE update_perslid (p_import_key IN NUMBER,
p_sleutelkolom IN VARCHAR2,
p_alg_type IN VARCHAR2)
IS
c_fielddelimitor VARCHAR2 (1) := ';';
v_errormsg VARCHAR2 (1000);
v_errorhint VARCHAR2 (1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_aanduiding VARCHAR2 (200);
v_count NUMBER (10);
v_ongeldig NUMBER (1);
v_count_update NUMBER (10);
v_count_error NUMBER (10);
v_count_tot NUMBER (10);
v_wpcount_error NUMBER (10);
--
v_perslid_key NUMBER (10);
v_afdeling_key NUMBER (10);
v_srtperslid_key NUMBER (10);
v_prs_perslid_naam VARCHAR2(200);
v_prs_perslid_tussenvoegsel VARCHAR2(200);
v_locatie_key NUMBER (10);
v_gebouw_key NUMBER (10);
v_verdieping_key NUMBER (10);
v_ruimte_key NUMBER (10);
v_space VARCHAR2(1);
CURSOR cSPERSLID
IS
SELECT MIN (prs_srtperslid_omschrijving) prs_srtperslid_omschrijving
FROM fac_imp_perslid i
WHERE NOT EXISTS
(SELECT prs_srtperslid_key
FROM prs_srtperslid sp
WHERE UPPER (sp.prs_srtperslid_omschrijving) =
UPPER (i.prs_srtperslid_omschrijving))
GROUP BY UPPER (prs_srtperslid_omschrijving);
recSPersLid cSPersLid%ROWTYPE;
CURSOR cPERSLID
IS
SELECT * FROM fac_imp_perslid;
recPersLid cPersLid%ROWTYPE;
BEGIN
v_count_update := 0;
v_count_tot := 0;
v_count_error := 0;
v_wpcount_error := 0;
FOR recSPersLid IN cSPersLid
LOOP
BEGIN
v_aanduiding := '';
v_errormsg := '';
v_errorhint := '';
v_count_tot := v_count_tot + 1;
v_aanduiding := recSPersLid.PRS_SRTPERSLID_OMSCHRIJVING;
v_errorhint := 'Fout bij toevoegen functie';
INSERT INTO prs_srtperslid (prs_srtperslid_omschrijving)
VALUES (recSPersLid.prs_srtperslid_omschrijving);
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 :=
' (ORACLE error number = <'
|| ORACLE_err_num
|| '> ORACLE error message = <'
|| ORACLE_err_mes
|| '>)';
fac.imp_writelog (p_import_key,
'E',
v_aanduiding || v_errormsg,
v_errorhint);
COMMIT; -- tbv logging
END;
END LOOP;
fac.imp_writelog (
p_import_key,
'S',
'Personeelsfunctie: toegevoegde regels zonder foutmelding: '
|| TO_CHAR (v_count_tot - v_count_error),
'');
fac.imp_writelog (
p_import_key,
'S',
'Personeelsfunctie: toegevoegde regels met foutmelding: '
|| TO_CHAR (v_count_error),
'');
COMMIT; -- logging
v_count_update := 0;
v_count_tot := 0;
v_count_error := 0;
FOR recPersLid IN cPersLid
LOOP
BEGIN
v_aanduiding := '';
v_errormsg := '';
v_errorhint := '';
v_count_tot := v_count_tot + 1;
v_aanduiding :=
recPersLid.prs_perslid_naam
|| '|'
|| recPersLid.prs_perslid_voornaam
|| '| ';
v_errormsg := '';
v_errorhint := 'Fout bij bepalen functie';
SELECT prs_srtperslid_key
INTO v_srtperslid_key
FROM prs_srtperslid
WHERE prs_srtperslid_verwijder IS NULL
AND UPPER (prs_srtperslid_omschrijving) =
UPPER (recPersLid.prs_srtperslid_omschrijving);
v_errorhint :=
'Afdeling niet gevonden ['
|| recPersLid.prs_afdeling_naam
|| ']';
SELECT a.prs_afdeling_key
INTO v_afdeling_key
FROM prs_v_aanwezigafdeling_boom b, prs_afdeling a
WHERE UPPER (a.prs_afdeling_naam) = UPPER (recPersLid.prs_afdeling_naam)
AND a.prs_afdeling_verwijder IS NULL
AND a.prs_afdeling_key = b.prs_afdeling_key;
v_space := '';
-- kijk hoe we met partnernamen moeten omgaan:
IF recPersLid.prs_perslid_naamgebruik_code = 0
THEN
-- normaal gebruik van naam. Eigen naam wordt gebruikt
v_prs_perslid_naam := recPersLid.prs_perslid_naam;
v_prs_perslid_tussenvoegsel := recPersLid.prs_perslid_tussenvoegsel;
ELSIF recPersLid.prs_perslid_naamgebruik_code = 1
THEN
-- personen die de geboortenaam van de partner icm de eigen naam willen gebruiken
IF recPersLid.prs_perslid_tussenvoegsel IS NOT NULL
THEN
v_space := ' ';
END IF;
v_prs_perslid_naam := recPersLid.prs_perslid_partner_naam || ' - ' || recPersLid.prs_perslid_tussenvoegsel || v_space || recPersLid.prs_perslid_naam;
v_prs_perslid_tussenvoegsel := recPersLid.prs_perslid_partner_tussenv;
ELSIF recPersLid.prs_perslid_naamgebruik_code = 2
THEN
-- personen die de geboortenaam van de partner willen gebruiken
v_prs_perslid_naam := recPersLid.prs_perslid_partner_naam;
v_prs_perslid_tussenvoegsel := recPersLid.prs_perslid_partner_tussenv;
ELSIF recPersLid.prs_perslid_naamgebruik_code = 3
THEN
-- personen die de eigen naam icm de geboortenaam van de partner willen gebruiken
IF recPersLid.prs_perslid_partner_tussenv IS NOT NULL
THEN
v_space := ' ';
END IF;
v_prs_perslid_naam := recPersLid.prs_perslid_naam || ' - ' || recPersLid.prs_perslid_partner_tussenv || v_space || recPersLid.prs_perslid_partner_naam;
v_prs_perslid_tussenvoegsel := recPersLid.prs_perslid_tussenvoegsel;
END IF;
IF length(v_prs_perslid_naam) > 60
THEN
v_prs_perslid_naam := SUBSTR(v_prs_perslid_naam, 1,60);
fac.imp_writelog (
p_import_key,
'W',
recPersLid.prs_perslid_naam || '|' || recPersLid.prs_perslid_voornaam || '| ' || 'Samengestelde achternaam is te lang',
'Aanduiding wordt afgebroken tot ['
|| v_prs_perslid_naam
|| ']');
END IF;
-- p_sleutelkolom
-- NR = prs_perslid_nr
-- EMAIL = prs_perslid_email
-- LOGIN = prs_perslid_oslogin
-- APIKEY = prs_perslid_apikey
v_errorhint := 'Kijken of de persoon al bestaat';
SELECT MAX (prs_perslid_key), COUNT ( * )
INTO v_perslid_key, v_count
FROM prs_perslid
WHERE prs_perslid_verwijder IS NULL
AND ( (p_sleutelkolom IS NULL
AND UPPER (prs_perslid_naam) =
UPPER (recPersLid.prs_perslid_naam)
AND UPPER (prs_perslid_voornaam) =
UPPER (recPersLid.prs_perslid_voornaam))
OR (UPPER (p_sleutelkolom) = 'NR'
AND UPPER (prs_perslid_nr) =
UPPER (recPersLid.prs_perslid_nr)
OR UPPER (p_sleutelkolom) = 'EMAIL'
AND UPPER (prs_perslid_email) =
UPPER (recPersLid.prs_perslid_email)
OR UPPER (p_sleutelkolom) = 'LOGIN'
AND UPPER (prs_perslid_oslogin) =
UPPER (recPersLid.prs_perslid_oslogin)
OR UPPER (p_sleutelkolom) = 'APIKEY'
AND UPPER (prs_perslid_apikey) =
UPPER (recPersLid.prs_perslid_apikey)));
IF (v_count = 0)
THEN
v_errorhint := 'Fout bij toevoegen persoon';
INSERT INTO prs_perslid (prs_perslid_module,
prs_srtperslid_key,
prs_afdeling_key,
prs_perslid_naam,
prs_perslid_voorletters,
prs_perslid_tussenvoegsel,
prs_perslid_voornaam,
prs_perslid_telefoonnr,
prs_perslid_mobiel,
prs_perslid_email,
prs_perslid_nr,
prs_perslid_geslacht,
prs_perslid_titel,
prs_perslid_dienstverband,
prs_perslid_oslogin,
prs_perslid_apikey)
VALUES ('PRS',
v_srtperslid_key,
v_afdeling_key,
v_prs_perslid_naam,
recPersLid.prs_perslid_voorletters,
v_prs_perslid_tussenvoegsel,
recPersLid.prs_perslid_voornaam,
recPersLid.prs_perslid_telefoonnr,
recPersLid.prs_perslid_mobiel,
recPersLid.prs_perslid_email,
recPersLid.prs_perslid_nr,
recPersLid.prs_perslid_geslacht,
recPersLid.prs_perslid_titel,
recPersLid.prs_perslid_dienstverband,
recPersLid.prs_perslid_oslogin,
recPersLid.prs_perslid_apikey)
RETURNING prs_perslid_key
INTO v_perslid_key;
prs.setpassword(v_perslid_key, recPersLid.prs_perslid_wachtwoord);
COMMIT;
v_count_update := v_count_update + 1;
ELSIF v_count = 1
THEN
UPDATE prs_perslid
SET prs_srtperslid_key = v_srtperslid_key,
prs_afdeling_key = v_afdeling_key,
prs_perslid_naam = v_prs_perslid_naam,
prs_perslid_voorletters =
recPersLid.prs_perslid_voorletters,
prs_perslid_tussenvoegsel =
v_prs_perslid_tussenvoegsel,
prs_perslid_voornaam = recPersLid.prs_perslid_voornaam,
prs_perslid_nr = recPersLid.prs_perslid_nr,
prs_perslid_dienstverband = recPersLid.prs_perslid_dienstverband,
prs_perslid_geslacht = recPersLid.prs_perslid_geslacht,
prs_perslid_titel = recPersLid.prs_perslid_titel,
prs_perslid_telefoonnr = recPersLid.prs_perslid_telefoonnr,
prs_perslid_mobiel = recPersLid.prs_perslid_mobiel,
prs_perslid_email = recPersLid.prs_perslid_email,
prs_perslid_oslogin = recPersLid.prs_perslid_oslogin,
prs_perslid_apikey = recPersLid.prs_perslid_apikey
WHERE prs_perslid_key = v_perslid_key;
IF recPersLid.prs_perslid_wachtwoord IS NOT NULL
THEN
prs.setpassword(v_perslid_key, recPersLid.prs_perslid_wachtwoord);
END IF;
END IF;
-- Voor CUST-postprocessing (van de kenmerken) is het handig te onthouden:
UPDATE fac_imp_perslid
SET prs_perslid_key = v_perslid_key
WHERE fac_import_key = recPersLid.fac_import_key
AND fac_imp_file_index = recPersLid.fac_imp_file_index;
COMMIT; -- persoon in ieder geval toegevoegd.
v_aanduiding :=
recPersLid.prs_perslid_nr
|| '|'
|| recPersLid.prs_perslid_naam
|| '|'
|| recPersLid.prs_perslid_voornaam
|| '|'
|| recPersLid.alg_locatie_code
|| '|'
|| recPersLid.alg_gebouw_code
|| '|'
|| recPersLid.alg_verdieping_volgnr
|| '|'
|| recPersLid.alg_ruimte_nr
|| ' - ';
v_locatie_key := NULL;
v_gebouw_key := NULL;
v_verdieping_key := NULL;
v_ruimte_key := NULL;
v_errorhint := 'Fout bij bepalen locatie';
SELECT MAX(alg_locatie_key)
INTO v_locatie_key
FROM alg_v_aanweziglocatie
WHERE UPPER (alg_locatie_code) = UPPER (recPersLid.alg_locatie_code);
v_errorhint := 'Fout bij bepalen gebouw';
SELECT MAX(alg_gebouw_key)
INTO v_gebouw_key
FROM alg_v_aanweziggebouw
WHERE UPPER (alg_gebouw_code) = UPPER (recPersLid.alg_gebouw_code)
AND alg_locatie_key = v_locatie_key;
v_errorhint := 'Fout bij bepalen verdieping';
SELECT MAX(alg_verdieping_key)
INTO v_verdieping_key
FROM alg_v_aanwezigverdieping
WHERE UPPER (alg_verdieping_volgnr) = UPPER (recPersLid.alg_verdieping_volgnr)
AND alg_gebouw_key = v_gebouw_key;
v_errorhint := 'Fout bij bepalen beoogde ruimte';
SELECT MAX(alg_ruimte_key)
INTO v_ruimte_key
FROM alg_v_aanwezigruimte r
WHERE r.alg_ruimte_upper_nr = UPPER (recPersLid.alg_ruimte_nr)
AND r.alg_verdieping_key = v_verdieping_key;
-- standaard ruimte moet door cust gedeelte van deFout bij bepalen beoogde ruimte import ingevuld worden.
-- als er een locatie ingevuld is willen we ook een ruimte vinden.
IF v_ruimte_key IS NULL AND recPersLid.alg_locatie_code IS NOT NULL
THEN
fac.imp_writelog (p_import_key,
'W',
v_aanduiding || ' Ruimte kan niet gevonden worden',
'Controleer locatie,gebouw en verdieping');
END IF;
-- fouten bij het bepalen van de werkplek worden als waarschuwing weergegeven.
BEGIN
v_errorhint := 'Fout bij het aanpassen van de werkplek';
PRS.movetoruimte (v_perslid_key, v_ruimte_key, p_alg_type);
EXCEPTION WHEN OTHERS
THEN
v_wpcount_error := v_wpcount_error + 1;
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg := ' (ORACLE error number = <' || ORACLE_err_num || '> ORACLE error message = <' || ORACLE_err_mes || '>)';
fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, v_errorhint);
END;
EXCEPTION WHEN OTHERS
THEN
v_count_error := v_count_error + 1;
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg := ' (ORACLE error number = <' || ORACLE_err_num || '> ORACLE error message = <' || ORACLE_err_mes || '>)';
fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, v_errorhint);
COMMIT; -- tbv logging
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),
'');
fac.imp_writelog (
p_import_key,
'S',
'Werkplek: verwerkte regels met foutmelding: '
|| TO_CHAR (v_wpcount_error),
'');
END update_perslid;
PROCEDURE delete_perslid (p_import_key IN NUMBER,
p_perslid_key IN NUMBER)
IS
v_errormsg VARCHAR2 (1000);
v_errorhint VARCHAR2 (1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_count NUMBER (10);
--
v_perslid_naam VARCHAR (100);
v_perslid_nr VARCHAR (30);
BEGIN
BEGIN
v_errormsg := 'Verwijderen van de persoon is NIET gelukt';
v_errorhint :=
'Heeft de persoon met prs_perslid_key '
|| TO_CHAR (p_perslid_key)
|| ' historie?';
SELECT prs_perslid_naam_full, prs_perslid_nr
INTO v_perslid_naam, v_perslid_nr
FROM prs_perslid p, prs_v_perslid_fullnames pf
WHERE p.prs_perslid_key = pf.prs_perslid_key
AND p.prs_perslid_key = p_perslid_key;
-- *** Budgethouderschap ***
-- Voor hoeveel kostenplaatsen is deze persoon budgethouder?
SELECT COUNT ( * )
INTO v_count
FROM prs_kostenplaats
WHERE prs_perslid_key = p_perslid_key;
IF (v_count > 0)
THEN
UPDATE prs_kostenplaats
SET prs_perslid_key = NULL
WHERE prs_perslid_key = p_perslid_key;
fac.imp_writelog (
p_import_key,
'I',
'Budgethouderschap van te verwijderen persoon ('
|| v_count
|| ' stuks) vervallen.',
'Naam/persoonsnr: ' || v_perslid_naam || '/' || v_perslid_nr);
END IF;
-- *** Vervangers ***
-- koppelingen met vervangers dienen ook verwijderd te worden
SELECT COUNT ( * )
INTO v_count
FROM prs_collega
WHERE prs_perslid_key = p_perslid_key
OR prs_perslid_key_alt = p_perslid_key;
IF (v_count > 0)
THEN
DELETE FROM prs_collega
WHERE prs_perslid_key = p_perslid_key
OR prs_perslid_key_alt = p_perslid_key;
fac.imp_writelog (
p_import_key,
'I',
'Te verwijderen persoon heeft vervanger(s). Koppeling(en) verwijderd.',
'Naam/persoonsnr: ' || v_perslid_naam || '/' || v_perslid_nr);
END IF;
-- *** werkplekken ***
-- per 5.3.2 worden impliciete werkplekken via trigger verwijderd!
DELETE prs_perslidwerkplek
WHERE prs_perslid_key = p_perslid_key;
-- *** Verplichtingen ***
SELECT COUNT ( * )
INTO v_count
FROM prs_v_verplichting_refcheck vp
WHERE vp.prs_perslid_key = p_perslid_key;
IF v_count = 0
THEN
-- Persoon heeft geen enkele (actuele of historische) verplichting
v_errorhint :=
'Verwijderen van persoon met key ' || TO_CHAR (p_perslid_key);
-- Referenties in tabellen naar deze pers_perslid_key moeten eerst verwijderd worden.
-- Door cascade verwijderen van deze record onstaan audits op die tabellen die audit tracking hebben.
-- Daardoor onstaan "ORxA-04091:table VLKC.FAC_AUDIT is mutating, trigger/function may not see it" foutmeldingen
-- op de delete van de prs_perslid_key uit de prs_perslid tabel.
-- De tabellen prs_kostenplaats, prs_kostenplaatsgrp, prs_perslidkostenplaats en fac_gebruikersgroep hebben een prs_perslid_key referentie en audit tracking.
DELETE FROM prs_kostenplaats
WHERE prs_perslid_key = p_perslid_key;
DELETE FROM prs_kostenplaatsgrp
WHERE prs_perslid_key = p_perslid_key;
DELETE FROM prs_perslidkostenplaats
WHERE prs_perslid_key = p_perslid_key;
DELETE FROM fac_gebruikersgroep
WHERE prs_perslid_key = p_perslid_key;
DELETE FROM prs_perslid
WHERE prs_perslid_key = p_perslid_key;
fac.imp_writelog (
p_import_key,
'I',
'Persoon verwijderd.',
'Achternaam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr);
ELSE
-- Controleer of er ACTUELE verplichtingen zijn
SELECT COUNT ( * )
INTO v_count
FROM prs_v_verplichting_keys vp
WHERE vp.prs_perslid_key = p_perslid_key;
IF v_count > 0
THEN
UPDATE prs_perslid
SET prs_perslid_naam =
SUBSTR ('INACTIEF:' || prs_perslid_naam, 1, 60),
prs_perslid_oslogin = NULL,
prs_perslid_oslogin2 = NULL
WHERE prs_perslid_key = p_perslid_key
AND prs_perslid_naam NOT LIKE 'INACTIEF:%';
fac.imp_writelog (
p_import_key,
'I',
'Persoon als INACTIEF gemarkeerd of was al INACTIEF gemarkeerd.',
'Achternaam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr);
ELSE
BEGIN
UPDATE prs_perslid
SET prs_perslid_verwijder = SYSDATE
WHERE prs_perslid_key = p_perslid_key;
fac.imp_writelog (
p_import_key,
'I',
'Persoon ge<67>nactiveerd.',
'Achternaam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr);
EXCEPTION
WHEN OTHERS
THEN
-- Kennelijk heeft de persoon toch ernstige verplichtingen
v_errorhint :=
'Persoon heeft nog (max. '
|| TO_CHAR (v_count)
|| ') verplichtingen. Naam/persoonsnr: '
|| v_perslid_naam
|| '/'
|| v_perslid_nr;
fac.imp_writelog (p_import_key,
'I',
'Inactiveren persoon is niet gelukt',
v_errorhint);
END;
END IF;
END IF;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
v_errormsg :=
'(ORACLE error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_import_key,
'E',
v_errormsg,
v_errorhint);
END;
END delete_perslid;
END prs;
/
REGISTERRUN('$Id$')
#endif // PRS