/* ALG_TRI.SRC
 * $Revision$
 * $Id$
 */

#include    "alg\algsql.h"

CREATE_TRIGGER(alg_t_alg_import_B_IU)
BEFORE INSERT OR UPDATE ON alg_import
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(alg_import_key, alg_s_alg_import_key);
END;
/

CREATE_TRIGGER(alg_t_alg_regio_B_IU)
BEFORE INSERT OR UPDATE ON alg_regio
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(alg_regio_key, alg_s_alg_regio_key);
    UPDATE_UPPER(alg_regio_omschrijving, alg_regio_upper,alg_regio);
    CHECK_NOG_REFERENCES(alg_regio, alg_regio_verwijder, alg_v_aanwezigdistrict,
                         alg_regio_key, 'alg_m211');
    UPDATE_AANMAAKDATUM(alg_regio, alg_regio_aanmaak);
END;
/

CREATE_TRIGGER(alg_t_alg_district_B_IU)
BEFORE INSERT OR UPDATE ON alg_district
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(alg_district_key, alg_s_alg_district_key);
    UPDATE_UPPER(alg_district_omschrijving, alg_district_upper,alg_district);
    CHECK_NOG_REFERENCES(alg_district, alg_district_verwijder, alg_v_aanweziglocatie,
                         alg_district_key, 'alg_m212');
    UPDATE_AANMAAKDATUM(alg_district, alg_district_aanmaak);
END;
/

CREATE_TRIGGER(alg_t_alg_locatie_B_IU)
BEFORE INSERT OR UPDATE ON alg_locatie
FOR EACH ROW
BEGIN
    -- LET OP : Deze trigger is ook gedefinieerd in ALG !!
    UPDATE_PRIMARY_KEY(alg_locatie_key, alg_s_alg_locatie_key);
    UPDATE_UPPER(alg_locatie_code, alg_locatie_code,alg_locatie);
    UPDATE_UPPER(alg_locatie_omschrijving, alg_locatie_upper,alg_locatie);
    CHECK_NOG_REFERENCES(alg_locatie, alg_locatie_verwijder, alg_v_aanweziggebouw,
                         alg_locatie_key, 'alg_m213');
    CHECK_NOG_REFERENCES(alg_locatie, alg_locatie_verwijder, alg_v_aanwezigterreinsector,
                         alg_locatie_key, 'alg_m214');
    UPDATE_AANMAAKDATUM(alg_locatie, alg_locatie_aanmaak);

    IF :new.alg_locatie_verwijder IS NOT NULL AND :old.alg_locatie_verwijder IS NULL THEN
      DECLARE
        dummy CHAR;
      BEGIN
        SELECT 'x'
        INTO   dummy
        FROM   cnt_v_aanwezigcontract_plaats, cnt_v_aanwezigcontract
        WHERE  cnt_v_aanwezigcontract_plaats.cnt_contract_key = cnt_v_aanwezigcontract.cnt_contract_key
        AND    cnt_v_aanwezigcontract.cnt_contract_looptijd_tot > sysdate
        AND    cnt_v_aanwezigcontract_plaats.cnt_alg_plaats_key  = :old.alg_locatie_key
        AND    cnt_v_aanwezigcontract_plaats.cnt_alg_plaats_code = 'L';
        raise_application_error(-20000,'cnt_m028');
      EXCEPTION
        WHEN NO_DATA_FOUND THEN NULL;
        WHEN TOO_MANY_ROWS THEN raise_application_error(-20000,'cnt_m028');
      END;

      DECLARE
         dummy CHAR;
      BEGIN
        SELECT 'x'
        INTO dummy
        FROM  mld_melding
        WHERE mld_alg_locatie_key=:old.alg_locatie_key
          AND fac_activiteit_key IS NULL
          AND mld_melding_status IN (0,2,3,4,7);
        raise_application_error(-20001, 'alg_m999 Locatie kan nog niet verwijderd worden. Er zijn nog lopende meldingen');
      EXCEPTION
          WHEN NO_DATA_FOUND THEN NULL;
          WHEN TOO_MANY_ROWS THEN raise_application_error(-20001,'alg_m999 Locatie kan nog niet verwijderd worden. Er zijn nog lopende meldingen');
      END;

      DELETE FROM cad_tekening WHERE alg_locatie_key=:old.alg_locatie_key;
    END IF;

