--
-- $Id$
--
-- Script containing customer specific configuration sql statements for PCHA: PCH Het Gelders Huis Arnhem

DEFINE thisfile = 'PCHA.SQL'
DEFINE dbuser   = '^PCHA'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
WHENEVER SQLERROR EXIT;
SELECT adm.scriptspoolfile('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL;
WHENEVER SQLERROR CONTINUE;
SPOOL &fcltlogfile
SET DEFINE OFF

------ payload begin ------


-- Importfuncties onroerendgoed vanaf verdieping.
CREATE OR REPLACE PROCEDURE pcha_import_onrgoed2 (p_import_key IN NUMBER)
AS
BEGIN
   UPDATE fac_imp_file
      SET fac_imp_file_line = REPLACE (fac_imp_file_line, CHR (160), ' ')
    WHERE fac_import_key = p_import_key;

   fac_import_onrgoed2 (p_import_key);
   UPDATE fac_imp_onrgoed2 SET alg_srtruimte_omschrijving = TRIM(alg_srtruimte_omschrijving);
END;
/

CREATE OR REPLACE PROCEDURE pcha_update_onrgoed2 (p_import_key IN NUMBER)
AS
BEGIN
   fac_update_onrgoed2 (p_import_key);

   -- plaats de ruimte type codering in het code veld.
   UPDATE alg_srtruimte
      SET alg_srtruimte_code = SUBSTR (alg_srtruimte_omschrijving, 1, 7)
    WHERE alg_srtruimte_code IS NULL;

   -- pas de openingstijden van de ruimten aan waar een 24/7 regime geldt. Verder geldt voor
   -- deze ruimten ook dat de sla in het weekend door telt.
   UPDATE alg_ruimte
      SET
          (alg_ruimte_beginuur,
          alg_ruimte_einduur,
          alg_ruimte_werkdagen
          ) =
             (SELECT DECODE (SUBSTR (alg_onrgoedkenmerk_waarde, 1, 2), '24', 0, NULL),
                     DECODE (SUBSTR (alg_onrgoedkenmerk_waarde, 1, 2), '24', 24, NULL),
                     DECODE (SUBSTR (alg_onrgoedkenmerk_waarde, 1, 2), '24', 0, NULL)
                FROM alg_onrgoedkenmerk
               WHERE alg_kenmerk_key = 1000 AND alg_onrgoed_key = alg_ruimte_key);
END;
/

-- Importfunctie voor THT waardes bij meldingen
CREATE OR REPLACE PROCEDURE pcha_import_storing_regime (
   p_import_key IN NUMBER)
AS
   CURSOR c_cursor
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;

   v_newline                 VARCHAR2 (1000);
   v_aanduiding              VARCHAR2 (1000);                   -- Import line
   v_fielddelimitor          VARCHAR2 (1);                  -- Field seperator
   v_errormsg                VARCHAR (200);
   v_errorhint               VARCHAR (200);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   header_found              BOOLEAN;
   v_error                   NUMBER(1);
   -- De importvelden
   v_r_codering              VARCHAR2(100);
   v_omschrijving            VARCHAR2(100);
   v_ruimten                 VARCHAR2(100);
   v_storing_os              VARCHAR2(100);
   v_stdmelding              VARCHAR2(100);
   v_vakgroep                VARCHAR2(100);
   v_vakgroeptype            VARCHAR2(100);
   v_tht_os                  VARCHAR2(100);
   v_tht                     VARCHAR2(100);
   v_tht_eenheid             VARCHAR2(100);
   v_bk                      VARCHAR2(100);
   v_vk                      VARCHAR2(100);
   v_srtruimte_key           NUMBER;
   v_stdmelding_key          NUMBER;
   v_discipline_key          NUMBER;
   v_srtdiscipline_key       NUMBER;


BEGIN
   -- Verwijder nbsp karakters.
   UPDATE fac_imp_file
      SET fac_imp_file_line = REPLACE (fac_imp_file_line, CHR (160), ' ')
    WHERE fac_import_key = p_import_key;

   -- Init
   header_found := FALSE;
   v_fielddelimitor := ';';

   -- Clear my previous imported rows
   DELETE FROM pcha_imp_storing_regime;

   FOR rec1 IN c_cursor
   LOOP
      BEGIN
         v_newline := REPLACE(rec1.fac_imp_file_line, CHR(160), ' ');
         v_aanduiding := SUBSTR (v_newline, 1, 200);
         v_error := 0;

         IF SUBSTR (v_newline, 1, 3) = '?'
         THEN
            -- EF BB BF aangetroffen
            fac.imp_writelog (p_import_key,
                              'W',
                              'Byte Order Mark aangetroffen',
                              'Bestand heeft onbehandeld UTF-8 formaat.');
            v_newline := SUBSTR (v_newline, 4);
         END IF;

         v_errormsg := 'Inlezen velden';
         fac.imp_getfield (v_newline, v_fielddelimitor, v_r_codering);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_omschrijving);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_ruimten);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_storing_os);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_stdmelding);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_vakgroep);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_vakgroeptype);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_tht_os);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_tht);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_tht_eenheid);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_bk);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_vk);

         -- Skip until a valid header is found
         v_errormsg := 'Controleer de header';

         IF UPPER (rec1.fac_imp_file_line) LIKE
               'R CODERING;OMSCHRIJVING;RUIMTEN;STORING OS;STANDAARD MELDING;VAKGROEP;VAKGROEPTYPE;THT OS;THT;THT EENHEID;BK;VK%'
         THEN
            -- Sla de kopregel over.
            header_found := TRUE;
         ELSIF (header_found AND v_vakgroep IS NOT NULL)
         THEN
            -- Kennen we de ruimtecodering
            v_errormsg := 'Controleer ruimtesoort';
            v_r_codering := REPLACE(v_r_codering, CHR(160));

            IF v_r_codering IS NOT NULL
            THEN
               v_r_codering := TRIM(v_r_codering);
               BEGIN
                  SELECT alg_srtruimte_key
                    INTO v_srtruimte_key
                    FROM alg_srtruimte sr
                   WHERE alg_srtruimte_verwijder IS NULL
                     AND UPPER (sr.alg_srtruimte_code) = UPPER (v_r_codering);
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     fac.imp_writelog (
                        p_import_key,
                        'E',
                        'Ruimtecodering niet gevonden:  ' || v_r_codering,
                        v_aanduiding);
                     v_srtruimte_key := NULL;
                     v_error := 1;
               END;
            ELSE
               v_srtruimte_key := NULL;
            END IF;

            v_errormsg := 'Controleer vakgroeptype';

            BEGIN
               v_vakgroeptype := TRIM(v_vakgroeptype);
               SELECT ins_srtdiscipline_key
                 INTO v_srtdiscipline_key
                 FROM ins_srtdiscipline sd
                WHERE sd.ins_srtdiscipline_module = 'MLD'
                  AND sd.ins_srtdiscipline_verwijder IS NULL
                  AND UPPER (sd.ins_srtdiscipline_omschrijving) =
                         UPPER (v_vakgroeptype);
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     'Vakgroeptype niet gevonden:  ' || v_vakgroeptype,
                     v_aanduiding);
                  v_srtdiscipline_key := NULL;
                  v_error := 1;
            END;

            v_errormsg := 'Controleer vakgroep';

            BEGIN
               v_vakgroep := TRIM(v_vakgroep);
               SELECT ins_discipline_key
                 INTO v_discipline_key
                 FROM ins_tab_discipline d
                WHERE d.ins_discipline_module = 'MLD'
                  AND d.ins_discipline_verwijder IS NULL
                  AND d.ins_srtdiscipline_key = v_srtdiscipline_key
                  AND UPPER (d.ins_discipline_omschrijving) =
                         UPPER (v_vakgroep);
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     'Vakgroep niet gevonden:  ' || v_vakgroep,
                     v_aanduiding);
                  v_discipline_key := NULL;
                  v_error := 1;
            END;

            v_errormsg := 'Controleer stdmelding';

            IF v_stdmelding IS NOT NULL
            THEN
               v_stdmelding := SUBSTR(TRIM(v_stdmelding),1,60);
               BEGIN
                  SELECT mld_stdmelding_key
                    INTO v_stdmelding_key
                    FROM mld_stdmelding std
                   WHERE std.mld_stdmelding_verwijder IS NULL
                     AND std.mld_ins_discipline_key = v_discipline_key
                     AND UPPER (std.mld_stdmelding_omschrijving) =
                            UPPER (v_stdmelding);
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     fac.imp_writelog (
                        p_import_key,
                        'E',
                        'Standaard melding niet gevonden:  ' || v_stdmelding,
                        v_aanduiding);
                     v_stdmelding_key := NULL;
                     v_error := 1;
               END;
            ELSE
               v_stdmelding_key := NULL;
            END IF;

            v_errormsg := 'Controleer THT';

            IF fac.safe_to_number (v_tht) IS NULL AND v_tht IS NOT NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'E',
                                 'THT niet geldig:  ' || v_tht,
                                 v_aanduiding);
               v_error := 1;
            END IF;

            v_errormsg := 'Controleer THT eenheid';

            v_tht_eenheid := TRIM(UPPER(v_tht_eenheid));
            IF v_tht_eenheid NOT IN ('UUR', 'MIN', 'DAG')  AND v_tht_eenheid IS NOT NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  'THT eehheid niet geldig:  ' || v_tht_eenheid,
                  v_aanduiding);
               v_error := 1;
            END IF;

            v_errormsg := 'Controleer basiskorting';

            IF fac.safe_to_number (v_bk) IS NULL AND v_bk IS NOT NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'E',
                                 'Basiskorting niet geldig:  ' || v_bk,
                                 v_aanduiding);
               v_error := 1;
            END IF;

            v_errormsg := 'Controleer variabele korting';

            IF fac.safe_to_number (v_vk) IS NULL AND v_vk IS NOT NULL
            THEN
               fac.imp_writelog (p_import_key,
                                 'E',
                                 'variabele korting niet geldig:  ' || v_vk,
                                 v_aanduiding);
               v_error := 1;
            END IF;

            IF v_error = 0
            THEN
               INSERT INTO pcha_imp_storing_regime (r_codering,
                                                    omschrijving,
                                                    ruimten,
                                                    storing_os,
                                                    stdmelding,
                                                    vakgroep,
                                                    vakgroeptype,
                                                    tht_os,
                                                    tht,
                                                    tht_eenheid,
                                                    bk,
                                                    vk,
                                                    alg_srtruimte_key,
                                                    mld_stdmelding_key,
                                                    mld_discipline_key,
                                                    ins_srtdiscipline_key)
                   VALUES (v_r_codering,
                           v_omschrijving,
                           v_ruimten,
                           v_storing_os,
                           v_stdmelding,
                           v_vakgroep,
                           v_vakgroeptype,
                           v_tht_os,
                           v_tht,
                           v_tht_eenheid,
                           v_bk,
                           v_vk,
                           v_srtruimte_key,
                           v_stdmelding_key,
                           v_discipline_key,
                           v_srtdiscipline_key);
            END IF;

            COMMIT;
         END IF;
         END;
      END loop;

      IF NOT header_found
      THEN
         fac.imp_writelog (
            p_import_key,
            'E',
            'Geen geldige header aangetroffen',
            'Bestand is geen geldig melding regime importbestand.');
      END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      v_aanduiding := v_errormsg || ' - ' || v_aanduiding;
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', SUBSTR (v_errormsg, 1, 1000), v_aanduiding);
      -- maak de importtabel leeg om te voorkomen dat er halve bestanden ingelezen worden.
      DELETE FROM pcha_imp_storing_regime;
