--
-- $Id$
--
-- Script containing customer specific sql statements for the FACILITOR database


DEFINE thisfile = 'pghe.sql'
DEFINE dbuser   = 'PGHE'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
COLUMN fcltcusttxt NEW_VALUE fcltcusttxt NOPRINT;
WHENEVER SQLERROR CONTINUE;
SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL;
SPOOL &fcltlogfile
WHENEVER SQLERROR EXIT;
SELECT adm.checkscriptcust('&dbuser') AS fcltcusttxt FROM DUAL;
WHENEVER SQLERROR CONTINUE;
---------------------------------------
PROMPT &fcltcusttxt
---------------------------------------
SET DEFINE OFF

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

CREATE OR REPLACE PACKAGE PGHE
AS
  PROCEDURE mail_gbs_melding(pfrom      IN VARCHAR2,
                             pto        IN VARCHAR2,
                             psubject   IN VARCHAR2,
                             pbody      IN VARCHAR2,
                             psessionid IN VARCHAR2,
                             pemailkey  IN NUMBER);

END;
/

CREATE OR REPLACE PACKAGE BODY PGHE
AS

  PROCEDURE mail_gbs_melding(pfrom      IN VARCHAR2,
                             pto        IN VARCHAR2,
                             psubject   IN VARCHAR2,
                             pbody      IN VARCHAR2,
                             psessionid IN VARCHAR2,
                             pemailkey  IN NUMBER)

   AS

   CURSOR c IS
      SELECT *
        FROM mld_melding m
       WHERE mld_meldbron_key = 6    -- System GBS
         AND mld_melding_status IN (0, 2, 3, 4, 7, 99); -- alles behalve 1=Afgewezen, 5= afgemeld, 6= historie

   v_sender                    prs_perslid.prs_perslid_key%TYPE;
   v_melding_key               mld_melding.mld_melding_key%TYPE;
   v_stdmelding_key            mld_stdmelding.mld_stdmelding_key%TYPE;
   v_errormsg                  fac_result.fac_result_waarde%TYPE;
   v_uitvoertijd               mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE;
   v_onderwerp                 mld_melding.mld_melding_onderwerp%TYPE;
   v_omschrijving              mld_melding.mld_melding_omschrijving%TYPE;
   v_melding_status            mld_melding.mld_melding_status%TYPE;
   v_srtruimte_key             alg_srtruimte.alg_srtruimte_key%TYPE;
   v_ruimte_nr                 alg_ruimte.alg_ruimte_nr%TYPE;
   v_std_ruimte_nr             alg_ruimte.alg_ruimte_nr%TYPE;
   v_ruimte_key                alg_ruimte.alg_ruimte_key%TYPE;
   v_locatie_key               alg_locatie.alg_locatie_key%TYPE;
   v_tijdstip                  VARCHAR2 (100);
   v_date                      DATE;
   v_gbs_melding               VARCHAR2 (1000);
   v_count                     NUMBER;
   v_error                     NUMBER;
   v_newline                   VARCHAR2 (4000);
   v_tag                       VARCHAR2 (4000);
   v_from                      VARCHAR2 (4000);
   v_body                      VARCHAR2 (4000);

   v_errorhint          VARCHAR2 (1000);
   oracle_err_num       NUMBER;
   oracle_err_mes       VARCHAR2 (200);

   v_volgnr             NUMBER;
   BEGIN

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


      IF psubject = 'Watchdog Alarm'
      THEN
         UPDATE fac_usrdata
            SET fac_usrdata_vervaldatum = SYSDATE
          WHERE fac_usrdata_key = 181;  -- Watchdog
      ELSE
         UPDATE fac_usrdata
            SET fac_usrdata_vervaldatum = SYSDATE
          WHERE fac_usrdata_key = 60;  -- Laatst ontvangen bericht

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

         v_body := pbody;
         v_body := REPLACE (v_body, CHR (13), CHR (10));
         -- verwijder dubbele lf's
         v_body := REPLACE (v_body, CHR (10) || CHR (10), CHR (10));
         v_omschrijving := v_body;
         v_onderwerp := psubject;

         v_errorhint := 'Bepaal volgnummer';
         SELECT MAX(fac_rapport_volgnr)
           INTO v_volgnr
           FROM fac_rapport
          WHERE fac_rapport_node = 'GBS_MELDING';

         v_errorhint := 'Bewaar mail ' || v_volgnr;
         INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel)
         VALUES ('GBS_MELDING', v_volgnr + 1, pfrom || CHR (10) || psubject || CHR (10) || v_omschrijving);

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

         -- Eerste 5 regels bevatten geen relevante informatie
         fac.imp_getfield (v_body, CHR (10), v_newline);
         v_errorhint := 'Ophalen 1e regel: ' || v_newline;
         fac.imp_getfield (v_body, CHR (10), v_newline);
         v_errorhint := 'Ophalen 2e regel: ' || v_newline;
         fac.imp_getfield (v_body, CHR (10), v_newline);
         v_errorhint := 'Ophalen 3e regel: ' || v_newline;
         fac.imp_getfield (v_body, CHR (10), v_newline);
         v_errorhint := 'Ophalen 4e regel: ' || v_newline;
         fac.imp_getfield (v_body, CHR (10), v_newline);
         v_errorhint := 'Ophalen 5e regel: ' || v_newline;
         fac.imp_getfield (v_body, CHR (10), v_newline);
         v_errorhint := 'Ophalen 6e regel: ' || v_newline;

         -- De zesde regel moet allemaal sterren bevatten. Laten we dit maar even checken
         IF v_newline = '********************************'
         THEN
            fac.imp_getfield (v_body, CHR (10), v_gbs_melding);
            v_errorhint := 'Ophalen GBS melding: ' || v_gbs_melding;
            fac.imp_getfield (v_body, CHR (10), v_tijdstip);
            v_errorhint := 'Ophalen tijdstip: ' || v_tijdstip;
            v_date := TO_DATE(v_tijdstip, 'dd-mm-yyyy hh24:mi:ss');
            v_errorhint := 'Tijdstip: ' || v_date;

            v_ruimte_nr := SUBSTR(v_gbs_melding, 2, INSTR(v_gbs_melding, ']')-2);
            v_errorhint := 'Ruimte: ' || v_ruimte_nr;
            v_tag := SUBSTR(v_gbs_melding, INSTR(v_gbs_melding, ']')+2, 100);

            v_errorhint := 'Tag: ' || v_tag;
            IF v_tag = 'GbsMeldingUit'
            THEN
               -- dan gaan we alle GBS meldingen afmelden
               FOR rec IN c
               LOOP
                  v_errorhint := 'Opzoeken status';
                  SELECT mld_melding_status
                    INTO v_melding_status
                    FROM mld_melding
                   WHERE mld_melding_key = rec.mld_melding_key;

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

                  -- nu de status op afgemeld zetten.
                  v_errorhint := 'Afmelden melding';
                  mld.setmeldingstatus (rec.mld_melding_key, 5, v_sender);

                  v_errorhint := 'Einddatum aanpassen';
                  fac.backtrackaction ('MLDAFM',
                                       rec.mld_melding_key,
                                       v_sender,
                                       v_date);

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

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

            ELSE
               SELECT fac_usrdata_prijs, fac_usrdata_omschr
                 INTO v_stdmelding_key, v_std_ruimte_nr
                 FROM fac_usrdata ud
                WHERE fac_usrtab_key = 20
                  AND fac_usrdata_code = v_tag;

               BEGIN
                  -- Zoek het ruimtenummer dat we ontvangen hebben. Als het Algemeen is gaan we dat natuurlijk niet vinden.
                  SELECT alg_ruimte_key, alg_locatie_key, alg_srtruimte_key
                    INTO v_ruimte_key, v_locatie_key, v_srtruimte_key
                    FROM alg_v_ruimte_gegevens
                   WHERE alg_ruimte_nr = v_ruimte_nr;
               EXCEPTION WHEN NO_DATA_FOUND
               THEN
                  -- Zoek het ruimtenummer nav het nummer dat in de eigentabel staat.
                  SELECT alg_ruimte_key, alg_locatie_key, alg_srtruimte_key
                    INTO v_ruimte_key, v_locatie_key, v_srtruimte_key
                    FROM alg_v_ruimte_gegevens
                   WHERE alg_ruimte_nr = v_std_ruimte_nr;
               END;

               -- Kijk of er al een melding actief is met dezelfde stdmelding_key en meldbron 6 (System)
               SELECT MIN (m.mld_melding_key), COUNT (m.mld_melding_key)
                 INTO v_melding_key, v_count
                 FROM mld_melding m
                WHERE     mld_stdmelding_key = v_stdmelding_key
                      AND mld_alg_onroerendgoed_keys = v_ruimte_key
                      AND mld_melding_status IN (0, 2, 3, 4, 7, 99); -- alles behalve 1=Afgewezen, 5= afgemeld, 6= historie

               IF v_count = 0
               THEN

                  -- nu gaan we de hersteltijd bepalen
                  v_errormsg := '(0x147)';

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

                  v_errormsg := 'Melding kan niet aangemaakt worden (0x1481)';

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

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

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

                  v_error := 1;
                  v_errormsg := 'Melding bestaat al ' || v_melding_key;
               END IF;
            END IF;
         ELSE
            INSERT INTO fac_result (fac_result_sessionid,
                                    fac_result_naam,
                                    fac_result_waarde)
                            VALUES (psessionid,
                                    'errormsg',
                                    'Berichtopbouw verkeerd gevonden regel: ' || v_newline);
