#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;
//</MLD>
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);
    UPDATE_UPPER(prs_perslid_initialen, prs_perslid_init_upper,prs_perslid);
    UPDATE_UPPER(prs_perslid_oslogin, prs_perslid_oslogin,prs_perslid);
    UPDATE_UPPER(prs_perslid_oslogin2, prs_perslid_oslogin2,prs_perslid);
    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
        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;

      IF    :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')
      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
	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';
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;
/

REGISTERRUN('$Id$')

#endif
