--
-- $Id$
--
-- Script containing customer specific configuration sql statements for PCHW: PCH Gemeente Westland

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

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 ------



CREATE OR REPLACE PROCEDURE pchw_import_perslid (p_import_key IN NUMBER)
AS
    v_seq_of_columns VARCHAR(255);
BEGIN

    v_seq_of_columns := '0;0;0;4;5;6;7;8;9;11;10;0;0;0;0;13;14;15;0;17;16;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46';
    prs.import_perslid(p_import_key, v_seq_of_columns, 'LOCATIECODE;GEBOUWCODE;BOUWLAAGVOLGNUMMER;RUIMTENUMMER;WERKPLEKVOLGNUMMER;OMSCHRIJVING;AFDELINGSCODE;PERSOONACHTERNAAM;TUSSENVOEGSEL;VOORLETTERS;VOORNAAM;TITEL/AANHEF;TELEFOONNUMMER;MOBIEL;EMAIL;FUNCTIE;PERSONEELSNUMMER;LOGINNAAM;PASSWORD%');

-- Het personeelsnummer gebruiken we ook als login. Inloggen via SSO vindt plaats op emailadres.
-- Doordat de import soms door Excel gehaald wordt zetten we zelf de voorloopnullen er weer in.
UPDATE fac_imp_perslid
   SET prs_perslid_oslogin = prs_perslid_nr,
       prs_perslid_nr = TO_CHAR (prs_perslid_nr, 'FM000000000');

END pchw_import_perslid;
/


CREATE OR REPLACE PROCEDURE pchw_update_perslid (
   p_import_key IN NUMBER
) IS

CURSOR c_del
IS
    SELECT p.prs_perslid_key, p.prs_perslid_nr, pf.prs_perslid_naam_full
      FROM fac_imp_perslid i, prs_perslid p, prs_v_perslid_fullnames_all pf
     WHERE p.prs_perslid_nr = i.prs_perslid_nr(+)
       AND pf.prs_perslid_key = p.prs_perslid_key
       AND p.prs_perslid_nr IS NOT NULL
       AND i.prs_perslid_nr IS NULL
       AND p.prs_perslid_verwijder IS NULL
    ORDER BY 2;

CURSOR c_imp
IS
   SELECT *
     FROM fac_imp_file
    WHERE fac_import_key = p_import_key;

v_perslid_key     NUMBER;
v_perslid_nr      VARCHAR2(100);
v_kostenplaats_nr VARCHAR2(100);
v_count           NUMBER;

BEGIN
	-- generic update

	SELECT count(*)
	  INTO v_count
	  FROM fac_imp_perslid;

	IF v_count < 500
	THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Het aantal te importeren personen is te klein ('
                        || TO_CHAR (v_count) || ')',
                        'Zie Specificatie'
      );
      RETURN;
	END IF;

  prs.update_perslid (p_import_key, 'NR', NULL);

  -- 2 maanden na het zetten van de uitdienst datum worden de medewerkers daadwerkelijk verwijderd.
  FOR rec IN c_del
  LOOP
     BEGIN
       prs.delete_perslid (p_import_key, rec.prs_perslid_key);
     END;
  END LOOP;

  INSERT INTO prs_perslidkostenplaats (prs_perslid_key, prs_perslidkostenplaats_boeken)
  SELECT prs_perslid_key, 1
    FROM prs_v_aanwezigperslid p
   WHERE NOT EXISTS (
       SELECT pk.prs_perslid_key
         FROM prs_perslidkostenplaats pk
        WHERE p.prs_perslid_key = pk.prs_perslid_key);

END pchw_update_perslid;
/


CREATE OR REPLACE PROCEDURE pchw_import_organisatie (p_import_key IN NUMBER)
AS
BEGIN
   fac_import_organisatie (p_import_key);
END pchw_import_organisatie;
/


CREATE OR REPLACE PROCEDURE pchw_update_organisatie (p_import_key IN NUMBER)
AS

   CURSOR c_del
   IS
      SELECT prs_afdeling_key, prs_afdeling_upper, prs_afdeling_omschrijving
        FROM prs_v_afdeling
       WHERE prs_afdeling_verwijder IS NULL
         AND prs_bedrijf_key = 121
         AND prs_afdeling_upper NOT IN (SELECT prs_afdeling_naam FROM fac_imp_organisatie)
         ORDER BY niveau DESC;

   CURSOR c_kpn
   IS
      SELECT b.prs_afdeling_key, a1.prs_kostenplaats_key, prs_afdeling_naam, prs_afdeling_omschrijving
        FROM prs_v_afdeling_boom b, prs_afdeling a1
       WHERE b.prs_bedrijf_key = 121               -- Gemeente Westland
         AND b.prs_afdeling_key1 = a1.prs_afdeling_key
         AND b.niveau <> 1;