END;
/

CREATE_TRIGGER(alg_t_alg_terreinsector_B_IU)
BEFORE INSERT OR UPDATE ON alg_terreinsector
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(alg_terreinsector_key, alg_s_alg_onroerendgoed_keys);
    UPDATE_UPPER(alg_terreinsector_code,alg_terreinsector_upper,alg_terreinsector);
    UPDATE_AANMAAKDATUM(alg_terreinsector, alg_terreinsector_aanmaak);
    SET_VERWIJDER_CHILDREN_DEELT(ins_deel, alg_terreinsector_key, alg_terreinsector_verwijder, NULL,
                        ins_deel_verwijder, ins_alg_ruimte_key, NULL);
    IF :new.alg_terreinsector_verwijder IS NOT NULL AND :old.alg_terreinsector_verwijder IS NULL THEN
      DECLARE
        dummy CHAR;
      BEGIN
          SELECT 'x'
          INTO   dummy
          FROM   cnt_v_aanwezigcontract_plaats, cnt_v_aanwezigcontract
         WHERE  cnt_v_aanwezigcontract_plaats.cnt_contract_key = cnt_v_aanwezigcontract.cnt_contract_key
           AND  cnt_v_aanwezigcontract.cnt_contract_looptijd_tot > sysdate
           AND  cnt_v_aanwezigcontract_plaats.cnt_alg_plaats_key  = :old.alg_terreinsector_key
           AND  cnt_v_aanwezigcontract_plaats.cnt_alg_plaats_code = 'T';
          raise_application_error(-20000,'cnt_m027');
      EXCEPTION
        WHEN NO_DATA_FOUND THEN NULL;
        WHEN TOO_MANY_ROWS THEN raise_application_error(-20000,'cnt_m027');
      END;
      DECLARE
        dummy CHAR;
      BEGIN
        SELECT 'x'
        INTO dummy
        FROM  mld_melding
        WHERE mld_alg_onroerendgoed_keys=:old.alg_terreinsector_key
          AND fac_activiteit_key IS NULL
          AND mld_melding_status IN (0,2,3,4,7);
        raise_application_error(-20001, 'alg_m999 Terrein kan nog niet verwijderd worden. Er zijn nog lopende meldingen');
      EXCEPTION
        WHEN NO_DATA_FOUND THEN NULL;
        WHEN TOO_MANY_ROWS THEN raise_application_error(-20001, 'alg_m999 Terrein kan nog niet verwijderd worden. Er zijn nog lopende meldingen');
      END;
      /* Terrein kent geen bezoekers */
    END IF;
END;
/

CREATE_TRIGGER(alg_t_alg_srtgebouw_B_IU)
BEFORE INSERT OR UPDATE ON alg_srtgebouw
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(alg_srtgebouw_key, alg_s_alg_srtgebouw_key);
    UPDATE_UPPER(alg_srtgebouw_omschrijving, alg_srtgebouw_upper,alg_srtgebouw);
    CHECK_NOG_REFERENCES(alg_srtgebouw, alg_srtgebouw_verwijder,
                alg_v_aanweziggebouw, alg_srtgebouw_key, 'alg_m022');
    UPDATE_AANMAAKDATUM(alg_srtgebouw, alg_srtgebouw_aanmaak);
END;
/