--                                    'Fout bij verwerken GBS bericht: ' || psubject);
         END IF;
      END IF;

      IF v_error = 1
      THEN
         -- foutafhandeling
         fac.writelog ('PROCESSEMAIL',
                       'E',
                       v_errormsg,
                       SUBSTR (pbody, 1, 1000));
      END IF;

   EXCEPTION WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.writelog ('GBS_MELDING', 'E', v_errormsg, v_errorhint);

      INSERT INTO fac_result (fac_result_sessionid,
                              fac_result_naam,
                              fac_result_waarde)
                      VALUES (psessionid,
                              'errormsg',
                              'Fout bij verwerken GBS bericht: ' || psubject);
   END;

END;
/

CREATE OR REPLACE PROCEDURE pghe_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 pghe_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, ';', 25, 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;
/


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

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


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

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

   -- Clear my previous imported rows
   DELETE FROM pghe_imp_storing_regime;

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

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

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

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

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

            IF v_r_codering IS NOT NULL
            THEN
               v_r_codering := TRIM(v_r_codering);
               BEGIN
                  SELECT alg_srtruimte_key
                    INTO v_srtruimte_key
                    FROM alg_srtruimte sr
                   WHERE alg_srtruimte_verwijder IS NULL
                     AND UPPER (sr.alg_srtruimte_omschrijving) = 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 pghe_imp_storing_regime (r_codering,
                                                    omschrijving,
                                                    ruimten,
                                                    storing_os,
                                                    stdmelding,
                                                    vakgroep,
                                                    vakgroeptype,
                                                    tht_os,
                                                    tht,
                                                    tht_eenheid,
                                                    bk,
                                                    vk,
                                                    alg_srtruimte_key,
                                                    mld_stdmelding_key,
                                                    mld_discipline_key,
                                                    ins_srtdiscipline_key)
                   VALUES (v_r_codering,
                           v_omschrijving,
                           v_ruimten,
                           v_storing_os,
                           v_stdmelding,
                           v_vakgroep,
                           v_vakgroeptype,
                           v_tht_os,
                           v_tht,
                           v_tht_eenheid,
                           v_bk,
                           v_vk,
                           v_srtruimte_key,
                           v_stdmelding_key,
                           v_discipline_key,
                           v_srtdiscipline_key);
            END IF;

            COMMIT;
         END IF;
         END;
      END loop;

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

