#ifdef FIN
/* $Revision$
 * $Id$
 */

CREATE_TRIGGER(fin_t_fin_factuur_b_iu)
BEFORE INSERT OR UPDATE ON fin_factuur
FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(fin_factuur_key, fin_s_fin_factuur_key);
   /* constraint: gefiatteerd of hoger mag pas als 1 van de referenties is ingevuld */
   IF :new.fin_factuur_boekmaand IS NULL THEN :new.fin_factuur_boekmaand := DATE_TO_CHAR(:new.fin_factuur_datum, 'YYYY-MM'); END IF;
END;
/

CREATE_TRIGGER(fin_t_fin_factuurregel_b_iu)
BEFORE INSERT OR UPDATE ON fin_factuurregel
FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(fin_factuurregel_key, fin_s_fin_factuurregel_key);
END;
/

CREATE_TRIGGER(fin_t_fin_kenmerkfactuur_b_iu)
BEFORE INSERT OR UPDATE ON fin_kenmerkfactuur
FOR EACH ROW
BEGIN
   UPDATE_AANMAAKDATUM(fin_kenmerkfactuur, fin_kenmerkfactuur_aanmaak);
   /*
   ** Controleer eerst of de ingevulde waarde goed is.
   */
   IF :new.fin_kenmerkfactuur_waarde <> :old.fin_kenmerkfactuur_waarde
   OR :old.fin_kenmerkfactuur_waarde IS NULL
   OR :new.fin_kenmerkfactuur_waarde IS NULL
   THEN
      DECLARE
         KenmerkOmschr   fin_kenmerk.fin_kenmerk_omschrijving%TYPE;
         KenmerkType     fin_kenmerk.fin_kenmerk_kenmerktype%TYPE;
         KenmerkLengte   fin_kenmerk.fin_kenmerk_lengte%TYPE;
         KenmerkDec      fin_kenmerk.fin_kenmerk_dec%TYPE;
         KenmerkNMin     fin_kenmerk.fin_kenmerk_nmin%TYPE;
         KenmerkNMax     fin_kenmerk.fin_kenmerk_nmax%TYPE;
         NumberWaarde    NUMBER(25,5);
         FormatMask      VARCHAR2(60);
         KenmerkWaarde   fin_kenmerkfactuur.fin_kenmerkfactuur_waarde%TYPE;
      BEGIN
         KenmerkWaarde := :new.fin_kenmerkfactuur_waarde;
         BEGIN
            DECLARE
               dummy VARCHAR2(1);
            BEGIN
            SELECT fin_kenmerk_omschrijving
            ,      fin_kenmerk_kenmerktype
            ,      fin_kenmerk_lengte
            ,      fin_kenmerk_dec
            ,      fin_kenmerk_nmin
            ,      fin_kenmerk_nmax
            INTO   KenmerkOmschr
            ,      KenmerkType
            ,      KenmerkLengte
            ,      KenmerkDec
            ,      KenmerkNMin
            ,      KenmerkNMax
            FROM   fin_kenmerk
            WHERE  fin_kenmerk_key = :new.fin_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, 'fin_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, 'fin_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, 'fin_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, 'fin_M233,'|| KenmerkOmschr ||','
                                                      || FormatMask);
               END IF;
            END IF;
            /*
            ** Zet de geconverteerde waarde terug
            */
            :new.fin_kenmerkfactuur_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.fin_kenmerkfactuur_waarde := KenmerkWaarde;
         END IF;
      END;
    END;
    UPDATE_PRIMARY_KEY(fin_kenmerkfactuur_key, fin_s_fin_kenmerkfactuur_key);
   END IF;