CREATE_TRIGGER(alg_t_alg_gebouw_B_IU)
BEFORE INSERT OR UPDATE ON alg_gebouw
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(alg_gebouw_key, alg_s_alg_onroerendgoed_keys);
    UPDATE_UPPER(alg_gebouw_code, alg_gebouw_upper,alg_gebouw);
    UPDATE_AANMAAKDATUM(alg_gebouw, alg_gebouw_aanmaak);
    LAAT_VERDIEPING_VERVALLEN_VOOR_GEBOUW('alg_m54');
    IF :new.alg_gebouw_verwijder IS NOT NULL AND :old.alg_gebouw_verwijder IS NULL THEN
      DECLARE
        dummy CHAR;
      BEGIN
        SELECT 'x'
        INTO   dummy
        FROM   cnt_v_aanwezigcontract_plaats, cnt_v_aanwezigcontract
        WHERE  cnt_v_aanwezigcontract_plaats.cnt_contract_key = cnt_v_aanwezigcontract.cnt_contract_key
        AND    cnt_v_aanwezigcontract.cnt_contract_looptijd_tot > sysdate
        AND    cnt_v_aanwezigcontract_plaats.cnt_alg_plaats_key  = :old.alg_gebouw_key
        AND    cnt_v_aanwezigcontract_plaats.cnt_alg_plaats_code = 'G';
        raise_application_error(-20000,'cnt_m026');
      EXCEPTION
        WHEN NO_DATA_FOUND THEN NULL;
        WHEN TOO_MANY_ROWS THEN raise_application_error(-20000,'cnt_m026');
      END;

      DECLARE
         dummy   CHAR;
      BEGIN
         SELECT 'x'
           INTO dummy
           FROM mld_melding
          WHERE mld_alg_onroerendgoed_keys = :OLD.alg_gebouw_key
            AND fac_activiteit_key IS NULL
            AND mld_melding_status IN (0,2,3,4,7);
         raise_application_error(-20001, 'alg_m999 Gebouw kan nog niet verwijderd worden. Er zijn nog lopende meldingen');
      EXCEPTION
        WHEN NO_DATA_FOUND THEN NULL;
        WHEN TOO_MANY_ROWS THEN raise_application_error(-20001, 'alg_m999 Gebouw kan nog niet verwijderd worden. Er zijn nog lopende meldingen');
      END;

      /* Wissen laat een ingevulde locatie_key over, wat goed is */
      UPDATE bez_afspraak
         SET alg_onrgoed_keys = NULL
       WHERE alg_onrgoed_keys = :NEW.alg_gebouw_key AND bez_afspraak_datum > SYSDATE;

    END IF;

END;
/

CREATE_TRIGGER(alg_t_alg_verdieping_B_IU)
BEFORE INSERT OR UPDATE ON alg_verdieping
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(alg_verdieping_key, alg_s_alg_onroerendgoed_keys);
    UPDATE_UPPER(alg_verdieping_omschrijving, alg_verdieping_upper,alg_verdieping);
    UPDATE_AANMAAKDATUM(alg_verdieping, alg_verdieping_aanmaak);
    LAAT_RUIMTE_VERVALLEN_VOOR_VERDIEPING('alg_m55');
    IF :new.alg_verdieping_verwijder IS NOT NULL AND :old.alg_verdieping_verwijder IS NULL THEN
      DECLARE
        dummy CHAR;
      BEGIN
        SELECT 'x'
        INTO   dummy
        FROM   cnt_v_aanwezigcontract_plaats, cnt_v_aanwezigcontract
        WHERE  cnt_v_aanwezigcontract_plaats.cnt_contract_key = cnt_v_aanwezigcontract.cnt_contract_key
        AND    cnt_v_aanwezigcontract.cnt_contract_looptijd_tot > sysdate
        AND    cnt_v_aanwezigcontract_plaats.cnt_alg_plaats_key  = :old.alg_verdieping_key
        AND    cnt_v_aanwezigcontract_plaats.cnt_alg_plaats_code = 'V';
        raise_application_error(-20000,'cnt_m025');
      EXCEPTION
        WHEN NO_DATA_FOUND THEN NULL;
        WHEN TOO_MANY_ROWS THEN raise_application_error(-20000,'cnt_m025');
      END;
      DECLARE
        dummy CHAR;
      BEGIN
        SELECT 'x'
        INTO dummy
        FROM  mld_melding
        WHERE mld_alg_onroerendgoed_keys=:old.alg_verdieping_key
          AND fac_activiteit_key IS NULL
          AND mld_melding_status IN (0,2,3,4,7);
        raise_application_error(-20001, 'alg_m999 Verdieping kan nog niet verwijderd worden. Er zijn nog lopende meldingen');
      EXCEPTION
        WHEN NO_DATA_FOUND THEN NULL;
        WHEN TOO_MANY_ROWS THEN raise_application_error(-20001, 'alg_m999 Verdieping kan nog niet verwijderd worden. Er zijn nog lopende meldingen');
      END;
      DELETE FROM cad_tekening WHERE alg_verdieping_key=:old.alg_verdieping_key;

      UPDATE bez_afspraak
         SET alg_onrgoed_keys = :NEW.alg_gebouw_key
       WHERE alg_onrgoed_keys = :NEW.alg_verdieping_key AND bez_afspraak_datum > SYSDATE;
   END IF;