BEGIN
   fac_update_organisatie (p_import_key);

   -- Vervallen afdeling proberen we te verwijderen
   FOR rec IN c_del
   LOOP
      BEGIN
         UPDATE prs_afdeling
            SET prs_afdeling_verwijder = SYSDATE
          WHERE prs_afdeling_key = rec.prs_afdeling_key;
      EXCEPTION
         WHEN OTHERS
         THEN
            fac.imp_writelog (p_import_key,
                              'W',
                              'Afdeling kan niet verwijderd worden:' || rec.prs_afdeling_key || ' Code:' || rec.prs_afdeling_upper || ' Omschrijving:' || rec.prs_afdeling_omschrijving,
                              '');
      END;
   END LOOP;

   -- aanpassen vqan kostenplaatsen bij afdelingen. De kostenplaatsen worden bij het top element vastgelegd.
   -- De kinderen moeten deze kostenplaats dus erven.
   FOR rec IN c_kpn
   LOOP
      BEGIN
         UPDATE prs_afdeling
            SET prs_kostenplaats_key = rec.prs_kostenplaats_key
          WHERE prs_afdeling_key = rec.prs_afdeling_key;
      EXCEPTION
         WHEN OTHERS
         THEN
           fac.imp_writelog (p_import_key,
                              'W',
                              'Kostenplaats kan niet aangepast worden: Code:' || rec.prs_afdeling_naam || ' Omschrijving:' || rec.prs_afdeling_omschrijving,
                              '');
      END;
   END LOOP;

END pchw_update_organisatie;
/


-- Importfuncties onroerendgoed vanaf verdieping.
CREATE OR REPLACE PROCEDURE pchw_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 pchw_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 pchw_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_dummy                   VARCHAR2(100);
   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_regime              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 pchw_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_regime);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);  -- regime eenheid
         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;HERSTELREGIME;REGIME EENHEID;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 pchw_imp_storing_regime (r_codering,
                                                    omschrijving,
                                                    ruimten,
                                                    storing_os,
                                                    stdmelding,
                                                    vakgroep,
                                                    vakgroeptype,
                                                    tht_os,
                                                    tht_regime,
                                                    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_regime,
                           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 pchw_imp_storing_regime;
END;
/

CREATE OR REPLACE PROCEDURE pchw_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,
             tht_regime,
             DECODE (tht_eenheid, 'UUR', 'U', 'MIN', 'U', 'DAG', 'D') eenheid,
             DECODE (tht_eenheid,
                     'UUR', tht,
                     'MIN', ROUND (tht / 60, 5),
                     'DAG', tht)
                tijdsduur
        FROM pchw_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 pchw_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 pchw_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 pchw_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);
   v_begin                     NUMBER;
   v_eind                      NUMBER;
   v_stdmelding_regime         NUMBER;
BEGIN
   SELECT COUNT ( * ) INTO v_count FROM pchw_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.tht_regime = '13'
      THEN
         v_begin := 7;
         v_eind := 20;
         v_stdmelding_regime := 2;    -- openingstijden
      ELSE
         v_begin := 0;
         v_eind := 24;
         v_stdmelding_regime := 3;   -- 24/7
      END IF;
      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,
                      mld_stdmelding_regime = v_stdmelding_regime
                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,
                         mld_stdmsrtruimte_beginuur1 = v_begin,
                         mld_stdmsrtruimte_einduur1 = v_eind
                   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,
                                                 mld_stdmsrtruimte_beginuur1,
                                                 mld_stdmsrtruimte_einduur1)
                      VALUES (mld_t_uitvoertijd (rec.tijdsduur, rec.eenheid),
                              rec.vk,
                              rec.bk,
                              rec.alg_srtruimte_key,
                              rec.mld_stdmelding_key,
                              v_begin,
                              v_eind);
            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 pchw_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,
                         mld_stdmelding_regime = v_stdmelding_regime
                   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,
                            mld_stdmsrtruimte_beginuur1 = v_begin,
                            mld_stdmsrtruimte_einduur1 = v_eind
                      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,
                                                 mld_stdmsrtruimte_beginuur1,
                                                 mld_stdmsrtruimte_einduur1)
                      VALUES (mld_t_uitvoertijd (rec.tijdsduur, rec.eenheid),
                              rec.vk,
                              rec.bk,
                              rec.alg_srtruimte_key,
                              rec_stdsr.mld_stdmelding_key,
                              v_begin,
                              v_eind);
               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 pchw_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 pchw_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;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 pchw_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 pchw_imp_kenmerken;
END;
/

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

   CURSOR c_hint
   IS
      SELECT std.mld_stdmelding_key, kd.fac_usrtab_key
        FROM mld_srtkenmerk sk,
             mld_kenmerk k,
             fac_kenmerkdomein kd,
             mld_stdmelding std
       WHERE mld_srtkenmerk_omschrijving LIKE 'Type %'
         AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
         AND sk.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key
         AND k.mld_stdmelding_key = std.mld_stdmelding_key;



   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;
   v_hint                      VARCHAR2 (4000);
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_discipline_omschrijving || '/' || mld_stdmelding_omschrijving, 1, 50)
           INTO v_srtkenmerk_omschrijving
           FROM mld_discipline d, mld_stdmelding std
          WHERE d.ins_discipline_key = std.mld_ins_discipline_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;

      END IF;
   END LOOP;

   FOR rec IN c_hint
   LOOP
      BEGIN
         SELECT listagg (u.fac_usrdata_omschr, ' ') WITHIN GROUP (ORDER BY u.fac_usrdata_omschr)
                   AS hint
           INTO v_hint
           FROM fac_usrdata u
          WHERE fac_usrtab_key = rec.fac_usrtab_key;

         UPDATE mld_stdmelding
            SET mld_stdmelding_hint = v_hint
          WHERE mld_stdmelding_key = rec.mld_stdmelding_key;
      END;
   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 pchw_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 pchw_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;