CREATE OR REPLACE PROCEDURE pghe_update_storing_regime (
   p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT sr.r_codering,
             stdmelding,
             vakgroep,
             vakgroeptype,
             fac.safe_to_number (bk) bk,
             fac.safe_to_number (vk) vk,
             alg_srtruimte_key,
             mld_stdmelding_key,
             mld_discipline_key,
             ins_srtdiscipline_key,
             DECODE (tht_eenheid, 'UUR', 'U', 'MIN', 'U', 'DAG', 'D') eenheid,
             DECODE (tht_eenheid,
                     'UUR', tht,
                     'MIN', ROUND (tht / 60, 5),
                     'DAG', tht)
                tijdsduur
        FROM pghe_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 pghe_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 pghe_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 pghe_imp_storing_regime)
         AND ssr.alg_srtruimte_key = sr.alg_srtruimte_key;

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

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

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

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

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

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

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

               v_errormsg := 'Aanpassen stdmelding';

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

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

                  v_errormsg := 'Verwijderen stdmsrtruimte';

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

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

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

                  v_errormsg := 'Aanpassen stdmsrtruimte';

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

                  v_errormsg := 'Toevoegen stdmsrtruimte';

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

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

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

                  v_errormsg := 'Aanpassen stdmelding';

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

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

                     v_errormsg := 'Aanpassen stdmsrtruimte';

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

                  v_errormsg := 'Toevoegen stdmsrtruimte';

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

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

      DELETE mld_stdmsrtruimte WHERE mld_stdmsrtruimte_key = rec. mld_stdmsrtruimte_key;

   END LOOP;

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

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

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


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