END;
/

CREATE OR REPLACE PROCEDURE pcha_update_storing_regime (
   p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT sr.r_codering,
             stdmelding,
             vakgroep,
             vakgroeptype,
             fac.safe_to_number (bk) bk,
             fac.safe_to_number (vk) vk,
             alg_srtruimte_key,
             mld_stdmelding_key,
             mld_discipline_key,
             ins_srtdiscipline_key,
             DECODE (tht_eenheid, 'UUR', 'U', 'MIN', 'U', 'DAG', 'D') eenheid,
             DECODE (tht_eenheid,
                     'UUR', tht,
                     'MIN', ROUND (tht / 60, 5),
                     'DAG', tht)
                tijdsduur
        FROM pcha_imp_storing_regime sr;

   CURSOR c_del
   IS
      SELECT ssr.mld_stdmsrtruimte_key,
             d.ins_discipline_omschrijving,
             std.mld_stdmelding_omschrijving,
             sr.alg_srtruimte_code
        FROM mld_stdmsrtruimte ssr,
             mld_stdmelding std,
             ins_tab_discipline d,
             ins_srtdiscipline sd,
             alg_srtruimte sr
       WHERE NOT EXISTS
                (SELECT mld_stdmelding_key
                   FROM pcha_imp_storing_regime sm
                  WHERE sm.mld_stdmelding_key = ssr.mld_stdmelding_key
                    AND sm.alg_srtruimte_key = ssr.alg_srtruimte_key)
         AND NOT EXISTS
                (SELECT std.mld_stdmelding_key
                   FROM pcha_imp_storing_regime sm, mld_stdmelding std
                  WHERE sm.mld_discipline_key = std.mld_ins_discipline_key
                    AND std.mld_stdmelding_key = ssr.mld_stdmelding_key
                    AND sm.alg_srtruimte_key = ssr.alg_srtruimte_key
                    AND sm.mld_stdmelding_key IS NULL)
         AND ssr.mld_stdmelding_key = std.mld_stdmelding_key
         AND std.mld_ins_discipline_key = d.ins_discipline_key
         AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
         AND sd.ins_srtdiscipline_omschrijving IN (SELECT DISTINCT vakgroeptype FROM pcha_imp_storing_regime)
         AND ssr.alg_srtruimte_key = sr.alg_srtruimte_key;

   CURSOR c_upd_std
   IS
      SELECT DISTINCT
             mld_stdmelding_key,
             sr1.mld_stdmsrtruimte_t_uitvtijd.eenheid eenheid,
             sr1.mld_stdmsrtruimte_t_uitvtijd.tijdsduur tijdsduur
        FROM (SELECT mld_stdmelding_key,
                     DECODE (sr.mld_stdmsrtruimte_t_uitvtijd.eenheid, 'U', 0, 'D', 100)
                     + sr.mld_stdmsrtruimte_t_uitvtijd.tijdsduur
                        duur,
                     sr.mld_stdmsrtruimte_t_uitvtijd
                FROM mld_stdmsrtruimte sr) sr1
       WHERE NOT EXISTS (SELECT *
                           FROM (SELECT mld_stdmelding_key,
                                        DECODE (sr.mld_stdmsrtruimte_t_uitvtijd.eenheid,
                                                'U', 0,
                                                'D', 100)
                                        + sr.mld_stdmsrtruimte_t_uitvtijd.tijdsduur
                                           duur
                                   FROM mld_stdmsrtruimte sr) sr2
                          WHERE sr1.mld_stdmelding_key = sr2.mld_stdmelding_key AND sr1.duur < sr2.duur);

   v_newline                   VARCHAR2 (1000);
   v_aanduiding                VARCHAR2 (1000);                 -- Import line
   v_fielddelimitor            VARCHAR2 (1);                -- Field seperator
   v_errormsg                  VARCHAR (200);
   v_errorhint                 VARCHAR (200);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   v_count                     NUMBER;
   v_tijdsduur                 NUMBER (10, 5);
   v_eenheid                   VARCHAR2 (1);
   v_basiskorting              NUMBER;
   v_varkorting                NUMBER;
   v_stdmsrtruimte_key         NUMBER;
   v_stdmelding_omschrijving   VARCHAR2 (60);
BEGIN
   SELECT COUNT ( * ) INTO v_count FROM pcha_imp_storing_regime;

   IF v_count < 1000 AND 1=0  -- Toch maar even niet testen. De lijst met Kq meldingen bevat maar 17 records
   THEN
      fac.imp_writelog (
         p_import_key,
         'E',
         'Aantal ingelezen regels: ' || v_count || ' is te weing.',
         NULL);
      RETURN;
   END IF;

   FOR rec IN c
   LOOP
      v_aanduiding :=
            rec.r_codering
         || '-'
         || rec.vakgroep
         || '/'
         || rec.stdmelding
         || ') '
         || v_tijdsduur
         || ' '
         || v_eenheid
         || ' '
         || v_basiskorting
         || '-'
         || v_varkorting;

      IF rec.mld_stdmelding_key IS NOT NULL
      THEN
         -- de hersteltijden gelden niet voor alle meldingen in de vakgroep.
         IF rec.alg_srtruimte_key IS NULL
         THEN
            -- deze melding is gelijk voor alle ruimtesoorten. We gaan dit dus bij de stdmelding aanpassen.
            v_errormsg := 'Zoeken stdmelding';

            SELECT std.mld_stdmelding_t_uitvoertijd.tijdsduur tijdsduur,
                   std.mld_stdmelding_t_uitvoertijd.eenheid eenheid,
                   COALESCE (mld_stdmelding_malusbasis, 0)
                      mld_stdmelding_malusbasis,
                   COALESCE (mld_stdmelding_malus, 0) mld_stdmelding_malus
              INTO v_tijdsduur,
                   v_eenheid,
                   v_basiskorting,
                   v_varkorting
              FROM mld_stdmelding std
             WHERE std.mld_stdmelding_key = rec.mld_stdmelding_key
               AND std.mld_stdmelding_verwijder IS NULL;

            IF v_tijdsduur <> rec.tijdsduur
            OR v_eenheid <> rec.eenheid
            OR v_basiskorting <> rec.bk
            OR v_varkorting <> rec.vk
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'I',
                     'Gewijzigd stdm1 ('
                  || rec.r_codering
                  || '-'
                  || rec.vakgroep
                  || '/'
                  || rec.stdmelding
                  || ')',
                     v_tijdsduur
                  || ' '
                  || v_eenheid
                  || ' '
                  || v_basiskorting
                  || '-'
                  || v_varkorting
                  || ' -> '
                  || rec.tijdsduur
                  || ' '
                  || rec.eenheid
                  || ' '
                  || rec.bk
                  || '-'
                  || rec.vk);

               v_errormsg := 'Aanpassen stdmelding';

               UPDATE mld_stdmelding
                  SET mld_stdmelding_t_uitvoertijd =
                         mld_t_uitvoertijd (rec.tijdsduur, rec.eenheid),
                      mld_stdmelding_malus = rec.vk,
                      mld_stdmelding_malusbasis = rec.bk
                WHERE mld_stdmelding_key = rec.mld_stdmelding_key;

               FOR rec_sr
                  IN (SELECT *
                        FROM mld_stdmsrtruimte
                       WHERE mld_stdmelding_key = rec.mld_stdmelding_key)
               LOOP
                  fac.imp_writelog (
                     p_import_key,
                     'I',
                        'Verwijderd ('
                     || rec.r_codering
                     || '-'
                     || rec.vakgroep
                     || '/'
                     || rec.stdmelding
                     || ')',
                     NULL);

                  v_errormsg := 'Verwijderen stdmsrtruimte';

                  DELETE mld_stdmsrtruimte
                   WHERE mld_stdmsrtruimte_key = rec_sr.mld_stdmsrtruimte_key;
               END LOOP;
            END IF;
         ELSE
            -- Stdmelding en srtruimte zijn ingevuld. Dus een upsert op het mld_stdmsrtruimte record uitvoeren
            BEGIN
               v_errormsg := 'Zoeken stdmsrtruimte';

               SELECT stdsr.mld_stdmsrtruimte_t_uitvtijd.tijdsduur tijdsduur,
                      stdsr.mld_stdmsrtruimte_t_uitvtijd.eenheid eenheid,
                      COALESCE (mld_stdmsrtruimte_malusbasis, 0)
                         mld_stdmsrtruimte_malusbasis,
                      COALESCE (mld_stdmsrtruimte_malus, 0)
                         mld_stdmsrtruimte_malus,
                      mld_stdmsrtruimte_key
                 INTO v_tijdsduur,
                      v_eenheid,
                      v_basiskorting,
                      v_varkorting,
                      v_stdmsrtruimte_key
                 FROM mld_stdmsrtruimte stdsr
                WHERE stdsr.mld_stdmelding_key = rec.mld_stdmelding_key
                  AND stdsr.alg_srtruimte_key = rec.alg_srtruimte_key;

               IF v_tijdsduur <> rec.tijdsduur
               OR v_eenheid <> rec.eenheid
               OR v_basiskorting <> rec.bk
               OR v_varkorting <> rec.vk
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'I',
                        'Gewijzigd stdmsr1 ('
                     || rec.r_codering
                     || '-'
                     || rec.vakgroep
                     || '/'
                     || rec.stdmelding
                     || ')',
                        v_tijdsduur
                     || ' '
                     || v_eenheid
                     || ' '
                     || v_basiskorting
                     || '-'
                     || v_varkorting
                     || ' -> '
                     || rec.tijdsduur
                     || ' '
                     || rec.eenheid
                     || ' '
                     || rec.bk
                     || '-'
                     || rec.vk);

                  v_errormsg := 'Aanpassen stdmsrtruimte';

                  UPDATE mld_stdmsrtruimte
                     SET mld_stdmsrtruimte_t_uitvtijd =
                            mld_t_uitvoertijd (rec.tijdsduur, rec.eenheid),
                         mld_stdmsrtruimte_malus = rec.vk,
                         mld_stdmsrtruimte_malusbasis = rec.bk
                   WHERE mld_stdmsrtruimte_key = v_stdmsrtruimte_key;
               END IF;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'I',
                        'Toegevoegd ('
                     || rec.r_codering
                     || '-'
                     || rec.vakgroep
                     || '/'
                     || rec.stdmelding
                     || ')',
                        rec.tijdsduur
                     || ' '
                     || rec.eenheid
                     || ' '
                     || rec.bk
                     || '-'
                     || rec.vk);

                  v_errormsg := 'Toevoegen stdmsrtruimte';

                  INSERT INTO mld_stdmsrtruimte (mld_stdmsrtruimte_t_uitvtijd,
                                                 mld_stdmsrtruimte_malus,
                                                 mld_stdmsrtruimte_malusbasis,
                                                 alg_srtruimte_key,
                                                 mld_stdmelding_key)
                      VALUES (mld_t_uitvoertijd (rec.tijdsduur, rec.eenheid),
                              rec.vk,
                              rec.bk,
                              rec.alg_srtruimte_key,
                              rec.mld_stdmelding_key);
            END;
         END IF;
      ELSE
         -- de standaardmelding is null. De aanpassingen gelden dus voor alle meldingen die niet in de lijst voorkomen.
         IF rec.alg_srtruimte_key IS NULL
         THEN
            -- deze melding is gelijk voor alle ruimtesoorten. We gaan dit dus bij de stdmelding aanpassen.
            FOR rec_std
               IN (SELECT *
                     FROM mld_stdmelding std
                    WHERE std.mld_ins_discipline_key = rec.mld_discipline_key
                      AND std.mld_stdmelding_verwijder IS NULL
                      AND std.mld_stdmelding_key NOT IN
                                (SELECT i.mld_stdmelding_key
                                   FROM pcha_imp_storing_regime i
                                  WHERE COALESCE (i.mld_stdmelding_key, -1) =
                                           std.mld_stdmelding_key))
            LOOP
               v_errormsg := 'Zoeken stdmelding';

               SELECT std.mld_stdmelding_t_uitvoertijd.tijdsduur tijdsduur,
                      std.mld_stdmelding_t_uitvoertijd.eenheid eenheid,
                      COALESCE (mld_stdmelding_malusbasis, 0)
                         mld_stdmelding_malusbasis,
                      COALESCE (mld_stdmelding_malus, 0) mld_stdmelding_malus,
                      mld_stdmelding_omschrijving
                 INTO v_tijdsduur,
                      v_eenheid,
                      v_basiskorting,
                      v_varkorting,
                      v_stdmelding_omschrijving
                 FROM mld_stdmelding std
                WHERE std.mld_stdmelding_key = rec_std.mld_stdmelding_key;

               IF v_tijdsduur <> rec.tijdsduur
               OR v_eenheid <> rec.eenheid
               OR v_basiskorting <> rec.bk
               OR v_varkorting <> rec.vk
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'I',
                        'Gewijzigd stdm2 ('
                     || rec.r_codering
                     || '-'
                     || rec.vakgroep
                     || '/'
                     || v_stdmelding_omschrijving
                     || ')',
                        v_tijdsduur
                     || ' '
                     || v_eenheid
                     || ' '
                     || v_basiskorting
                     || '-'
                     || v_varkorting
                     || ' -> '
                     || rec.tijdsduur
                     || ' '
                     || rec.eenheid
                     || ' '
                     || rec.bk
                     || '-'
                     || rec.vk);

                  v_errormsg := 'Aanpassen stdmelding';

                  UPDATE mld_stdmelding
                     SET mld_stdmelding_t_uitvoertijd =
                            mld_t_uitvoertijd (rec.tijdsduur, rec.eenheid),
                         mld_stdmelding_malus = rec.vk,
                         mld_stdmelding_malusbasis = rec.bk
                   WHERE mld_stdmelding_key = rec_std.mld_stdmelding_key;
               END IF;
            END LOOP;
         ELSE
            -- Ruimte is gevuld maar standaardmelding niet. We gaan nu voor alle bestaande standaardmeldingen en ruimtesoorten mld_stdmsrtruimte records aanmaken of bijwerken.
            FOR rec_stdsr
               IN (SELECT std.mld_stdmelding_key,
                          std.mld_stdmelding_omschrijving,
                          stdmsr.mld_stdmsrtruimte_t_uitvtijd.tijdsduur
                             tijdsduur,
                          stdmsr.mld_stdmsrtruimte_t_uitvtijd.eenheid eenheid,
                          COALESCE (mld_stdmsrtruimte_malusbasis, 0)
                             mld_stdmsrtruimte_malusbasis,
                          COALESCE (mld_stdmsrtruimte_malus, 0)
                             mld_stdmsrtruimte_malus,
                          mld_stdmsrtruimte_key
                     FROM mld_stdmelding std,
                          (SELECT *
                             FROM mld_stdmsrtruimte
                            WHERE alg_srtruimte_key = rec.alg_srtruimte_key)
                          stdmsr
                    WHERE std.mld_ins_discipline_key = rec.mld_discipline_key
                      AND std.mld_stdmelding_verwijder IS NULL
                      AND std.mld_stdmelding_key =
                             stdmsr.mld_stdmelding_key(+))
            LOOP
               v_tijdsduur := rec_stdsr.tijdsduur;
               v_eenheid := rec_stdsr.eenheid;
               v_basiskorting := rec_stdsr.mld_stdmsrtruimte_malusbasis;
               v_varkorting := rec_stdsr.mld_stdmsrtruimte_malus;
               v_stdmelding_omschrijving :=
                  rec_stdsr.mld_stdmelding_omschrijving;
               v_stdmsrtruimte_key := rec_stdsr.mld_stdmsrtruimte_key;

               IF rec_stdsr.mld_stdmsrtruimte_key IS NOT NULL
               THEN
                  -- Update
                  IF v_tijdsduur <> rec.tijdsduur
                  OR v_eenheid <> rec.eenheid
                  OR v_basiskorting <> rec.bk
                  OR v_varkorting <> rec.vk
                  THEN
                     fac.imp_writelog (
                        p_import_key,
                        'I',
                           'Gewijzigd stdmsr2(' || v_stdmsrtruimte_key || '*'
                        || rec.r_codering
                        || '-'
                        || rec.vakgroep
                        || '/'
                        || v_stdmelding_omschrijving
                        || ')',
                           v_tijdsduur
                        || ' '
                        || v_eenheid
                        || ' '
                        || v_basiskorting
                        || '-'
                        || v_varkorting
                        || ' -> '
                        || rec.tijdsduur
                        || ' '
                        || rec.eenheid
                        || ' '
                        || rec.bk
                        || '-'
                        || rec.vk);

                     v_errormsg := 'Aanpassen stdmsrtruimte';

                     UPDATE mld_stdmsrtruimte
                        SET mld_stdmsrtruimte_t_uitvtijd =
                               mld_t_uitvoertijd (rec.tijdsduur, rec.eenheid),
                            mld_stdmsrtruimte_malus = rec.vk,
                            mld_stdmsrtruimte_malusbasis = rec.bk
                      WHERE mld_stdmsrtruimte_key = v_stdmsrtruimte_key;
                  END IF;
               ELSE
                  -- Insert
                  fac.imp_writelog (
                     p_import_key,
                     'I',
                        'Toegevoegd ('
                     || rec.r_codering
                     || '-'
                     || rec.vakgroep
                     || '/'
                     || v_stdmelding_omschrijving
                     || ')',
                        rec.tijdsduur
                     || ' '
                     || rec.eenheid
                     || ' '
                     || rec.bk
                     || '-'
                     || rec.vk);

                  v_errormsg := 'Toevoegen stdmsrtruimte';

                  INSERT INTO mld_stdmsrtruimte (mld_stdmsrtruimte_t_uitvtijd,
                                                 mld_stdmsrtruimte_malus,
                                                 mld_stdmsrtruimte_malusbasis,
                                                 alg_srtruimte_key,
                                                 mld_stdmelding_key)
                      VALUES (mld_t_uitvoertijd (rec.tijdsduur, rec.eenheid),
                              rec.vk,
                              rec.bk,
                              rec.alg_srtruimte_key,
                              rec_stdsr.mld_stdmelding_key);
               END IF;
            END LOOP;
         END IF;
      END IF;
   END LOOP;

   FOR rec IN c_del
   LOOP
      fac.imp_writelog (
         p_import_key,
         'I',
            'Verwijderd ('
         || rec.alg_srtruimte_code
         || '-'
         || rec.ins_discipline_omschrijving
         || '/'
         || rec.mld_stdmelding_omschrijving
         || ')',
         NULL);

      DELETE mld_stdmsrtruimte WHERE mld_stdmsrtruimte_key = rec. mld_stdmsrtruimte_key;

   END LOOP;

   -- Als de hersteltijd per ruimtesoort geldt dan moeten we de vlag afhankelijk ook zetten bij de stdmelding.
   UPDATE mld_stdmelding std
      SET mld_stdmelding_afhankelijk =
             (SELECT DECODE (COUNT ( * ), 0, 0, 1)
                FROM mld_stdmsrtruimte sr
               WHERE sr.mld_stdmelding_key = std.mld_stdmelding_key);

   -- Als er een uitsplitsing is naar ruimtesoort dan moeten we toch de default uitvoertijd bij de stdmelding
   -- invullen. Anders wordt de verkeerde eenheid bij respijt getoond.
   FOR rec IN c_upd_std
   LOOP
      UPDATE mld_stdmelding
         SET mld_stdmelding_t_uitvoertijd = mld_t_uitvoertijd (rec.tijdsduur, rec.eenheid)
       WHERE mld_stdmelding_key = rec.mld_stdmelding_key;
   END LOOP;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      v_aanduiding := v_errormsg || ' - ' || v_aanduiding;
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
         'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        SUBSTR (v_errormsg, 1, 1000),
                        v_aanduiding);
