#ifdef PRS /* PRS_TRI.SRC * $Revision$ * $Id$ */ #include "alg\algsql.h" CREATE_TRIGGER(prs_t_prs_srtperslid_B_IU) BEFORE INSERT OR UPDATE ON prs_srtperslid FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_srtperslid_key, prs_s_prs_alluitvoerende_keys); UPDATE_UPPER(prs_srtperslid_omschrijving, prs_srtperslid_upper,prs_srtperslid); CHECK_NOG_REFERENCES(prs_perslid, prs_srtperslid_verwijder, prs_v_aanwezigperslid, prs_srtperslid_key, 'prs_m014'); UPDATE_AANMAAKDATUM(prs_srtperslid, prs_srtperslid_aanmaak); // Niet verwijderen als nog MLD_OPDRs zijn met status 'Uitgegeven' en // uitvoerende deze SRTPERSLID. IF :new.prs_srtperslid_verwijder IS NOT NULLDATUM THEN DECLARE dummy CHAR; BEGIN 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_srtperslid_key; APPLICATION_ERROR(-20000, 'prs_m084'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR(-20000, 'prs_m084'); END; END IF; // END; / CREATE_TRIGGER(prs_t_prs_afdeling_B_IU) BEFORE INSERT OR UPDATE ON prs_afdeling FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_afdeling_key, prs_s_prs_afdeling_key); UPDATE_UPPER(prs_afdeling_naam, prs_afdeling_upper,prs_afdeling); CHECK_NOG_REFERENCES(prs_perslid, prs_afdeling_verwijder, prs_v_aanwezigperslid, prs_afdeling_key, 'prs_m015'); UPDATE_AANMAAKDATUM(prs_afdeling, prs_afdeling_aanmaak); CHECK_NOG_REFERENCES(prs_perslid, prs_afdeling_verwijder, prs_v_aanwezigruimteafdeling, prs_afdeling_key, 'SYSTEM ERROR: In Afdeling, er zijn nog PRS_RUIMTEAFDELING-records'); IF :new.prs_afdeling_verwijder IS NOT NULL AND :old.prs_afdeling_verwijder IS NULL THEN DECLARE dummy CHAR; BEGIN SELECT 'X' INTO dummy FROM cnt_v_aanwezigcontract WHERE (cnt_v_aanwezigcontract.cnt_prs_afdeling_key = :old.prs_afdeling_key OR cnt_v_aanwezigcontract.prs_afdeling_key_eig = :old.prs_afdeling_key) AND cnt_v_aanwezigcontract.cnt_contract_looptijd_tot > SYSDATE; APPLICATION_ERROR_GOTO(-20000,'cnt_m022'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000,'cnt_m022'); END; END IF; -- -- Afdeling mag alleen verwijderd worden als deze geen objecten meer in het bezit heeft. -- IF :new.prs_afdeling_verwijder IS NOT NULL AND :old.prs_afdeling_verwijder IS NULL THEN DECLARE dummy VARCHAR2(1); BEGIN SELECT 'x' INTO dummy FROM ins_deel WHERE ins_deel_verwijder IS NULL AND ins_alg_ruimte_type = 'A' AND ins_alg_ruimte_key = :old.prs_afdeling_key; APPLICATION_ERROR_GOTO(-20000,'prs_m173'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000,'prs_m173'); END; END IF; END; / CREATE_TRIGGER(prs_t_prs_afdeling_B_D) BEFORE DELETE ON prs_afdeling FOR EACH ROW BEGIN DELETE FROM prs_kenmerklink KL WHERE KL.prs_link_key=:old.prs_afdeling_key AND KL.prs_kenmerklink_niveau='A'; END; / AUDIT_BEGIN(prs_perslid) IF NOT DELETING THEN AUDIT_VALUE(prs_perslid, prs_perslid_verwijder) END IF; AUDIT_END() CREATE_TRIGGER(prs_t_prs_perslid_B_I) BEFORE INSERT ON prs_perslid FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_perslid_key, prs_s_prs_alluitvoerende_keys); END; / CREATE_TRIGGER(prs_t_prs_perslid_B_IU) BEFORE INSERT OR UPDATE ON prs_perslid FOR EACH ROW BEGIN UPDATE_UPPER(prs_perslid_naam, prs_perslid_upper,prs_perslid); IF (BITAND(:old.prs_perslid_flags,32) = 32 OR BITAND(:new.prs_perslid_flags,32) = 32) THEN IF (:old.prs_perslid_oslogin <> :new.prs_perslid_oslogin) THEN raise_application_error(-20000, 'PRS_M183'); END IF; ELSE :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 -- it gets a default apikey to get synced across the domains IF (:old.prs_afdeling_key IS NULL OR :old.prs_afdeling_key <> :new.prs_afdeling_key) AND fac.getsetting ('xd_primary_bedrijfkey') > 0 THEN DECLARE dummy prs_afdeling.prs_bedrijf_key%TYPE; BEGIN SELECT prs_bedrijf_key INTO dummy FROM prs_v_afdeling WHERE prs_afdeling_key = :new.prs_afdeling_key AND prs_v_afdeling.prs_bedrijf_key = fac.getsetting ('xd_primary_bedrijfkey'); -- 52 lower en uppercase letters*32 is 182 bits equivalent SELECT DBMS_RANDOM.string ('a', 32) INTO :new.prs_perslid_apikey FROM DUAL; EXCEPTION WHEN NO_DATA_FOUND THEN 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) THEN IF ( BITAND(:old.prs_perslid_flags,32) = 32 OR BITAND(:new.prs_perslid_flags,32) = 32 ) 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; -- 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 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; END IF; END IF; IF fac.getsetting ('login_use_email') = 0 AND ( :new.prs_perslid_oslogin IS NULL AND :old.prs_perslid_oslogin IS NOT NULL OR :new.prs_perslid_oslogin2 IS NULL AND :old.prs_perslid_oslogin2 IS NOT NULL OR NVL(:new.prs_perslid_wachtwoord_hash, 'X') <> NVL(:old.prs_perslid_wachtwoord_hash, 'X') ) OR fac.getsetting ('login_use_email') = 1 AND :new.prs_perslid_email IS NULL AND :old.prs_perslid_email IS NOT NULL THEN -- Merk op: anno 5.3.2 wordt een persoon die *nu* is ingelogd hier niet -- automatisch door uitgelogd :new.prs_perslid_credentials_datum := SYSDATE; DELETE FROM fac_session WHERE prs_perslid_key = :new.prs_perslid_key; DELETE FROM aut_client_perslid WHERE prs_perslid_key = :old.prs_perslid_key; END IF; END; / CREATE_TRIGGER(prs_t_prs_perslid_A_IU) AFTER INSERT OR UPDATE ON prs_perslid FOR EACH ROW BEGIN /* * Als echte persoon een login krijgt, dan ook in de default autorisatiegroep als die nog geen rechten had */ IF :new.prs_perslid_verwijder IS NULLDATUM AND :new.prs_perslid_oslogin IS NOT NULL AND :old.prs_perslid_oslogin IS NULL AND SUBSTR(:new.prs_perslid_oslogin, 1, 1) <> '_' THEN BEGIN INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key) SELECT fac_groep_key, :NEW.prs_perslid_key FROM fac_groep WHERE fac_groep_upper = '_DEFAULT' AND NOT EXISTS (SELECT 'x' FROM fac_gebruikersgroep WHERE prs_perslid_key = :NEW.prs_perslid_key); EXCEPTION WHEN OTHERS THEN NULL; END; END IF; END; / CREATE_TRIGGER(prs_t_prs_perslid_B_D) BEFORE DELETE ON prs_perslid FOR EACH ROW BEGIN IF (BITAND(:old.prs_perslid_flags,32) = 32 OR BITAND(:new.prs_perslid_flags,32) = 32) THEN raise_application_error(-20000, 'Delete not allowed'); END IF; DELETE FROM prs_kenmerklink KL WHERE KL.prs_link_key=:old.prs_perslid_key AND KL.prs_kenmerklink_niveau='P'; END; / CREATE_TRIGGER(prs_t_prs_werkplek_B_IU) BEFORE INSERT OR UPDATE ON prs_werkplek FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_werkplek_key, prs_s_prs_werkplek_key); /* werkplek weg = bezetting weg gebeurt via de cascade */ UPDATE_AANMAAKDATUM(prs_werkplek, prs_werkplek_aanmaak); END; / CREATE_TRIGGER(prs_t_prs_werkplek_B_D) BEFORE DELETE ON prs_werkplek FOR EACH ROW BEGIN UPDATE ins_deel SET ins_alg_ruimte_type = 'R', ins_alg_ruimte_key = :old.prs_alg_ruimte_key WHERE ins_deel.ins_alg_ruimte_key = :old.prs_werkplek_key AND ins_deel.ins_alg_ruimte_type = 'W'; UPDATE ins_deel SET ins_alg_ruimte_type_org = 'R', ins_alg_ruimte_key_org = :old.prs_alg_ruimte_key WHERE ins_deel.ins_alg_ruimte_key_org = :old.prs_werkplek_key AND ins_deel.ins_alg_ruimte_type_org = 'W'; END; / CREATE_TRIGGER(prs_t_prs_ruimteafdeling_B_IU) BEFORE INSERT OR UPDATE ON prs_ruimteafdeling FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_ruimteafdeling_key, prs_s_prs_ruimteafdeling_key); END; / CREATE_TRIGGER(prs_t_prs_perslidwerkplek_B_IU) BEFORE INSERT OR UPDATE ON prs_perslidwerkplek FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_perslidwerkplek_key, prs_s_prs_perslidwerkplek_key); UPDATE_AANMAAKDATUM(prs_perslidwerkplek, prs_perslidwerkplek_aanmaak); END; / CREATE_TRIGGER(prs_t_prs_bedrijf_B_I) BEFORE INSERT ON prs_bedrijf FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_bedrijf_key,prs_s_prs_alluitvoerende_keys); UPDATE_AANMAAKDATUM(prs_bedrijf, prs_bedrijf_aanmaak); END; / CREATE_TRIGGER(prs_t_prs_bedrijf_B_IU) BEFORE INSERT OR UPDATE ON prs_bedrijf FOR EACH ROW BEGIN UPDATE_UPPER(prs_bedrijf_naam,prs_bedrijf_naam_upper,prs_bedrijf); SET_VERWIJDER_CHILDREN(prs_srtperslid, prs_bedrijf_key, prs_bedrijf_verwijder, prs_srtperslid_verwijder,prs_bedrijf); // Niet verwijderen als nog MLD_OPDRs zijn met status 'Uitgegeven' en // uitvoerende dit bedrijf IF :new.prs_bedrijf_verwijder IS NOT NULL AND :old.prs_bedrijf_verwijder IS NULL THEN DECLARE dummy CHAR; BEGIN 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_bedrijf_key; APPLICATION_ERROR_GOTO(-20000, 'prs_m086'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000, 'prs_m086'); END; END IF; IF :new.prs_bedrijf_verwijder IS NOT NULL AND :old.prs_bedrijf_verwijder IS NULL THEN DECLARE dummy CHAR; BEGIN SELECT 'x' INTO dummy FROM cnt_v_aanwezigcontract WHERE cnt_v_aanwezigcontract.cnt_prs_bedrijf_key = :old.prs_bedrijf_key AND cnt_v_aanwezigcontract.cnt_contract_looptijd_tot > sysdate; APPLICATION_ERROR_GOTO(-20000,'cnt_m023'); EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN APPLICATION_ERROR_GOTO(-20000,'cnt_m023'); END; END IF; -- Ruim de afhankelijheden op: IF :new.prs_bedrijf_verwijder IS NOT NULL AND :old.prs_bedrijf_verwijder IS NULL THEN UPDATE prs_afdeling SET prs_afdeling_verwijder = :new.prs_bedrijf_verwijder WHERE prs_afdeling_verwijder IS NULL AND prs_bedrijf_key = :old.prs_bedrijf_key; UPDATE prs_contactpersoon SET prs_contactpersoon_verwijder = :new.prs_bedrijf_verwijder WHERE prs_contactpersoon_verwijder IS NULL AND prs_bedrijf_key = :old.prs_bedrijf_key; END IF; END; / CREATE_TRIGGER(prs_t_prs_bedrijf_B_D) BEFORE DELETE ON prs_bedrijf FOR EACH ROW BEGIN DELETE FROM prs_kenmerklink KL WHERE KL.prs_link_key=:old.prs_bedrijf_key AND KL.prs_kenmerklink_niveau='B'; END; / CREATE_TRIGGER(prs_t_prs_bedrijfbedrijf_B_IU) BEFORE INSERT OR UPDATE ON prs_bedrijf_bedrijf FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_bedrijf_bedrijf_key, prs_s_prs_bedrijfbedrijf_key); END; / CREATE_TRIGGER(prs_t_prs_bedrijfadres_B_I) BEFORE INSERT ON prs_bedrijfadres FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_bedrijfadres_key, prs_s_prs_bedrijfadres_key); END; / CREATE_TRIGGER(prs_t_prs_kenmerk_b_iu) BEFORE INSERT OR UPDATE ON prs_kenmerk FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_kenmerk_key, prs_s_prs_kenmerk_key); UPDATE_UPPER(prs_kenmerk_omschrijving, prs_kenmerk_upper,prs_kenmerk); IF (:new.prs_kenmerk_verwijder IS NOT NULL AND :old.prs_kenmerk_verwijder IS NULL AND :new.prs_kenmerk_systeem = 1) THEN APPLICATION_ERROR(-20003, 'ALG_M238'); END IF; IF :new.prs_kenmerk_kenmerktype IN ('C', 'N', 'B') AND :new.prs_kenmerk_lengte IS NULL THEN APPLICATION_ERROR(-20000, 'ALG_C_ALG_KENMERK_LENGTE'); END IF; IF :new.prs_kenmerk_kenmerktype IN ('N', 'B') AND :new.prs_kenmerk_lengte > 20 THEN :new.prs_kenmerk_lengte := 20; END IF; IF :new.prs_kenmerk_kenmerktype IN ('N', 'B') AND :old.prs_kenmerk_key IS NOT NULL THEN -- An existing property of type N IF :old.prs_kenmerk_nmin <> :new.prs_kenmerk_nmin OR (:old.prs_kenmerk_nmin IS NULL AND :new.prs_kenmerk_nmin IS NOT NULL) THEN DECLARE Dummy CHAR; BEGIN SELECT 'X' INTO Dummy FROM prs_kenmerkLink WHERE FAC.SAFE_TO_NUMBER(prs_kenmerkLink_waarde) < :new.prs_kenmerk_nmin AND prs_kenmerk_key = :old.prs_kenmerk_key; IF :new.prs_kenmerk_niveau = 'G' THEN raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MIN_G'); ELSE raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MIN_R'); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN BEGIN IF :new.prs_kenmerk_niveau = 'G' THEN raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MIN_G'); ELSE raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MIN_R'); END IF; END; END; END IF; IF :old.prs_kenmerk_nmax <> :new.prs_kenmerk_nmax OR (:old.prs_kenmerk_nmax IS NULL AND :new.prs_kenmerk_nmax IS NOT NULL) THEN DECLARE Dummy CHAR; BEGIN SELECT 'X' INTO Dummy FROM prs_kenmerkLink WHERE FAC.SAFE_TO_NUMBER(prs_kenmerkLink_waarde) > :new.prs_kenmerk_nmax AND prs_kenmerk_key = :old.prs_kenmerk_key; IF :new.prs_kenmerk_niveau = 'G' THEN raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MAX_G'); ELSE raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MAX_R'); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN TOO_MANY_ROWS THEN BEGIN IF :new.prs_kenmerk_niveau = 'G' THEN raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MAX_G'); ELSE raise_application_error(-20000, 'ALG_C_ALG_KENMERK_MAX_R'); END IF; END; END; END IF; END IF; UPDATE_AANMAAKDATUM(prs_kenmerk, prs_kenmerk_aanmaak); END; / CREATE_TRIGGER(prs_t_prs_kenmerkLink_b_iu) BEFORE INSERT OR UPDATE ON prs_kenmerkLink FOR EACH ROW BEGIN UPDATE_AANMAAKDATUM(prs_kenmerklink, prs_kenmerkLink_aanmaak); /* ** Controleer eerst of de ingevulde waarde goed is. */ IF (:new.prs_kenmerkLink_waarde <> :old.prs_kenmerkLink_waarde OR :old.prs_kenmerkLink_waarde IS NULL OR :new.prs_kenmerkLink_waarde IS NULL) AND :new.prs_link_key IS NOT NULL THEN DECLARE KenmerkOmschr prs_kenmerk.prs_kenmerk_omschrijving%TYPE; KenmerkType prs_kenmerk.prs_kenmerk_kenmerktype%TYPE; KenmerkLengte prs_kenmerk.prs_kenmerk_lengte%TYPE; KenmerkDec prs_kenmerk.prs_kenmerk_dec%TYPE; KenmerkNMin prs_kenmerk.prs_kenmerk_nmin%TYPE; KenmerkNMax prs_kenmerk.prs_kenmerk_nmax%TYPE; NumberWaarde NUMBER(25,5); FormatMask VARCHAR2(60); KenmerkWaarde prs_kenmerklink.prs_kenmerklink_waarde%TYPE; BEGIN KenmerkWaarde := :new.prs_kenmerkLink_waarde; BEGIN DECLARE dummy VARCHAR2(1); BEGIN IF :new.prs_kenmerkLink_niveau = 'P' THEN SELECT 'X' INTO dummy FROM prs_perslid WHERE prs_perslid_key = :new.prs_link_key; ELSIF :new.prs_kenmerkLink_niveau = 'A' THEN SELECT 'X' INTO dummy FROM prs_afdeling WHERE prs_afdeling_key = :new.prs_link_key; ELSIF :new.prs_kenmerkLink_niveau = 'B' THEN SELECT 'X' INTO dummy FROM prs_bedrijf WHERE prs_bedrijf_key = :new.prs_link_key; ELSIF :new.prs_kenmerkLink_niveau = 'C' THEN SELECT 'X' INTO dummy FROM prs_contactpersoon WHERE prs_contactpersoon_key = :new.prs_link_key; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN APPLICATION_ERROR_GOTO(-20000, 'ALG_M015'); END; SELECT prs_kenmerk_omschrijving , prs_kenmerk_kenmerktype , prs_kenmerk_lengte , prs_kenmerk_dec , prs_kenmerk_nmin , prs_kenmerk_nmax INTO KenmerkOmschr , KenmerkType , KenmerkLengte , KenmerkDec , KenmerkNMin , KenmerkNMax FROM prs_kenmerk WHERE prs_kenmerk_key = :new.prs_kenmerk_key; EXCEPTION WHEN NO_DATA_FOUND THEN APPLICATION_ERROR_GOTO(-20000,'INS_R_INS_KENMERK_KEY1'); END; /* Kijk welk KenmerkType gebruikt wordt. ** Aan de hand daarvan moet een controle uitgevoerd worden. **/ IF KenmerkType = 'C' /* ** Char */ THEN /* ** Controleer of de lengte te groot of goed is */ IF LENGTH(KenmerkWaarde) > KenmerkLengte THEN APPLICATION_ERROR_GOTO(-20004, 'ALG_M232,'|| KenmerkOmschr ||',' || TO_CHAR(KenmerkLengte)); END IF; ELSIF KenmerkType IN ('N', 'B') /* ** Number */ THEN /* ** Controleer of er een numerieke waarde ingevuld is */ IF KenmerkDec IS NULL OR KenmerkDec = 0 THEN FormatMask := RPAD('9', KenmerkLengte, '9'); ELSE FormatMask := RPAD('9', KenmerkLengte - KenmerkDec, '9') ||'D'||RPAD('9', KenmerkDec, '9'); END IF; /* ** Controleer of er een numerieke waarde ingevuld is */ BEGIN NumberWaarde := TO_NUMBER(KenmerkWaarde); EXCEPTION WHEN OTHERS THEN FormatMask := REPLACE(FormatMask, '9', '#'); FormatMask := REPLACE(FormatMask, '0', '#'); FormatMask := REPLACE(FormatMask, 'D', '.'); RAISE_APPLICATION_ERROR(-20004,'ALG_M233,'|| KenmerkOmschr ||',' || FormatMask); END; /* ** Controleer of de waarde binnen NMin en NMax ligt */ IF ( (KenmerkNMin IS NOT NULL AND NumberWaarde < KenmerkNMin) OR (KenmerkNMax IS NOT NULL AND NumberWaarde > KenmerkNMax)) THEN APPLICATION_ERROR_GOTO(-20004, 'ALG_M234,'|| KenmerkOmschr ||',' || TO_CHAR(KenmerkNMin)||',' || TO_CHAR(KenmerkNMax)); ELSE /* ** Controleer of de waarde aan het formaat voldoet */ KenmerkWaarde := LTRIM(NUMBER_TO_CHAR(NumberWaarde, FormatMask)); IF INSTR2(KenmerkWaarde, '#') <> 0 THEN FormatMask := REPLACE(FormatMask, '9', '#'); FormatMask := REPLACE(FormatMask, '0', '#'); FormatMask := REPLACE(FormatMask, 'D', '.'); APPLICATION_ERROR_GOTO(-20004,'ALG_M233,'|| KenmerkOmschr ||',' || FormatMask); END IF; END IF; /* ** Zet de geconverteerde waarde terug */ :new.prs_kenmerkLink_waarde := KenmerkWaarde; ELSIF KenmerkType = 'D' /* ** Datum */ THEN KenmerkWaarde := DATE_TO_CHAR(_TO_DATE2(KenmerkWaarde,'DD-MM-YY'),'DD-MM-YYYY'); /* ** Zet de geconverteerde waarde terug */ :new.prs_kenmerkLink_waarde := KenmerkWaarde; END IF; END; UPDATE_PRIMARY_KEY(prs_kenmerkLink_key, prs_s_prs_kenmerkLink_key); END IF; END; / CREATE_TRIGGER(prs_t_prs_collega_B_IU) BEFORE INSERT OR UPDATE ON prs_collega FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_collega_key,prs_s_prs_collega_key); END; / CREATE_TRIGGER(prs_t_prs_contactpersoon_B_IU) BEFORE INSERT OR UPDATE ON prs_contactpersoon FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_contactpersoon_key,prs_s_prs_contactpersoon_key); END; / CREATE_TRIGGER(prs_t_prs_contactpersoon_B_D) BEFORE DELETE ON prs_contactpersoon FOR EACH ROW BEGIN DELETE FROM prs_kenmerklink KL WHERE KL.prs_link_key=:old.prs_contactpersoon_key AND KL.prs_kenmerklink_niveau='C'; END; / CREATE_TRIGGER(prs_t_prs_contactpers_loc_b_iu) BEFORE INSERT OR UPDATE ON prs_contactpersoon_locatie FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_contactpersoon_locatie_key,prs_s_prs_contactpers_loc_key); END; / CREATE_TRIGGER(prs_t_prs_dienst_B_IU) BEFORE INSERT OR UPDATE ON prs_dienst FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_dienst_key,prs_s_prs_dienst_key); END; / CREATE_TRIGGER(prs_t_prs_bedrijfdnstloc_B_IU) BEFORE INSERT OR UPDATE ON prs_bedrijfdienstlocatie FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_bedrijfdienstlocatie_key,prs_s_prs_bedrijfdienstloc_key); END; / AUDIT_BEGIN(prs_kostenplaatsgrp) AUDIT_VALUE(prs_kostenplaatsgrp, prs_kostenplaatsgrp_oms) AUDIT_VALUE(prs_kostenplaatsgrp, prs_kostenplaatsgrp_nr) AUDIT_VALUE(prs_kostenplaatsgrp, prs_perslid_key) AUDIT_VALUE(prs_kostenplaatsgrp, prs_kostenplaatsgrp_fiat2_key) AUDIT_VALUE(prs_kostenplaatsgrp, prs_kostenplaatsgrp_fiat3_key) AUDIT_VALUE(prs_kostenplaatsgrp, prs_kostenplaatsgrp_limiet) AUDIT_VALUE(prs_kostenplaatsgrp, prs_kostenplaatsgrp_limperiode) AUDIT_END() CREATE_TRIGGER(prs_t_prs_kostenplaatsgrp_B_IU) BEFORE INSERT OR UPDATE ON prs_kostenplaatsgrp FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_kostenplaatsgrp_key, prs_s_prs_kostenplaatsgrp_key); END; / AUDIT_BEGIN(prs_kostenplaats) AUDIT_VALUE(prs_kostenplaats, prs_kostenplaats_nr) AUDIT_VALUE(prs_kostenplaats, prs_kostenplaats_module) AUDIT_VALUE(prs_kostenplaats, prs_kostenplaats_omschrijving) AUDIT_VALUE(prs_kostenplaats, prs_perslid_key) AUDIT_VALUE(prs_kostenplaats, prs_kostenplaatsgrp_key) AUDIT_VALUE(prs_kostenplaats, prs_kostenplaats_extern) AUDIT_VALUE(prs_kostenplaats, prs_kostenplaats_fiat) AUDIT_VALUE(prs_kostenplaats, prs_kostenplaats_eind) AUDIT_VALUE(prs_kostenplaats, prs_kostenplaats_limiet) AUDIT_VALUE(prs_kostenplaats, prs_kostenplaats_limietperiode) AUDIT_VALUE(prs_kostenplaats, prs_kostenplaats_verwijder) AUDIT_END() CREATE_TRIGGER(prs_t_prs_kostenplaats_B_IU) BEFORE INSERT OR UPDATE ON prs_kostenplaats FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_kostenplaats_key, prs_s_prs_kostenplaats_key); UPDATE_UPPER(prs_kostenplaats_nr, prs_kostenplaats_upper, prs_kostenplaats); IF :new.prs_kostenplaats_verwijder IS NOT NULL and :old.prs_kostenplaats_verwijder IS NULL THEN DELETE FROM prs_perslidkostenplaats WHERE prs_kostenplaats_key = :new.prs_kostenplaats_key; END IF; END; / AUDIT_BEGIN(prs_kostenplaatsdisc) AUDIT_VALUE(prs_kostenplaatsdisc, prs_kostenplaats_key) AUDIT_VALUE(prs_kostenplaatsdisc, ins_discipline_key) AUDIT_VALUE(prs_kostenplaatsdisc, prs_kostenplaatsdisc_limiet) AUDIT_END() CREATE_TRIGGER(prs_t_prs_kostenpltsdisc_B_IU) BEFORE INSERT OR UPDATE ON prs_kostenplaatsdisc FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_kostenplaatsdisc_key, prs_s_prs_kostenplaatsdisc_key); END; / AUDIT_BEGIN(prs_perslidkostenplaats) AUDIT_VALUE(prs_perslidkostenplaats, prs_perslid_key) AUDIT_VALUE(prs_perslidkostenplaats, prs_kostenplaats_key) AUDIT_VALUE(prs_perslidkostenplaats, prs_perslidkostenplaats_boeken) AUDIT_VALUE(prs_perslidkostenplaats, prs_perslidkostenplaats_inzage) AUDIT_END() CREATE_TRIGGER(prs_t_prs_perslidkp_B_IU) BEFORE INSERT OR UPDATE ON prs_perslidkostenplaats FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_perslidkostenplaats_key, prs_s_prs_perslidkp_key); END; / CREATE_TRIGGER(prs_t_prs_project_B_IU) BEFORE INSERT OR UPDATE ON prs_project FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_project_key, prs_s_prs_project_key); END; / CREATE_TRIGGER(prs_t_prs_kostensoortgrp_B_IU) BEFORE INSERT OR UPDATE ON prs_kostensoortgrp FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_kostensoortgrp_key, prs_s_prs_kostensoortgrp_key); END; / AUDIT_BEGIN(prs_kostensoort) AUDIT_VALUE(prs_kostensoort, prs_kostensoort_oms) AUDIT_VALUE(prs_kostensoort, prs_kostensoort_refcode) AUDIT_VALUE(prs_kostensoort, prs_kostensoort_doorbelasten) AUDIT_VALUE(prs_kostensoort, prs_kostensoort_btw) AUDIT_VALUE(prs_kostensoort, prs_kostenplaats_key) AUDIT_VALUE(prs_kostensoort, prs_kostensoortgrp_key) AUDIT_VALUE(prs_kostensoort, prs_kostensoort_altcode) AUDIT_END() CREATE_TRIGGER(prs_t_prs_kostensoort_B_IU) BEFORE INSERT OR UPDATE ON prs_kostensoort FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_kostensoort_key, prs_s_prs_kostensoort_key); UPDATE_UPPER(prs_kostensoort_oms, prs_kostensoort_upper, prs_kostensoort); END; / AUDIT_BEGIN(prs_kostencombinatie) AUDIT_VALUE(prs_kostencombinatie, prs_kostenplaatsgrp_key) AUDIT_VALUE(prs_kostencombinatie, prs_kostensoort_key) AUDIT_END() CREATE_TRIGGER(prs_t_prs_kostencomb_B_IU) BEFORE INSERT OR UPDATE ON prs_kostencombinatie FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_kostencombinatie_key, prs_s_prs_kostencombinatie_key); END; / CREATE_TRIGGER(prs_t_prs_staffel_B_IU) BEFORE INSERT OR UPDATE ON prs_staffel FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_staffel_key, prs_s_prs_staffel_key); END; / CREATE_TRIGGER(prs_t_prs_perslid_inzet_B_IU) BEFORE INSERT OR UPDATE ON prs_perslid_inzetbaar FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_perslid_inzetbaar_key, prs_s_prs_perslid_inzet_key); END; / CREATE_TRIGGER(prs_t_prs_relatietype_B_IU) BEFORE INSERT OR UPDATE ON prs_relatietype FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_relatietype_key, prs_s_prs_relatietype_key); CHECK_NOG_REFERENCES(prs_relatietype, prs_relatietype_verwijder, prs_v_aanwezigbedrijf, prs_relatietype_key, 'PRS_M182'); END; / CREATE_TRIGGER(prs_t_perslid_tabs_B_I) BEFORE INSERT ON prs_perslid_tabs FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_perslid_tabs_key, prs_s_prs_perslid_tabs_key); END; / CREATE_TRIGGER(prs_t_perslid_cols_B_I) BEFORE INSERT ON prs_perslid_cols FOR EACH ROW BEGIN UPDATE_PRIMARY_KEY(prs_perslid_cols_key, prs_s_prs_perslid_cols_key); END; / REGISTERRUN('$Id$') #endif