/


CREATE OR REPLACE PROCEDURE pchw_select_freeze_cat (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
   CURSOR c
   IS
      SELECT rra.res_rsv_artikel_key, rra.res_rsv_artikel_prijs
        FROM res_rsv_artikel rra, res_artikel ra
       WHERE     rra.res_artikel_key = ra.res_artikel_key
             AND SUBSTR (ra.res_artikel_groep, 1, 3) <> 'SVD'
             AND res_status_bo_key = 5
             AND res_rsv_artikel_levering < TRUNC (SYSDATE, 'MONTH')
             AND res_rsv_artikel_verwijder IS NULL;

   v_exportdate       DATE;
   v_lastexport       DATE;
   v_cat_totaal       NUMBER(11,2);
BEGIN
   v_exportdate := SYSDATE;
   v_cat_totaal := 0;
   -- Als ik deze maand al een freeze heb uitgevoerd dan mag ik dat niet nog een keer doen.
   SELECT MAX(res_rsv_artikel_verwerkt)
     INTO v_lastexport
     FROM res_rsv_artikel rra, res_artikel ra
    WHERE     rra.res_artikel_key = ra.res_artikel_key
          AND SUBSTR (ra.res_artikel_groep, 1, 3) <> 'SVD';

   IF TRUNC (v_lastexport, 'MONTH') <> TRUNC(v_exportdate, 'MONTH') OR v_lastexport IS NULL
   THEN
      FOR rec IN c
      LOOP
         BEGIN
            UPDATE res_rsv_artikel
               SET res_status_bo_key = 6
             WHERE res_rsv_artikel_key = rec.res_rsv_artikel_key;
            v_cat_totaal := v_cat_totaal + rec.res_rsv_artikel_prijs;
         END;
      END LOOP;

      INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_regel, fac_rapport_volgnr)
             VALUES ('FREEZE_CAT', 'Catering totaal: ' || v_cat_totaal, 1);

   ELSE
      INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_regel, fac_rapport_volgnr)
             VALUES ('FREEZE_CAT', 'Catering is al bevroren deze maand op ' || TO_CHAR(v_lastexport, 'dd-mm-yyyy hh24:mi:ss'), 1);
   END IF;

COMMIT;
END pchw_select_freeze_cat;
/

CREATE OR REPLACE PROCEDURE pchw_export_freeze_cat (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2,
   p_filedir    IN VARCHAR2,
   p_filename   IN VARCHAR2)
AS
BEGIN
   DELETE fac_rapport WHERE fac_rapport_node = 'FREEZE_CAT';
END;
/

CREATE OR REPLACE VIEW pchw_v_export_freeze_cat
( result,
  result_order)
AS
   SELECT fac_rapport_regel, fac_rapport_volgnr
     FROM fac_rapport
    WHERE fac_rapport_node = 'FREEZE_CAT';


CREATE OR REPLACE VIEW pchw_v_cat_factuur
(
    res_rsv_ruimte_nr,
    res_rsv_ruimte_omschrijving,
    res_rsv_ruimte_van,
    res_rsv_ruimte_bezoekers,
    res_rsv_ruimte_extern,
    prs_perslid_naam_full,
    prs_afdeling_omschrijving,
    fcl,
    res_discipline_omschrijving,
    res_rsv_artikel_aantal,
    res_rsv_artikel_omschrijving,
    res_rsv_artikel_prijs,
    res_artikel_groep,
    res_rsv_artikel_verwerkt,
    periode
)
AS
   SELECT rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr,
           res_rsv_ruimte_omschrijving,
           res_rsv_ruimte_van,
           res_rsv_ruimte_bezoekers,
           (SELECT fac.safe_to_number (res_kenmerkreservering_waarde)
              FROM res_kenmerkwaarde kw
             WHERE     kw.res_kenmerk_key = 22
                   AND kw.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key)
               extern,
           prs_perslid_naam_full,
           prs_afdeling_omschrijving,
           fcl.res_kenmerkreservering_waarde fcl,
           d.ins_discipline_omschrijving,
           rra.res_rsv_artikel_aantal,
           ra.res_artikel_omschrijving,
           res_rsv_artikel_prijs,
           DECODE (SUBSTR (ra.res_artikel_groep, 1, 3),
                   'SVD', 'SVD',
                   'Banqueting')
               groep,
           rra.res_rsv_artikel_verwerkt,
           TO_CHAR (
               ADD_MONTHS (TRUNC (rra.res_rsv_artikel_verwerkt, 'month'), -1),
               'YYYY-month')
               periode
      FROM res_rsv_artikel  rra,
           prs_perslid p,
           prs_v_perslid_fullnames pf,
           prs_afdeling a,
           (SELECT res_rsv_ruimte_key, res_kenmerkreservering_waarde
              FROM res_kenmerkwaarde kw, res_kenmerk k
             WHERE kw.res_kenmerk_key = k.res_kenmerk_key
               AND k.res_srtkenmerk_key = 23) fcl,            -- FCL
           res_artikel      ra,
           res_rsv_ruimte   rrr,
           res_discipline   d
     WHERE     rra.res_artikel_key = ra.res_artikel_key
           AND ra.res_discipline_key = d.ins_discipline_key
           AND rra.res_status_bo_key = 6
           AND rrr.res_rsv_ruimte_contact_key = p.prs_perslid_key
           AND p.prs_perslid_key = pf.prs_perslid_key
           AND p.prs_afdeling_key = a.prs_afdeling_key
           AND rrr.res_rsv_ruimte_key = fcl.res_rsv_ruimte_key(+)
           AND rra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key;