END;
/
CREATE_TRIGGER(fin_t_fin_kenmerkfacreg_b_iu)
BEFORE INSERT OR UPDATE ON fin_kenmerkfactregel
FOR EACH ROW
BEGIN
   UPDATE_AANMAAKDATUM(fin_kenmerkfactregel, fin_kenmerkfactregel_aanmaak);
   /*
   ** Controleer eerst of de ingevulde waarde goed is.
   */
   IF :new.fin_kenmerkfactregel_waarde <> :old.fin_kenmerkfactregel_waarde
   OR :old.fin_kenmerkfactregel_waarde IS NULL
   OR :new.fin_kenmerkfactregel_waarde IS NULL
   THEN
      DECLARE
         KenmerkOmschr   fin_kenmerk.fin_kenmerk_omschrijving%TYPE;
         KenmerkType     fin_kenmerk.fin_kenmerk_kenmerktype%TYPE;
         KenmerkLengte   fin_kenmerk.fin_kenmerk_lengte%TYPE;
         KenmerkDec      fin_kenmerk.fin_kenmerk_dec%TYPE;
         KenmerkNMin     fin_kenmerk.fin_kenmerk_nmin%TYPE;
         KenmerkNMax     fin_kenmerk.fin_kenmerk_nmax%TYPE;
         NumberWaarde    NUMBER(25,5);
         FormatMask      VARCHAR2(60);
         KenmerkWaarde   fin_kenmerkfactregel.fin_kenmerkfactregel_waarde%TYPE;
      BEGIN
         KenmerkWaarde := :new.fin_kenmerkfactregel_waarde;
         BEGIN
            DECLARE
               dummy VARCHAR2(1);
            BEGIN
            SELECT fin_kenmerk_omschrijving
            ,      fin_kenmerk_kenmerktype
            ,      fin_kenmerk_lengte
            ,      fin_kenmerk_dec
            ,      fin_kenmerk_nmin
            ,      fin_kenmerk_nmax
            INTO   KenmerkOmschr
            ,      KenmerkType
            ,      KenmerkLengte
            ,      KenmerkDec
            ,      KenmerkNMin
            ,      KenmerkNMax
            FROM   fin_kenmerk
            WHERE  fin_kenmerk_key = :new.fin_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, 'fin_M232,'|| KenmerkOmschr ||','
                                                    || TO_CHAR(KenmerkLengte));
            END IF;
         ELSIF KenmerkType = 'N'
         /*
         ** 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, 'fin_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, 'fin_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, 'fin_M233,'|| KenmerkOmschr ||','
                                                      || FormatMask);
               END IF;
            END IF;
            /*
            ** Zet de geconverteerde waarde terug
            */
            :new.fin_kenmerkfactregel_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.fin_kenmerkfactregel_waarde := KenmerkWaarde;
         END IF;
      END;
    END;
    UPDATE_PRIMARY_KEY(fin_kenmerkfactregel_key, fin_s_fin_kenmerkfactregel_key);
   END IF;
