FCLT#59433 Harder voorkomen dat _FACILITOR wordt verwijderd

svn path=/Database/trunk/; revision=44517
This commit is contained in:
Erik Groener
2019-10-11 11:19:47 +00:00
parent 29fb632ef9
commit 775adce0b0

View File

@@ -123,10 +123,10 @@ BEGIN
THEN
-- Zet de waarde weer terug alsof er niets gewijzigd is.
:new.prs_perslid_oslogin := :old.prs_perslid_oslogin;
:new.prs_perslid_oslogin2 := :new.prs_perslid_oslogin2;
:new.prs_perslid_oslogin2 := :old.prs_perslid_oslogin2;
ELSE
UPDATE_UPPER(prs_perslid_oslogin, prs_perslid_oslogin,prs_perslid);
UPDATE_UPPER(prs_perslid_oslogin2, prs_perslid_oslogin2,prs_perslid);
:new.prs_perslid_oslogin := UPPER(:new.prs_perslid_oslogin);
:new.prs_perslid_oslogin2 := UPPER(:new.prs_perslid_oslogin2);
END IF;
UPDATE_AANMAAKDATUM(prs_perslid, prs_perslid_aanmaak);
-- If this perslid belongs to the primary company of an xd-environment
@@ -150,114 +150,115 @@ BEGIN
NULL; -- persoon hoort niet bij de serviceorganisatie
END;
END IF;
IF ( :new.prs_perslid_verwijder IS NOT NULLDATUM
AND :old.prs_perslid_verwijder IS NULLDATUM
AND ( BITAND(:old.prs_perslid_flags,32) = 32
IF (:new.prs_perslid_verwijder IS NOT NULLDATUM AND :old.prs_perslid_verwijder IS NULLDATUM)
THEN
IF ( BITAND(:old.prs_perslid_flags,32) = 32
OR BITAND(:new.prs_perslid_flags,32) = 32
)
)
THEN
:new.prs_perslid_verwijder := :old.prs_perslid_verwijder;
ELSE
DECLARE
dummy VARCHAR2(1);
BEGIN
-- Niet verwijderen als nog MLD_OPDR's zijn met status 'Uitgegeven' en
-- uitvoerende deze PERSLID.
SELECT 'X'
INTO dummy
FROM mld_opdr MLD_O
WHERE MLD_O.mld_statusopdr_key IN (5, 8)
AND MLD_O.mld_uitvoerende_keys = :new.prs_perslid_key;
APPLICATION_ERROR_GOTO(-20000, 'prs_m085');
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000, 'prs_m085');
END;
THEN
-- Persoon mag niet verwijderd worden omdat flagbit=32 aan staat.
:new.prs_perslid_verwijder := :old.prs_perslid_verwijder;
ELSE
DECLARE
dummy VARCHAR2(1);
BEGIN
-- Niet verwijderen als nog MLD_OPDR's zijn met status 'Uitgegeven' en
-- uitvoerende deze PERSLID.
SELECT 'X'
INTO dummy
FROM mld_opdr MLD_O
WHERE MLD_O.mld_statusopdr_key IN (5, 8)
AND MLD_O.mld_uitvoerende_keys = :new.prs_perslid_key;
APPLICATION_ERROR_GOTO(-20000, 'prs_m085');
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000, 'prs_m085');
END;
DECLARE
dummy VARCHAR2(1);
BEGIN
-- Persoon mag alleen verwijderd worden als deze geen objecten meer in het bezit heeft.
-- Dit geldt alleen voor objecten die 'van de organisatie' zijn, d.i.
-- ins_discipline_min_level <> 3. Deze mocht de gebruiker zelf bijhouden
SELECT 'x'
INTO dummy
FROM ins_v_aanwezigdeel D, ins_tab_discipline DI
WHERE ins_alg_ruimte_type = 'P'
AND ins_alg_ruimte_key = :old.prs_perslid_key
AND DI.ins_discipline_key = D.ins_discipline_key
AND DI.ins_discipline_min_level <> 3;
APPLICATION_ERROR_GOTO(-20000,'prs_m175');
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000,'prs_m175');
END;
DECLARE
dummy VARCHAR2(1);
BEGIN
-- Persoon mag alleen verwijderd worden als deze geen objecten meer in het bezit heeft.
-- Dit geldt alleen voor objecten die 'van de organisatie' zijn, d.i.
-- ins_discipline_min_level <> 3. Deze mocht de gebruiker zelf bijhouden
SELECT 'x'
INTO dummy
FROM ins_v_aanwezigdeel D, ins_tab_discipline DI
WHERE ins_alg_ruimte_type = 'P'
AND ins_alg_ruimte_key = :old.prs_perslid_key
AND DI.ins_discipline_key = D.ins_discipline_key
AND DI.ins_discipline_min_level <> 3;
APPLICATION_ERROR_GOTO(-20000,'prs_m175');
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000,'prs_m175');
END;
-- Hierna kan het verwijderen niet meer falen
BEGIN
-- Ja, je zou zeggen dat dit een zaak is van prs_perslidwerkplek, maar
-- dat is toch niet zo. Bovendien krijg je dan nare mutating trigger errors.
-- Alleen vaste werkplekken, geen flexplekken
IF fac.getsetting ('prs_werkplek_implicit') = 1
THEN
DELETE FROM prs_werkplek
WHERE prs_werkplek_key IN (SELECT prs_werkplek_key
FROM prs_perslidwerkplek
WHERE prs_perslid_key = :old.prs_perslid_key)
AND prs_werkplek_type = 0;
-- Deze delete cascadeert naar de werkplekbezetting door, gooit die dus ook weg
-- Let wel: de werkplekken blijven helaas wel bestaan
ELSE
-- Bij expliciet gooien wij de bezetting weg en blijft de werkplek leeg achter
DELETE FROM prs_perslidwerkplek
WHERE prs_perslid_key = :old.prs_perslid_key;
END IF;
END;
-- Verwijder mandateringen
DELETE FROM prs_perslidkostenplaats
WHERE prs_perslid_key = :old.prs_perslid_key;
-- Hierna kan het verwijderen niet meer falen
BEGIN
-- Ja, je zou zeggen dat dit een zaak is van prs_perslidwerkplek, maar
-- dat is toch niet zo. Bovendien krijg je dan nare mutating trigger errors.
-- Alleen vaste werkplekken, geen flexplekken
IF fac.getsetting ('prs_werkplek_implicit') = 1
THEN
DELETE FROM prs_werkplek
WHERE prs_werkplek_key IN (SELECT prs_werkplek_key
FROM prs_perslidwerkplek
WHERE prs_perslid_key = :old.prs_perslid_key)
AND prs_werkplek_type = 0;
-- Deze delete cascadeert naar de werkplekbezetting door, gooit die dus ook weg
-- Let wel: de werkplekken blijven helaas wel bestaan
ELSE
-- Bij expliciet gooien wij de bezetting weg en blijft de werkplek leeg achter
DELETE FROM prs_perslidwerkplek
WHERE prs_perslid_key = :old.prs_perslid_key;
END IF;
END;
-- Verwijder mandateringen
DELETE FROM prs_perslidkostenplaats
WHERE prs_perslid_key = :old.prs_perslid_key;
-- Verwijder contactpersoon-link
UPDATE prs_contactpersoon
SET prs_perslid_key = NULL
WHERE prs_perslid_key = :old.prs_perslid_key;
-- Verwijder contactpersoon-link
UPDATE prs_contactpersoon
SET prs_perslid_key = NULL
WHERE prs_perslid_key = :old.prs_perslid_key;
-- Verwijder vervangingsregistraties heen en terug
DELETE FROM prs_collega
WHERE prs_perslid_key = :old.prs_perslid_key OR prs_perslid_key_alt = :old.prs_perslid_key;
-- Verwijder vervangingsregistraties heen en terug
DELETE FROM prs_collega
WHERE prs_perslid_key = :old.prs_perslid_key OR prs_perslid_key_alt = :old.prs_perslid_key;
BEGIN
-- Pak mijn autorisaties af
DELETE FROM FAC_GEBRUIKERSGROEP WHERE PRS_PERSLID_KEY = :old.prs_perslid_key;
-- Ook een stukje veiligheid
DELETE FROM fac_session WHERE prs_perslid_key = :old.prs_perslid_key;
DELETE FROM aut_client_perslid WHERE prs_perslid_key = :old.prs_perslid_key;
END;
-- Tenslotte: ruim de objecten die ik zelf mocht beheren op
-- Aandacht: zou nog steeds kunnen dat dit faalt, niet mekkeren, jammer dan
BEGIN
DELETE FROM INS_DEEL WHERE ins_deel_key IN
(SELECT D.ins_deel_key
FROM ins_deel D, ins_tab_discipline DI
WHERE ins_alg_ruimte_type = 'P'
AND ins_alg_ruimte_key = :old.prs_perslid_key
AND DI.ins_discipline_key = D.ins_discipline_key
AND DI.ins_discipline_min_level = 3);
EXCEPTION
WHEN OTHERS THEN NULL;
END;
-- Wis alle authenticatiemogelijkheden
:new.prs_perslid_oslogin := '';
:new.prs_perslid_oslogin2 := '';
:new.prs_perslid_apikey := NULL;
-- And do what prs.setpassword(:new.prs_perslid_key, NULL) would do:
:new.prs_perslid_salt := NULL;
:new.prs_perslid_wachtwoord_hash := NULL;
:new.prs_perslid_wachtwoord_exp := NULL;
:new.prs_perslid_otpsecret := NULL;
-- Wis profiel (dat kan anders nooit opgeruimd worden)
:new.fac_profiel_key := NULL;
BEGIN
-- Pak mijn autorisaties af
DELETE FROM FAC_GEBRUIKERSGROEP WHERE PRS_PERSLID_KEY = :old.prs_perslid_key;
-- Ook een stukje veiligheid
DELETE FROM fac_session WHERE prs_perslid_key = :old.prs_perslid_key;
DELETE FROM aut_client_perslid WHERE prs_perslid_key = :old.prs_perslid_key;
END;
-- Tenslotte: ruim de objecten die ik zelf mocht beheren op
-- Aandacht: zou nog steeds kunnen dat dit faalt, niet mekkeren, jammer dan
BEGIN
DELETE FROM INS_DEEL WHERE ins_deel_key IN
(SELECT D.ins_deel_key
FROM ins_deel D, ins_tab_discipline DI
WHERE ins_alg_ruimte_type = 'P'
AND ins_alg_ruimte_key = :old.prs_perslid_key
AND DI.ins_discipline_key = D.ins_discipline_key
AND DI.ins_discipline_min_level = 3);
EXCEPTION
WHEN OTHERS THEN NULL;
END;
-- Wis alle authenticatiemogelijkheden
:new.prs_perslid_oslogin := '';
:new.prs_perslid_oslogin2 := '';
:new.prs_perslid_apikey := NULL;
-- And do what prs.setpassword(:new.prs_perslid_key, NULL) would do:
:new.prs_perslid_salt := NULL;
:new.prs_perslid_wachtwoord_hash := NULL;
:new.prs_perslid_wachtwoord_exp := NULL;
:new.prs_perslid_otpsecret := NULL;
-- Wis profiel (dat kan anders nooit opgeruimd worden)
:new.fac_profiel_key := NULL;
END IF;
END IF;
IF fac.getsetting ('login_use_email') = 0