END;
/

CREATE_TRIGGER(alg_t_alg_srtruimte_B_IU)
BEFORE INSERT OR UPDATE ON alg_srtruimte
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(alg_srtruimte_key, alg_s_alg_srtruimte_key);
    UPDATE_UPPER(alg_srtruimte_omschrijving, alg_srtruimte_upper,alg_srtruimte);
    UPDATE_AANMAAKDATUM(alg_srtruimte, alg_srtruimte_aanmaak);

    CHECK_NOG_REFERENCES(alg_srtruimte, alg_srtruimte_verwijder,
                alg_v_aanwezigruimte, alg_srtruimte_key, 'alg_m041');
END;
/

CREATE_TRIGGER(alg_t_alg_srtruimte_lg_B_IU)
BEFORE INSERT OR UPDATE ON alg_srtruimte_locatiegebouw
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(alg_srtruimte_lg_key, alg_s_alg_srtruimte_lg_key);
END;
/

CREATE_TRIGGER(alg_t_alg_ruimte_B_IU)
BEFORE INSERT OR UPDATE ON alg_ruimte
FOR EACH ROW
BEGIN

    UPDATE_PRIMARY_KEY(alg_ruimte_key, alg_s_alg_onroerendgoed_keys);
    UPDATE_UPPER(alg_ruimte_nr, alg_ruimte_upper_nr,alg_ruimte);
    UPDATE_AANMAAKDATUM(alg_ruimte, alg_ruimte_aanmaak);
    /* Als de soort ruimte veranderd wordt en er zijn werkplekken in de ruimte
     * dan moet het veld PRS_BEVAT_WERKPLEKKEN de waarde 1 bevatten in de
     * nieuwe soort ruimte.
     */
    IF :old.alg_ruimte_key IS NOT NULL
    AND :new.alg_ruimte_verwijder IS NULL
    AND :old.alg_srtruimte_key <> :new.alg_srtruimte_key
    THEN
       DECLARE
          dummy CHAR;
       BEGIN
          SELECT 'x'
          INTO dummy
          FROM alg_srtruimte ALG_SR_1,
               alg_srtruimte ALG_SR_2,
               prs_werkplek PRS_W
          WHERE ALG_SR_1.alg_srtruimte_key = :old.alg_srtruimte_key
            AND ALG_SR_1.prs_bevat_werkplek = 1
            AND ALG_SR_2.alg_srtruimte_key = :new.alg_srtruimte_key
            AND ALG_SR_2.prs_bevat_werkplek IS NULL
            AND PRS_W.prs_alg_ruimte_key = :new.alg_ruimte_key;
          raise_application_error(-20000, 'prs_m034');
        EXCEPTION
          WHEN NO_DATA_FOUND THEN NULL;
          WHEN TOO_MANY_ROWS THEN raise_application_error(-20000, 'prs_m034');
        END;
    END IF;
    IF :new.alg_ruimte_verwijder IS NOT NULL AND :old.alg_ruimte_verwijder IS NULL THEN
      DECLARE
        dummy CHAR;
      BEGIN
        SELECT 'x'
        INTO   dummy
        FROM   cnt_v_aanwezigcontract_plaats, cnt_v_aanwezigcontract
        WHERE  cnt_v_aanwezigcontract_plaats.cnt_contract_key = cnt_v_aanwezigcontract.cnt_contract_key
        AND    cnt_v_aanwezigcontract.cnt_contract_looptijd_tot > sysdate
        AND    cnt_v_aanwezigcontract_plaats.cnt_alg_plaats_key  = :old.alg_ruimte_key
        AND    cnt_v_aanwezigcontract_plaats.cnt_alg_plaats_code = 'R';
        raise_application_error(-20000,'cnt_m024');
      EXCEPTION
        WHEN NO_DATA_FOUND THEN NULL;
        WHEN TOO_MANY_ROWS THEN raise_application_error(-20000,'cnt_m024');
      END;

      DECLARE
        dummy CHAR;
      BEGIN
         SELECT 'X'
           INTO dummy
           FROM (SELECT 'X'
                   FROM res_rsv_ruimte r, res_ruimte_opstelling ro, res_ruimte rr, res_alg_ruimte ra
                  WHERE r.res_rsv_ruimte_verwijder IS NULL
                    AND r.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                    AND ro.res_ruimte_key = rr.res_ruimte_key
                    AND rr.res_ruimte_key = ra.res_ruimte_key
                    AND r.res_status_bo_key < 5
                    AND ra.alg_ruimte_key = :OLD.alg_ruimte_key
                    AND res_rsv_ruimte_tot > SYSDATE-14 -- na 14 dagen niet meer klagen
                    AND ra.res_alg_ruimte_verwijder IS NULL
                 UNION ALL
                 SELECT 'X'
                   FROM res_rsv_ruimte rr, res_rsv_artikel ra
                  WHERE rr.alg_ruimte_key = :OLD.alg_ruimte_key
                    AND rr.res_rsv_ruimte_verwijder IS NULL
				    AND rr.RES_RSV_RUIMTE_KEY = ra.RES_RSV_RUIMTE_KEY
                    AND ra.res_rsv_artikel_verwijder IS NULL
                    AND res_rsv_ruimte_tot > SYSDATE-14
                    AND ra.res_status_bo_key < 5
                 UNION ALL
                 SELECT 'X'
                   FROM res_rsv_ruimte rr, res_rsv_deel rd
                  WHERE rr.alg_ruimte_key = :OLD.alg_ruimte_key
                    AND rr.res_rsv_ruimte_verwijder IS NULL
				    AND rr.RES_RSV_RUIMTE_KEY = rd.RES_RSV_RUIMTE_KEY
                    AND rd.res_rsv_deel_verwijder IS NULL
                    AND res_rsv_ruimte_tot > SYSDATE-14
                    AND rd.res_status_bo_key < 5);
        raise_application_error(-20000, 'res_m039');
        EXCEPTION
          WHEN NO_DATA_FOUND THEN NULL;
          WHEN TOO_MANY_ROWS THEN raise_application_error(-20000, 'res_m039');
      END;

      DECLARE
        dummy CHAR;
      BEGIN
        SELECT 'x'
        INTO dummy
        FROM  mld_melding
        WHERE mld_alg_onroerendgoed_keys=:old.alg_ruimte_key
          AND fac_activiteit_key IS NULL
          AND mld_melding_status IN (0,2,3,4,7);
        raise_application_error(-20001, 'Ruimte kan nog niet verwijderd worden. Er zijn nog lopende meldingen');
        EXCEPTION
          WHEN NO_DATA_FOUND THEN NULL;
          WHEN TOO_MANY_ROWS THEN raise_application_error(-20001, 'alg_m999 Ruimte kan nog niet verwijderd worden. Er zijn nog lopende meldingen');
      END;

      DECLARE
        dummy CHAR;
      BEGIN
        SELECT 'x'
        INTO dummy
        FROM  ins_deel
        WHERE ins_alg_ruimte_key=:old.alg_ruimte_key
          AND ins_deel_verwijder IS NULL
          AND ins_alg_ruimte_type = 'R';
        raise_application_error(-20001, 'alg_m999 Ruimte kan nog niet verwijderd worden. Er zijn nog objecten');
        EXCEPTION
          WHEN NO_DATA_FOUND THEN NULL;
          WHEN TOO_MANY_ROWS THEN raise_application_error(-20001, 'alg_m999 Ruimte kan nog niet verwijderd worden. Er zijn nog objecten');
       END;

      UPDATE res_alg_ruimte
         SET res_alg_ruimte_verwijder = :NEW.alg_ruimte_verwijder
       WHERE alg_ruimte_key = :NEW.alg_ruimte_key AND res_alg_ruimte_verwijder IS NULL;
      -- FSN#17457
      UPDATE prs_ruimteafdeling
         SET prs_ruimteafdeling_verwijder = :NEW.alg_ruimte_verwijder
       WHERE alg_ruimte_key = :NEW.alg_ruimte_key AND prs_ruimteafdeling_verwijder IS NULL;

       /* toekomstig bezoek degraderen naar verdieping */
      UPDATE bez_afspraak
         SET alg_onrgoed_keys = :NEW.alg_verdieping_key
       WHERE alg_onrgoed_keys = :NEW.alg_ruimte_key AND bez_afspraak_datum > SYSDATE;

       DELETE FROM prs_werkplek
        WHERE prs_werkplek.prs_alg_ruimte_key = :new.alg_ruimte_key;

    END IF;