END;
/

CREATE OR REPLACE PROCEDURE pcha_import_kenmerken (
   p_import_key IN NUMBER)
AS
   CURSOR c_cursor
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;

   v_newline                 VARCHAR2(1000);
   v_aanduiding              VARCHAR2(1000);                   -- Import line
   v_fielddelimitor          VARCHAR2(1);                  -- Field seperator
   v_errormsg                VARCHAR(200);
   v_errorhint               VARCHAR(200);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2(200);
   header_found              BOOLEAN;
   v_error                   NUMBER(1);
   v_dummy                   VARCHAR2(100);
   -- De importvelden
   v_stdmelding              VARCHAR2(100);
   v_vakgroep                VARCHAR2(100);
   v_vakgroeptype            VARCHAR2(100);
   v_kenmerk                 VARCHAR2(100);
   v_usrtab_omschrijving     VARCHAR2(30);
   v_stdmelding_key          NUMBER;
   v_discipline_key          NUMBER;
   v_srtdiscipline_key       NUMBER;


BEGIN
   -- Init
   header_found := FALSE;
   v_fielddelimitor := ';';

   -- Clear my previous imported rows
   DELETE FROM pcha_imp_kenmerken;

   FOR rec1 IN c_cursor
   LOOP
      BEGIN
         v_newline := REPLACE(rec1.fac_imp_file_line, CHR(160), ' ');
         v_aanduiding := SUBSTR (v_newline, 1, 200);
         v_error := 0;

         IF SUBSTR (v_newline, 1, 3) = '?'
         THEN
            -- EF BB BF aangetroffen
            fac.imp_writelog (p_import_key,
                              'W',
                              'Byte Order Mark aangetroffen',
                              'Bestand heeft onbehandeld UTF-8 formaat.');
            v_newline := SUBSTR (v_newline, 4);
         END IF;

         v_errormsg := 'Inlezen velden';
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);       -- OS code
         fac.imp_getfield (v_newline, v_fielddelimitor, v_vakgroep);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_stdmelding);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_kenmerk);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_vakgroeptype);

         -- Skip until a valid header is found
         v_errormsg := 'Controleer de header';

         IF UPPER (rec1.fac_imp_file_line) LIKE
               'OS_CODE;VAKGROEP;STANDAARDMELDING;ONDERDEEL;GROEP;VAKGROEPTYPE%'
         THEN
            -- Sla de kopregel over.
            header_found := TRUE;
         ELSIF (header_found AND v_vakgroep IS NOT NULL)
         THEN
             v_errormsg := 'Controleer vakgroeptype';

            BEGIN
               v_vakgroeptype := TRIM(v_vakgroeptype);
               SELECT ins_srtdiscipline_key
                 INTO v_srtdiscipline_key
                 FROM ins_srtdiscipline sd
                WHERE sd.ins_srtdiscipline_module = 'MLD'
                  AND sd.ins_srtdiscipline_verwijder IS NULL
                  AND UPPER (sd.ins_srtdiscipline_omschrijving) =
                         UPPER (v_vakgroeptype);
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     'Vakgroeptype niet gevonden:  ' || v_vakgroeptype,
                     v_aanduiding);
                  v_srtdiscipline_key := NULL;
                  v_error := 1;
            END;

            v_errormsg := 'Controleer vakgroep';

            BEGIN
               v_vakgroep := TRIM(v_vakgroep);
               SELECT ins_discipline_key
                 INTO v_discipline_key
                 FROM ins_tab_discipline d
                WHERE d.ins_discipline_module = 'MLD'
                  AND d.ins_discipline_verwijder IS NULL
                  AND d.ins_srtdiscipline_key = v_srtdiscipline_key
                  AND UPPER (d.ins_discipline_omschrijving) =
                         UPPER (v_vakgroep);
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     'Vakgroep niet gevonden:  ' || v_vakgroep,
                     v_aanduiding);
                  v_discipline_key := NULL;
                  v_error := 1;
            END;

            v_usrtab_omschrijving := SUBSTR(v_vakgroeptype,1,2) || '/' || SUBSTR(v_vakgroep,1,6) || '/' || SUBSTR(v_stdmelding,1,6);
            v_errormsg := 'Controleer stdmelding';

            IF v_stdmelding IS NOT NULL
            THEN
               v_stdmelding := SUBSTR(TRIM(v_stdmelding),1,60);
               BEGIN
                  SELECT mld_stdmelding_key
                    INTO v_stdmelding_key
                    FROM mld_stdmelding std
                   WHERE std.mld_stdmelding_verwijder IS NULL
                     AND std.mld_ins_discipline_key = v_discipline_key
                     AND UPPER (std.mld_stdmelding_omschrijving) =
                            UPPER (v_stdmelding);
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     fac.imp_writelog (
                        p_import_key,
                        'E',
                        'Standaard melding niet gevonden:  ' || v_stdmelding,
                        v_aanduiding);
                     v_stdmelding_key := NULL;
                     v_error := 1;
               END;
            ELSE
               v_stdmelding_key := NULL;
            END IF;

            IF v_error = 0
            THEN
               INSERT INTO pcha_imp_kenmerken (mld_stdmelding_key,
                                               fac_usrtab_omschrijving,
                                               fac_usrdata_omschrijving)
                   VALUES (v_stdmelding_key,
                           v_usrtab_omschrijving,
                           SUBSTR(v_kenmerk,1,60));
            END IF;

            COMMIT;
         END IF;
         END;
      END loop;

      IF NOT header_found
      THEN
         fac.imp_writelog (
            p_import_key,
            'E',
            'Geen geldige header aangetroffen',
            'Bestand is geen geldig kenmerken importbestand.');
      END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      v_aanduiding := v_errormsg || ' - ' || v_aanduiding;
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', SUBSTR (v_errormsg, 1, 1000), v_aanduiding);
      -- maak de importtabel leeg om te voorkomen dat er halve bestanden ingelezen worden.
      DELETE FROM pcha_imp_kenmerken;