-- Procedure om mailberichten van meldingen buiten kantooruren toch in een melding op te kunnen slaan.
CREATE OR REPLACE PROCEDURE pchw_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;
   errormsg                    fac_result.fac_result_waarde%TYPE;
   v_uitvoertijd               mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE;
   v_ruimte_key                alg_ruimte.alg_ruimte_key%TYPE;
   v_locatie_key               alg_locatie.alg_locatie_key%TYPE;
   v_count                     NUMBER;
   v_error                     NUMBER;
   v_errormsg                  VARCHAR2 (100);
   v_from                      VARCHAR2 (4000);
   v_body                      VARCHAR2 (4000);
BEGIN
   errormsg := '(0x143)';
   v_error := 0;
   v_errormsg := '';
   v_locatie_key := 41;     -- LGS
   v_ruimte_key := 8392;    -- L.002 	Entreehal incl.wachtruimte


   -- 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;


   -- afzender van een gbs bericht is altijd 4881 (Key van gebruiker Calamiteiten servicedesk)
   v_sender := 4881;

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


         -- filter nu de essentiele velden uit de mailbody
         -- vervang cr door lf
         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));
         errormsg := '(0x1451)';

         -- vind de uitvoertijd bij de stdmelding
         SELECT mld_stdmelding_t_uitvoertijd
           INTO v_uitvoertijd
           FROM mld_stdmelding
          WHERE mld_stdmelding_key = v_stdmelding_key;

         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
                     SYSDATE,
                     psubject,
                     v_body,
                     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);
   END CASE;

EXCEPTION
   WHEN OTHERS
   THEN
      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;
/

CREATE OR REPLACE VIEW pchw_v_prs_kostenplaats
(
   prs_kostenplaats_omschrijving,
   prs_kostenplaats_key,
   prs_kostenplaats_eind
)
AS
   SELECT prs_kostenplaats_key,
          prs_kostenplaats_nr || ' ' || prs_kostenplaats_omschrijving,
          prs_kostenplaats_eind
     FROM prs_kostenplaats
    WHERE prs_kostenplaats_verwijder IS NULL;

CREATE OR REPLACE VIEW pchw_v_prs_srtperslid
(
   prs_srtperslid_key,
   prs_srtperslid_omschrijving
)
AS
   SELECT prs_srtperslid_key, prs_srtperslid_omschrijving
     FROM prs_srtperslid
    WHERE prs_srtperslid_verwijder IS NULL;

CREATE OR REPLACE VIEW pchw_v_prs_afdeling
(
   prs_afdeling_key,
   prs_afdeling_omschrijving
)
AS
   SELECT prs_afdeling_key,
          prs_afdeling_naam || ' ' || prs_afdeling_omschrijving
     FROM prs_afdeling
    WHERE prs_afdeling_verwijder IS NULL;


CREATE OR REPLACE VIEW pchw_v_rap_indices (volgorde, svd, index_waarde) as
  SELECT 0, 'MON', pchx_mon.get_index_value (SYSDATE,'MON')
    FROM DUAL
  UNION ALL
  SELECT DISTINCT
         FAC.SAFE_TO_NUMBER(SUBSTR (COALESCE (res_artikel_groep, 'SVD1'), 4)),
         COALESCE (res_artikel_groep, 'SVD1'),
         pchx_mon.get_index_value (SYSDATE,
                                   COALESCE (res_artikel_groep, 'SVD1'))
    FROM res_artikel;

-- Dashboard views

-- Dashboard rapport voor nieuwe meldingen.
CREATE OR REPLACE VIEW pchw_v_dashboard_new
AS
    SELECT sd.ins_srtdiscipline_prefix || m.mld_melding_key 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,
           mld_stdmelding           std,
           ins_tab_discipline       d,
           ins_srtdiscipline        sd
     WHERE     m.prs_perslid_key = p.prs_perslid_key
           AND p.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 pchx_mon.klant_melding (m.mld_melding_key) = 1
           AND mld_melding_status IN (2, 3);