END;
/

CREATE_TRIGGER(alg_t_alg_kenmerk_b_iu)
BEFORE INSERT OR UPDATE ON alg_kenmerk
FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(alg_kenmerk_key, alg_s_alg_kenmerk_key);
   UPDATE_UPPER(alg_kenmerk_omschrijving, alg_kenmerk_upper, alg_kenmerk);
   UPDATE_UPPER(alg_kenmerk_code, alg_kenmerk_code, alg_kenmerk);
   IF (:new.alg_kenmerk_verwijder IS NOT NULL AND :old.alg_kenmerk_verwijder IS NULL AND
       :new.alg_kenmerk_systeem = 1)
   THEN
      raise_application_error(-20000, 'ALG_M238');
   END IF;
   IF :new.alg_kenmerk_kenmerktype IN ('C', 'N', 'B') AND :new.alg_kenmerk_lengte IS NULL
   THEN
      raise_application_error(-20000, 'ALG_C_ALG_KENMERK_LENGTE');
   END IF;
   -- Numeriek mag niet te lang zijn (numeric overflow)
   IF :new.alg_kenmerk_kenmerktype IN ('N', 'B') AND :new.alg_kenmerk_lengte > 20
   THEN
      :new.alg_kenmerk_lengte := 20;
   END IF;
   IF :new.alg_kenmerk_kenmerktype IN ('N', 'B') AND :old.alg_kenmerk_key IS NOT NULL
   THEN
     IF :old.alg_kenmerk_nmin <> :new.alg_kenmerk_nmin OR
       :old.alg_kenmerk_nmin IS NULL AND :new.alg_kenmerk_nmin IS NOT NULL
     THEN
       DECLARE
         Dummy CHAR;
       BEGIN
         SELECT 'X'
           INTO Dummy
           FROM alg_onrgoedkenmerk
          WHERE alg_kenmerk_key = :old.alg_kenmerk_key
            AND alg_kenmerk_key IN
              (SELECT alg_kenmerk_key FROM alg_onrgoedkenmerk
                WHERE alg_kenmerk_key = :old.alg_kenmerk_key
                  AND FAC.SAFE_TO_NUMBER(alg_onrgoedkenmerk_waarde) < :new.alg_kenmerk_nmin
                  AND rownum=1);
         IF :new.alg_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.alg_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.alg_kenmerk_nmax <> :new.alg_kenmerk_nmax OR
       :old.alg_kenmerk_nmax IS NULL AND :new.alg_kenmerk_nmax IS NOT NULL
     THEN
       DECLARE
         Dummy CHAR;
       BEGIN
         SELECT 'X'
           INTO Dummy
           FROM alg_onrgoedkenmerk
          WHERE alg_kenmerk_key = :old.alg_kenmerk_key
            AND alg_kenmerk_key IN
              (SELECT alg_kenmerk_key FROM alg_onrgoedkenmerk
                WHERE alg_kenmerk_key = :old.alg_kenmerk_key
                  AND FAC.SAFE_TO_NUMBER(alg_onrgoedkenmerk_waarde) > :new.alg_kenmerk_nmax
                  AND rownum=1);
         IF :new.alg_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.alg_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(alg_kenmerk, alg_kenmerk_aanmaak);