END;
/

CREATE OR REPLACE PROCEDURE pcha_update_kenmerken (p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT * FROM pcha_imp_kenmerken;

   v_aanduiding                VARCHAR2 (1000);                                       -- Import line
   v_errormsg                  VARCHAR (200);
   v_errorhint                 VARCHAR (200);
   oracle_err_num              NUMBER;
   oracle_err_mes              VARCHAR2 (200);
   v_usrtab_key                fac_usrtab.fac_usrtab_key%TYPE;
   v_usrdata_key               fac_usrdata.fac_usrdata_key%TYPE;
   v_kenmerkdomein_key         fac_kenmerkdomein.fac_kenmerkdomein_key%TYPE;
   v_srtkenmerk_key            mld_srtkenmerk.mld_srtkenmerk_key%TYPE;
   v_kenmerk_key               mld_kenmerk.mld_kenmerk_key%TYPE;
   v_srtkenmerk_omschrijving   mld_srtkenmerk.mld_srtkenmerk_omschrijving%TYPE;
BEGIN
   FOR rec IN c
   LOOP
      v_aanduiding :=
            rec.mld_stdmelding_key
         || '-'
         || rec.fac_usrtab_omschrijving
         || '/'
         || rec.fac_usrdata_omschrijving;

      IF rec.mld_stdmelding_key IS NOT NULL
      THEN
         v_errorhint := 'Toevoegen of bepalen fac_usrtab';

         BEGIN
            SELECT fac_usrtab_key
              INTO v_usrtab_key
              FROM fac_usrtab
             WHERE fac_usrtab_naam = rec.fac_usrtab_omschrijving;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               INSERT INTO fac_usrtab (fac_usrtab_naam, fac_usrtab_omschrijving)
                   VALUES (rec.fac_usrtab_omschrijving, rec.fac_usrtab_omschrijving)
                RETURNING fac_usrtab_key
                     INTO v_usrtab_key;
         END;

         v_errorhint := 'Toevoegen of bepalen fac_kenmerkdomein';

         BEGIN
            SELECT fac_kenmerkdomein_key
              INTO v_kenmerkdomein_key
              FROM fac_kenmerkdomein
             WHERE fac_kenmerkdomein_verwijder IS NULL
               AND fac_kenmerkdomein_module = 'MLD'
               AND fac_usrtab_key = v_usrtab_key;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               INSERT INTO fac_kenmerkdomein (fac_kenmerkdomein_omschrijving,
                                              fac_kenmerkdomein_module,
                                              fac_kenmerkdomein_kolomnaam,
                                              fac_kenmerkdomein_kolomtxt,
                                              fac_kenmerkdomein_objectnaam,
                                              fac_usrtab_key)
                   VALUES (rec.fac_usrtab_omschrijving,
                           'MLD',
                           'FAC_USRDATA_KEY',
                           'FAC_USRDATA_OMSCHR',
                           'FAC_USRDATA',
                           v_usrtab_key)
                RETURNING fac_kenmerkdomein_key
                     INTO v_kenmerkdomein_key;
         END;

         v_errorhint := 'Toevoegen of bepalen srtkenmerk_omschrijving';

        SELECT SUBSTR('Type ' || ins_srtdiscipline_prefix || ':' || ins_discipline_omschrijving || '/' || mld_stdmelding_omschrijving, 1, 50)
           INTO v_srtkenmerk_omschrijving
           FROM mld_discipline d, mld_stdmelding std, ins_srtdiscipline sd
          WHERE d.ins_discipline_key = std.mld_ins_discipline_key
            AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
            AND std.mld_stdmelding_key = rec.mld_stdmelding_key;

         v_errorhint := 'Toevoegen of bepalen mld_srtkenmerk';

         BEGIN
            SELECT mld_srtkenmerk_key
              INTO v_srtkenmerk_key
              FROM mld_srtkenmerk
             WHERE mld_srtkenmerk_verwijder IS NULL
               AND fac_kenmerkdomein_key = v_kenmerkdomein_key
               AND mld_srtkenmerk_omschrijving = v_srtkenmerk_omschrijving;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               INSERT INTO mld_srtkenmerk (mld_srtkenmerk_omschrijving,
                                           mld_srtkenmerk_kenmerktype,
                                           fac_kenmerkdomein_key)
                   VALUES (v_srtkenmerk_omschrijving, 'R', v_kenmerkdomein_key)
                RETURNING mld_srtkenmerk_key
                     INTO v_srtkenmerk_key;
         END;

         v_errorhint := 'Toevoegen of bepalen mld_kenmerk';

         BEGIN
            SELECT mld_kenmerk_key
              INTO v_kenmerk_key
              FROM mld_kenmerk
             WHERE mld_kenmerk_verwijder IS NULL AND mld_srtkenmerk_key = v_srtkenmerk_key;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               INSERT INTO mld_kenmerk (mld_srtkenmerk_key,
                                        mld_stdmelding_key,
                                        mld_kenmerk_niveau,
                                        mld_kenmerk_volgnummer)
                   VALUES (v_srtkenmerk_key,
                           rec.mld_stdmelding_key,
                           'S',
                           400)
                RETURNING mld_kenmerk_key
                     INTO v_kenmerk_key;
         END;

         v_errorhint := 'Toevoegen of bepalen fac_usrdata';

         BEGIN
            SELECT fac_usrdata_key
              INTO v_usrdata_key
              FROM fac_usrdata
             WHERE fac_usrdata_code = SUBSTR (rec.fac_usrdata_omschrijving, 1, 40)
               AND fac_usrtab_key = v_usrtab_key;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               INSERT INTO fac_usrdata (fac_usrtab_key, fac_usrdata_code, fac_usrdata_omschr)
                   VALUES (v_usrtab_key, SUBSTR (rec.fac_usrdata_omschrijving, 1, 40), rec.fac_usrdata_omschrijving)
                RETURNING fac_usrdata_key
                     INTO v_usrdata_key;
         END;
      --------------------------- Kenmerk toevoegen aan stdmelding ---------------------------
      END IF;
   END LOOP;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      v_aanduiding := v_errormsg || ' - ' || v_aanduiding;
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        SUBSTR (v_errormsg, 1, 1000),
                        v_aanduiding || ' - ' || v_errorhint);