END;
/
CREATE_TRIGGER(fin_t_fin_kenmerk_b_iu)
BEFORE INSERT OR UPDATE ON fin_kenmerk
FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(fin_kenmerk_key, fin_s_fin_kenmerk_key);
   UPDATE_UPPER(fin_kenmerk_omschrijving, fin_kenmerk_upper, fin_kenmerk);
   UPDATE_UPPER(fin_kenmerk_code, fin_kenmerk_code, fin_kenmerk);

   IF (:new.fin_kenmerk_verwijder IS NOT NULL AND :old.fin_kenmerk_verwijder IS NULL AND
       :new.fin_kenmerk_systeem = 1)
   THEN
      raise_application_error(-20000, 'fin_M238');
   END IF;
   IF :new.fin_kenmerk_kenmerktype IN ('C','N', 'B') AND :new.fin_kenmerk_lengte IS NULL
   THEN
      raise_application_error(-20000, 'fin_C_fin_KENMERK_LENGTE');
   END IF;
    -- Numeriek mag niet te lang zijn (numeric overflow)
   IF :new.fin_kenmerk_kenmerktype IN ('N', 'B') AND :new.fin_kenmerk_lengte > 20
   THEN
      :new.fin_kenmerk_lengte := 20;
   END IF;
   IF :new.fin_kenmerk_kenmerktype = 'N' AND :old.fin_kenmerk_key IS NOT NULL
   THEN
     IF :old.fin_kenmerk_nmin <> :new.fin_kenmerk_nmin OR
       :old.fin_kenmerk_nmin IS NULL AND :new.fin_kenmerk_nmin IS NOT NULL
     THEN
       DECLARE
         Dummy CHAR;
       BEGIN
         SELECT 'X'
           INTO Dummy
           FROM fin_kenmerkfactuur
          WHERE fin_kenmerk_key = :old.fin_kenmerk_key
            AND fin_kenmerk_key IN
              (SELECT fin_kenmerk_key FROM fin_kenmerkfactuur
                WHERE fin_kenmerk_key = :old.fin_kenmerk_key
                  AND FAC.SAFE_TO_NUMBER(fin_kenmerkfactuur_waarde) < :new.fin_kenmerk_nmin
                  AND rownum=1);
               raise_application_error(-20000, 'FIN_C_FIN_KENMERK_MIN');
       EXCEPTION
         WHEN NO_DATA_FOUND
           THEN NULL;
         WHEN TOO_MANY_ROWS THEN
               raise_application_error(-20000, 'FIN_C_FIN_KENMERK_MIN');
       END;
     END IF;
     IF :old.fin_kenmerk_nmax <> :new.fin_kenmerk_nmax OR
       :old.fin_kenmerk_nmax IS NULL AND :new.fin_kenmerk_nmax IS NOT NULL
     THEN
       DECLARE
         Dummy CHAR;
       BEGIN
         SELECT 'X'
           INTO Dummy
           FROM fin_kenmerkfactuur
          WHERE fin_kenmerk_key = :old.fin_kenmerk_key
            AND fin_kenmerk_key IN
              (SELECT  fin_kenmerk_key FROM fin_kenmerkfactuur
                WHERE fin_kenmerk_key = :old.fin_kenmerk_key
                  AND FAC.SAFE_TO_NUMBER(fin_kenmerkfactuur_waarde) > :new.fin_kenmerk_nmax
                  AND rownum=1);
               raise_application_error(-20000, 'FIN_C_FIN_KENMERK_MAX');
       EXCEPTION
         WHEN NO_DATA_FOUND
           THEN NULL;
         WHEN TOO_MANY_ROWS THEN
           BEGIN
               raise_application_error(-20000, 'FIN_C_FIN_KENMERK_MAX');
           END;
       END;
     END IF;
   END IF;
   UPDATE_AANMAAKDATUM(fin_kenmerk, fin_kenmerk_aanmaak);
END;
/

CREATE_TRIGGER(fin_t_fin_btwtabel_b_iu)
BEFORE INSERT OR UPDATE ON fin_btwtabel
FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(fin_btwtabel_key, fin_s_fin_btwtabel_key);
END;
/
CREATE_TRIGGER(fin_t_fin_btwtabelwaarde_b_iu)
BEFORE INSERT OR UPDATE ON fin_btwtabelwaarde
FOR EACH ROW
BEGIN
   UPDATE_PRIMARY_KEY(fin_btwtabelwaarde_key, fin_s_fin_btwtabelwaarde_key);
END;
/

CREATE_TRIGGER(fin_t_fin_factuur_note_b_iu)
BEFORE INSERT OR UPDATE ON fin_factuur_note
FOR EACH ROW
BEGIN
  UPDATE_PRIMARY_KEY(fin_factuur_note_key, fin_s_fin_factuur_note_key);
END;
/

CREATE_TRIGGER(fin_t_verkoopfactuurkop_b_i)
BEFORE INSERT ON fin_verkoopfactuurkop
FOR EACH ROW
BEGIN
  UPDATE_PRIMARY_KEY(fin_verkoopfactuurkop_key, fin_s_verkoopfactuurkop_key);
END;
/

CREATE_TRIGGER(fin_t_fin_verkoopfactuur_b_iu)
BEFORE INSERT OR UPDATE ON fin_verkoopfactuur
FOR EACH ROW
BEGIN
  UPDATE_PRIMARY_KEY(fin_verkoopfactuur_key, fin_s_fin_verkoopfactuur_key);
END;
/

REGISTERRUN('$Id$')

#endif // FIN
