Files
Database/RES/RES_TRI.SRC
Peter Feij f412718fd5 RWSN#14758
svn path=/Database/trunk/; revision=10001
2009-03-31 16:01:42 +00:00

896 lines
35 KiB
Plaintext

#ifdef RES
/*
* $Revision: 92 $
* $Modtime: 31-03-09 17:55 $
*/
#include "comsql.h"
CREATE_TRIGGER(res_t_res_disc_params_b_iu)
BEFORE INSERT OR UPDATE ON res_disc_params
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_disc_params_key, res_s_res_disc_params_key);
END;
/
CREATE_TRIGGER(res_t_res_reservering_B_IU)
BEFORE INSERT OR UPDATE ON res_reservering
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_reservering_key, res_s_res_reservering_key);
SET_VERWIJDER_CHILDREN(res_rsv_ruimte, res_reservering_key, res_reservering_verwijder,res_rsv_ruimte_verwijder,res_reservering);
END;
/
CREATE_TRIGGER(res_t_res_ruimte_B_IU)
BEFORE INSERT OR UPDATE ON res_ruimte
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_ruimte_key, res_s_res_ruimte_key);
UPDATE_UPPER(res_ruimte_nr, res_ruimte_upper,res_ruimte);
IF :new.res_ruimte_verwijder IS NOT NULL AND :old.res_ruimte_verwijder IS NULL THEN
DECLARE dummy CHAR;
BEGIN
-- Een res_ruimte mag niet inactief worden als er nog *openstaande* reserveringen zijn...
SELECT 'x' INTO dummy
FROM res_v_aanwezigrsv_ruimte rr, res_ruimte_opstelling ro
WHERE rr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
AND ro.res_ruimte_key = :old.res_ruimte_key
AND rr.res_status_bo_key IN (2,3,4,7);
raise_application_error(-20000,'res_m035');
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
WHEN TOO_MANY_ROWS THEN
raise_application_error(-20000,'res_m035');
END;
-- inactivate corresponding reference(s) to alg_ruimte
BEGIN
UPDATE res_alg_ruimte
SET res_alg_ruimte_verwijder = :new.res_ruimte_verwijder
WHERE res_ruimte_key = :old.res_ruimte_key
AND res_alg_ruimte_verwijder IS NULL;
END;
END IF;
END;
/
CREATE_TRIGGER(res_t_alg_ruimte_B_IU)
BEFORE INSERT OR UPDATE ON res_alg_ruimte
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_alg_ruimte_key, res_s_alg_ruimte_key);
/* Het is niet aan deze tabel om afspraken te controleren */
IF :NEW.alg_ruimte_key <> :OLD.alg_ruimte_key
THEN
UPDATE bez_afspraak ba
SET alg_onrgoed_keys = :NEW.alg_ruimte_key
WHERE ba.res_rsv_ruimte_key IN (
SELECT rrr.res_rsv_ruimte_key
FROM res_rsv_ruimte rrr, res_ruimte_opstelling rro
WHERE rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
AND rro.res_ruimte_key = :NEW.res_ruimte_key)
AND ba.alg_onrgoed_keys = :OLD.alg_ruimte_key;
END IF;
END;
/
CREATE_TRIGGER(res_t_res_opstelling_B_IU)
BEFORE INSERT OR UPDATE ON res_opstelling
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_opstelling_key, res_s_res_opstelling_key);
UPDATE_UPPER(res_opstelling_omschrijving, res_opstelling_upper,res_opstelling);
CHECK_NOG_REFERENCES(res_opstelling, res_opstelling_verwijder, res_ruimte_opstelling,
res_opstelling_key, 'res_m038');
#ifdef MS_SQL
lerror:
#endif
END;
/
CREATE_TRIGGER(res_t_res_ruimte_opstel_B_IU)
BEFORE INSERT OR UPDATE ON res_ruimte_opstelling
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_ruimte_opstel_key, res_s_res_ruimte_opstel_key);
END;
/
CREATE_TRIGGER(res_t_res_deel_B_IU)
BEFORE INSERT OR UPDATE ON res_deel
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_deel_key, res_s_res_deel_key);
UPDATE_AANMAAKDATUM(res_deel, res_deel_aanmaak);
IF :NEW.res_deel_verwijder IS NOT NULL AND :OLD.res_deel_verwijder IS NULL
THEN
DECLARE
dummy NUMBER;
BEGIN
-- Een res_deel mag niet inactief worden als er nog *openstaande* reserveringen zijn.
SELECT ''
INTO dummy
FROM res_v_aanwezigrsv_deel rs
WHERE rs.res_deel_key = :OLD.res_deel_key AND rs.res_status_bo_key IN (2, 3, 4, 7);
raise_application_error (-20000, 'res_m034');
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
WHEN TOO_MANY_ROWS THEN raise_application_error(-20000,'res_m034');
END;
END IF;
#ifdef MS_SQL
lerror:
#endif
END;
/
CREATE_TRIGGER(res_t_res_artikel_B_IU)
BEFORE INSERT OR UPDATE ON res_artikel
FOR EACH ROW
BEGIN
UPDATE_AANMAAKDATUM(res_artikel, res_artikel_aanmaak);
UPDATE_PRIMARY_KEY(res_artikel_key, res_s_res_artikel_key);
IF :new.res_artikel_verwijder IS NOT NULL AND :old.res_artikel_verwijder IS NULL
THEN
DECLARE
lCount NUMBER;
BEGIN
-- Een res_deel mag niet inactief worden als er nog *openstaande* reserveringen zijn...
SELECT COUNT(*)
INTO lCount
FROM res_v_aanwezigrsv_artikel rs
WHERE rs.res_artikel_key = :old.res_artikel_key
AND rs.res_status_bo_key IN (2,3,4,7);
IF lCount > 0 THEN
APPLICATION_ERROR_GOTO(-20000,'res_m033');
END IF;
END;
END IF;
#ifdef MS_SQL
lerror:
#endif
END;
/
CREATE_TRIGGER(res_t_res_rsv_artikel_B_IU)
BEFORE INSERT OR UPDATE ON res_rsv_artikel
FOR EACH ROW
BEGIN
IF :old.res_status_bo_key=6 THEN raise_application_error(-20000, 'Reserveringsgegevens zijn verwerkt; wijzigen is niet meer toegestaan.'); END IF;
UPDATE_PRIMARY_KEY(res_rsv_artikel_key, res_s_res_rsv_artikel_key);
IF :new.res_status_bo_key = 6 AND :old.res_status_bo_key <> 6 AND :new.res_rsv_artikel_verwerkt IS NULL THEN
:new.res_rsv_artikel_verwerkt := SYSDATE;
END IF;
IF UPDATING ('res_rsv_artikel_aantal')
THEN
:new.res_rsv_artikel_mutatie := SYSDATE;
END IF;
END;
/
CREATE_TRIGGER(res_t_res_rsv_deel_B_IU)
BEFORE INSERT OR UPDATE ON res_rsv_deel
FOR EACH ROW
BEGIN
IF :old.res_status_bo_key=6 THEN raise_application_error(-20000, 'Reserveringsgegevens zijn verwerkt; wijzigen is niet meer toegestaan.'); END IF;
UPDATE_PRIMARY_KEY(res_rsv_deel_key, res_s_res_rsv_deel_key);
IF :new.res_status_bo_key = 6 AND :old.res_status_bo_key <> 6 AND :new.res_rsv_deel_verwerkt IS NULL THEN
:new.res_rsv_deel_verwerkt := SYSDATE;
END IF;
IF UPDATING ('res_rsv_deel_aantal') OR UPDATING ('res_rsv_deel_van') OR UPDATING ('res_rsv_deel_tot')
THEN
:new.res_rsv_deel_mutatie := SYSDATE;
END IF;
END;
/
CREATE_TRIGGER(res_t_res_cyclus_B_IU)
BEFORE INSERT OR UPDATE ON res_cyclus
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_cyclus_key, res_s_res_cyclus);
END;
/
CREATE_TRIGGER(res_t_res_activiteit_B_IU)
BEFORE INSERT OR UPDATE ON res_activiteit
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_activiteit_key, res_s_res_activiteit_key);
UPDATE_UPPER(res_activiteit_omschrijving, res_activiteit_upper,res_activiteit);
END;
/
CREATE_TRIGGER(res_t_res_refsrtkenmerk_b_iu)
BEFORE INSERT OR UPDATE ON res_refsrtkenmerk
FOR EACH ROW
DECLARE
ObjectType USER_OBJECTS.OBJECT_TYPE%TYPE;
BEGIN
UPDATE_PRIMARY_KEY(res_refsrtkenmerk_key, res_s_res_refsrtkenmerk_key);
UPDATE_UPPER(res_refsrtkenmerk_omschrijving, res_refsrtkenmerk_upper,res_refsrtkenmerk);
UPDATE_AANMAAKDATUM(res_refsrtkenmerk, res_refsrtkenmerk_aanmaak);
--
-- Controleer of de ingevulde tablenaam, kolomnaam en kolomtxt
-- wel bestaan. Controle moet ook gebeuren als de omschrijving
-- is gewijzigd; de objectnaam is dan hetzelfde.
--
BEGIN
SELECT object_type
INTO ObjectType
FROM USER_OBJECTS
WHERE object_name = UPPER(:new.res_refsrtkenmerk_objectnaam);
EXCEPTION
WHEN NO_DATA_FOUND THEN ObjectType := NULL;
END;
--
IF ObjectType IS NULL
THEN
raise_application_error(-20000, 'res_m244');
ELSIF ObjectType = 'TABLE'
OR ObjectType = 'VIEW'
THEN
-- Bij een TABLE of VIEW staan de kolommen in USER_TAB_COLUMNS
-- Controleer of deze KOLOMNAAM en KOLOMTXT bestaan.
--
DECLARE
Dummy VARCHAR2(30);
BEGIN
SELECT column_name
INTO Dummy
FROM USER_TAB_COLUMNS
WHERE table_name = UPPER(:new.res_refsrtkenmerk_objectnaam)
AND column_name = UPPER(:new.res_refsrtkenmerk_kolomnaam)
AND data_type = 'NUMBER';
EXCEPTION
WHEN NO_DATA_FOUND THEN raise_application_error(-20000, 'res_m245');
END;
--
DECLARE
Dummy VARCHAR2(30);
BEGIN
SELECT column_name
INTO Dummy
FROM USER_TAB_COLUMNS
WHERE table_name = UPPER(:new.res_refsrtkenmerk_objectnaam)
AND column_name = UPPER(:new.res_refsrtkenmerk_kolomtxt)
AND data_type LIKE '%CHAR%';
EXCEPTION
WHEN NO_DATA_FOUND THEN raise_application_error(-20000, 'res_m246');
END;
ELSIF ObjectType <> 'SYNONYM'
THEN
-- Bij een SYNONYM kan er niet gecontroleerd worden
-- of de ingevulde kolommen bestaan.
--
/* NULL;
ELSE */
raise_application_error(-20000, 'res_m244');
END IF;
END;
/
CREATE_TRIGGER(res_t_res_srtkenmerk_b_iu)
BEFORE INSERT OR UPDATE ON res_srtkenmerk
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_srtkenmerk_key, res_s_res_srtkenmerk_key);
UPDATE_UPPER(res_srtkenmerk_omschrijving, res_srtkenmerk_upper,res_srtkenmerk);
UPDATE_AANMAAKDATUM(res_srtkenmerk, res_srtkenmerk_aanmaak);
IF (:new.res_srtkenmerk_verwijder IS NOT NULL AND :old.res_srtkenmerk_verwijder IS NULL AND
:new.res_srtkenmerk_systeem = 1)
THEN
raise_application_error(-20003, 'RES_C_RES_SRTKENMERK_SYSTEEM');
END IF;
--
IF (:new.res_srtkenmerk_kenmerktype = 'C'
OR :new.res_srtkenmerk_kenmerktype = 'N')
AND :new.res_srtkenmerk_lengte IS NULL
THEN
raise_application_error(-20000, 'res_C_res_SRTKENMERK_LENGTE');
END IF;
--
IF :new.res_srtkenmerk_kenmerktype = 'N'
AND :old.res_srtkenmerk_key IS NOT NULL
THEN
IF :old.res_srtkenmerk_nmin <> :new.res_srtkenmerk_nmin
OR (:old.res_srtkenmerk_nmin IS NULL AND :new.res_srtkenmerk_nmin IS NOT NULL)
THEN
DECLARE
Dummy CHAR;
BEGIN
SELECT 'X'
INTO Dummy
FROM res_kenmerkwaarde
WHERE FAC.SAFE_TO_NUMBER(res_kenmerkreservering_waarde) < :new.res_srtkenmerk_nmin
AND res_kenmerk_key IN
(SELECT res_kenmerk_key
FROM res_kenmerk
WHERE res_srtkenmerk_key = :old.res_srtkenmerk_key
);
raise_application_error(-20000, 'res_C_res_SRTKENMERK_MIN');
EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN TOO_MANY_ROWS
THEN raise_application_error(-20000, 'res_C_res_SRTKENMERK_MIN');
END;
END IF;
--
IF :old.res_srtkenmerk_nmax <> :new.res_srtkenmerk_nmax
OR (:old.res_srtkenmerk_nmax IS NULL AND :new.res_srtkenmerk_nmax IS NOT NULL)
THEN
DECLARE
Dummy CHAR;
BEGIN
SELECT 'X'
INTO Dummy
FROM res_kenmerkwaarde
WHERE FAC.SAFE_TO_NUMBER(res_kenmerkreservering_waarde) > :new.res_srtkenmerk_nmax
AND res_kenmerk_key IN
(SELECT res_kenmerk_key
FROM res_kenmerk
WHERE res_srtkenmerk_key = :old.res_srtkenmerk_key
);
raise_application_error(-20000, 'res_C_res_SRTKENMERK_MAX');
EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN TOO_MANY_ROWS
THEN raise_application_error(-20000, 'res_C_res_SRTKENMERK_MAX');
END;
END IF;
END IF;
END;
/
CREATE_TRIGGER(res_t_res_rsv_ruimte_B_IU)
BEFORE INSERT OR UPDATE ON res_rsv_ruimte
FOR EACH ROW
BEGIN
IF :old.res_status_bo_key=6 THEN raise_application_error(-20000, 'Reserveringsgegevens zijn verwerkt; wijzigen is niet meer toegestaan.'); END IF;
UPDATE_PRIMARY_KEY(res_rsv_ruimte_key, res_s_res_rsv_ruimte_key);
BEGIN IF :new.res_rsv_ruimte_verwijder IS NOT NULL OR (:new.res_rsv_ruimte_verwijder IS NULL AND :old.res_rsv_ruimte_verwijder IS NOT NULL) THEN UPDATE res_rsv_artikel SET res_rsv_artikel_verwijder = :new.res_rsv_ruimte_verwijder WHERE res_rsv_artikel.res_rsv_ruimte_key = :new.res_rsv_ruimte_key AND res_rsv_artikel.res_rsv_artikel_verwijder IS NULL; END IF; END;
BEGIN IF :new.res_rsv_ruimte_verwijder IS NOT NULL OR (:new.res_rsv_ruimte_verwijder IS NULL AND :old.res_rsv_ruimte_verwijder IS NOT NULL) THEN UPDATE res_rsv_deel SET res_rsv_deel_verwijder = :new.res_rsv_ruimte_verwijder WHERE res_rsv_deel.res_rsv_ruimte_key = :new.res_rsv_ruimte_key AND res_rsv_deel.res_rsv_deel_verwijder IS NULL; END IF; END;
BEGIN IF :new.res_rsv_ruimte_verwijder IS NOT NULL THEN DELETE FROM bez_afspraak WHERE bez_afspraak.res_rsv_ruimte_key = :new.res_rsv_ruimte_key; END IF; END;
IF :new.res_status_bo_key = 6 AND :old.res_status_bo_key <> 6 AND :new.res_rsv_ruimte_verwerkt IS NULL THEN
:new.res_rsv_ruimte_verwerkt := SYSDATE;
END IF;
BEGIN IF :new.res_rsv_ruimte_host_key <> :old.res_rsv_ruimte_host_key THEN UPDATE bez_afspraak set bez_afspraak_host_key = :new.res_rsv_ruimte_host_key WHERE res_rsv_ruimte_key = :new.res_rsv_ruimte_key AND bez_afspraak_host_key IS NOT NULL; END IF; END;
BEGIN IF :new.res_rsv_ruimte_contact_key <> :old.res_rsv_ruimte_contact_key THEN UPDATE bez_afspraak set bez_afspraak_contact_key= :new.res_rsv_ruimte_contact_key WHERE res_rsv_ruimte_key =:new.res_rsv_ruimte_key; END IF; END;
IF UPDATING ('res_rsv_ruimte_verwijder')
OR UPDATING ('res_ruimte_opstel_key')
OR UPDATING ('alg_ruimte_key')
OR UPDATING ('res_rsv_ruimte_van')
OR UPDATING ('res_rsv_ruimte_tot')
THEN
:new.res_rsv_ruimte_mutatie := SYSDATE;
END IF;
END;
/
CREATE_TRIGGER(res_t_res_kenmerkwaarde_b_iu)
BEFORE INSERT OR UPDATE ON res_kenmerkwaarde
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_kenmerkwaarde_key, res_s_res_kenmerkwaarde_key);
END;
/
CREATE_TRIGGER(res_t_res_kenmerk_b_iu)
BEFORE INSERT OR UPDATE ON res_kenmerk
FOR EACH ROW
BEGIN
-- Een kenmerk mag niet verplicht worden gemaakt als er al
-- waarden ingevuld zijn en hij daarvoor niet verplicht was.
-- Dit is alleen bij wijzigen te controleren, doordat
-- de PrimaryKey niet NULL is.
--
IF :new.res_kenmerk_key IS NOT NULL
AND :new.res_kenmerk_verplicht IS NOT NULL
AND :old.res_kenmerk_verplicht IS NULL
THEN
DECLARE
Dummy CHAR;
BEGIN
SELECT 'X'
INTO Dummy
FROM res_kenmerkwaarde
WHERE res_kenmerk_key = :new.res_kenmerk_key;
raise_application_error(-20004, 'RES_C_RES_KENMERK_VERPLICHT0');
EXCEPTION
WHEN NO_DATA_FOUND
THEN NULL;
WHEN TOO_MANY_ROWS
THEN raise_application_error(-20004, 'RES_C_RES_KENMERK_VERPLICHT0');
END;
END IF;
--
UPDATE_PRIMARY_KEY(res_kenmerk_key, res_s_res_kenmerk_key);
UPDATE_AANMAAKDATUM(res_kenmerk, res_kenmerk_aanmaak);
END;
/
CREATE_TRIGGER(res_t_res_srtartikel_og_B_IU)
BEFORE INSERT OR UPDATE ON res_srtartikel_onrgoed
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_srtartikel_onrgoed_key, res_s_res_srtartikel_og_key);
END;
/
CREATE_TRIGGER(res_t_notificatie_res_reserv)
AFTER DELETE
ON res_reservering
FOR EACH ROW
BEGIN
fac.clrnotifications ('RES%', :OLD.res_reservering_key);
END;
/
CREATE_TRIGGER(res_t_notificatie_rsv_ruimte)
AFTER INSERT OR UPDATE
ON res_rsv_ruimte
FOR EACH ROW
BEGIN
-- Proc+edure to create a notification to the enduser that requested the reservation
-- pReceiver is optional, if it's null we'll look for the receiver ourself.
-- Note that since 4.70 most info is at res_rsv_ruimte level, not res_reservering
-- Sometimes we delete previous notifications first
DECLARE
soms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
scode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
lomschrijving res_rsv_ruimte.res_rsv_ruimte_omschrijving%TYPE;
lstatuswijziging BOOLEAN;
sgroep BOOLEAN; -- bepaalt of res_key of rsv_ruimte_key als parameter moet
lrefkey res_reservering.res_reservering_key%TYPE;
lxrefkey res_rsv_ruimte.res_rsv_ruimte_key%TYPE;
skey VARCHAR2 (30);
lnotify res_disc_params.res_disc_params_notify%TYPE;
lsender fac_notificatie.fac_notificatie_sender_email%TYPE;
BEGIN
lstatuswijziging := FALSE;
IF (:NEW.res_ruimte_opstel_key IS NULL AND :NEW.alg_ruimte_key IS NULL)
THEN
-- Een reservering zonder plaats is (nog) geen reservering!
scode := NULL;
ELSIF (:OLD.res_ruimte_opstel_key IS NULL AND :NEW.res_ruimte_opstel_key IS NOT NULL)
OR (:OLD.alg_ruimte_key IS NULL AND :NEW.alg_ruimte_key IS NOT NULL)
THEN
-- Een reservering is nieuwe als plaats bekend is gemaakt
scode := 'RESNEW';
sgroep := TRUE;
ELSIF :NEW.res_status_bo_key = 5 AND :OLD.res_status_bo_key <> 5
THEN
scode := 'RESAFM';
sgroep := FALSE;
ELSIF :NEW.res_status_bo_key = 6 AND :OLD.res_status_bo_key <> 6
THEN
scode := 'RESVER';
sgroep := FALSE;
ELSIF :NEW.res_rsv_ruimte_verwijder IS NOT NULL AND :OLD.res_rsv_ruimte_verwijder IS NULL
THEN
scode := 'RESDEL';
sgroep := FALSE;
ELSIF :NEW.res_rsv_ruimte_verwijder IS NULL
THEN
-- Alleen mekkeren over FO-statuswijzigingen als deze niet verwijderd is/wordt
IF :NEW.res_status_fo_key = 1 AND :OLD.res_status_fo_key <> 1
THEN
scode := 'RESOPT';
lstatuswijziging := TRUE;
sgroep := FALSE;
ELSIF :NEW.res_status_fo_key = 2 AND :OLD.res_status_fo_key <> 2
THEN
scode := 'RESBEV';
lstatuswijziging := TRUE;
sgroep := FALSE;
ELSIF :NEW.res_status_fo_key = 4 AND :OLD.res_status_fo_key <> 4
THEN
scode := 'RESDEL';
lstatuswijziging := TRUE;
sgroep := FALSE;
ELSIF :NEW.res_ruimte_opstel_key <> :OLD.res_ruimte_opstel_key
OR :NEW.res_rsv_ruimte_van <> :OLD.res_rsv_ruimte_van
OR :NEW.res_rsv_ruimte_tot <> :OLD.res_rsv_ruimte_tot
OR :NEW.res_activiteit_key <> :OLD.res_activiteit_key
OR :NEW.res_rsv_ruimte_bezoekers <> :OLD.res_rsv_ruimte_bezoekers
THEN
scode := 'RESUPD';
sgroep := TRUE;
END IF;
END IF;
lrefkey := :NEW.res_reservering_key;
IF sgroep
THEN
lxrefkey := NULL;
ELSE
lxrefkey := :NEW.res_rsv_ruimte_key;
END IF;
-- tricky: asp doet eerst halve insert en dan update van de rest. Bij de update is pas de opstelling bekend.
lnotify := NULL;
IF :new.res_ruimte_opstel_key IS NOT NULL
THEN
SELECT res_disc_params_notify
INTO lnotify
FROM res_disc_params rdp, res_ruimte rr, res_ruimte_opstelling rro
WHERE rro.res_ruimte_key = rr.res_ruimte_key
AND rr.res_discipline_key = rdp.res_ins_discipline_key
AND rro.res_ruimte_opstel_key = :new.res_ruimte_opstel_key;
END IF;
IF scode IS NOT NULL AND lnotify = 1
THEN
BEGIN
SELECT sn.fac_srtnotificatie_oms
INTO soms
FROM fac_srtnotificatie sn
WHERE sn.fac_srtnotificatie_code = scode AND sn.fac_srtnotificatie_mode > 0;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Nothing to do
RETURN;
END;
-- We support substitution of placeholders in the messages
-- ##DESC## = res_rsv_ruimte_omschrijving
-- ##KEY## = res_reservering_key
IF INSTR2(soms, '#') > 0
THEN
IF sgroep
THEN
skey := :NEW.res_reservering_key;
ELSE
skey := :NEW.res_reservering_key || '/' || :NEW.res_rsv_ruimte_volgnr;
END IF;
soms := REPLACE (REPLACE (soms, '##DESC##', :NEW.res_rsv_ruimte_omschrijving), '##KEY##', skey);
END IF;
-- Stuur notificatie naar de aanvrager
IF lstatuswijziging
THEN
-- eventuele voorgaande statuswijzigingen wissen
fac.clrnotifications ('RESOPT', lrefkey);
fac.clrnotifications ('RESDEL', lrefkey);
fac.clrnotifications ('RESBEV', lrefkey);
END IF;
BEGIN
-- Bepaal afzender, afhankelijk van catalogus (als res_ruimte) of anders de locatie
IF :NEW.res_ruimte_opstel_key IS NOT NULL
THEN
SELECT COALESCE (MAX (d.ins_discipline_email), MAX (l.alg_locatie_email))
INTO lsender
FROM res_ruimte_opstelling ro,
res_ruimte rr,
res_alg_ruimte rag,
alg_ruimte r,
alg_verdieping v,
alg_gebouw g,
alg_locatie l,
ins_tab_discipline d
WHERE l.alg_locatie_key = g.alg_locatie_key
AND g.alg_gebouw_key = v.alg_gebouw_key
AND r.alg_verdieping_key = v.alg_verdieping_key
AND r.alg_ruimte_key = rag.alg_ruimte_key
AND rag.res_ruimte_key = rr.res_ruimte_key
AND d.ins_discipline_key = rr.res_discipline_key
AND rr.res_ruimte_key = ro.res_ruimte_key
AND ro.res_ruimte_opstel_key = :NEW.res_ruimte_opstel_key;
ELSIF :NEW.alg_ruimte_key IS NOT NULL
THEN
SELECT MAX (l.alg_locatie_email)
INTO lsender
FROM alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
WHERE l.alg_locatie_key = g.alg_locatie_key
AND g.alg_gebouw_key = v.alg_gebouw_key
AND r.alg_verdieping_key = v.alg_verdieping_key
AND r.alg_ruimte_key = :NEW.alg_ruimte_key;
ELSE
lsender := NULL;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
lsender := NULL;
END;
fac.clrnotifications (scode, :NEW.res_reservering_key);
fac.putnotificationsrtprio (NULL, :NEW.res_rsv_ruimte_contact_key, scode, lrefkey, soms, NULL, NULL, NULL, lxrefkey, 2, lsender);
END IF;
END;
END;
/
CREATE_TRIGGER(res_t_notificatie_rsv_deel)
AFTER INSERT OR UPDATE OR DELETE
ON res_rsv_deel
FOR EACH ROW
BEGIN
-- Only 1 message is visible to that user. If new events occur that would issue a
-- new notification, the old message is deleted first.
-- Note that since 4.70 most info is at res_rsv_ruimte level, not res_reservering
DECLARE
soms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
scode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
lomschrijving res_rsv_ruimte.res_rsv_ruimte_omschrijving%TYPE;
lreskey res_rsv_ruimte.res_reservering_key%TYPE;
lresrsvruimteomschrijving res_rsv_ruimte.res_rsv_ruimte_omschrijving%TYPE;
lresrsvruimtecontactkey res_rsv_ruimte.res_rsv_ruimte_contact_key%TYPE;
lresrsvruimtekey res_rsv_ruimte.res_rsv_ruimte_key%TYPE;
lnotify res_disc_params.res_disc_params_notify%TYPE;
lresruimteopstelkey res_rsv_ruimte.res_ruimte_opstel_key%TYPE;
lalgruimtekey res_rsv_ruimte.alg_ruimte_key%TYPE;
lsender fac_notificatie.fac_notificatie_sender_email%TYPE;
BEGIN
lresrsvruimtekey := NVL(:new.res_rsv_ruimte_key, :old.res_rsv_ruimte_key);
IF lresrsvruimtekey IS NULL
THEN
-- parkeerplaats
RETURN;
END IF;
-- scode := 'RESNEW'; parent heeft deze voor losse voorziening niet genotificeerd
-- scode := 'RESAFM'; veronderstellen we ook hooguit interessant indien dat op hoger niveau gebeurt
-- scode := 'RESVER'; veronderstellen we ook hooguit interessant indien dat op hoger niveau gebeurt
-- scode := 'RESBEV'; hoeft nooit genotificeerd te worden, daarvoor heeft een parent altijd al gezorgd
-- scode := 'RESDEL'; hoeft nooit genotificeerd te worden, daarvoor heeft een parent altijd al gezorgd
IF (:new.res_deel_key IS NOT NULL AND :old.res_deel_key IS NULL)
THEN
-- insert
scode := 'RESNEW';
ELSIF (:new.res_rsv_deel_van <> :OLD.res_rsv_deel_van)
OR (:new.res_rsv_deel_tot <> :OLD.res_rsv_deel_tot)
OR (:new.res_rsv_deel_verwijder IS NOT NULL AND :OLD.res_rsv_deel_verwijder IS NULL)
OR :new.res_rsv_deel_key IS NULL
THEN
-- nb: een echte delete notificeren we dus niet echt; komt deze voor?
scode := 'RESUPD';
END IF;
lnotify := NULL;
IF :new.res_deel_key IS NOT NULL
THEN
SELECT res_disc_params_notify
INTO lnotify
FROM res_disc_params rdp, res_deel rd
WHERE rd.res_discipline_key = rdp.res_ins_discipline_key
AND rd.res_deel_key = :new.res_deel_key;
END IF;
IF scode IS NOT NULL AND lnotify = 1
THEN
BEGIN
SELECT sn.fac_srtnotificatie_oms
INTO soms
FROM fac_srtnotificatie sn
WHERE sn.fac_srtnotificatie_code = scode AND sn.fac_srtnotificatie_mode > 0;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Nothing to do
RETURN;
END;
BEGIN
SELECT res_reservering_key, res_rsv_ruimte_omschrijving, res_rsv_ruimte_contact_key, res_ruimte_opstel_key, alg_ruimte_key
INTO lreskey, lresrsvruimteomschrijving, lresrsvruimtecontactkey, lresruimteopstelkey, lalgruimtekey
FROM res_rsv_ruimte
WHERE res_rsv_ruimte_key = lresrsvruimtekey;
EXCEPTION
WHEN OTHERS
THEN
-- vangnet: liever geen notificatie dan geen updates
-- waarschijnlijk een 4091: dan komt deze trigger via een update van de parent
-- Dan notificeert die zelf wel.
RETURN;
END;
-- We support substitution of placeholders in the messages
-- ##DESC## = res_rsv_ruimte_omschrijving
-- ##KEY## = res_reservering_key
IF INSTR2(soms, '#') > 0
THEN
soms := REPLACE (REPLACE (soms, '##DESC##', lresrsvruimteomschrijving), '##KEY##', lreskey);
END IF;
-- Bepaal afzender, afhankelijk van catalogus of anders de locatie
BEGIN
SELECT ins_discipline_email
INTO lsender
FROM ins_tab_discipline d, res_deel r
WHERE d.ins_discipline_key = r.res_discipline_key AND r.res_deel_key = :NEW.res_deel_key;
IF lsender IS NULL
THEN
IF lresruimteopstelkey IS NOT NULL
THEN
SELECT MAX (l.alg_locatie_email)
INTO lsender
FROM res_ruimte_opstelling ro,
res_ruimte rr,
res_alg_ruimte rag,
alg_ruimte r,
alg_verdieping v,
alg_gebouw g,
alg_locatie l
WHERE l.alg_locatie_key = g.alg_locatie_key
AND g.alg_gebouw_key = v.alg_gebouw_key
AND r.alg_verdieping_key = v.alg_verdieping_key
AND r.alg_ruimte_key = rag.alg_ruimte_key
AND rag.res_ruimte_key = rr.res_ruimte_key
AND rr.res_ruimte_key = ro.res_ruimte_key
AND ro.res_ruimte_opstel_key = lresruimteopstelkey;
ELSIF lalgruimtekey IS NOT NULL
THEN
SELECT MAX (l.alg_locatie_email)
INTO lsender
FROM alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
WHERE l.alg_locatie_key = g.alg_locatie_key
AND g.alg_gebouw_key = v.alg_gebouw_key
AND r.alg_verdieping_key = v.alg_verdieping_key
AND r.alg_ruimte_key = lalgruimtekey;
END IF;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
lsender := NULL;
END;
fac.clrnotifications (scode, lreskey);
fac.putnotificationsrtprio (NULL, lresrsvruimtecontactkey, scode, lreskey, soms, NULL, NULL, NULL, NULL, 2, lsender);
END IF;
END;
END;
/
CREATE_TRIGGER(res_t_notificatie_rsv_artikel)
AFTER INSERT OR UPDATE OR DELETE
ON res_rsv_artikel
FOR EACH ROW
BEGIN
-- Only 1 message is visible to that user. If new events occur that would issue a
-- new notification, the old message is deleted first.
-- Note that since 4.70 most info is at res_rsv_ruimte level, not res_reservering
DECLARE
soms fac_srtnotificatie.fac_srtnotificatie_oms%TYPE;
scode fac_srtnotificatie.fac_srtnotificatie_code%TYPE;
lomschrijving res_rsv_ruimte.res_rsv_ruimte_omschrijving%TYPE;
lreskey res_rsv_ruimte.res_reservering_key%TYPE;
lresrsvruimteomschrijving res_rsv_ruimte.res_rsv_ruimte_omschrijving%TYPE;
lresrsvruimtecontactkey res_rsv_ruimte.res_rsv_ruimte_contact_key%TYPE;
lresrsvruimtekey res_rsv_ruimte.res_rsv_ruimte_key%TYPE;
lnotify res_disc_params.res_disc_params_notify%TYPE;
lresruimteopstelkey res_rsv_ruimte.res_ruimte_opstel_key%TYPE;
lalgruimtekey res_rsv_ruimte.alg_ruimte_key%TYPE;
lsender fac_notificatie.fac_notificatie_sender_email%TYPE;
BEGIN
lresrsvruimtekey := NVL (:NEW.res_rsv_ruimte_key, :OLD.res_rsv_ruimte_key);
-- scode := 'RESNEW'; parent heeft deze voor losse catering niet genotificeerd
-- scode := 'RESAFM'; veronderstellen we ook hooguit interessant indien dat op hoger niveau gebeurt
-- scode := 'RESVER'; veronderstellen we ook hooguit interessant indien dat op hoger niveau gebeurt
-- scode := 'RESBEV'; hoeft nooit genotificeerd te worden, daarvoor heeft een parent altijd al gezorgd
-- scode := 'RESDEL'; hoeft nooit genotificeerd te worden, daarvoor heeft een parent altijd al gezorgd
IF (:new.res_artikel_key IS NOT NULL AND :old.res_artikel_key IS NULL)
THEN
-- insert
scode := 'RESNEW';
ELSIF :OLD.res_rsv_artikel_aantal IS NULL
OR :new.res_rsv_artikel_aantal <> :OLD.res_rsv_artikel_aantal
OR (:new.res_rsv_artikel_levering IS NOT NULL AND :OLD.res_rsv_artikel_levering IS NULL)
OR (:new.res_rsv_artikel_verwijder IS NOT NULL AND :OLD.res_rsv_artikel_verwijder IS NULL)
OR :new.res_rsv_artikel_key IS NULL --was deleted
THEN
-- nb: een echte delete notificeren we dus niet echt als delete
scode := 'RESUPD';
END IF;
lnotify := NULL;
IF :new.res_artikel_key IS NOT NULL
THEN
SELECT res_disc_params_notify
INTO lnotify
FROM res_disc_params rdp, res_artikel ra
WHERE ra.res_discipline_key = rdp.res_ins_discipline_key
AND ra.res_artikel_key = :new.res_artikel_key;
END IF;
IF scode IS NOT NULL AND lnotify = 1
THEN
BEGIN
SELECT sn.fac_srtnotificatie_oms
INTO soms
FROM fac_srtnotificatie sn
WHERE sn.fac_srtnotificatie_code = scode AND sn.fac_srtnotificatie_mode > 0;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Nothing to do
RETURN;
END;
BEGIN
SELECT res_reservering_key, res_rsv_ruimte_omschrijving, res_rsv_ruimte_contact_key, res_ruimte_opstel_key, alg_ruimte_key
INTO lreskey, lresrsvruimteomschrijving, lresrsvruimtecontactkey, lresruimteopstelkey, lalgruimtekey
FROM res_rsv_ruimte
WHERE res_rsv_ruimte_key = lresrsvruimtekey;
EXCEPTION
WHEN OTHERS
THEN
-- vangnet: liever geen notificatie dan geen updates
-- waarschijnlijk een 4091: dan komt deze trigger via een update van de parent
-- Dan notificeert die zelf wel.
RETURN;
END;
-- We support substitution of placeholders in the messages
-- ##DESC## = res_rsv_ruimte_omschrijving
-- ##KEY## = res_reservering_key
IF INSTR2(soms, '#') > 0
THEN
soms := REPLACE (REPLACE (soms, '##DESC##', lresrsvruimteomschrijving), '##KEY##', lreskey);
END IF;
-- Bepaal afzender, afhankelijk van catalogus of anders de locatie
BEGIN
SELECT ins_discipline_email
INTO lsender
FROM ins_tab_discipline d, res_artikel a
WHERE d.ins_discipline_key = a.res_discipline_key AND a.res_artikel_key = :NEW.res_artikel_key;
IF lsender IS NULL
THEN
IF lresruimteopstelkey IS NOT NULL
THEN
SELECT MAX (l.alg_locatie_email)
INTO lsender
FROM res_ruimte_opstelling ro,
res_ruimte rr,
res_alg_ruimte rag,
alg_ruimte r,
alg_verdieping v,
alg_gebouw g,
alg_locatie l
WHERE l.alg_locatie_key = g.alg_locatie_key
AND g.alg_gebouw_key = v.alg_gebouw_key
AND r.alg_verdieping_key = v.alg_verdieping_key
AND r.alg_ruimte_key = rag.alg_ruimte_key
AND rag.res_ruimte_key = rr.res_ruimte_key
AND rr.res_ruimte_key = ro.res_ruimte_key
AND ro.res_ruimte_opstel_key = lresruimteopstelkey;
ELSIF lalgruimtekey IS NOT NULL
THEN
SELECT MAX (l.alg_locatie_email)
INTO lsender
FROM alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
WHERE l.alg_locatie_key = g.alg_locatie_key
AND g.alg_gebouw_key = v.alg_gebouw_key
AND r.alg_verdieping_key = v.alg_verdieping_key
AND r.alg_ruimte_key = lalgruimtekey;
END IF;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
lsender := NULL;
END;
fac.clrnotifications (scode, lreskey);
fac.putnotificationsrtprio (NULL, lresrsvruimtecontactkey, scode, lreskey, soms, NULL, NULL, NULL, NULL, 2, lsender);
END IF;
END;
END;
/
CREATE_TRIGGER(res_t_res_activiteitdisc_B_IU)
BEFORE INSERT OR UPDATE ON res_activiteitdiscipline
FOR EACH ROW
BEGIN
UPDATE_PRIMARY_KEY(res_activiteitdiscipline_key, res_s_res_activiteitdisc_key);
END;
/
#endif // RES