END;
/


CREATE OR REPLACE PROCEDURE pcha_import_mld (p_import_key IN NUMBER)
AS
BEGIN
   -- Verwijder nbsp karakters.
   UPDATE fac_imp_file
      SET fac_imp_file_line = REPLACE (fac_imp_file_line, CHR (160), ' ')
    WHERE fac_import_key = p_import_key;

   fac_import_mld (p_import_key);

   UPDATE fac_imp_mld SET mld_stdmelding_groep = TRIM(mld_stdmelding_groep);
END;
/

CREATE OR REPLACE PROCEDURE pcha_update_mld (p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT i.*,
             sd.ins_srtdiscipline_key,
             d.ins_discipline_key,
             std.mld_stdmelding_key
        FROM fac_imp_file i,
             ins_tab_discipline d,
             ins_srtdiscipline sd,
             mld_stdmelding std
       WHERE sd.ins_srtdiscipline_key = d.ins_srtdiscipline_key
         AND d.ins_discipline_key = std.mld_ins_discipline_key
         AND i.fac_imp_file_line LIKE
                   ins_srtdiscipline_omschrijving
                || ';%;'
                || ins_discipline_omschrijving
                || ';'
                || mld_stdmelding_omschrijving
                || ';%'
         AND mld_stdmelding_verwijder IS NULL
         AND ins_discipline_verwijder IS NULL
         AND sd.ins_srtdiscipline_verwijder IS NULL
         AND fac_import_key = p_import_key;

   v_aanduiding     VARCHAR2 (400);
   v_errormsg       VARCHAR (200);
   v_errorhint      VARCHAR (200);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_regime         VARCHAR2 (40);
BEGIN
   fac_update_mld (p_import_key);

   FOR rec IN c
   LOOP
      BEGIN
         fac.imp_getfield_nr (rec.fac_imp_file_line, ';', 20, v_regime);
         DBMS_OUTPUT.put_line (v_regime);
         IF v_regime LIKE '%24%'
         THEN
            -- 24/7
            UPDATE mld_stdmelding SET mld_stdmelding_regime = 3 WHERE mld_stdmelding_key = rec.mld_stdmelding_key;
         ELSE
            -- Openingstijden
            UPDATE mld_stdmelding SET mld_stdmelding_regime = 2 WHERE mld_stdmelding_key = rec.mld_stdmelding_key;
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.put_line ('Fout bij bepalen regime uit melding: ' || rec.fac_imp_file_line);
      END;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      v_aanduiding := v_errormsg || ' - ' || v_aanduiding;
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        SUBSTR (v_errormsg, 1, 1000),
                        v_aanduiding);