END;
/


CREATE_TRIGGER(alg_t_alg_onrgoedkenmerk_b_iu)
BEFORE INSERT OR UPDATE ON alg_onrgoedkenmerk
FOR EACH ROW
BEGIN
   UPDATE_AANMAAKDATUM(alg_onrgoedkenmerk, alg_onrgoedkenmerk_aanmaak);
   /*
   ** Controleer eerst of de ingevulde waarde goed is.
   */
   IF :new.alg_onrgoedkenmerk_waarde <> :old.alg_onrgoedkenmerk_waarde
   OR :old.alg_onrgoedkenmerk_waarde IS NULL
   OR :new.alg_onrgoedkenmerk_waarde IS NULL
   THEN
      DECLARE
         KenmerkOmschr   alg_kenmerk.alg_kenmerk_omschrijving%TYPE;
         KenmerkType     alg_kenmerk.alg_kenmerk_kenmerktype%TYPE;
         KenmerkLengte   alg_kenmerk.alg_kenmerk_lengte%TYPE;
         KenmerkDec      alg_kenmerk.alg_kenmerk_dec%TYPE;
         KenmerkNMin     alg_kenmerk.alg_kenmerk_nmin%TYPE;
         KenmerkNMax     alg_kenmerk.alg_kenmerk_nmax%TYPE;
         RefKenmerkKey   NUMBER(10);
         NumberWaarde    NUMBER(25,5);
         FormatMask      VARCHAR2(60);
         KenmerkWaarde   alg_onrgoedkenmerk.alg_onrgoedkenmerk_waarde%TYPE;
      BEGIN
         KenmerkWaarde := :new.alg_onrgoedkenmerk_waarde;
         BEGIN
            DECLARE
               dummy VARCHAR2(1);
            BEGIN
               IF    :new.alg_onrgoed_niveau = 'G'
               THEN
                  SELECT 'X'
                  INTO   dummy
                  FROM   alg_gebouw
                  WHERE  alg_gebouw_key = :new.alg_onrgoed_key;
               ELSIF :new.alg_onrgoed_niveau = 'R'
               THEN
                  SELECT 'X'
                  INTO   dummy
                  FROM   alg_ruimte
                  WHERE  alg_ruimte_key = :new.alg_onrgoed_key;
               END IF;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN raise_application_error(-20000, 'ALG_M015');
            END;
            SELECT alg_kenmerk_omschrijving
            ,      alg_kenmerk_kenmerktype
            ,      alg_kenmerk_lengte
            ,      alg_kenmerk_dec
            ,      alg_kenmerk_nmin
            ,      alg_kenmerk_nmax
            INTO   KenmerkOmschr
            ,      KenmerkType
            ,      KenmerkLengte
            ,      KenmerkDec
            ,      KenmerkNMin
            ,      KenmerkNMax
            FROM   alg_kenmerk
            WHERE  alg_kenmerk_key = :new.alg_kenmerk_key;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN raise_application_error(-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', '.');
                    APPLICATION_ERROR_GOTO(-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.alg_onrgoedkenmerk_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.alg_onrgoedkenmerk_waarde := KenmerkWaarde;
         END IF;
      END;
      UPDATE_PRIMARY_KEY(alg_onrgoedkenmerk_key, alg_s_alg_onrgoedkenmerk_key);
   END IF;
END;
/

CREATE_TRIGGER(alg_t_alg_srtterreinsec_B_IU)
BEFORE INSERT OR UPDATE ON alg_srtterreinsector
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(alg_srtterreinsector_key, alg_s_alg_srtterrein_key);
    UPDATE_UPPER(alg_srtterreinsec_omschrijving, alg_srtterreinsector_upper,alg_srtterreinsector);
    UPDATE_AANMAAKDATUM(alg_srtterreinsector, alg_srtterreinsector_aanmaak);

    CHECK_NOG_REFERENCES(alg_srtterreinsector, alg_srtterreinsector_verwijder,
                alg_v_aanwezigterreinsector, alg_srtterreinsector_key, 'alg_m041');
END;
/

CREATE_TRIGGER(alg_t_alg_algfaq_B_I)
BEFORE INSERT ON alg_algfaq
FOR EACH ROW
BEGIN
    UPDATE_PRIMARY_KEY(alg_algfaq_key, alg_s_alg_algfaq_key);
END;
/

CREATE_TRIGGER(alg_t_alg_algfaq_B_IU)
BEFORE INSERT OR UPDATE ON alg_algfaq
FOR EACH ROW
BEGIN
    IF :new.alg_onroerendgoed_keys IS NOT NULL
    THEN
    CHECK_REFERENCE_ONROERENDGOED(alg_onroerendgoed_keys, 'alg_m239 alg_onroerendgoed_keys ('|| :new.alg_onroerendgoed_keys ||') bestaat niet');
    END IF;
END;
/

REGISTERRUN('$Id$')