CREATE OR REPLACE VIEW pchw_melding_optijd
AS
    SELECT gereed,
           DECODE (SIGN (mld_melding_einddatum_std - gereed), -1, 0, 100)
               optijd
      FROM (SELECT m.*,
                   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;

--Klant specifieke view voor het tonen van het totaal aantal korting per onderwerp over 1 maand
CREATE OR REPLACE VIEW pchw_v_totaal_korting_ond
(
    onderwerp,
    totaal_index,
    maand
)
AS
      SELECT onderwerp, SUM (totaal_index), TRUNC (gereed, 'MONTH')
        FROM (SELECT ins_discipline_omschrijving,
                     mld_stdmeldinggroep_oms 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,
                     mld_stdmeldinggroep gr
               WHERE     m.stdmelding_key = std.mld_stdmelding_key
                     AND std.mld_ins_discipline_key = d.ins_discipline_key
                     AND std.mld_stdmeldinggroep_key =
                         gr.mld_stdmeldinggroep_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 pchw_v_overschrijding_doorbel
(
    MAAND,
    EXPORT_DATUM,
    BEDRIJF,
    GROEP,
    VARIABELEKORTING,
    MLD_MELDING_ONDERWERP,
    MLD_MELDING_OMSCHRIJVING,
    MLD_MELDING_KEY,
    MLD_MELDING_OPMERKING,
    TOTAAL,
    TOTAAL_INDEX
)
BEQUEATH DEFINER
AS
      SELECT TO_CHAR (TRUNC (export_datum, 'MONTH') - 1, 'yyyy-month')
                 maand,
             export_datum,
             bedrijf,
             groep,
             variabelekorting,
             MLD_MELDING_ONDERWERP,
             MLD_MELDING_OMSCHRIJVING,
             m.MLD_MELDING_KEY,
             MLD_MELDING_OPMERKING,
               (  totaal
                / (  (totaal / variabelekorting)
                   + DECODE (variabelekorting,  50, 20,  250, 10,  0)))
             * COUNT (*)
                 totaal,
               (  totaal_index
                / (  (totaal / variabelekorting)
                   + DECODE (variabelekorting,  50, 20,  250, 10,  0)))
             * COUNT (*)
                 totaal_index
        FROM pchx_monitoring mo,
             mld_melding    m,
             (SELECT km.mld_melding_key, fac_usrdata_omschr bedrijf
                FROM mld_kenmerkmelding km, fac_usrdata ud
               WHERE     mld_kenmerk_key = 121
                     AND fac.safe_to_number (mld_kenmerkmelding_waarde) =
                         ud.fac_usrdata_key) b
       WHERE     kinderen IS NOT NULL
             AND ',' || mo.kinderen || ',' LIKE
                     '%,' || m.mld_melding_key || ',%'
             AND COALESCE (m.mld_melding_parentkey, m.mld_melding_key) =
                 b.mld_melding_key(+) -- bij meldingen die onder een andere melding vallen moeten we bij de parent kijken
             AND totaal > 0 -- Soms zijn er wel kind meldingen maar hebben we geen korting te pakken.
    GROUP BY export_datum,
             groep,
             variabelekorting,
             MLD_MELDING_ONDERWERP,
             MLD_MELDING_OMSCHRIJVING,
             m.MLD_MELDING_KEY,
             MLD_MELDING_OPMERKING,
             totaal_index,
             totaal,
             bedrijf;

-- Rapportages ten behoeve van de verslaglegging naar de financiers.
CREATE OR REPLACE VIEW pchw_v_melding_p_maand
AS
SELECT maand,
       (SELECT COUNT (*)
          FROM mld_melding
         WHERE mld_melding_datum BETWEEN ADD_MONTHS (maand, -11)
                                     AND ADD_MONTHS (maand, 1))
           pmaandjaar,
       (SELECT COUNT (*)
          FROM mld_melding
         WHERE mld_melding_datum BETWEEN maand AND ADD_MONTHS (maand, 1))
           pmaand
  FROM (    SELECT ADD_MONTHS (TRUNC (SYSDATE, 'MONTH'), (LEVEL * -1)) maand
              FROM DUAL
        CONNECT BY LEVEL <= 12);

CREATE OR REPLACE VIEW pchw_v_onderdeel_p_maand
AS
SELECT maand,
       mld_stdmeldinggroep_oms,
       (SELECT COUNT (*)
          FROM mld_melding m, mld_stdmelding std
         WHERE m.mld_stdmelding_key = std.mld_stdmelding_key
           AND std.mld_stdmeldinggroep_key = gr.mld_stdmeldinggroep_key
           AND mld_melding_datum BETWEEN maand AND ADD_MONTHS (maand, 1))
           pmaand
  FROM (    SELECT ADD_MONTHS (TRUNC (SYSDATE, 'MONTH'), (LEVEL * -1)) maand
              FROM DUAL
        CONNECT BY LEVEL <= 12) m,
        mld_stdmeldinggroep gr
        WHERE mld_stdmeldinggroep_oms IS NOT NULL;

CREATE OR REPLACE VIEW pchw_v_malus_bedrijf
(
    maand,
    bedrijf_malus,
    totaal
)
AS
      SELECT m.maand,
             COALESCE (mon.bedrijf_malus, 'PCH'),
             SUM (mon.totaal) totaal
        FROM (SELECT ADD_MONTHS (TRUNC (export_datum, 'MONTH'), -1) maand,
                     mo.bedrijf_malus,
                     mo.totaal
                FROM pchx_monitoring mo
               WHERE kinderen IS NULL           -- geen overschrijdingskorting
                 AND totaal IS NOT NULL
              UNION ALL
              SELECT ADD_MONTHS (TRUNC (export_datum, 'MONTH'), -1) maand,
                     bedrijf
                         bedrijf_malus,
                     totaal
                FROM pchw_v_overschrijding_doorbel) mon,
             (    SELECT ADD_MONTHS (TRUNC (SYSDATE, 'MONTH'), (LEVEL * -1)) maand
                    FROM DUAL
              CONNECT BY LEVEL <= 12) m
       WHERE m.maand = mon.maand(+)
    GROUP BY m.maand, mon.bedrijf_malus;

CREATE OR REPLACE VIEW pchw_v_meldingen_top10_mnd
AS
   SELECT 1 - aantal hide_f_sort,
          mld_stdmelding_omschrijving,
          ins_discipline_omschrijving,
          aantal
     FROM (  SELECT mld_stdmelding_omschrijving,
                    d.ins_discipline_omschrijving,
                    COUNT ( * ) aantal
               FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d
              WHERE     m.mld_stdmelding_key = std.mld_stdmelding_key
                    AND std.mld_ins_discipline_key = d.ins_discipline_key
                    AND d.ins_srtdiscipline_key = 101
                    AND mld_melding_datum BETWEEN ADD_MONTHS (
                                                     TRUNC (SYSDATE, 'MONTH'),
                                                     -1)
                                              AND  TRUNC (SYSDATE, 'MONTH')
           GROUP BY mld_stdmelding_omschrijving,
                    d.ins_discipline_omschrijving
           ORDER BY COUNT ( * ) DESC)
    WHERE ROWNUM <= 10;

CREATE OR REPLACE VIEW pchw_v_meldingen_top10_jaar
AS
    SELECT 1 - aantal hide_f_sort,
           mld_stdmelding_omschrijving,
           ins_discipline_omschrijving,
           aantal
      FROM (  SELECT mld_stdmelding_omschrijving,
                     d.ins_discipline_omschrijving,
                     COUNT (*) aantal
                FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d
               WHERE     m.mld_stdmelding_key = std.mld_stdmelding_key
                     AND std.mld_ins_discipline_key = d.ins_discipline_key
                     AND d.ins_srtdiscipline_key = 101
                     AND mld_melding_datum BETWEEN ADD_MONTHS (
                                                       TRUNC (SYSDATE, 'MONTH'),
                                                       -12)
                                               AND TRUNC (SYSDATE, 'MONTH')
            GROUP BY mld_stdmelding_omschrijving,
                     d.ins_discipline_omschrijving
            ORDER BY COUNT (*) DESC)
     WHERE ROWNUM <= 10;

CREATE OR REPLACE VIEW pchw_v_meldingen_top10_hlfjr
AS
   SELECT 1 - aantal hide_f_sort,
          mld_stdmelding_omschrijving,
          ins_discipline_omschrijving,
          aantal
     FROM (  SELECT mld_stdmelding_omschrijving,
                    d.ins_discipline_omschrijving,
                    COUNT ( * ) aantal
               FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d
              WHERE     m.mld_stdmelding_key = std.mld_stdmelding_key
                    AND std.mld_ins_discipline_key = d.ins_discipline_key
                    AND d.ins_srtdiscipline_key = 101
                    AND mld_melding_datum BETWEEN TRUNC (
                                                     ADD_MONTHS (
                                                        SYSDATE - 182,
                                                        (1
                                                         + 6
                                                           * ROUND (
                                                                ROUND (
                                                                   EXTRACT (
                                                                      MONTH FROM (SYSDATE
                                                                                  - 182))
                                                                   / 12,
                                                                   1)
                                                                - 0.1,
                                                                0))
                                                        - EXTRACT (
                                                             MONTH FROM (SYSDATE
                                                                         - 182))),
                                                     'Month')
                                              AND  TRUNC (
                                                      ADD_MONTHS (
                                                         SYSDATE,
                                                         (1
                                                          + 6
                                                            * ROUND (
                                                                 ROUND (
                                                                    EXTRACT (
                                                                       MONTH FROM (SYSDATE))
                                                                    / 12,
                                                                    1)
                                                                 - 0.1,
                                                                 0))
                                                         - EXTRACT (
                                                              MONTH FROM (SYSDATE))),
                                                      'Month')
           GROUP BY mld_stdmelding_omschrijving,
                    d.ins_discipline_omschrijving
           ORDER BY COUNT ( * ) DESC)
    WHERE ROWNUM <= 10;


-- Reminder naar de gastheer van de reservering tenzij
-- de gastheer een functie burgermeester of wethouder heeft (124/130)
-- of tenzij de afdeling van gastheer Directie betreft (359/262) dan naar naar contactpersoon
CREATE OR REPLACE VIEW pchw_v_noti_resreminder
(
   code,
   sender,
   receiver,
   text,
   key,
   xkey
)
AS
   SELECT 'RESINF',
          NULL,
          DECODE (
             prs_afdeling_key,
             124,
             rsvr.res_rsv_ruimte_contact_key,
             130,
             rsvr.res_rsv_ruimte_contact_key,
             DECODE (prs_srtperslid_key,
                     359, rsvr.res_rsv_ruimte_contact_key,
                     262, rsvr.res_rsv_ruimte_contact_key,
                     rsvr.res_rsv_ruimte_host_key))
             receiver,
             'Reservering '
          || res.res_reservering_key
          || ': U heeft op '
          || TO_CHAR (rsvr.res_rsv_ruimte_van, 'DD-MM')
          || ' van '
          || TO_CHAR (rsvr.res_rsv_ruimte_van, 'HH24:MI')
          || ' tot '
          || TO_CHAR (rsvr.res_rsv_ruimte_tot, 'HH24:MI')
          || ' ruimte '
          || r.res_ruimte_nr
          || ' gereserveerd.',
          res.res_reservering_key,
          rsvr.res_rsv_ruimte_key
     FROM res_v_aanwezigreservering res,
          res_v_aanwezigrsv_ruimte rsvr,
          res_ruimte_opstelling opst,
          res_disc_params rdp,
          res_ruimte r,
          prs_perslid p
    WHERE     r.res_discipline_key = rdp.res_ins_discipline_key
          AND rdp.res_disc_params_noti_dagen IS NOT NULL
          AND res.res_reservering_key = rsvr.res_reservering_key
          AND opst.res_ruimte_opstel_key = rsvr.res_ruimte_opstel_key
          AND opst.res_ruimte_key = r.res_ruimte_key
          AND rsvr.res_rsv_ruimte_host_key = p.prs_perslid_key
          AND rsvr.res_status_fo_key <= 5
          AND rsvr.res_rsv_ruimte_van BETWEEN fac.datumtijdplusuitvoertijd (
                                                 SYSDATE,
                                                 res_disc_params_noti_dagen,
                                                 'DAGEN')
                                          AND  fac.datumtijdplusuitvoertijd (
                                                  SYSDATE,
                                                  res_disc_params_noti_dagen
                                                  + 1,
                                                  'DAGEN')
          AND fac.getweekdaynum (SYSDATE) NOT IN (1, 7)
          AND rsvr.res_rsv_ruimte_van >= SYSDATE
   UNION ALL
     SELECT 'RESINF',
            NULL,
            DECODE (
               prs_afdeling_key,
               124,
               res_rsv_ruimte_contact_key,
               130,
               res_rsv_ruimte_contact_key,
               DECODE (prs_srtperslid_key,
                       359, res_rsv_ruimte_contact_key,
                       262, res_rsv_ruimte_contact_key,
                       res_rsv_ruimte_host_key))
               receiver,
               'Reservering '
            || res_reservering_key
            || ': U heeft op '
            || TO_CHAR (MIN (van), 'dd-mm')
            || DECODE (
                  MIN (van),
                  MAX (tot),
                  ' om ' || TO_CHAR (MIN (van), 'hh24:mi'),
                     ' van '
                  || TO_CHAR (MIN (van), 'hh24:mi')
                  || ' tot '
                  || TO_CHAR (MAX (tot), 'hh24:mi'))
            || ' in ruimte ('
            || (SELECT    alg_gebouw_code
                       || '-'
                       || alg_verdieping_code
                       || '-'
                       || alg_ruimte_nr
                  FROM alg_v_onroerendgoed_gegevens arg
                 WHERE arg.alg_ruimte_key = ruimte_key)
            || ') '
            || COUNT (res_reservering_key)
            || ' voorziening(en) gereserveerd.',
            res_reservering_key,
            res_rsv_ruimte_key
       FROM (SELECT rsvr.res_rsv_ruimte_host_key,
                    rsvr.res_rsv_ruimte_contact_key,
                    p.prs_srtperslid_key,
                    p.prs_afdeling_key,
                    res.res_reservering_key,
                    rsvd.res_rsv_deel_van van,
                    rsvd.res_rsv_deel_tot tot,
                    rsvr.res_rsv_ruimte_key,
                    rsvr.alg_ruimte_key ruimte_key
               FROM res_v_aanwezigreservering res,
                    res_v_aanwezigrsv_ruimte rsvr,
                    res_disc_params rdp,
                    res_rsv_deel rsvd,
                    res_deel rd,
                    prs_perslid p
              WHERE     rsvd.res_rsv_ruimte_key = rsvr.res_rsv_ruimte_key
                    AND rd.res_deel_key = rsvd.res_deel_key
                    AND rd.res_discipline_key = rdp.res_ins_discipline_key
                    AND rdp.res_disc_params_noti_dagen IS NOT NULL
                    AND res.res_reservering_key = rsvr.res_reservering_key
                    AND rsvr.res_ruimte_opstel_key IS NULL
                    AND rsvr.res_rsv_ruimte_host_key = p.prs_perslid_key
                    AND rsvr.res_status_fo_key <= 5
                    AND rsvd.res_rsv_deel_verwijder IS NULL
                    AND rsvd.res_rsv_deel_van BETWEEN fac.datumtijdplusuitvoertijd (
                                                         SYSDATE,
                                                         res_disc_params_noti_dagen,
                                                         'DAGEN')
                                                  AND  fac.datumtijdplusuitvoertijd (
                                                          SYSDATE,
                                                          res_disc_params_noti_dagen
                                                          + 1,
                                                          'DAGEN')
                    AND fac.getweekdaynum (SYSDATE) NOT IN (1, 7)
                    AND rsvd.res_rsv_deel_van >= SYSDATE
             UNION ALL
             SELECT rsvr.res_rsv_ruimte_host_key,
                    rsvr.res_rsv_ruimte_contact_key,
                    p.prs_srtperslid_key,
                    p.prs_afdeling_key,
                    res.res_reservering_key,
                    rsva.res_rsv_artikel_levering van,
                    rsva.res_rsv_artikel_levering tot,
                    rsvr.res_rsv_ruimte_key,
                    rsvr.alg_ruimte_key ruimte_key
               FROM res_v_aanwezigreservering res,
                    res_v_aanwezigrsv_ruimte rsvr,
                    res_disc_params rdp,
                    res_rsv_artikel rsva,
                    res_artikel ra,
                    prs_perslid p
              WHERE     rsva.res_rsv_ruimte_key = rsvr.res_rsv_ruimte_key
                    AND ra.res_discipline_key = rdp.res_ins_discipline_key
                    AND rsva.res_artikel_key = ra.res_artikel_key
                    AND rdp.res_disc_params_noti_dagen IS NOT NULL
                    AND res.res_reservering_key = rsvr.res_reservering_key
                    AND rsvr.res_ruimte_opstel_key IS NULL
                    AND rsvr.res_rsv_ruimte_host_key = p.prs_perslid_key
                    AND rsvr.res_status_fo_key <= 5
                    AND rsva.res_rsv_artikel_verwijder IS NULL
                    AND rsva.res_rsv_artikel_levering BETWEEN fac.datumtijdplusuitvoertijd (
                                                                 SYSDATE,
                                                                 res_disc_params_noti_dagen,
                                                                 'DAGEN')
                                                          AND  fac.datumtijdplusuitvoertijd (
                                                                  SYSDATE,
                                                                  res_disc_params_noti_dagen
                                                                  + 1,
                                                                  'DAGEN')
                    AND fac.getweekdaynum (SYSDATE) NOT IN (1, 7)
                    AND rsva.res_rsv_artikel_levering >= SYSDATE)
   GROUP BY res_rsv_ruimte_host_key,
            res_rsv_ruimte_contact_key,
            prs_srtperslid_key,
            prs_afdeling_key,
            res_reservering_key,
            res_rsv_ruimte_key,
            ruimte_key;


CREATE OR REPLACE VIEW pchw_v_catering_gegevens
(
    res_rsv_ruimte_nummer,
    res_rsv_ruimt_key,
    alg_locatie_omschrijving,
    alg_ruimte_aanduiding,
    prs_afdeling_naam,
    prs_afdeling_omschrijving,
    prs_perslid_naam_full,
    res_status_bo_omschrijving,
    res_rsv_ruimte_datum,
    res_rsv_ruimte_van,
    res_rsv_ruimte_tot,
    res_rsv_ruimte_bezoekers,
    res_rsv_ruimte_opmerking,
    res_artikel_btw,
    res_artikel_omschrijving,
    res_rsv_artikel_aantal,
    res_artikel_prijs,
    res_artikel_prijs_totaal,
    res_rsv_artikel_key,
    res_artikel_groep,
    res_artikel_soortcat,
    prs_kostenplaats_nr,
    fcl
)
AS
    SELECT res_reservering_key || '/' || res_rsv_ruimte_volgnr,
           rrr.res_rsv_ruimte_key,
           rg.alg_locatie_omschrijving,
           rg.alg_ruimte_nr || ' -  ' || rg.alg_ruimte_omschrijving,
           a.prs_afdeling_naam,
           a.prs_afdeling_omschrijving,
           pf.prs_perslid_naam_full,
           b.res_status_bo_omschrijving,
           res_rsv_ruimte_van
               datum,
           res_rsv_ruimte_van
               van,
           res_rsv_ruimte_tot
               tot,
           rrr.res_rsv_ruimte_bezoekers,
           rrr.res_rsv_ruimte_opmerking,
           ra.res_artikel_btw,
           ra.res_artikel_omschrijving,
           rra.res_rsv_artikel_aantal,
           ra.res_artikel_prijs,
           res.getartikelprijs (rra.res_rsv_artikel_key),
           rra.res_rsv_artikel_key,
           ra.res_artikel_groep,
           DECODE (SUBSTR (ra.res_artikel_groep, 1, 3),
                   'SVD', 'SVD',
                   'Banqueting')
               soortcat,
           k.prs_kostenplaats_nr,
           (SELECT res_kenmerkreservering_waarde
              FROM res_kenmerkwaarde kw, res_kenmerk k
             WHERE     kw.res_kenmerk_key = k.res_kenmerk_key
                   AND k.res_srtkenmerk_key = 23
                   AND kw.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key)
               fcl                                                      -- FCL
      FROM res_rsv_ruimte               rrr,
           (  SELECT res_rsv_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                FROM (SELECT DISTINCT res_rsv_ruimte_key, alg_ruimte_key
                        FROM RES_V_RSV_RUIMTE_2_ALG_RUIMTE
                       WHERE res_alg_ruimte_verwijder IS NULL
                      UNION
                      SELECT res_rsv_ruimte_key, alg_ruimte_key
                        FROM res_rsv_ruimte
                       WHERE     alg_ruimte_key IS NOT NULL
                             AND res_rsv_ruimte_verwijder IS NULL)
            GROUP BY res_rsv_ruimte_key) r2a,
           alg_v_ruimte_gegevens        rg,
           res_rsv_artikel              rra,
           res_artikel                  ra,
           res_status_bo                b,
           prs_kostenplaats             k,
           prs_afdeling                 a,
           prs_perslid                  p,
           prs_v_perslid_fullnames_all  pf
     WHERE     rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
           AND rrr.res_rsv_ruimte_key = r2a.res_rsv_ruimte_key
           AND r2a.alg_ruimte_key = rg.alg_ruimte_key
           AND rra.res_artikel_key = ra.res_artikel_key
           AND rra.res_status_bo_key = b.res_status_bo_key
           AND rrr.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
           AND rra.res_rsv_artikel_verwijder IS NULL
           AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
           AND p.prs_afdeling_key = a.prs_afdeling_key
           AND p.prs_perslid_key = pf.prs_perslid_key;
------ 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