END;
/

-- View om de uitnutting van SVD grafisch weer te geven op de portal
CREATE OR REPLACE FORCE VIEW pcha_v_rap_svd_budget (svd_type, omschrijving, bedrag)
AS
     SELECT svd_type, 'Budget' omschrijving, u.fac_usrdata_prijs - SUM (index_totaal) bedrag
       FROM pchx_v_rap_svd s, fac_usrdata u
      WHERE s.svd_type = u.fac_usrdata_code AND TRUNC (datum, 'Y') = TRUNC (SYSDATE, 'Y')
   GROUP BY u.fac_usrdata_prijs, svd_type
   UNION ALL
     SELECT svd_type, 'Uitnutting', SUM (index_totaal) bedrag
       FROM pchx_v_rap_svd s, fac_usrdata u
      WHERE s.svd_type = u.fac_usrdata_code AND TRUNC (datum, 'Y') = TRUNC (SYSDATE, 'Y')
   GROUP BY u.fac_usrdata_prijs, svd_type;

-- Rapport om SVD's goed te keuren door contractteam
CREATE OR REPLACE VIEW pcha_v_goedkeuring_svd
AS
SELECT pf.prs_perslid_naam_full,
       m.prs_perslid_key,
       o.mld_melding_key,
       mld_opdr_key,
       o.mld_opdr_bedrijfopdr_volgnr,
       m.mld_melding_onderwerp,
          sd.ins_srtdiscipline_prefix
       || m.mld_melding_key
       || '/'
       || o.mld_opdr_bedrijfopdr_volgnr
           id
  FROM mld_opdr                     o,
       mld_melding                  m,
       prs_v_perslid_fullnames_all  pf,
       mld_stdmelding               std,
       mld_discipline               d,
       ins_srtdiscipline            sd
 WHERE     o.mld_typeopdr_key = 161                                     -- SVD
       AND o.mld_statusopdr_key = 9                                -- afgerond
       AND m.mld_melding_key = o.mld_melding_key
       AND m.prs_perslid_key = pf.prs_perslid_key
       AND m.mld_stdmelding_key = std.mld_stdmelding_key
       AND std.mld_ins_discipline_key = d.ins_discipline_key
       AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
       AND NOT EXISTS
               (SELECT mld_kenmerkopdr_key
                  FROM mld_kenmerkopdr ko
                 WHERE     ko.mld_kenmerk_key = 281 -- goedgekeurd door aanvrager
                       AND ko.mld_opdr_key = o.mld_opdr_key);

-- Rapport met de diverse indexeringen
CREATE OR REPLACE VIEW pcha_v_rap_indexering
(
   omschrijving,
   jaar,
   jaar_1,
   jaar_2
)
AS
   SELECT omschrijving,
          ROUND (pchx_mon.get_index_value (SYSDATE, module), 7) jaar,
          ROUND (pchx_mon.get_index_value (ADD_MONTHS (SYSDATE, -12), module), 7) jaar_1,
          ROUND (pchx_mon.get_index_value (ADD_MONTHS (SYSDATE, -24), module), 7) jaar_2
     FROM (SELECT 'MON' module, 'Monitoring' omschrijving FROM DUAL
           UNION ALL
           SELECT 'SCH', 'Schoonmaak' FROM DUAL
           UNION ALL
           SELECT 'BEV', 'Beveiliging' FROM DUAL
           UNION ALL
           SELECT 'GLA', 'Gladheidsbestrijding' FROM DUAL);

-- Rapportage om de releatie tussen het bericht uit het GBS en de standaardmelding
-- in Facilitor zichtbaar te maken.
CREATE OR REPLACE VIEW pcha_v_rap_gbs_storing_def
(
   gbs_melding,
   vakgroeptype,
   vakgroep,
   melding
)
AS
   SELECT fac_usrdata_code,
          sd.ins_srtdiscipline_omschrijving,
          d.ins_discipline_omschrijving,
          mld_stdmelding_omschrijving
     FROM fac_usrdata ud,
          mld_stdmelding std,
          mld_discipline d,
          ins_srtdiscipline sd
    WHERE ud.fac_usrdata_verwijder IS NULL
      AND ud.fac_usrtab_key = 221
      AND TRUNC (ud.fac_usrdata_prijs) = std.mld_stdmelding_key
      AND std.mld_ins_discipline_key = d.ins_discipline_key
      AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key;

-- Rapport om problemen met de GBS koppeling inzichtelijk te maken.
CREATE OR REPLACE VIEW pcha_v_gbs_logging
AS
    SELECT *
      FROM imp_log
     WHERE     imp_log_applicatie = 'PROCESSEMAIL'
           AND imp_log_datum > TO_DATE ('20171001', 'yyyymmdd');

-- Koppeling met Gebouw beheer systeem (GBS). Storingen komen via de mail binnen volgens
-- vastgesteld formaat.
CREATE OR REPLACE PROCEDURE pcha_processemail (pfrom        IN VARCHAR2,
                                               pto          IN VARCHAR2,
                                               psubject     IN VARCHAR2,
                                               pbody        IN VARCHAR2,
                                               psessionid   IN VARCHAR2,
                                               puserkey     IN NUMBER DEFAULT NULL)