-- Rapport om de sychronisatie status van de koppeling op de portal te tonen.
CREATE OR REPLACE VIEW pghe_v_rap_gbs_status_info
(
    item_key,
    item,
    datum
)
AS
    SELECT fac_usrdata_key, fac_usrdata_code, fac_usrdata_vervaldatum
      FROM fac_usrdata
     WHERE fac_usrtab_key = 60;

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

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


CREATE OR REPLACE VIEW pghe_v_goedkeuring_svd
AS
SELECT pf.prs_perslid_naam_full,
       m.prs_perslid_key,
       o.mld_melding_key,
       o.mld_opdr_key,
       o.mld_opdr_bedrijfopdr_volgnr,
       m.mld_melding_onderwerp,
          sd.ins_srtdiscipline_prefix
       || m.mld_melding_key
       || '/'
       || o.mld_opdr_bedrijfopdr_volgnr
           id,
       so.mld_statusopdr_omschrijving,
       ud.fac_usrdata_omschr,
       (SELECT mld_kenmerkopdr_waarde
          FROM mld_kenmerkopdr ko
         WHERE     ko.mld_kenmerk_key = 201 -- goedgekeurd door aanvrager
               AND ko.mld_opdr_key = o.mld_opdr_key) goedgekeurd,
       om.mld_opdr_materiaal_aantal aantaltikken,
       (SELECT mld_kenmerkopdr_waarde
          FROM mld_kenmerkopdr ko
         WHERE     ko.mld_kenmerk_key = 181 -- maand
               AND ko.mld_opdr_key = o.mld_opdr_key) maand
  FROM mld_opdr                     o,
       mld_melding                  m,
       prs_v_perslid_fullnames_all  pf,
       mld_stdmelding               std,
       mld_discipline               d,
       ins_srtdiscipline            sd,
       mld_statusopdr               so,
       mld_opdr_materiaal           om,
       fac_usrdata                  ud
 WHERE     o.mld_typeopdr_key = 261                                     -- SVD
       AND o.mld_statusopdr_key = so.mld_statusopdr_key
       AND m.mld_melding_key = o.mld_melding_key
       AND m.prs_perslid_key = pf.prs_perslid_key
       AND m.mld_stdmelding_key = std.mld_stdmelding_key
       AND std.mld_ins_discipline_key = d.ins_discipline_key
       AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
       AND o.mld_opdr_key = om.mld_opdr_key
       AND om.fac_usrdata_key = ud.fac_usrdata_key;

-- View om de beschikbaarheid van de koffieautomaten inzichtelijke te krijgen. De meetperiode is 2 maanden.
-- De tijd dat het apparaat in storing is wordt vergelijken met de beschikbaarheid
-- Hiermee wordt rekening gehouden met indult en overlappende meldingen. Ook overlap met andere maanden.
-- Er wordt geen rekening gehouden met respijt dat gegeven wordt op een melding omdat je dan bij meldingen die
-- een maandgrens overschrijden niet weet in welke periode de respijt valt.

CREATE OR REPLACE VIEW pghe_v_koffie_storingen
AS
    SELECT pchx_mon.get_first_melding (mld_melding_key, 1)    m_start,
           mld_melding_datum,
           COALESCE (fac.gettrackingdate ('MLDAFM', mld_melding_key),
                     SYSDATE)                                 afgemeld,
           mld_alg_onroerendgoed_keys,
           alg_ruimte_nr
      FROM mld_melding m, alg_ruimte r
     WHERE     mld_stdmelding_key = 91        -- beschikbaarheid warme dranken
           AND pchx_mon.klant_melding (mld_melding_key) = 1
           AND mld_melding_indult = 0
           AND m.mld_alg_onroerendgoed_keys = r.alg_ruimte_key;