AS
   v_sender                    prs_perslid.prs_perslid_key%TYPE;
   v_melding_key               mld_melding.mld_melding_key%TYPE;
   v_stdmelding_key            mld_stdmelding.mld_stdmelding_key%TYPE;
   v_stdmelding_omschrijving   mld_stdmelding.mld_stdmelding_omschrijving%TYPE;
   v_discipline_omschrijving   ins_tab_discipline.ins_discipline_omschrijving%TYPE;
   errormsg                    fac_result.fac_result_waarde%TYPE;
   v_uitvoertijd               mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE;
   v_srtruimte_key             alg_srtruimte.alg_srtruimte_key%TYPE;
   v_onderwerp                 mld_melding.mld_melding_onderwerp%TYPE;
   v_omschrijving              mld_melding.mld_melding_omschrijving%TYPE;
   v_melding_status            mld_melding.mld_melding_status%TYPE;
   v_ruimte                    alg_ruimte.alg_ruimte_nr%TYPE;
   v_ruimte_key                alg_ruimte.alg_ruimte_key%TYPE;
   v_locatie_key               alg_locatie.alg_locatie_key%TYPE;
   v_datum                     VARCHAR2 (100);
   v_tijdstip                  VARCHAR2 (100);
   v_status                    VARCHAR2 (100);
   v_installatiecode           VARCHAR2 (100);
   v_date                      DATE;
   v_sync_bericht6             NUMBER;
   v_sync_bericht8             NUMBER;
   v_count                     NUMBER;
   v_error                     NUMBER;
   v_errormsg                  VARCHAR2 (100);
   v_inuit                     VARCHAR2 (100);
   v_newline                   VARCHAR2 (4000);
   v_tag                       VARCHAR2 (4000);
   v_value                     VARCHAR2 (4000);
   v_from                      VARCHAR2 (4000);
   v_body                      VARCHAR2 (4000);
   v_pos                       NUMBER;
BEGIN
   errormsg := '(0x143)';
   v_error := 0;
   v_errormsg := '';
   v_sync_bericht6 := 0;
   v_sync_bericht8 := 0;

   -- Verwijder de Bounce Address Tag Validation
   IF pfrom LIKE 'prvs=%'
   THEN
      v_from := SUBSTR (pfrom, INSTR (pfrom, '=', -1) + 1);
   ELSE
      v_from := pfrom;
   END IF;

   v_body := pbody;

   --   DBMS_OUTPUT.PUT_LINE('v_from: '||v_from);

   -- afzender van een gbs bericht is altijd 104 (Key van gebruiker Gebouwbeheersysteem GBS)
   v_sender := 104;

   CASE
      WHEN UPPER (pto) LIKE 'GBS@%'
      THEN
         errormsg := '(0x145)';


         -- filter nu de essentiele velden uit de mailbody
         -- vervang cr door lf
         -- MOETEN WE EEN FALLBACK STDMELDING KEY DEFINIEREN??????????????????????
         v_stdmelding_key := fac.safe_to_number (fac.getsetting ('defaultstdmelding'));

         v_body := REPLACE (v_body, CHR (13), CHR (10));
         -- verwijder dubbele lf's
         v_body := REPLACE (v_body, CHR (10) || CHR (10), CHR (10));
         v_omschrijving := v_body;
         errormsg := '(0x1451)';

         WHILE LENGTH (v_body) <> 0
         LOOP
            fac.imp_getfield (v_body, CHR (10), v_newline);
            fac.imp_getfield (v_newline, ':', v_tag);
            --fac.imp_getfield (v_newline, ':', v_value);
            v_value := v_newline;
            v_tag := UPPER (TRIM (v_tag));

            --               fac.writelog ('PROCESSEMAIL',
            --                             'I',
            --                            'tag: ' || v_tag || ' value: ' || v_value,
            --                             NULL);
            errormsg := '(0x1452)';

            CASE v_tag
               WHEN 'MELDINGSTEKST'
               THEN
                  v_onderwerp := SUBSTR (v_value, 1, 60);
                  errormsg := '(0x1453)';

                  -- Eerst even kijken naar de sync berichten
                  CASE TRIM (UPPER (v_value))
                     WHEN 'TESTFMISTC8'
                     THEN
                        v_sync_bericht8 := 1;
                        v_error := 0;
                        EXIT;
                     WHEN 'TESTFMISTC6'
                     THEN
                        v_sync_bericht6 := 1;
                        v_error := 0;
                        EXIT;
                     ELSE
                        v_stdmelding_omschrijving := 'Onbekend';
                  END CASE;

                  errormsg := '(0x1454)';
                  BEGIN
                     -- Zoek omschrijving op in eigen tabel met key 221
                     SELECT fac_usrdata_prijs
                       INTO v_stdmelding_key
                       FROM fac_usrdata
                      WHERE fac_usrdata_verwijder IS NULL
                        AND fac_usrdata_upper = TRIM (UPPER (v_value))
                        AND fac_usrtab_key = 221;

                     EXCEPTION
                     WHEN NO_DATA_FOUND
                     THEN
                        v_error := 1;
                        v_errormsg :=
                           'Standaard melding kan niet gevonden worden: '
                           || v_value;
                  END;
               WHEN 'INUIT'
               THEN
                  v_inuit := UPPER (TRIM (v_value));
               WHEN 'INSTALLATIEDEEL'
               THEN
                  -- plak er ' x' achter om er zeker van te zijn dat er een spatie in staat.
                  v_ruimte := UPPER(SUBSTR(TRIM (v_value), 1, INSTR(TRIM(v_value || ' x'), ' ')-1));
                  errormsg := '(0x1455)';

                  BEGIN
                     SELECT alg_ruimte_key, alg_locatie_key, alg_srtruimte_key
                       INTO v_ruimte_key, v_locatie_key, v_srtruimte_key
                       FROM alg_v_ruimte_gegevens
                      WHERE UPPER (alg_ruimte_nr) = v_ruimte;
                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        v_error := 1;
                        v_errormsg := 'Ruimte kan niet gevonden worden: ' || v_ruimte;
                  END;
               WHEN 'INSTALLATIECODE'
               THEN
                  v_installatiecode := TRIM (v_value);
               WHEN 'STATUS'
               THEN
                  v_status := TRIM (v_value);
               WHEN 'ONDERSTATION DATUM'
               THEN
                  v_datum := TRIM (v_value);
               WHEN 'ONDERSTATION TIJD'
               THEN
                  v_tijdstip := TRIM(v_value);
               ELSE
                  NULL;
            END CASE;
         END LOOP;

         IF v_error = 0 AND v_sync_bericht6 = 0 AND v_sync_bericht8 = 0
         THEN
            -- bepalen van de timestamp uit het emailbericht
            v_date := fac.safe_to_date(v_datum || ' ' || v_tijdstip, 'dd-mm-yyyy hh24:mi.ss');

            IF v_date IS NULL
            THEN
               v_date := SYSDATE;
            END IF;
            -- nu gaan we de hersteltijd bepalen
            errormsg := '(0x147)';

            BEGIN
               -- vind de uitvoertijd bij de ruimte specifieke sla
               SELECT mld_stdmsrtruimte_t_uitvtijd
                 INTO v_uitvoertijd
                 FROM mld_stdmsrtruimte
                WHERE alg_srtruimte_key = v_srtruimte_key AND mld_stdmelding_key = v_stdmelding_key;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  -- vind de uitvoertijd bij de stdmelding
                  SELECT mld_stdmelding_t_uitvoertijd
                    INTO v_uitvoertijd
                    FROM mld_stdmelding
                   WHERE mld_stdmelding_key = v_stdmelding_key;
            END;

            -- suggested extensions:
            -- check for MLDUSE-write autorisations
            -- parse the subject to find an appropriate stdmelding, if uniquely possible
            errormsg := '(0x148)';

            SELECT MIN (m.mld_melding_key), COUNT (m.mld_melding_key)
              INTO v_melding_key, v_count
              FROM mld_melding m, mld_kenmerkmelding km
             WHERE mld_stdmelding_key = v_stdmelding_key
               AND mld_alg_onroerendgoed_keys = v_ruimte_key
               AND mld_melding_status IN (0, 2, 3, 4, 7, 99) -- alles behalve 1=Afgewezen, 5= afgemeld, 6= historie
               AND km.mld_melding_key = m.mld_melding_key
               AND km.mld_kenmerk_key = 181
               AND km.mld_kenmerkmelding_waarde = v_installatiecode || ';' || v_status || ';' || v_onderwerp;

            IF UPPER (v_inuit) = 'IN'
            THEN
               IF v_count = 0
               THEN
                  errormsg := 'Melding kan niet aangemaakt worden (0x1481)';

                  INSERT INTO mld_melding (mld_melding_module,
                                           mld_meldbron_key,
                                           mld_melding_datum,
                                           mld_melding_onderwerp,
                                           mld_melding_omschrijving,
                                           mld_melding_status,
                                           mld_melding_t_uitvoertijd,
                                           mld_stdmelding_key,
                                           prs_perslid_key,
                                           prs_perslid_key_voor,
                                           prs_kostenplaats_key,
                                           mld_melding_spoed,
                                           mld_alg_locatie_key,
                                           mld_alg_onroerendgoed_keys)
                      VALUES ('MLD',
                              4,                                                            -- email
                              v_date,
                              v_onderwerp,
                              v_omschrijving,
                              NULL,
                              v_uitvoertijd,
                              v_stdmelding_key,
                              v_sender,
                              v_sender,
                              NULL,
                              3,
                              v_locatie_key,
                              v_ruimte_key)
                   RETURNING mld_melding_key
                        INTO v_melding_key;

                  errormsg := '(0x165)';
                  mld.setmeldingstatus (v_melding_key, 2, v_sender);

                  INSERT INTO mld_kenmerkmelding (mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde)
                     VALUES (v_melding_key, 181, v_installatiecode || ';' || v_status || ';' || v_onderwerp);

                  INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
                      VALUES (psessionid,
                              'maillog',
                              'Geregistreerd onder melding ' || v_melding_key);
               ELSE
                  INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
                      VALUES (psessionid, 'maillog', 'Melding bestaat al ' || v_melding_key);

                  v_error := 1;
                  v_errormsg := 'Melding bestaat al ' || v_melding_key;
               END IF;
            ELSE
               IF v_count = 1
               THEN
                  errormsg := '(0x1482)';

                  SELECT mld_melding_status
                    INTO v_melding_status
                    FROM mld_melding
                   WHERE mld_melding_key = v_melding_key;

                  -- Als status is nieuw of te accepteren dan eerst op geaccepteerd zetten.
                  IF v_melding_status = 2 OR v_melding_status = 3
                  THEN
                     -- melding op geaccepteerd zetten.
                     mld.setmeldingstatus (v_melding_key, 4, v_sender);
                  END IF;

                  -- nu de status op afgemeld zetten.
                  mld.setmeldingstatus (v_melding_key, 5, v_sender);

                  fac.backtrackaction('MLDAFM', v_melding_key , v_sender, v_date);

                  -- Vul het kenmerk Bedrijf (malus) met de waarde van Homij uit de eigen tabel
                  mld.upsertmeldingkenmerk (61, v_melding_key, 182);

                  INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
                      VALUES (psessionid,
                              'maillog',
                              'Melding ' || v_melding_key || ' is afgemeld, aantal gevonden ' || v_count || ' Details: ' || v_installatiecode || ';' || v_status || ';' || v_onderwerp);

               ELSE
                  INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
                      VALUES (psessionid,
                              'maillog',
                              'Melding niet uniek gevonden, aantal gevonden ' || v_count || ' Details: ' || v_installatiecode || ';' || v_status || ';' || v_onderwerp);

                  v_error := 1;
                  v_errormsg := 'Melding niet uniek gevonden, aantal gevonden ' || v_count || ' Details: ' || v_installatiecode || ';' || v_status || ';' || v_onderwerp;
               END IF;
            END IF;
         END IF;
   END CASE;

   IF v_error = 1
   THEN
      -- foutafhandeling
      fac.writelog ('PROCESSEMAIL',
                    'E',
                    v_errormsg,
                    SUBSTR (pbody, 1, 1000));
   ELSE
      IF v_sync_bericht6 = 1
      THEN
         UPDATE fac_usrdata
            SET fac_usrdata_vervaldatum = SYSDATE
          WHERE fac_usrdata_key = 41;
      ELSIF v_sync_bericht8 = 1
      THEN
         UPDATE fac_usrdata
            SET fac_usrdata_vervaldatum = SYSDATE
          WHERE fac_usrdata_key = 561;
      ELSE
         UPDATE fac_usrdata
            SET fac_usrdata_vervaldatum = SYSDATE
          WHERE fac_usrdata_key = 42;
      END IF;
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      --      DBMS_OUTPUT.PUT_LINE('Mail niet geaccepteerd: ' || 'OTHERS (error ' ||  SQLCODE  || '/' || SUBSTR (SQLERRM, 1, 100) || ')');
      INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde)
          VALUES (psessionid,
                  'maillog',
                  'Database fout - Neem contact op met uw systeembeheerder ' || errormsg);

      fac.writelog ('PROCESSEMAIL',
                    'E',
                    'Mail kon niet ingelezen worden afzender:' || pfrom || '[' || errormsg || ']',
                    'OTHERS (error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 100) || ')');