CREATE OR REPLACE VIEW pghe_v_rap_beschikb_koffie1
AS
SELECT mnth_begin mnth_begin,
       mnth_einde-1 mnth_einde,
       alg_ruimte_nr,
       beschikbaar,
       storing,
       ROUND ((beschikbaar - COALESCE (storing, 0)) * 100 / beschikbaar, 2)    beschikbaarheid
  FROM (  SELECT mnth_begin,
                 mnth_einde,
                 alg_ruimte_key,
                 SUM (FAC.datumtijdnaaruitvoertijd (m_begin_cor, m_einde_cor, 'U', 8, 18, 1).tijdsduur) storing,
                 FAC.datumtijdnaaruitvoertijd (mnth_begin, mnth_einde, 'U', 8, 18, 1).tijdsduur beschikbaar
            FROM (WITH
                      months
                      AS
                          (SELECT *
                             FROM (    SELECT TRUNC (ADD_MONTHS (SYSDATE, (-1 * LEVEL) + 1), 'MM')    month
                                         FROM DUAL
                                   CONNECT BY LEVEL <= 4),
                                  (SELECT alg_ruimte_key
                                     FROM ins_v_deel_gegevens
                                    WHERE ins_srtdeel_key = 1))
                  SELECT mnth_begin,
                         mnth_einde,
                         m_start,
                         m_begin,
                         m_einde,
                         DECODE (SIGN (m_begin - mnth_begin),
                                 -1, mnth_begin,
                                 m_begin)    m_begin_cor,
                         DECODE (SIGN (m_einde - mnth_einde),
                                 1, mnth_einde,
                                 m_einde)    m_einde_cor,
                         alg_ruimte_key
                    FROM (SELECT months.month                     mnth_begin,
                                 ADD_MONTHS (months.month, 2)     mnth_einde,
                                 m.mld_alg_onroerendgoed_keys,
                                 alg_ruimte_key,
                                 m_start,
                                 m_begin,
                                 m_einde
                            FROM months
                                 LEFT JOIN
                                 (  SELECT m_start,
                                           MIN (mld_melding_datum)     m_begin,
                                           MAX (afgemeld)              m_einde,
                                           mld_alg_onroerendgoed_keys      --,
                                      FROM pghe_v_koffie_storingen
                                  GROUP BY m_start, mld_alg_onroerendgoed_keys) m
                                     ON     months.month < m_einde AND ADD_MONTHS (months.month, 2) > m_begin
                                        AND months.alg_ruimte_key =
                                            m.mld_alg_onroerendgoed_keys))
        GROUP BY mnth_begin, mnth_einde, alg_ruimte_key) mg,
       alg_ruimte  r
 WHERE r.alg_ruimte_key = mg.alg_ruimte_key
 ORDER BY alg_ruimte_nr, mnth_begin;

CREATE OR REPLACE VIEW pghe_v_rap_beschikb_koffie
AS
    SELECT mnth_begin,
           mnth_einde,
           alg_ruimte_nr,
           beschikbaar,
           storing,
           beschikbaarheid
      FROM pghe_v_rap_beschikb_koffie1
    UNION ALL
      SELECT mnth_begin,
             mnth_einde,
             'Totaal'             alg_ruimte_nr,
             SUM (beschikbaar)    beschikbaar,
             SUM (storing)        storing,
             ROUND (
                   (SUM (beschikbaar) - COALESCE (SUM (storing), 0))
                 * 100
                 / SUM (beschikbaar),
                 2)               beschikbaarheid
        FROM pghe_v_rap_beschikb_koffie1
    GROUP BY mnth_begin, mnth_einde;


CREATE OR REPLACE VIEW PGHE_V_NOTI_SVD_GOEDKEURING
(
    SENDER,
    RECEIVER,
    TEXT,
    CODE,
    KEY,
    XKEY
)
AS
    SELECT DISTINCT
           NULL
               sender,
           gg.prs_perslid_key
               receiver,
              'Facilitor: opdracht '
           || m.mld_melding_key
           || '/'
           || m.mld_opdr_bedrijfopdr_volgnr
           || ' moet goedgekeurd worden in '
           || pchx.get_user,
           'CUST14'
               code,
           m.mld_opdr_key
               key,
           NULL
               xkey
      FROM PGHE_V_GOEDKEURING_SVD  m,
           fac_srtnotificatie      sn,
           fac_tracking            t,
           fac_gebruikersgroep     gg
     WHERE     t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
           AND sn.fac_srtnotificatie_code = 'ORDAFR'
           AND t.fac_tracking_refkey = m.mld_opdr_key
           AND m.goedgekeurd IS NULL
           AND t.fac_tracking_datum BETWEEN (SELECT   fac_notificatie_job_nextrun
                                                    -   fac_notificatie_job_interval
                                                      / 24
                                               FROM fac_notificatie_job
                                              WHERE UPPER (
                                                        fac_notificatie_job_view) =
                                                    'PGHE_V_NOTI_SVD_GOEDKEURING')
                                        AND (SELECT fac_notificatie_job_nextrun
                                               FROM fac_notificatie_job
                                              WHERE UPPER (
                                                        fac_notificatie_job_view) =
                                                    'PGHE_V_NOTI_SVD_GOEDKEURING')
           --Notificatie wordt gestuurd naar de contractbeheerders
           AND gg.fac_groep_key =
               DECODE (pchx.get_user, 'PGHE', 181);
------ 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