END;
/



--Klant specifieke view voor het tonen van het totaal korting per kwartaal per onderwerp
CREATE OR REPLACE VIEW pcha_v_totaal_korting_ond
(
    onderwerp,
    totaal_index,
    maand
)
AS
      SELECT onderwerp, SUM (totaal_index), TRUNC (gereed, 'MONTH')
        FROM (SELECT ins_discipline_omschrijving,
                     DECODE (
                         UPPER (ins_discipline_omschrijving),
                         'COMFORT', 'FTRC',
                         'FUNCTIONALITEIT', 'FTRC',
                         'TOEGANKELIJKHEID', 'FTRC',
                         'REPRESENTATIVITEIT', 'FTRC',
                         'VEILIGHEID ' || CHR (38) || ' GEZONDHEID', 'V' || CHR (38) || 'G',
                         'WET ' || CHR (38) || ' REGELGEVING', 'W' || CHR (38) || 'R',
                         'Dienst')
                         onderwerp,
                     totaal_index,
                     gereed
                FROM (SELECT melding_key,
                             COALESCE (gereed, SYSDATE) gereed,
                             totaal_index,
                             stdmelding_key,
                             indult
                        FROM pchx_v_monitoring
                      UNION ALL
                      SELECT melding_key,
                             gereed,
                             totaal_index,
                             stdmelding_key,
                             indult
                        FROM pchx_monitoring) m,
                     mld_discipline d,
                     mld_stdmelding std
               WHERE     m.stdmelding_key = std.mld_stdmelding_key
                     AND std.mld_ins_discipline_key = d.ins_discipline_key
                     AND indult = 'Nee'
                     AND totaal_index IS NOT NULL
                     AND totaal_index != 0
                     AND ADD_MONTHS(TRUNC(gereed, 'MONTH'),6) > SYSDATE)
    GROUP BY onderwerp, TRUNC (gereed, 'MONTH');

CREATE OR REPLACE VIEW pcha_melding_optijd
AS
    SELECT gereed,
           gbs,
           DECODE (SIGN (mld_melding_einddatum_std - gereed), -1, 0, 100)
               optijd
      FROM (SELECT m.*,
                   DECODE (prs_perslid_key, 104, 1, 0)               gbs,
                   fac.gettrackingdate ('MLDAFM', m.mld_melding_key) gereed
              FROM mld_melding m)
     WHERE gereed IS NOT NULL
       AND ADD_MONTHS(TRUNC(gereed, 'MONTH'),6) > SYSDATE;

-- Dashboard rapport voor nieuwe meldingen.
CREATE OR REPLACE VIEW pcha_v_dashboard_new
AS
    SELECT m.mld_melding_key,
           pf.prs_perslid_naam_full,
           mld_melding_datum,
           std.mld_stdmelding_omschrijving,
           d.ins_discipline_omschrijving
      FROM mld_melding              m,
           prs_perslid              p,
           prs_v_perslid_fullnames  pf,
           prs_afdeling             a,
           mld_stdmelding           std,
           ins_tab_discipline       d
     WHERE     m.prs_perslid_key = p.prs_perslid_key
           AND p.prs_perslid_naam <> 'Gebouwbeheersysteem GBS'
           AND p.prs_perslid_key = pf.prs_perslid_key
           AND p.prs_afdeling_key = a.prs_afdeling_key
           AND prs_afdeling_naam = 'GLD'
           AND m.mld_stdmelding_key = std.mld_stdmelding_key
           AND std.mld_ins_discipline_key = d.ins_discipline_key
           AND d.ins_srtdiscipline_key = 102
           AND mld_melding_status IN (2, 3);

------ payload end   ------

SET DEFINE OFF
BEGIN adm.systrackscriptId ('$Id$', 0); END;
/

COMMIT;
SET ECHO OFF
SPOOL OFF
SET DEFINE ON
PROMPT Logfile of this upgrade is: &fcltlogfile

