--
-- $Id$
--
-- Script containing customer specific db-configuration for RAI Amsterdam (ARAI)

DEFINE thisfile = 'ARAI.SQL'
DEFINE dbuser   = '^ARAI'
DEFINE custid   = 'ARAI'

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 VIEW arai_v_import_log
AS
   SELECT imp_log_status fclt_f_status,
          imp_log_omschrijving omschrijving,
          imp_log_hint opmerking
   FROM imp_log
   WHERE imp_log_applicatie = 'PRS';
   
CREATE OR REPLACE PROCEDURE arai_import_perslid (p_import_key IN NUMBER)
AS
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_errormsg                VARCHAR2 (400);
   v_errorhint               VARCHAR2 (400);
   v_newline                 FAC_IMP_FILE.FAC_IMP_FILE_LINE%TYPE;
BEGIN

   BEGIN
      SELECT fac_imp_file_line
        INTO v_newline
        FROM fac_imp_file
       WHERE fac_import_key = p_import_key
         AND fac_imp_file_index = 1;

      IF v_newline LIKE
                  CHR (TO_NUMBER ('EF', 'xx'))
               || CHR (TO_NUMBER ('BB', 'xx'))
               || CHR (TO_NUMBER ('BF', 'xx'))
               || '%'
      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;

      -- Verwijder de dubbele quotes
      v_newline := REPLACE (v_newline, '"');

      UPDATE fac_imp_file
         SET fac_imp_file_line = v_newline
       WHERE fac_import_key = p_import_key
         AND fac_imp_file_index = 1;


   EXCEPTION WHEN OTHERS
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Fout bij controle op Byte Order Mark',
                        ''
                       );
   END;


   v_errorhint := 'Generieke update';
   -- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid proc
   -- Ingangsdatum (laatste kolom) land in v_dummy, later omzetten.
   prs.import_perslid (p_import_key,
                       '0;0;0;0;0;0;10;2;0;1;' ||
                       '0;0;0;0;0;6;7;5;0;0;' ||
                       '0;8;0;11;0;12;0;0;0;0;'||
                       '0;0;0;0;0;0;0;0;0;0;'||
                       '0;0;0;0;0;0',
                       'GivenName;Surname;DisplayName;userPrincipalName;Mail;telephoneNumber;mobile;SamAccountName;Company;Department;Title;extensionAttribute5%'
                       );

UPDATE fac_imp_perslid
SET alg_locatie_code = 'RAI';

UPDATE fac_imp_perslid
SET prs_afdeling_naam = 
(
  SELECT DISTINCT p.prs_afdeling_naam
  FROM prs_afdeling p
  WHERE fac_imp_perslid.prs_afdeling_naam = substr (p.prs_afdeling_omschrijving, 1, 15)
  AND p.prs_afdeling_verwijder IS NULL
)
WHERE fac_imp_perslid.prs_afdeling_naam NOT IN (SELECT p.prs_afdeling_naam FROM prs_afdeling p);

DELETE FROM fac_imp_perslid
WHERE alg_locatie_code NOT IN (SELECT alg_locatie_code FROM alg_locatie);

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

CREATE OR REPLACE PROCEDURE arai_update_perslid (
   p_import_key IN NUMBER
) IS
  -- Alle personen verwijderen die niet meer in import bestand voorkomen.
  CURSOR c_del
  IS
      SELECT p.prs_perslid_key, p.prs_perslid_oslogin, pf.prs_perslid_naam_full
        FROM fac_imp_perslid i, prs_perslid p, prs_v_perslid_fullnames_all pf
       WHERE p.prs_perslid_oslogin = i.prs_perslid_oslogin(+)
         AND pf.prs_perslid_key = p.prs_perslid_key
         AND p.prs_perslid_oslogin IS NOT NULL
         AND i.prs_perslid_oslogin IS NULL
         AND p.prs_perslid_verwijder IS NULL
         AND p.prs_perslid_oslogin NOT LIKE '%_%'
      ORDER BY 2;

  v_count           NUMBER;

BEGIN
    -- generic update

    SELECT count(*)
      INTO v_count
      FROM fac_imp_perslid;

    IF v_count < 150
    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;

  -- 'LOGIN' betekent dat op basis van oslogin wordt gematched.
  -- 'A' betekent altijd alle (andere/overige) werkplekken verwijderen
  prs.update_perslid (p_import_key, 'LOGIN', NULL);

  -- Verwijder personen die niet meer in de import voorkomen.
  FOR rec IN c_del
  LOOP
     BEGIN
       prs.delete_perslid (p_import_key, rec.prs_perslid_key);
     END;
  END LOOP;

END arai_update_perslid;
/   

-- LET OP: OUDE PRS IMPORT!!!!!!!
   
CREATE OR REPLACE PROCEDURE arai_import_prs (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   -- LET OP: moet idem zijn als declaratie bij arai_UPDATE_PRS
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;
   -- De importvelden:
   v_prs_perslid_nr                VARCHAR2 (256);
   v_prs_perslid_naam              VARCHAR2 (256);
   v_prs_perslid_tussenvoegsel     VARCHAR2 (256);
   v_prs_perslid_voorletters       VARCHAR2 (256);
   v_prs_perslid_voornaam          VARCHAR2 (256);
   v_prs_afdeling_naam             VARCHAR2 (256);
   v_prs_srtperslid_omschrijving   VARCHAR2 (256);
   v_prs_perslid_telefoonnr        VARCHAR2 (256);
   v_prs_perslid_email             VARCHAR2 (256);
   v_prs_perslid_oslogin           VARCHAR2 (256);

   -- Overig:
   v_alg_locatie_code              VARCHAR2 (256);
   v_alg_gebouw_code               VARCHAR2 (256);


   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM arai_imp_prs;

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         -- Lees alle veldwaarden


         -- 01 - Usernaam/login
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_oslogin);

         -- 02 - Afdelingsnaam (niet de code!)
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_afdeling_naam);

         -- 03 - Voornaam van medewerker
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_voornaam);
         -- 04 - Tussenvoegsels van medewerker
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_tussenvoegsel);
         -- 05 - Naam van medewerkers = voornaam, tussenvoegsels en achternaam
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_naam);


         -- 06 - Email adres van medewerker
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_email);

         -- Verplicht
         -- fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_srtperslid_omschrijving);
         v_prs_srtperslid_omschrijving := 'Onbekend';

         --fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_locatie_code);
         v_alg_locatie_code := NULL;
         --fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_gebouw_code);
         v_alg_gebouw_code := NULL;
         -- fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_voorletters);
         v_prs_perslid_voorletters := NULL;
         -- fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_telefoonnr);
         v_prs_perslid_telefoonnr := NULL;
         -- fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_nr);
         v_prs_perslid_nr := NULL;



         --
         v_aanduiding :=
               '['
            || v_prs_perslid_oslogin
            || '|'
            || v_prs_perslid_naam
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_prs_perslid_oslogin) = 'USERNAAM'
               AND UPPER (v_prs_afdeling_naam) = 'AFDELING'
               AND UPPER (v_prs_perslid_voornaam) = 'VOORNAAM'
               AND UPPER (v_prs_perslid_tussenvoegsel) = 'TUSSENVOEGSELS'
               AND UPPER (v_prs_perslid_naam) = 'ACHTERNAAM'
            	 AND UPPER (v_prs_perslid_email) = 'E-MAIL'

            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden


            --
            v_errorhint := 'Ongeldig loginnaam';
            v_prs_perslid_oslogin := TRIM (v_prs_perslid_oslogin);

            IF LENGTH (v_prs_perslid_oslogin) > 30
            THEN
               v_prs_perslid_oslogin := SUBSTR (v_prs_perslid_oslogin, 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Loginnaam te lang',
                                    'Loginnaam wordt afgebroken tot ['
                                 || v_prs_perslid_oslogin
                                 || ']'
                                );
            ELSE
               IF (v_prs_perslid_oslogin IS NULL)
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog
                     (p_import_key,
                      'E',
                      v_aanduiding || 'Usernaam/login onbekend',
                      'Usernaam/login is verplicht; regel wordt overgeslagen!'
                     );
               END IF;
            END IF;
            COMMIT;

            --
            v_errorhint := 'Ongeldig e-mailadres';
            v_prs_perslid_email := TRIM (v_prs_perslid_email);

            IF LENGTH (v_prs_perslid_email) > 200
            THEN
               v_prs_perslid_email := SUBSTR (v_prs_perslid_email, 1, 200);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'E-mailadres te lang',
                                    'E-mailadres wordt afgebroken tot ['
                                 || v_prs_perslid_email
                                 || ']'
                                );
               COMMIT;
            END IF;

            v_errorhint := 'Ongeldig personeelsnummer';
            v_prs_perslid_nr := TRIM (v_prs_perslid_nr);

            IF LENGTH (v_prs_perslid_nr) > 16
            THEN
               v_prs_perslid_nr := SUBSTR (v_prs_perslid_nr, 1, 16);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Personeelsnummer te lang',
                                    'Personeelsnummer wordt afgebroken tot ['
                                 || v_prs_perslid_nr
                                 || ']'
                                );
            END IF;
            COMMIT;

            --
            v_errorhint := 'Ongeldige naam';
            v_prs_perslid_naam := TRIM (v_prs_perslid_naam);

            IF LENGTH (v_prs_perslid_naam) > 30
            THEN
               v_prs_perslid_naam := SUBSTR (v_prs_perslid_naam, 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Naam te lang',
                                    'Naam wordt afgebroken tot ['
                                 || v_prs_perslid_naam
                                 || ']'
                                );
            ELSE
               IF (v_prs_perslid_naam IS NULL)
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog
                              (p_import_key,
                               'E',
                               v_aanduiding || 'Naam onbekend',
                               'Naam is verplicht; regel wordt overgeslagen!'
                              );
               END IF;
            END IF;
            COMMIT;

            --
            v_errorhint := 'Ongeldig tussenvoegsel';
            v_prs_perslid_tussenvoegsel := TRIM (v_prs_perslid_tussenvoegsel);

            IF LENGTH (v_prs_perslid_tussenvoegsel) > 15
            THEN
               v_prs_perslid_tussenvoegsel :=
                                  SUBSTR (v_prs_perslid_tussenvoegsel, 1, 15);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Tussenvoegsel te lang',
                                    'Tussenvoegsel wordt afgebroken tot ['
                                 || v_prs_perslid_tussenvoegsel
                                 || ']'
                                );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldige voorletters';
            v_prs_perslid_voorletters := TRIM (v_prs_perslid_voorletters);

            IF LENGTH (v_prs_perslid_voorletters) > 10
            THEN
               v_prs_perslid_voorletters :=
                                    SUBSTR (v_prs_perslid_voorletters, 1, 10);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Voorletters te lang',
                                    'Voorletters worden afgebroken tot ['
                                 || v_prs_perslid_voorletters
                                 || ']'
                                );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldige voornaam';
            v_prs_perslid_voornaam := TRIM (v_prs_perslid_voornaam);

            IF LENGTH (v_prs_perslid_voornaam) > 30
            THEN
               v_prs_perslid_voornaam :=
                                       SUBSTR (v_prs_perslid_voornaam, 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Voornaam is te lang',
                                    'Voornaam wordt afgebroken tot ['
                                 || v_prs_perslid_voornaam
                                 || ']'
                                );
            END IF;
            COMMIT;

            -- Let op: bij ARAI zijn er geen afdelingscodes, zij gebruiken de hele afdelingnaam cq. omschrijving als unieke ID voor afdeling
            v_errorhint := 'Ongeldige afdeling';
            v_prs_afdeling_naam := TRIM (v_prs_afdeling_naam);

            IF LENGTH (v_prs_afdeling_naam) > 60
            THEN
               v_prs_afdeling_naam := SUBSTR (v_prs_afdeling_naam, 1, 60);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Afdelingsnaam te lang',
                                    'Afdelingsnaam wordt afgebroken tot ['
                                 || v_prs_afdeling_naam
                                 || ']'
                                );
            ELSE
               IF (v_prs_afdeling_naam IS NULL)
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog
                     (p_import_key,
                      'E',
                      v_aanduiding || 'Afdelingsnaam onbekend',
                      'Afdelingsnaam is verplicht; regel wordt overgeslagen!'
                     );
               END IF;
            END IF;
            COMMIT;

            --
            v_errorhint := 'Ongeldige functie';
            v_prs_srtperslid_omschrijving := TRIM (v_prs_srtperslid_omschrijving);

            IF LENGTH (v_prs_srtperslid_omschrijving) > 30
            THEN
               v_prs_srtperslid_omschrijving :=
                                SUBSTR (v_prs_srtperslid_omschrijving, 1, 30);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Functie te lang',
                                    'Functie wordt afgebroken tot ['
                                 || v_prs_srtperslid_omschrijving
                                 || ']'
                                );
            ELSE
               IF (v_prs_srtperslid_omschrijving IS NULL)
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog
                           (p_import_key,
                            'E',
                            v_aanduiding || 'Functie onbekend',
                            'Functie is verplicht; regel wordt overgeslagen!'
                           );
               END IF;
            END IF;
            COMMIT;

            --
            v_errorhint := 'Ongeldige plaats/locatiecode';
            v_alg_locatie_code := TRIM(v_alg_locatie_code);

            IF LENGTH (v_alg_locatie_code) > 5
            THEN
               v_alg_locatie_code := SUBSTR (v_alg_locatie_code, 1, 5);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Locatiecode te lang',
                                    'Locatiecode wordt afgebroken tot ['
                                 || v_alg_locatie_code
                                 || ']'
                                );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldige plaats/gebouwcode';
            v_alg_gebouw_code := TRIM(v_alg_gebouw_code);

            IF LENGTH (v_alg_gebouw_code) > 10
            THEN
               v_alg_gebouw_code := SUBSTR (v_alg_gebouw_code, 1, 10);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Gebouwcode te lang',
                                    'Gebouwcode wordt afgebroken tot ['
                                 || v_alg_gebouw_code
                                 || ']'
                                );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldig telefoonnummer';
            v_prs_perslid_telefoonnr := TRIM (v_prs_perslid_telefoonnr);

            IF LENGTH (v_prs_perslid_telefoonnr) > 15
            THEN
               v_prs_perslid_telefoonnr :=
                                     SUBSTR (v_prs_perslid_telefoonnr, 1, 15);
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Telefoonnummer te lang',
                                    'Telefoonnummer wordt afgebroken tot ['
                                 || v_prs_perslid_telefoonnr
                                 || ']'
                                );
               COMMIT;
            END IF;





            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errorhint :=
                      'Fout bij toevoegen regel aan importtabel arai_IMP_PRS';

                  INSERT INTO arai_imp_prs
                          (prs_perslid_nr, prs_perslid_naam,
                           prs_perslid_tussenvoegsel,
                           prs_perslid_voorletters,
                           prs_perslid_voornaam, prs_afdeling_naam,
                           prs_srtperslid_omschrijving,
                           alg_locatie_code, alg_gebouw_code,
                           alg_verdieping_volgnr, alg_ruimte_nr,
                           prs_perslid_telefoonnr,
                           prs_perslid_email,
                           prs_perslid_oslogin
                          )
                   VALUES (v_prs_perslid_nr, v_prs_perslid_naam,
                           v_prs_perslid_tussenvoegsel,
                           v_prs_perslid_voorletters,
                           v_prs_perslid_voornaam, v_prs_afdeling_naam,
                           v_prs_srtperslid_omschrijving,
                           v_alg_locatie_code, v_alg_gebouw_code,
                           NULL, NULL,
                           v_prs_perslid_telefoonnr,
                           v_prs_perslid_email,
                           v_prs_perslid_oslogin
                          );
                  COMMIT;
                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog
                             (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Ingelezen regel kan niet worden weggeschreven!'
                             );
                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'Persoon: aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Persoon: aantal ongeldige importregels: '
                        || TO_CHAR (v_count_tot - v_count_import),
                        ''
                       );
   END IF;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      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',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;
END arai_import_prs;
/


CREATE OR REPLACE PROCEDURE arai_update_prs (
   p_import_key IN NUMBER
)
IS
   -- LET OP: moet idem zijn als declaratie bij arai_IMPORT_PRS
   c_persoon_inactief       VARCHAR2 (30)   := 'INACTIEF: ';
   -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers met een nummer
   c_max_delta_percentage   NUMBER (10)     := 20;
   -- Ruimte waar personen in geplaatst worden (indien nog geen ruimte in opgegeven gebouw)
   c_ruimte_nr              VARCHAR2 (10)   := '000';
   -- Groep waar personen in geplaatst worden (indien nog geen groep)
   c_groep_upper            VARCHAR2 (30)   := '_DEFAULT';
   c_key_default_rol        NUMBER(10) := 1;

   v_aanduiding             VARCHAR2 (200);
   v_errorhint              VARCHAR2 (1000);
   v_errormsg               VARCHAR2 (1000);
   oracle_err_num           NUMBER;
   oracle_err_mes           VARCHAR2 (200);
   v_count_prs_actual       NUMBER (10);
   v_count_prs_import       NUMBER (10);          -- Matching actual persons!
   v_count_tot              NUMBER (10);
   v_count_error            NUMBER (10);
   v_count                  NUMBER (10);
   --
   v_perslid_key            NUMBER (10);
   v_afdeling_key           NUMBER (10);
   v_srtperslid_key         NUMBER (10);
   v_locatie_key            NUMBER (10);
   v_gebouw_key             NUMBER (10);
   v_verdieping_key         NUMBER (10);
   v_ruimte_key             NUMBER (10);
   v_wp_key                 NUMBER (10);
   v_wp_volgnr              NUMBER (3);
   v_wp_oms                 VARCHAR2 (30);
   v_groep_defaultnaam      VARCHAR2 (30);


   -- Alle personen in Facilitor en niet in AD-dump, obv login-naam
   CURSOR cdelprs
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_nr, p.prs_perslid_naam,
             p.prs_perslid_voornaam, p.prs_perslid_oslogin, prs_srtperslid_key, prs_perslid_einddatum
        FROM prs_v_aanwezigperslid p
       WHERE p.prs_perslid_oslogin IS NOT NULL
         AND SUBSTR(p.prs_perslid_oslogin,1,1) !=  '_'
         AND NOT EXISTS (
                SELECT 1
                  FROM arai_imp_prs ip
                 WHERE UPPER(ip.prs_perslid_oslogin) = UPPER(p.prs_perslid_oslogin));

   -- Alle functies uit AD-dump.
   CURSOR csperslid
   IS
      SELECT UPPER(prs_srtperslid_omschrijving) prs_srtperslid_omschrijving
      FROM arai_imp_prs
      GROUP BY UPPER (prs_srtperslid_omschrijving);

   -- Alle personen uit AD-dump
   CURSOR cperslid
   IS
      SELECT *
        FROM arai_imp_prs;

   -- Alle personen uit AD-dump met een locatie en gebouw, deze cursor is nu leeg, want RAI heeft deze locatie/gebouw gegevens niet.
   CURSOR cwp
   IS
      SELECT p.*, ip.alg_locatie_code, ip.alg_gebouw_code
        FROM arai_imp_prs ip, prs_v_aanwezigperslid p
       WHERE ip.alg_locatie_code IS NOT NULL
         AND ip.alg_gebouw_code IS NOT NULL
         AND UPPER (ip.prs_perslid_oslogin) = UPPER (p.prs_perslid_oslogin);

   -- Alle ACTIEVE personen MET login (ie. de import-doelgroep) ZONDER een werkplek
   CURSOR cnowp
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_nr, p.prs_perslid_naam,
             p.prs_perslid_voornaam, p.prs_perslid_oslogin
        FROM prs_v_aanwezigperslid p
       WHERE p.prs_perslid_oslogin IS NOT NULL
         AND p.prs_perslid_naam NOT LIKE c_persoon_inactief || '%'
         AND NOT EXISTS (SELECT 1
                           FROM prs_perslidwerkplek pw
                          WHERE pw.prs_perslid_key = p.prs_perslid_key);

   -- Alle aanwezige personen met login (ie. de import-doelgroep) niet in een autorisatiegroep
   CURSOR cnogroup
   IS
      SELECT p.prs_perslid_key, p.prs_perslid_nr, p.prs_perslid_naam,
             p.prs_perslid_voornaam, p.prs_perslid_oslogin
        FROM prs_v_aanwezigperslid p
       WHERE p.prs_perslid_oslogin IS NOT NULL
         AND NOT EXISTS (SELECT 1
                           FROM fac_gebruikersgroep g
                          WHERE g.prs_perslid_key = p.prs_perslid_key);





BEGIN
   -- Tel aantal personen in Facilitor (zonder verwijder-datum) met een login.
   SELECT DECODE (COUNT (*), 0, 1, COUNT (*))
     INTO v_count_prs_actual
     FROM prs_perslid
    WHERE prs_perslid_verwijder IS NULL AND prs_perslid_oslogin IS NOT NULL;

    -- Tel aantal personen in AD dump met een os-login.
   SELECT DECODE (COUNT (*), 0, 1, COUNT (*))
     INTO v_count_prs_import
     FROM arai_imp_prs ip
    WHERE prs_perslid_oslogin IS NOT NULL;

   IF (   (TRUNC ((v_count_prs_import / v_count_prs_actual) * 100) >=
                                               (100 - c_max_delta_percentage
                                               )
          )

      )
   THEN
      -- Verschil tussen aantal te importeren personen t.o.v. het aantal bestaande personen ligt boven de 20% veiligheidsgrens (c_max_delta_percentage),
      -- om te voorkomen dat er een ongeldige dump wordt geleverd waarin (bijna) alle personen worden verwijderd.
      -- M.a.w. Geldig importbestand wat betreft aantal personen

      -- Eerst de personen verwijderen...
      FOR recdelprs IN cdelprs
      LOOP
         BEGIN

            -- Voor externen, stagiairs etc die NIET in AD-export staan maar handmatig worden toegevoegd, moeten een einddatum krijgen.
            -- Als die einddatum niet is ingevuld, dan wordt de persoon als die niet meer uit AD komt, gewoon verwijderd.
            -- Als die einddatum wel is ingevuldm dan wordt de persoon pas verwijderd als de einddatum gepasseerd is.
            IF (recdelprs.prs_perslid_einddatum IS NULL or recdelprs.prs_perslid_einddatum < TRUNC(SYSDATE))
            THEN
                --- Als persoon een geen ingevulde einddatum heeft of een einddatum die in het verleden ligt, en NIET in AD-export staat, dan verwijderen.

                -- Heeft persoon actuele/toekomstige verplichtingen?
                SELECT COUNT (*)
                  INTO v_count
                  FROM prs_perslid p, prs_v_verplichting_keys r
                 WHERE p.prs_perslid_key = r.prs_perslid_key
                   AND p.prs_perslid_key = recdelprs.prs_perslid_key;

                IF (v_count = 0)
                THEN
                   v_errorhint := 'Fout bij verwijderen persoon';

                   UPDATE prs_perslid
                      SET prs_perslid_verwijder = SYSDATE
                    WHERE prs_perslid_key = recdelprs.prs_perslid_key;

                   fac.imp_writelog (p_import_key,
                                     'I',
                                        'Persoon met login ['
                                     || recdelprs.prs_perslid_oslogin
                                     || '] en naam ['
                                     || recdelprs.prs_perslid_naam
                                     || ', '
                                     || recdelprs.prs_perslid_voornaam
                                     || '] is verwijderd',
                                     'Persoon is verwijderd'
                                    );
                   COMMIT;
                ELSE
                   -- Staat persoon INACTIEF?
                   SELECT COUNT (*)
                     INTO v_count
                     FROM prs_perslid p
                    WHERE p.prs_perslid_naam LIKE c_persoon_inactief || '%'
                      AND p.prs_perslid_key = recdelprs.prs_perslid_key;

                   IF (v_count = 0)
                   THEN
                      v_errorhint := 'Fout bij INACTIEF zetten persoon';

                      -- Persoon INACTIEF zetten (update naam + reset oslogin)
                      UPDATE prs_perslid
                         SET prs_perslid_naam =
                                SUBSTR (c_persoon_inactief || prs_perslid_naam,
                                        1,
                                        30
                                       ),
                             prs_perslid_oslogin = NULL
                       WHERE prs_perslid_key = recdelprs.prs_perslid_key;

                      fac.imp_writelog (p_import_key,
                                        'I',
                                           'Persoon met usernaam ['
                                        || recdelprs.prs_perslid_oslogin
                                        || '] en naam ['
                                        || recdelprs.prs_perslid_naam
                                        || ', '
                                        || recdelprs.prs_perslid_voornaam
                                        || '] is INACTIEF gezet',
                                        'Persoon is INACTIEF gezet'
                                       );
                   ELSE
                      v_errorhint := 'Fout bij INACTIEF maken persoon';

                      -- Persoon INACTIEF maken (reset oslogin; indien handmatig INACTIEF gezet)
                      UPDATE prs_perslid
                         SET prs_perslid_oslogin = NULL
                       WHERE prs_perslid_naam LIKE c_persoon_inactief || '%'
                         AND prs_perslid_oslogin IS NOT NULL
                         AND prs_perslid_key = recdelprs.prs_perslid_key;

                      fac.imp_writelog (p_import_key,
                                        'I',
                                           'Persoon met usernaam ['
                                        || recdelprs.prs_perslid_oslogin
                                        || '] en naam ['
                                        || recdelprs.prs_perslid_naam
                                        || ', '
                                        || recdelprs.prs_perslid_voornaam
                                        || '] is INACTIEF gemaakt',
                                        'Persoon is INACTIEF gemaakt'
                                       );
                   END IF;
                   COMMIT;
                END IF;
            ELSE
               fac.imp_writelog (p_import_key,
                             'I',
                                'Extern persoon met login ['
                             || recdelprs.prs_perslid_oslogin
                             || '] en naam ['
                             || recdelprs.prs_perslid_naam
                             || ', '
                             || recdelprs.prs_perslid_voornaam
                             || '] is nog NIET verwijderd agv einddatum',
                             'Extern persoon NIET verwijderd'
                            );
            END IF;
            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

      v_count_tot := 0;
      v_count_error := 0;

      FOR recsperslid IN csperslid
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding := recsperslid.prs_srtperslid_omschrijving || ' - ';
            v_errorhint := 'Fout bij bepalen functie';

            SELECT COUNT (*)
              INTO v_count
              FROM prs_srtperslid
             WHERE UPPER (prs_srtperslid_omschrijving) =
                               UPPER (recsperslid.prs_srtperslid_omschrijving)
               AND prs_srtperslid_verwijder IS NULL;

            IF (v_count = 0)
            THEN
               v_errorhint := 'Fout bij toevoegen functie';

               INSERT INTO prs_srtperslid
                           (prs_srtperslid_omschrijving
                           )
                    VALUES (recsperslid.prs_srtperslid_omschrijving
                           );
               COMMIT;
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                           'Functie: verwerkte regels zonder foutmelding: '
                        || TO_CHAR (v_count_tot - v_count_error),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Functie: verwerkte regels met foutmelding: '
                        || TO_CHAR (v_count_error),
                        ''
                       );
      COMMIT;

      v_count_tot := 0;
      v_count_error := 0;

      -- Alle personen uit AD-dump scannen...
      FOR recperslid IN cperslid
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  recperslid.prs_perslid_oslogin
               || '|'
               || recperslid.prs_perslid_naam
               || '|'
               || recperslid.prs_perslid_voornaam
               || ' - ';
            v_errorhint :=
                  'Fout bij bepalen functie ['
               || recperslid.prs_srtperslid_omschrijving
               || ']';

            SELECT prs_srtperslid_key
              INTO v_srtperslid_key
              FROM prs_srtperslid
             WHERE prs_srtperslid_verwijder IS NULL
               AND UPPER (prs_srtperslid_omschrijving) =
                                UPPER (recperslid.prs_srtperslid_omschrijving);

            v_errorhint :=
                  'Fout bij bepalen afdeling ['
               || recperslid.prs_afdeling_naam
               || ']';
            -- Let op: bij de RAI wordt geen afdelingscode(naam) gebruikt, maar zij kennen alleen de afdelings!!OMSCHRIJVING!!!! als unieke naam.
            SELECT prs_afdeling_key
              INTO v_afdeling_key
              FROM prs_afdeling
             WHERE prs_afdeling_verwijder IS NULL
               AND UPPER (prs_afdeling_omschrijving) =
                                          UPPER (recperslid.prs_afdeling_naam);

            v_errorhint := 'Fout bij bepalen persoon';

            SELECT COUNT (*), MAX (prs_perslid_key)
              INTO v_count, v_perslid_key
              FROM prs_perslid
             WHERE prs_perslid_verwijder IS NULL
               AND UPPER (prs_perslid_oslogin) = UPPER (recperslid.prs_perslid_oslogin);


            IF (v_count = 0)
            THEN
               v_errorhint := 'Fout bij toevoegen persoon';
               -- Nieuwe persoon uit AD-dump, wordt toegevoegd in Facilitor.
               INSERT INTO prs_perslid
                           (prs_perslid_module, prs_srtperslid_key,
                            prs_afdeling_key, prs_perslid_naam,
                            prs_perslid_voorletters,
                            prs_perslid_tussenvoegsel,
                            prs_perslid_voornaam,
                            prs_perslid_telefoonnr,
                            prs_perslid_email,
                            prs_perslid_nr, prs_perslid_oslogin
                           )
                    VALUES ('PRS', v_srtperslid_key,
                            v_afdeling_key, recperslid.prs_perslid_naam,
                            recperslid.prs_perslid_voorletters,
                            recperslid.prs_perslid_tussenvoegsel,
                            recperslid.prs_perslid_voornaam,
                            recperslid.prs_perslid_telefoonnr,
                            recperslid.prs_perslid_email,
                            recperslid.prs_perslid_nr, recperslid.prs_perslid_oslogin
                           );
               COMMIT;
            ELSE

               v_errorhint := 'Fout bij wijzigen persoon';

               -- Functie, Afdeling, Naam, Voorletters, Tuusenvoegsels, Voornaam en Personeelsnummer altijd bijwerken
               -- Telefoonnr: alleen bijwerken indien uit AD-dump gevuld, anders niet bijwerken (dus gewoon laten staan zoals in Facilitor was gereigistreerd).
               -- E-mail: alleen bijwerken indien uit AD-dump gevuld, anders niet bijwerken (dus gewoon laten staan zoals in Facilitor was gereigistreerd).
               -- Personeelsnr: alleen bijwerken indien uit AD-dump gevuld, anders niet bijwerken (dus gewoon laten staan zoals in Facilitor was gereigistreerd).

               UPDATE prs_perslid
                  SET prs_srtperslid_key = v_srtperslid_key,
                      prs_afdeling_key = v_afdeling_key,
                      prs_perslid_naam = recperslid.prs_perslid_naam,
                      prs_perslid_voorletters = recperslid.prs_perslid_voorletters,
                      prs_perslid_tussenvoegsel = recperslid.prs_perslid_tussenvoegsel,
                      prs_perslid_voornaam = recperslid.prs_perslid_voornaam,
                      prs_perslid_telefoonnr = COALESCE (recperslid.prs_perslid_telefoonnr, prs_perslid_telefoonnr),
                      prs_perslid_email = COALESCE (recperslid.prs_perslid_email, prs_perslid_email),
                      prs_perslid_nr = COALESCE (recperslid.prs_perslid_nr, prs_perslid_nr)
                  WHERE prs_perslid_key = v_perslid_key;
               COMMIT;
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;

      fac.imp_writelog (p_import_key,
                        'S',
                           'Persoon: verwerkte regels zonder foutmelding: '
                        || TO_CHAR (v_count_tot - v_count_error),
                        ''
                       );
      fac.imp_writelog (p_import_key,
                        'S',
                           'Persoon: verwerkte regels met foutmelding: '
                        || TO_CHAR (v_count_error),
                        ''
                       );
      COMMIT;

      v_count_tot := 0;
      v_count_error := 0;

			-- Iedereen krijgt _default-rol die nog geen groep heeft.
      FOR recnogroup IN cnogroup
      LOOP
         BEGIN
            v_aanduiding :=
                  recnogroup.prs_perslid_oslogin
               || '|'
               || recnogroup.prs_perslid_naam
               || '|'
               || recnogroup.prs_perslid_voornaam
               || ' - ';
            v_errorhint := 'Fout bij bepalen groep met key [' || c_key_default_rol || ']';

						SELECT fac_groep_upper
              INTO v_groep_defaultnaam
              FROM fac_groep
             WHERE fac_groep_key = c_key_default_rol;

            v_errorhint :=
               'Fout bij koppelen persoon aan groep met key [' || c_key_default_rol || ']';

            INSERT INTO fac_gebruikersgroep
                        (fac_groep_key, prs_perslid_key
                        )
                 VALUES (c_key_default_rol, recnogroup.prs_perslid_key
                        );
            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
         END;
      END LOOP;


   ELSE
      fac.imp_writelog
         (p_import_key,
          'E',
          'Verschil tussen het actuele aantal en het te importeren aantal personen te groot; zie specificatie!',
             '- max. verschilpercentage = ['
          || TO_CHAR (c_max_delta_percentage)
          || '%] <br> '
          || '- #personen importbestand = ['
          || TO_CHAR (v_count_prs_import)
          || '] <br> '
          || '- #personen Facilitor = ['
          || TO_CHAR (v_count_prs_actual)
          || ']'
         );
      COMMIT;
   END IF;                  -- Geldig importbestand wat betreft aantal inserts
   COMMIT;
END arai_update_prs;
/


CREATE OR REPLACE VIEW arai_v_rap_uitdienst
(  Medewerker,
   Afdeling,
   Login,
   Einddatum
)
AS
   SELECT pf.prs_perslid_naam_full, a.prs_afdeling_omschrijving, p.prs_perslid_oslogin, TO_CHAR(prs_perslid_einddatum,'YYYY-MM-DD')
   FROM prs_v_aanwezigperslid p, prs_afdeling a, prs_v_perslid_fullnames pf
   WHERE p.prs_afdeling_key = a.prs_afdeling_key
   AND p.prs_perslid_key = pf.prs_perslid_key
   AND prs_perslid_einddatum IS NOT NULL
   AND SUBSTR(p.prs_perslid_oslogin,1,1) !=  '_';

-- Alle (potentiele) uitvoerders met de disciplines waarvoor ze uitvoerder kunnen zijn.
CREATE OR REPLACE VIEW arai_v_uitvoerders
AS
SELECT      DISTINCT p.prs_perslid_key,
            pf.prs_perslid_naam_full,
            p.prs_perslid_naam,
            p.prs_perslid_voornaam,
            p.prs_perslid_voorletters,
            p.prs_perslid_dienstverband,
            sp.prs_srtperslid_omschrijving,
            p.prs_afdeling_key,
            a.prs_afdeling_omschrijving,
            d.ins_discipline_key,
            d.ins_discipline_omschrijving
     FROM   prs_perslid p, prs_srtperslid sp, prs_afdeling a, mld_discipline d, fac_groeprechten gr, fac_gebruikersgroep gg, fac_functie f, prs_v_perslid_fullnames pf
    WHERE       p.prs_perslid_key = gg.prs_perslid_key
            AND p.prs_perslid_key = pf.prs_perslid_key
            AND p.prs_srtperslid_key = sp.prs_srtperslid_key
            AND p.prs_afdeling_key = a.prs_afdeling_key
            AND gr.fac_groep_key = gg.fac_groep_key
            AND gr.ins_discipline_key = d.ins_discipline_key
            AND gr.fac_functie_key = f.fac_functie_key
            AND f.fac_functie_code = 'WEB_MLDORD';

CREATE OR REPLACE VIEW ARAI_V_UITVOERDERS_FULL
AS SELECT DISTINCT PRS_PERSLID_KEY, PRS_PERSLID_NAAM_FULL FROM arai_v_uitvoerders;

-- Teamlid welke nu (!), op dit moment (!) een (of meer) lopende opdracht(en) heeft.
-- Alle uitvoerders met alle opdrachten in de tijd uitgezet.
CREATE OR REPLACE VIEW arai_v_opdr_uitvoerders
AS
   SELECT   p.prs_perslid_key,
            pf.prs_perslid_naam_full,
            p.prs_perslid_naam,
            p.prs_perslid_voornaam,
            p.prs_perslid_voorletters,
            p.prs_perslid_dienstverband,
            p.prs_afdeling_key,
            a.prs_afdeling_omschrijving,
            o.mld_melding_key,
            o.mld_opdr_key,
            o.mld_opdr_datumbegin,
            o.mld_opdr_einddatum,
            o.mld_opdr_uren,
            o.mld_statusopdr_key,
            s.mld_statusopdr_omschrijving
    FROM    prs_perslid p, mld_opdr o, mld_statusopdr s, prs_afdeling a, prs_v_perslid_fullnames pf
    WHERE   p.prs_perslid_key = o.mld_uitvoerende_keys
    AND     p.prs_perslid_key = pf.prs_perslid_key
    AND     o.mld_statusopdr_key = s.mld_statusopdr_key
    AND     p.prs_afdeling_key = a.prs_afdeling_key;

CREATE OR REPLACE VIEW arai_v_opdr_uitvoerders_all
AS
    SELECT  prs_perslid_key,
            prs_perslid_naam_full,
            prs_perslid_naam,
            prs_perslid_voornaam,
            prs_perslid_voorletters,
            prs_perslid_dienstverband,
            prs_afdeling_key,
            prs_afdeling_omschrijving,
            mld_melding_key,
            mld_opdr_key,
            MLD_OPDR_DATUMBEGIN,
            MLD_OPDR_EINDDATUM,
            MLD_OPDR_UREN,
            MLD_STATUSOPDR_OMSCHRIJVING
    FROM arai_v_opdr_uitvoerders
    WHERE MLD_STATUSOPDR_KEY In (5,8)
    UNION
    SELECT  DISTINCT prs_perslid_key,
            prs_perslid_naam_full,
            prs_perslid_naam,
            prs_perslid_voornaam,
            prs_perslid_voorletters,
            prs_perslid_dienstverband,
            prs_afdeling_key,
            prs_afdeling_omschrijving,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL
    FROM arai_v_uitvoerders p WHERE NOT EXISTS (SELECT 'x' FROM arai_v_opdr_uitvoerders u WHERE u.prs_perslid_key = p.prs_perslid_key);


CREATE OR REPLACE VIEW arai_v_opdr_uitvoerders_grp
(  prs_perslid_key,
   prs_perslid_naam_full,
   prs_perslid_naam,
   prs_perslid_voornaam,
   prs_perslid_voorletters,
   prs_perslid_dienstverband_uren,
   prs_afdeling_key,
   prs_afdeling_omschrijving,
   aantal_opdrachten,
   som_MLD_OPDR_UREN,
   url)
AS
    SELECT  prs_perslid_key,
            prs_perslid_naam_full,
            prs_perslid_naam,
            prs_perslid_voornaam,
            prs_perslid_voorletters,
            coalesce(40*prs_perslid_dienstverband/100,0),
            prs_afdeling_key,
            prs_afdeling_omschrijving,
            count(mld_opdr_key),
            coalesce(SUM(MLD_OPDR_UREN),0),
            'appl/mld/opdr_search.asp?urole=bo' || '&' || 'autosearch=1' || '&' || 'handler_key=' || prs_perslid_key
    FROM arai_v_opdr_uitvoerders_all
    GROUP BY prs_perslid_key,
            prs_perslid_naam_full,
            prs_perslid_naam,
            prs_perslid_voornaam,
            prs_perslid_voorletters,
            prs_perslid_dienstverband,
            prs_afdeling_key,
            prs_afdeling_omschrijving;


CREATE OR REPLACE VIEW arai_v_opdr_afdeling_grp
(  prs_afdeling_key,
   prs_afdeling_omschrijving,
   aantal_opdrachten,
   som_MLD_OPDR_UREN,
   url)
AS
    SELECT  prs_afdeling_key,
            prs_afdeling_omschrijving,
            count(mld_opdr_key),
            coalesce(SUM(MLD_OPDR_UREN),0),
            NULL
    FROM arai_v_opdr_uitvoerders_all
    GROUP BY prs_afdeling_key,
            prs_afdeling_omschrijving;




-- Dienstverband uren van medewerkers bij volle week, dus b.v. 40, 32, 30 etc
-- Beschikbare_uren_groen: normaal dienstverband, maar als ergen midden in de week, dan dienstverband - aantal voorbije dagen * # uren bij medewerker - # uren van vandaag gerekend vanaf 9 uur smorgens
-- Opdracht_uren_rood: opdrachturen bij medewerker, maar niet meer dan Beschikbare_uren_groen

CREATE OR REPLACE VIEW arai_v_opdr_uitvoerders_wk0
(
   prs_perslid_key,
   prs_afdeling_key,
   prs_perslid_naam_full,
   prs_perslid_dienstverband_uren,
   beschikbare_uren_groen,
   opdracht_uren_rood,
   url
)
AS
    SELECT  prs_perslid_key,
            prs_afdeling_key,
            prs_perslid_naam_full,
            prs_perslid_dienstverband_uren,
            prs_perslid_dienstverband_uren - (   greatest((to_char(sysdate,'D')-2),0)*(prs_perslid_dienstverband_uren/5) + (to_char(sysdate,'HH24') - 9) )  beschikbare_uren_groen,
            least(som_MLD_OPDR_UREN, prs_perslid_dienstverband_uren - (greatest((to_char(sysdate,'D')-2),0)*(prs_perslid_dienstverband_uren/5) + (to_char(sysdate,'HH24') - 9) ) ) opdracht_uren_rood,
            url
    FROM arai_v_opdr_uitvoerders_grp;



CREATE OR REPLACE VIEW arai_v_graph_capac_mdw_week_0
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_UREN,
   FCLT_YAS2_UREN,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || beschikbare_uren_groen || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen - opdracht_uren_rood,
            url
       FROM arai_v_opdr_uitvoerders_wk0;




CREATE OR REPLACE VIEW arai_v_opdr_uitvoerders_wk1
(
   prs_perslid_key,
   prs_afdeling_key,
   prs_perslid_naam_full,
   prs_perslid_dienstverband_uren,
   beschikbare_uren_groen,
   opdracht_uren_rood,
   url
)
AS
     SELECT g1.prs_perslid_key,
            g1.prs_afdeling_key,
            -- g1.prs_perslid_naam_full,
            TRIM(SUBSTR(g1.prs_perslid_naam_full, 1, decode (INSTR(g1.prs_perslid_naam_full,' '), 0, LENGTH(g1.prs_perslid_naam_full),INSTR(g1.prs_perslid_naam_full,' ') ))),
            g1.prs_perslid_dienstverband_uren,
            g1.prs_perslid_dienstverband_uren - least(g1.som_MLD_OPDR_UREN - w0.opdracht_uren_rood , g1.prs_perslid_dienstverband_uren) beschikbare_uren_groen,
            least(g1.som_MLD_OPDR_UREN - w0.opdracht_uren_rood , g1.prs_perslid_dienstverband_uren) opdracht_uren_rood,
            g1.url
       FROM arai_v_opdr_uitvoerders_grp g1, arai_v_opdr_uitvoerders_wk0 w0
       WHERE g1.prs_perslid_key = w0.prs_perslid_key;


CREATE OR REPLACE VIEW arai_v_graph_capac_mdw_week_1
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_UREN,
   FCLT_YAS2_UREN,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM arai_v_opdr_uitvoerders_wk1;



CREATE OR REPLACE VIEW arai_v_opdr_uitvoerders_wk2
(
   prs_perslid_key,
   prs_afdeling_key,
   prs_perslid_naam_full,
   prs_perslid_dienstverband_uren,
   beschikbare_uren_groen,
   opdracht_uren_rood,
   url
)
AS
     SELECT g1.prs_perslid_key,
            g1.prs_afdeling_key,
            -- g1.prs_perslid_naam_full,
            TRIM(SUBSTR(g1.prs_perslid_naam_full, 1, decode (INSTR(g1.prs_perslid_naam_full,' '), 0, LENGTH(g1.prs_perslid_naam_full),INSTR(g1.prs_perslid_naam_full,' ') ))),
            g1.prs_perslid_dienstverband_uren,
            g1.prs_perslid_dienstverband_uren - least(g1.som_MLD_OPDR_UREN - w0.opdracht_uren_rood - w1.opdracht_uren_rood, g1.prs_perslid_dienstverband_uren) beschikbare_uren_groen,
            least(g1.som_MLD_OPDR_UREN - w0.opdracht_uren_rood - w1.opdracht_uren_rood , g1.prs_perslid_dienstverband_uren) opdracht_uren_rood,
            g1.url
       FROM arai_v_opdr_uitvoerders_grp g1, arai_v_opdr_uitvoerders_wk0 w0, arai_v_opdr_uitvoerders_wk1 w1
       WHERE g1.prs_perslid_key = w0.prs_perslid_key
       AND   g1.prs_perslid_key = w1.prs_perslid_key;


CREATE OR REPLACE VIEW arai_v_graph_capac_mdw_week_2
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_UREN,
   FCLT_YAS2_UREN,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM arai_v_opdr_uitvoerders_wk2;






CREATE OR REPLACE VIEW arai_v_graph_capac_TD_week_0
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_UREN,
   FCLT_YAS2_UREN,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || beschikbare_uren_groen || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen - opdracht_uren_rood,
            url
       FROM arai_v_opdr_uitvoerders_wk0
       WHERE prs_afdeling_key = 97;

-- Grafiek van de medewerkers Technische Dienst Electra (key = 98)
CREATE OR REPLACE VIEW arai_v_graph_capac_ELE_week_0
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || beschikbare_uren_groen || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen - opdracht_uren_rood,
            url
       FROM arai_v_opdr_uitvoerders_wk0
       WHERE prs_afdeling_key = 98;

-- Grafiek van de medewerkers Technische Dienst Werktuigbouw (key = 99)
CREATE OR REPLACE VIEW arai_v_graph_capac_WTB_week_0
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || beschikbare_uren_groen || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen - opdracht_uren_rood,
            url
       FROM arai_v_opdr_uitvoerders_wk0
       WHERE prs_afdeling_key = 99;



-- Grafiek van de medewerkers Technische Dienst (key = 97)
CREATE OR REPLACE VIEW arai_v_graph_capac_TD_week_1
(
   prs_perslid_key,
   FCLT_XAS_,
   FCLT_YAS_UREN,
   FCLT_YAS2_UREN,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM arai_v_opdr_uitvoerders_wk1
       WHERE prs_afdeling_key = 97;

-- Grafiek van de medewerkers Technische Dienst Electra (key = 98)
CREATE OR REPLACE VIEW arai_v_graph_capac_ELE_week_1
(
   prs_perslid_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM arai_v_opdr_uitvoerders_wk1
       WHERE prs_afdeling_key = 98;

-- Grafiek van de medewerkers Technische Dienst Werktuigbouw (key = 99)
CREATE OR REPLACE VIEW arai_v_graph_capac_WTB_week_1
(
   prs_perslid_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM arai_v_opdr_uitvoerders_wk1
       WHERE prs_afdeling_key = 99;







CREATE OR REPLACE VIEW arai_v_graph_capac_TD_week_2
(
   prs_perslid_key,
   FCLT_XAS_,
   FCLT_YAS_UREN,
   FCLT_YAS2_UREN,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM arai_v_opdr_uitvoerders_wk2
       WHERE prs_afdeling_key = 97;

CREATE OR REPLACE VIEW arai_v_graph_capac_ELE_week_2
(
   prs_perslid_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM arai_v_opdr_uitvoerders_wk2
       WHERE prs_afdeling_key = 98;

CREATE OR REPLACE VIEW arai_v_graph_capac_WTB_week_2
(
   prs_perslid_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  (opdracht_uren_rood) || '/' || prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            beschikbare_uren_groen,
            url
       FROM arai_v_opdr_uitvoerders_wk2
       WHERE prs_afdeling_key = 99;





CREATE OR REPLACE VIEW arai_v_capac_mdw_max_weeknr
(max_weeknr)
AS
SELECT ROUND(COALESCE(MAX(som_MLD_OPDR_UREN), 0) / 40 ) + 2
FROM  arai_v_opdr_uitvoerders_grp;



CREATE OR REPLACE VIEW arai_v_graph_capac_mdw_all
(
   prs_perslid_key,
   prs_perslid_naam_full,
   prs_perslid_dienstverband_uren,
   beschikbare_uren_groen,
   opdracht_uren_rood,
   url
)
AS
    SELECT prs_perslid_key,
        prs_perslid_naam_full,
        prs_perslid_dienstverband_uren,
        40 * max_weeknr,
        round(som_MLD_OPDR_UREN * (40 / prs_perslid_dienstverband_uren)),
        url
    FROM  arai_v_opdr_uitvoerders_grp, arai_v_capac_mdw_max_weeknr;



CREATE OR REPLACE VIEW arai_v_graph_capac_mdw_totaal
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_UREN,
   -- FCLT_YAS2_WEEKNR,
   FCLT_URL
)
AS
     SELECT prs_perslid_key,
            prs_perslid_naam_full || ' (' ||  prs_perslid_dienstverband_uren || ')',
            opdracht_uren_rood,
            -- (beschikbare_uren_groen - opdracht_uren_rood),
            url
       FROM arai_v_graph_capac_mdw_all;

CREATE OR REPLACE VIEW arai_v_graph_aantopdr_mdw_all
(
   prs_perslid_key,
   FCLT_XAS_UITVOERDER,
   FCLT_YAS_AANTAL,
   FCLT_URL
)
AS
    SELECT  prs_perslid_key,
            prs_perslid_naam_full,
            aantal_opdrachten,
            url
    FROM  arai_v_opdr_uitvoerders_grp;



CREATE OR REPLACE VIEW arai_v_graph_capac_afd_totaal
(
   prs_afdeling_key,
   FCLT_XAS_AFDELING,
   FCLT_YAS_UREN,
   -- FCLT_YAS2_WEEKNR,
   FCLT_URL
)
AS
     SELECT prs_afdeling_key,
            prs_afdeling_omschrijving,
            som_MLD_OPDR_UREN,
            url
       FROM arai_v_opdr_afdeling_grp;

CREATE OR REPLACE VIEW arai_v_graph_aantopdr_afd_all
(
   prs_afdeling_key,
   FCLT_XAS_AFDELING,
   FCLT_YAS_AANTAL,
   -- FCLT_YAS2_WEEKNR,
   FCLT_URL
)
AS
     SELECT prs_afdeling_key,
            prs_afdeling_omschrijving,
            aantal_opdrachten,
            url
       FROM arai_v_opdr_afdeling_grp;



--CREATE OR REPLACE VIEW arai_v_uren_vd_week
--AS
--SELECT
--    TO_CHAR(SYSDATE, 'YYYY'),
--    TRUNC(TRUNC (SYSDATE, 'IW') + LEVEL),
--    TO_CHAR(TRUNC (SYSDATE, 'IW') + LEVEL/24, 'HH24')
--FROM  arai_v_opdr_uitvoerders_grp
--CONNECT BY LEVEL <= (SELECT ROUND(COALESCE(MAX(som_MLD_OPDR_UREN), 0) / 40 ) + 2
--                     FROM  arai_v_opdr_uitvoerders_grp
--                    );


CREATE OR REPLACE VIEW arai_v_sync_alg_ruimte
(   alg_ruimte_key,
    alg_verdieping_key,
    cadlabel
)
AS
SELECT  r.alg_ruimte_key,
        r.alg_verdieping_key,
        coalesce(rk.alg_onrgoedkenmerk_waarde,  trim(gk.alg_onrgoedkenmerk_waarde) || ' ' || trim(v.alg_verdieping_code)  || ' ' || trim(sr.alg_srtruimte_code) || ' ' ||  trim(r.alg_ruimte_nr))
FROM alg_v_aanwezigruimte r, alg_verdieping v, alg_gebouw g, alg_onrgoedkenmerk gk, alg_onrgoedkenmerk rk, alg_srtruimte sr
WHERE r.alg_verdieping_key = v.alg_verdieping_key
AND v.alg_gebouw_key = g.alg_gebouw_key
AND sr.alg_srtruimte_key =  r.alg_srtruimte_key
AND gk.alg_onrgoed_key= g.alg_gebouw_key
AND gk.alg_kenmerk_key = 1000
AND gk.alg_onrgoed_niveau='G'
AND rk.alg_onrgoed_key (+)=  r.alg_ruimte_key
AND rk.alg_kenmerk_key (+) = 1001
AND rk.alg_onrgoed_niveau (+) ='R';


CREATE OR REPLACE VIEW arai_v_rap_urenoverzicht
(fclt_x_meldingnr,
 html_meldingnr,
 fclt_f_vakgroep,
 fclt_f_melding,
 fclt_f_gebouw,
 fclt_f_verdieping,
 fclt_f_ruimte,
 opdrachtnr,
 uren_gepland,
 fclt_f_uitvoerder,
 uren_besteed,
 fclt_f_jaar,
 fclt_f_maand,
 fclt_f_weeknr,
 fclt_f_datum,
 fclt_f_status
)
AS  SELECT  TO_CHAR(m.mld_melding_key),
            '<a onclick=''FcltMgr.openDetail("Appl/MLD/mld_melding.asp?urole=bo&'
            || 'mld_key='
            || m.mld_melding_key
            || '")''>'
            || m.mld_melding_key
            || '</a>'
               mld_melding_html,
            d.ins_discipline_omschrijving,
            sm.mld_stdmelding_omschrijving,
            g.alg_gebouw_naam,
            to_char(v.alg_verdieping_volgnr),
            r.alg_ruimte_nr,
            -- o.mld_opdr_key,
            -- o.mld_opdr_datumbegin,
            -- TRUNC (o.mld_opdr_einddatum) einddatum,
            m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr,
            o.mld_opdr_uren uren_opdracht,
            --p.prs_perslid_key,
            --p.prs_perslid_naam,
            --p.prs_perslid_tussenvoegsel,
            --p.prs_perslid_voorletters,
            --p.prs_perslid_voornaam,
            pf.prs_perslid_naam_full,
            --p.prs_perslid_dienstverband,
            --ou.mld_opdr_uren_key,
            ou.mld_opdr_uren_besteed,
            TO_CHAR (ou.mld_opdr_uren_datum, 'IYYY'),
            TO_CHAR (ou.mld_opdr_uren_datum, 'MM'),
            TO_CHAR (ou.mld_opdr_uren_datum, 'IW'),
            TO_CHAR (ou.mld_opdr_uren_datum, 'IYYY-MM-DD'),
            DECODE(ou.mld_opdr_uren_status, 0, coalesce(flx0.fac_locale_xsl_cust, flx0.fac_locale_xsl_tekst),
                                            1, coalesce(flx1.fac_locale_xsl_cust, flx1.fac_locale_xsl_tekst),
                                            2, coalesce(flx2.fac_locale_xsl_cust, flx2.fac_locale_xsl_tekst),
                                            3, coalesce(flx3.fac_locale_xsl_cust, flx3.fac_locale_xsl_tekst),
                                            4, coalesce(flx4.fac_locale_xsl_cust, flx4.fac_locale_xsl_tekst)
                   )
     FROM   mld_opdr o, mld_opdr_uren ou, prs_perslid p, prs_v_perslid_fullnames pf, mld_melding m, mld_stdmelding sm, mld_discipline d,
            fac_locale_xsl flx0, fac_locale_xsl flx1, fac_locale_xsl flx2, fac_locale_xsl flx3, fac_locale_xsl flx4,
            alg_gebouw g, alg_verdieping v, alg_ruimte r
    WHERE   ou.mld_opdr_key = o.mld_opdr_key
    AND     ou.prs_perslid_key = p.prs_perslid_key
    AND     p.prs_perslid_key = pf.prs_perslid_key
    AND     m.mld_melding_key = o.mld_melding_key
    AND     sm.mld_stdmelding_key = m.mld_stdmelding_key
    AND     sm.mld_ins_discipline_key = d.ins_discipline_key
    AND     flx0.fac_locale_xsl_label = 'lcl_mld_uren_status_0'
    AND     flx0.fac_locale_xsl_lang = lcl.getuserlanguage ()
    AND     flx0.fac_locale_xsl_module = 'ASP'
    AND     flx1.fac_locale_xsl_label = 'lcl_mld_uren_status_1'
    AND     flx1.fac_locale_xsl_lang = lcl.getuserlanguage ()
    AND     flx1.fac_locale_xsl_module = 'ASP'
    AND     flx2.fac_locale_xsl_label = 'lcl_mld_uren_status_2'
    AND     flx2.fac_locale_xsl_lang = lcl.getuserlanguage ()
    AND     flx2.fac_locale_xsl_module = 'ASP'
    AND     flx3.fac_locale_xsl_label = 'lcl_mld_uren_status_3'
    AND     flx3.fac_locale_xsl_lang = lcl.getuserlanguage ()
    AND     flx3.fac_locale_xsl_module = 'ASP'
    AND     flx4.fac_locale_xsl_label = 'lcl_mld_uren_status_4'
    AND     flx4.fac_locale_xsl_lang = lcl.getuserlanguage ()
    AND     flx4.fac_locale_xsl_module = 'ASP'
    AND     m.mld_alg_onroerendgoed_keys = r.alg_ruimte_key (+)
    AND     r.alg_verdieping_key = v.alg_verdieping_key (+)
    AND     v.alg_gebouw_key = g.alg_gebouw_key (+);








---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
---          KOPPELING MET EBMS             KOPPELING MET EBMS                  KOPPELING MET EBMS              KOPPELING MET EBMS        ---
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------


---------------------------------------------------------------------------------------------------------------------------------------------
--- EBMS EVENT/ORGANISATIE GEGEVENS
---------------------------------------------------------------------------------------------------------------------------------------------

-- call ARAI#33463: via Vervaldatum verleden niet zichtbaar
CREATE OR REPLACE VIEW arai_v_events
(
   arai_events_key,
   arai_events_full,
   Evenement,
   EventID,
   Bedrijfsnaam,
   BedrijfsnaamID,
   BIllto,
   BilltoID,
   EventDatumVan,
   EventDatumTot,
   EventOpbouw,
   EventAfbouw,
   Vervaldatum
)
AS
   SELECT arai_events_key,
          Evenement || '|' || Bedrijfsnaam,
          Evenement,
          EventID,
          Bedrijfsnaam,
          BedrijfsnaamID,
          BIllto,
          BilltoID,
          EventDatumVan,
          EventDatumTot,
          EventOpbouw,
          EventAfbouw,
          EventDatumTot
          + COALESCE (
               (SELECT fac.safe_to_number (ud.fac_usrdata_omschr)
                  FROM fac_usrdata ud
                 WHERE     ud.fac_usrtab_key = 201
                       AND ud.fac_usrdata_code = 'EBMS_EVENTS_DAYS_IN_PAST'
                       AND ud.fac_usrdata_verwijder IS NULL),
               365)
     FROM arai_events
    WHERE     evenement NOT LIKE '%ikv%'
          AND evenement NOT LIKE '%IKV%'
          AND evenement NOT LIKE '%ite visit%'
          AND evenement NOT LIKE '%ite Visit%'
          AND evenement NOT LIKE '%espreking%'
          AND evenement NOT LIKE '%valuatie%'
          AND evenement NOT LIKE '%roductie meeting%'
          AND evenement NOT LIKE '%training%'
          AND evenement NOT LIKE '%Training%';

---------------------------------------------------------------------------------------------------------------------------------------------
--- EBMS EXPOSANTEN GEGEVENS
---------------------------------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE VIEW arai_v_ebms (
    arai_ebms_key,
    arai_ebms_full,
    Evenement,
    EventID,
    Bedrijfsnaam,
    BedrijfsnaamID,
    BIllto,
    BilltoID,
    Lokatie,
    Ordernummer,
    EventDatumVan,
    EventDatumTot,
    Vervaldatum
)
AS
SELECT
    eb.arai_ebms_key,
    eb.Ordernummer || '|' || eb.Evenement || '|' ||  eb.Bedrijfsnaam || '|' || eb.Lokatie,
    eb.Evenement,
    eb.EventID,
    eb.Bedrijfsnaam,
    eb.BedrijfsnaamID,
    eb.BIllto,
    eb.BilltoID,
    eb.Lokatie,
    eb.Ordernummer,
    ev.EventDatumVan,
    ev.EventDatumTot,
    ev.Vervaldatum
FROM arai_ebms eb, arai_v_events ev
WHERE eb.eventid=ev.eventid;

-- Lijst met unieke standnummers tussen een maand geleden en een jaar vooruit (anders teveel resultaten)
CREATE OR REPLACE VIEW arai_v_standnummers 
(ebms_key, 
standnummer)
AS
     SELECT DISTINCT MIN (arai_ebms_key), lokatie
       FROM ARAI_V_EBMS
       WHERE eventdatumtot BETWEEN sysdate - 31 AND sysdate + 365
   GROUP BY lokatie;

CREATE OR REPLACE PROCEDURE arai_import_ebms (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := '|';
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;

   -- De importvelden:

   v_Evenement                      VARCHAR2 (256);
   v_EventID                        VARCHAR2 (256);
   v_Bedrijfsnaam                   VARCHAR2 (256);
   v_BedrijfsnaamID                 VARCHAR2 (256);
   v_BIllto                         VARCHAR2 (256);
   v_BilltoID                       VARCHAR2 (256);
   v_Lokatie                        VARCHAR2 (256);
   v_Ordernummer                    VARCHAR2 (256);
   v_EventDatum1                    VARCHAR2 (256);
   v_EventDatum2                    VARCHAR2 (256);



   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM arai_imp_ebms;

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         -- Lees alle veldwaarden


         -- EBMS  gegevens
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_Evenement);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_EventID);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 3, v_Bedrijfsnaam);

         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 4, v_BedrijfsnaamID);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 5, v_BIllto);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 6, v_BilltoID);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 7, v_Lokatie);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 8, v_Ordernummer);

         --fac.imp_getfield_nr (v_newline, c_fielddelimitor, 9, v_EventDatum1);
         --fac.imp_getfield_nr (v_newline, c_fielddelimitor, 10, v_EventDatum2);

         --
         v_aanduiding :=
               '['
            || v_Evenement
            || '|'
            || v_BedrijfsnaamID
            || '|'
            || v_Ordernummer
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         -- Header = Evenement|EventID|Bedrijfsnaam|BedrijfsnaamID|BIllto|BilltoID|Lokatie|Ordernummer
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_Evenement) = 'EVENEMENT'
               AND UPPER (v_EventID) = 'EVENTID'
               AND UPPER (v_Bedrijfsnaam) = 'BEDRIJFSNAAM'
               AND UPPER (v_BedrijfsnaamID) = 'BEDRIJFSNAAMID'
               AND UPPER (v_Ordernummer) = 'ORDERNUMMER'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

            --
            v_errorhint := 'Ongeldige ordernummer';
            v_Ordernummer := TRIM (v_Ordernummer);

            IF (v_Ordernummer IS NOT NULL)
            THEN
                IF LENGTH (v_Ordernummer) > 20
                THEN
                    v_Ordernummer := SUBSTR (v_Ordernummer, 1, 20);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Ordernummer te lang', 'Ordernummer wordt afgebroken tot [' || v_Ordernummer || ']' );
                END IF;
            ELSE
                fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Record niet ingelezen', 'Ordernummer is leeg');
                v_ongeldig := 1;
            END IF;


            --
            v_errorhint := 'Ongeldige lokatie';
            v_Lokatie := TRIM (v_Lokatie);

            IF (v_Lokatie IS NOT NULL)
            THEN
                IF LENGTH (v_Lokatie) > 50
                THEN
                    v_Lokatie := SUBSTR (v_Lokatie, 1, 50);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Lokatie te lang', 'Lokatie wordt afgebroken tot [' || v_Lokatie || ']' );
                END IF;
            --ELSE
                --fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Record niet ingelezen', 'Lokatie is leeg');
                --v_ongeldig := 1;
            END IF;

            --
            v_errorhint := 'Ongeldige BedrijfsID';
            v_BedrijfsnaamID := TRIM (v_BedrijfsnaamID);

            IF (v_BedrijfsnaamID IS NOT NULL)
            THEN
                IF LENGTH (v_BedrijfsnaamID) > 20
                THEN
                    v_BedrijfsnaamID := SUBSTR (v_BedrijfsnaamID, 1, 20);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'BedrijfsnaamID te lang', 'BedrijfsnaamID wordt afgebroken tot [' || v_BedrijfsnaamID || ']' );
                END IF;
            --ELSE
                --fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Record niet ingelezen', 'BedrijfsnaamID is leeg');
                --v_ongeldig := 1;
            END IF;

            --
            v_errorhint := 'Ongeldige bedrijfsnaam';
            v_Bedrijfsnaam := TRIM (v_Bedrijfsnaam);

            IF (v_Bedrijfsnaam IS NOT NULL)
            THEN
                IF LENGTH (v_Bedrijfsnaam) > 255
                THEN
                    v_Bedrijfsnaam := SUBSTR (v_Bedrijfsnaam, 1, 255);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Bedrijfsnaam te lang', 'Bedrijfsnaam wordt afgebroken tot [' || v_Bedrijfsnaam || ']' );
                END IF;
            --ELSE
                --fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Record niet ingelezen', 'Bedrijfsnaam is leeg');
                --v_ongeldig := 1;
            END IF;


            --
            v_errorhint := 'Ongeldige BilltoID';
            v_BilltoID := TRIM (v_BilltoID);

            IF (v_BilltoID IS NOT NULL)
            THEN
                IF LENGTH (v_BilltoID) > 20
                THEN
                    v_BilltoID := SUBSTR (v_BilltoID, 1, 20);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'BilltoID te lang', 'BilltoID wordt afgebroken tot [' || v_BilltoID || ']' );
                END IF;
            --ELSE
                --fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Record niet ingelezen', 'BilltoID is leeg');
                --v_ongeldig := 1;
            END IF;

            --
            v_errorhint := 'Ongeldige BIllto';
            v_BIllto := TRIM (v_BIllto);

            IF (v_BIllto IS NOT NULL)
            THEN
                IF LENGTH (v_BIllto) > 255
                THEN
                    v_BIllto := SUBSTR (v_BIllto, 1, 255);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'BIllto te lang', 'BIllto wordt afgebroken tot [' || v_BIllto || ']' );
                END IF;
            --ELSE
                --fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Record niet ingelezen', 'BIllto is leeg');
                --v_ongeldig := 1;
            END IF;


            --
            v_errorhint := 'Ongeldige EventID';
            v_EventID := TRIM (v_EventID);

            IF (v_EventID IS NOT NULL)
            THEN
                IF LENGTH (v_EventID) > 20
                THEN
                    v_EventID := SUBSTR (v_EventID, 1, 20);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'EventID te lang', 'EventID wordt afgebroken tot [' || v_EventID || ']' );
                END IF;
            ELSE
                fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Record niet ingelezen', 'EventID is leeg');
                v_ongeldig := 1;
            END IF;

            --
            v_errorhint := 'Ongeldige Evenement';
            v_Evenement := TRIM (v_Evenement);

            IF (v_Evenement IS NOT NULL)
            THEN
                IF LENGTH (v_Evenement) > 255
                THEN
                    v_Evenement := SUBSTR (v_Evenement, 1, 255);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Evenement te lang', 'Evenement wordt afgebroken tot [' || v_Evenement || ']' );
                END IF;
            ELSE
                fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Record niet ingelezen', 'Evenement is leeg');
                v_ongeldig := 1;
            END IF;



            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errorhint :=
                      'Fout bij toevoegen regel aan importtabel arai_imp_ebms';

                  INSERT INTO arai_imp_ebms (Evenement, EventID, Bedrijfsnaam, BedrijfsnaamID, BIllto, BilltoID, Lokatie, Ordernummer)
                  VALUES (v_Evenement, v_EventID, v_Bedrijfsnaam, v_BedrijfsnaamID, v_BIllto, v_BilltoID, v_Lokatie, v_Ordernummer);

                  COMMIT;
                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog
                             (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Ingelezen regel kan niet worden weggeschreven!'
                             );
                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'EBMS: aantal ingelezen regels: '
                        || TO_CHAR (v_count_import),
                        ''
                       );
   END IF;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      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',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;
END arai_import_ebms;
/



CREATE OR REPLACE PROCEDURE arai_update_ebms (
   p_import_key IN NUMBER
)
IS

    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);


    v_ordernummer            VARCHAR(20);


    -- Alle kpi_wachtijen van Mitel telefooncentrale
    CURSOR c_imp_ebms
    IS
        SELECT *
        FROM arai_imp_ebms k;


    BEGIN
    v_count_tot := 0;
    v_count_error := 0;


    v_aanduiding := '';


    -- Alle kpi-wachtrijen verwerken...
    FOR rec_ebms IN c_imp_ebms
    LOOP
        BEGIN
            v_count_tot := v_count_tot + 1;

            v_errorhint := 'Fout bij bepalen ordernummer [' || UPPER(rec_ebms.Ordernummer) || ']';
            -- Dit zal waarschijnlijk een error opleveren bij 2 inserts van ordernummer.

            -- Evenement, EventID, Bedrijfsnaam, BedrijfsnaamID, BIllto, BilltoID, Lokatie, Ordernummer

            -- Bepaal het record uit arai_ebms op basis van ordernummer



            SELECT COUNT (*)
            INTO v_count
            FROM arai_ebms
            WHERE Ordernummer =  UPPER (rec_ebms.Ordernummer);


            IF (v_count = 0)
            THEN
                -- Ordernummer bestaat nog niet, dus toevoegen...
                v_errorhint := 'Fout bij toevoegen ordernummer ' || UPPER(rec_ebms.Ordernummer);

                INSERT INTO arai_ebms (Evenement, EventID, Bedrijfsnaam, BedrijfsnaamID, BIllto, BilltoID, Lokatie, Ordernummer)
                VALUES (rec_ebms.Evenement, rec_ebms.EventID, rec_ebms.Bedrijfsnaam, rec_ebms.BedrijfsnaamID, rec_ebms.BIllto, rec_ebms.BilltoID, rec_ebms.Lokatie, UPPER(rec_ebms.Ordernummer));

                COMMIT;
            ELSE
                -- Ordernummer bestaat al, dus updaten van alle gegevens
                v_errorhint := 'Fout bij bijwerken van ordernummer ' || UPPER(rec_ebms.Ordernummer);

                UPDATE arai_ebms
                SET  Evenement= rec_ebms.Evenement,
                    EventID=rec_ebms.EventID,
                    Bedrijfsnaam=rec_ebms.Bedrijfsnaam,
                    BedrijfsnaamID=rec_ebms.BedrijfsnaamID,
                    BIllto=rec_ebms.BIllto,
                    BilltoID=rec_ebms.BilltoID,
                    Lokatie=rec_ebms.Lokatie
                WHERE Ordernummer=UPPER(rec_ebms.Ordernummer);

                COMMIT;
            END IF;

            COMMIT;

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


    fac.imp_writelog (p_import_key,
                    'S',
                       'EBMS: verwerkte regels zonder foutmelding: '
                    || TO_CHAR (v_count_tot - v_count_error),
                    ''
                   );
    fac.imp_writelog (p_import_key,
                    'S',
                       'KPI: verwerkte regels met foutmelding: '
                    || TO_CHAR (v_count_error),
                    ''
                   );
    COMMIT;

END arai_update_ebms;
/


-- mbmb
---------------------------------------------------------------------------------------------------------------------------------------------
--- EBMS EVENTS / ORGANISATIE GEGEVENS
---------------------------------------------------------------------------------------------------------------------------------------------


CREATE OR REPLACE PROCEDURE arai_import_events (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := '|';
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;

   -- De importvelden:

   v_Evenement                      VARCHAR2 (256);
   v_EventID                        VARCHAR2 (256);
   v_Bedrijfsnaam                   VARCHAR2 (256);
   v_BedrijfsnaamID                 VARCHAR2 (256);
   v_BIllto                         VARCHAR2 (256);
   v_BilltoID                       VARCHAR2 (256);
   v_EventDatum1                    VARCHAR2 (256);
   v_EventDatum2                    VARCHAR2 (256);
   v_EventOpbouw                    VARCHAR2 (256);
   v_EventAfbouw                    VARCHAR2 (256);



   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM arai_imp_events;

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         -- Lees alle veldwaarden


         -- EVENTS GEGEVENS UIT EBMS
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_Evenement);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_EventID);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 3, v_Bedrijfsnaam);

         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 4, v_BedrijfsnaamID);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 5, v_BIllto);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 6, v_BilltoID);


         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 7, v_EventOpbouw);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 8, v_EventDatum1);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 9, v_EventDatum2);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 10, v_EventAfbouw);

         --
         v_aanduiding :=
               '['
            || v_Evenement
            || '|'
            || v_BedrijfsnaamID
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         -- Header = Evenement|EventID|Bedrijfsnaam|BedrijfsnaamID|BIllto|BilltoID
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_Evenement) = 'EVENEMENT'
               AND UPPER (v_EventID) = 'EVENTID'
               AND UPPER (v_Bedrijfsnaam) = 'BEDRIJFSNAAM'
               AND UPPER (v_BedrijfsnaamID) = 'BEDRIJFSNAAMID'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

            --
            v_errorhint := 'Ongeldige EventID';
            v_EventID := TRIM (v_EventID);

            IF (v_EventID IS NOT NULL)
            THEN
                IF LENGTH (v_EventID) > 20
                THEN
                    v_EventID := SUBSTR (v_EventID, 1, 20);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'EventID te lang', 'EventID wordt afgebroken tot [' || v_EventID || ']' );
                END IF;
            ELSE
                fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Record niet ingelezen', 'EventID is leeg');
                v_ongeldig := 1;
            END IF;

            --
            v_errorhint := 'Ongeldige Evenement';
            v_Evenement := TRIM (v_Evenement);

            IF (v_Evenement IS NOT NULL)
            THEN
                IF LENGTH (v_Evenement) > 255
                THEN
                    v_Evenement := SUBSTR (v_Evenement, 1, 255);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Evenement te lang', 'Evenement wordt afgebroken tot [' || v_Evenement || ']' );
                END IF;
            ELSE
                fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Record niet ingelezen', 'Evenement is leeg');
                v_ongeldig := 1;
            END IF;


            --
            v_errorhint := 'Ongeldige BedrijfsID';
            v_BedrijfsnaamID := TRIM (v_BedrijfsnaamID);

            IF (v_BedrijfsnaamID IS NOT NULL)
            THEN
                IF LENGTH (v_BedrijfsnaamID) > 20
                THEN
                    v_BedrijfsnaamID := SUBSTR (v_BedrijfsnaamID, 1, 20);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'BedrijfsnaamID te lang', 'BedrijfsnaamID wordt afgebroken tot [' || v_BedrijfsnaamID || ']' );
                END IF;
            END IF;

            --
            v_errorhint := 'Ongeldige bedrijfsnaam';
            v_Bedrijfsnaam := TRIM (v_Bedrijfsnaam);

            IF (v_Bedrijfsnaam IS NOT NULL)
            THEN
                IF LENGTH (v_Bedrijfsnaam) > 255
                THEN
                    v_Bedrijfsnaam := SUBSTR (v_Bedrijfsnaam, 1, 255);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Bedrijfsnaam te lang', 'Bedrijfsnaam wordt afgebroken tot [' || v_Bedrijfsnaam || ']' );
                END IF;
            END IF;


            --
            v_errorhint := 'Ongeldige BilltoID';
            v_BilltoID := TRIM (v_BilltoID);

            IF (v_BilltoID IS NOT NULL)
            THEN
                IF LENGTH (v_BilltoID) > 20
                THEN
                    v_BilltoID := SUBSTR (v_BilltoID, 1, 20);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'BilltoID te lang', 'BilltoID wordt afgebroken tot [' || v_BilltoID || ']' );
                END IF;
            END IF;

            --
            v_errorhint := 'Ongeldige BIllto';
            v_BIllto := TRIM (v_BIllto);

            IF (v_BIllto IS NOT NULL)
            THEN
                IF LENGTH (v_BIllto) > 255
                THEN
                    v_BIllto := SUBSTR (v_BIllto, 1, 255);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'BIllto te lang', 'BIllto wordt afgebroken tot [' || v_BIllto || ']' );
                END IF;
            END IF;


            v_errorhint := 'Ongeldige Start Eventdatum ';
            v_EventDatum1 := TRIM (v_EventDatum1);
            IF (v_EventDatum1 IS NOT NULL)
            THEN
                IF LENGTH (v_EventDatum1) > 50
                THEN
                    v_EventDatum1 := SUBSTR (v_EventDatum1, 1, 50);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Start Eventdatum te lang', 'Start Eventdatum wordt afgebroken tot [' || v_EventDatum1 || ']' );
                END IF;
                v_EventDatum1 := REPLACE(REPLACE(v_EventDatum1,'   ', ' '),'  ', ' ');
            END IF;

            v_errorhint := 'Ongeldige Einde Eventdatum ';
            v_EventDatum2 := TRIM (v_EventDatum2);
            IF (v_EventDatum2 IS NOT NULL)
            THEN
                IF LENGTH (v_EventDatum2) > 50
                THEN
                    v_EventDatum2 := SUBSTR (v_EventDatum2, 1, 50);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Einde Eventdatum te lang', 'Einde Eventdatum wordt afgebroken tot [' || v_EventDatum2 || ']' );
                END IF;
                v_EventDatum2 := REPLACE(REPLACE(v_EventDatum2,'   ', ' '),'  ', ' ');
            END IF;

            v_errorhint := 'Ongeldige Start Opbouwdatum ';
            v_EventOpbouw := TRIM (v_EventOpbouw);
            IF (v_EventOpbouw IS NOT NULL)
            THEN
                IF LENGTH (v_EventOpbouw) > 50
                THEN
                    v_EventOpbouw := SUBSTR (v_EventOpbouw, 1, 50);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Start Opbouwdatum te lang', 'Start Opbouwdatum wordt afgebroken tot [' || v_EventOpbouw || ']' );
                END IF;
                v_EventOpbouw := REPLACE(REPLACE(v_EventOpbouw,'   ', ' '),'  ', ' ');
            END IF;

            v_errorhint := 'Ongeldige Einde Afbouwdatum ';
            v_EventAfbouw := TRIM (v_EventAfbouw);
            IF (v_EventAfbouw IS NOT NULL)
            THEN
                IF LENGTH (v_EventAfbouw) > 50
                THEN
                    v_EventAfbouw := SUBSTR (v_EventAfbouw, 1, 50);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Einde Afbouwdatum te lang', 'Einde Afbouwdatum wordt afgebroken tot [' || v_EventAfbouw || ']' );
                END IF;
                v_EventAfbouw := REPLACE(REPLACE(v_EventAfbouw,'   ', ' '),'  ', ' ');
            END IF;




            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errorhint :=
                      'Fout bij toevoegen regel aan importtabel arai_imp_events';

                  INSERT INTO arai_imp_events (Evenement, EventID, Bedrijfsnaam, BedrijfsnaamID, BIllto, BilltoID, EventDatumVan, EventDatumTot, EventOpbouw, EventAfbouw)
                  VALUES (v_Evenement, v_EventID, v_Bedrijfsnaam, v_BedrijfsnaamID, v_BIllto, v_BilltoID, v_EventDatum1, v_EventDatum2, v_EventOpbouw, v_EventAfbouw);

                  COMMIT;
                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog
                             (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Ingelezen regel kan niet worden weggeschreven!'
                             );
                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'EVENTS: aantal ingelezen regels: '
                        || TO_CHAR (v_count_import),
                        ''
                       );
   END IF;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      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',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;
END arai_import_events;
/



CREATE OR REPLACE PROCEDURE arai_update_events (
   p_import_key IN NUMBER
)
IS

    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);



    -- Alle event-regels
    CURSOR c_imp_events
    IS
        SELECT *
        FROM arai_imp_events;


    BEGIN
    v_count_tot := 0;
    v_count_error := 0;


    v_aanduiding := '';


    -- Alle events verwerken...
    FOR rec_events IN c_imp_events
    LOOP
        BEGIN
            v_count_tot := v_count_tot + 1;

            v_errorhint := 'Fout bij bepalen events-id [' || UPPER(rec_events.EventID) || ']';

            -- Evenement, EventID, Bedrijfsnaam, BedrijfsnaamID, BIllto, BilltoID

            -- Bepaal het record uit arai_events op basis van event_id



            SELECT COUNT (*)
            INTO v_count
            FROM arai_events
            WHERE EventID =  UPPER (rec_events.EventID);


            IF (v_count = 0)
            THEN
                -- Event bestaat nog niet, dus toevoegen...
                v_errorhint := 'Fout bij toevoegen event ' || UPPER(rec_events.EventID);

                INSERT INTO arai_events (Evenement, EventID, Bedrijfsnaam, BedrijfsnaamID, BIllto, BilltoID, EventDatumVan, EventDatumTot, EventOpbouw, EventAfbouw)
                SELECT  rec_events.Evenement, UPPER(rec_events.EventID), rec_events.Bedrijfsnaam, rec_events.BedrijfsnaamID, rec_events.BIllto, rec_events.BilltoID,
                        to_date(rec_events.EventDatumVan,'DD-MM-YYYY HH24:MI:SS'),
                        to_date(rec_events.EventDatumTot,'DD-MM-YYYY HH24:MI:SS'),
                        to_date(rec_events.EventOpbouw,'DD-MM-YYYY HH24:MI:SS'),
                        to_date(rec_events.EventAfbouw,'DD-MM-YYYY HH24:MI:SS')
                FROM DUAL;
                -- VALUES (rec_events.Evenement, rec_events.EventID, rec_events.Bedrijfsnaam, rec_events.BedrijfsnaamID, rec_events.BIllto, rec_events.BilltoID);

                COMMIT;
            ELSE
                -- Event bestaat al, dus updaten van alle gegevens
                v_errorhint := 'Fout bij bijwerken van event ' || UPPER(rec_events.EventID);

                UPDATE arai_events
                SET  Evenement= rec_events.Evenement,
                    Bedrijfsnaam=rec_events.Bedrijfsnaam,
                    BedrijfsnaamID=rec_events.BedrijfsnaamID,
                    BIllto=rec_events.BIllto,
                    BilltoID=rec_events.BilltoID,
                    EventDatumVan=to_date(rec_events.EventDatumVan,'DD-MM-YYYY HH24:MI:SS'),
                    EventDatumTot=to_date(rec_events.EventDatumTot,'DD-MM-YYYY HH24:MI:SS'),
                    EventOpbouw=to_date(rec_events.EventOpbouw,'DD-MM-YYYY HH24:MI:SS'),
                    EventAfbouw=to_date(rec_events.EventAfbouw,'DD-MM-YYYY HH24:MI:SS')
                WHERE EventID=UPPER(rec_events.EventID);

                COMMIT;
            END IF;

            COMMIT;

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


    fac.imp_writelog (p_import_key,
                    'S',
                       'EVENTS: verwerkte regels zonder foutmelding: '
                    || TO_CHAR (v_count_tot - v_count_error),
                    ''
                   );
    fac.imp_writelog (p_import_key,
                    'S',
                       'EVENTS: verwerkte regels met foutmelding: '
                    || TO_CHAR (v_count_error),
                    ''
                   );
    COMMIT;

END arai_update_events;
/







---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
---              KPI TEMPERATUUR                      KPI TEMPERATUUR                            KPI TEMPERATUUR                          ---
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------





-- sd.ins_srtgroep_key (+) = 1 is de key van de groep 'Temperatuur' onder de discipline 'Klimaat'
-- kd.ins_kenmerk_key (+) = 1 is de key van het kenmerk Temperatuur.
-- ak.alg_kenmerk_key (+) = 1020 is de key van kenmerk 'Join KPI?'
-- ak1.alg_kenmerk_key (+) = 1021 is de key van kenmerk 'Min. temperatuur'
-- ak2.alg_kenmerk_key (+) = 1022 is de key van kenmerk 'Max. temperatuur'
-- ud1.fac_usrtab_key = 41 is de key van de usertabel '$KPI_SETTINGS'.
-- ud.fac_usrdata_code = KPI_TEMP_GROEN_MIN is de ondergrens voor de grone zone (default 20.0), KPI_TEMP_GROEN_MAX is de bovengrens voor de groene zone (default 24)..
-- KPI_TEMP_ORANJE_MARGE is de marge (default 1.0 graad) die de ondergrens voor de oranje zone (default dus 20-1=19) en de bovengrens voor orane (default dus 24+1=25) aangeeft.

-- join_kpi heeft de volgende (key)waarden (uit eigen tabel Join KPI): 1 = Nee (doet niet mee), 2 = Nu ff niet, 3 = Ja (doet mee).

-- min_waarde_oranje (1e min. grenswaarde, instelbaar per ruimte, als leeg dan eerst uit usrtab $KPI_SETTINGS (KPI_TEMP_GROEN_MIN), anders default 20.0),
-- max_waarde_oranje,(1e max. grenswaarde, instelbaar per ruimte, als leeg dan eerst uit usrtab $KPI_SETTINGS (KPI_TEMP_GROEN_MAX), anders default 24.0),
-- min_waarde, (rode grenswaarde, is gelijk aan min_waarde_oranje - 1.0)
-- max_waarde, (rode grenswaarde, is gelijk aan max_waarde_oranje + 1.0)
CREATE OR REPLACE VIEW arai_v_kpi_temp_per_ruimte
(   ins_deel_key,
    ins_deel_omschrijving,
    alg_ruimte_key,
    join_kpi,
    alg_gebouw_code,
    alg_gebouw_naam,
    alg_verdieping_key,
    alg_verdieping_volgnr,
    alg_ruimte_nr,
    alg_ruimte_omschrijving,
    ins_kenmerkdeel_waarde,
    min_waarde_oranje,
    max_waarde_oranje,
    min_waarde,
    max_waarde,
    ins_kenmerkdeel_aanmaak,
    ins_kenmerkdeel_verwijder,
    url
)
AS
   SELECT d.ins_deel_key, d.ins_deel_omschrijving, r.alg_ruimte_key, COALESCE(ak.alg_onrgoedkenmerk_waarde,'1'),
          g.alg_gebouw_code, g.alg_gebouw_naam, v.alg_verdieping_key, v.alg_verdieping_volgnr, r.alg_ruimte_nr, r.alg_ruimte_omschrijving, kd.ins_kenmerkdeel_waarde,
          COALESCE(ak1.alg_onrgoedkenmerk_waarde,
                      ( SELECT ud.fac_usrdata_omschr
                        FROM fac_usrdata ud
                        WHERE ud.fac_usrtab_key = 41
                        AND ud.fac_usrdata_code  = 'KPI_TEMP_GROEN_MIN'
                        AND ud.fac_usrdata_verwijder IS NULL
                      ), '20.0'),
          COALESCE(ak2.alg_onrgoedkenmerk_waarde,
                      ( SELECT ud.fac_usrdata_omschr
                        FROM fac_usrdata ud
                        WHERE ud.fac_usrtab_key = 41
                        AND ud.fac_usrdata_code  = 'KPI_TEMP_GROEN_MAX'
                        AND ud.fac_usrdata_verwijder IS NULL
                      ), '24.0'),
          COALESCE(ak1.alg_onrgoedkenmerk_waarde,
                      ( SELECT ud.fac_usrdata_omschr
                        FROM fac_usrdata ud
                        WHERE ud.fac_usrtab_key = 41
                        AND ud.fac_usrdata_code  = 'KPI_TEMP_GROEN_MIN'
                        AND ud.fac_usrdata_verwijder IS NULL
                      ), '20.0') -  COALESCE(  (    SELECT ud.fac_usrdata_omschr
                                                    FROM fac_usrdata ud
                                                    WHERE ud.fac_usrtab_key = 41
                                                    AND ud.fac_usrdata_code  = 'KPI_TEMP_ORANJE_MARGE'
                                                    AND ud.fac_usrdata_verwijder IS NULL
                                                ), '1.0'),
          COALESCE(ak2.alg_onrgoedkenmerk_waarde,
                      ( SELECT ud.fac_usrdata_omschr
                        FROM fac_usrdata ud
                        WHERE ud.fac_usrtab_key = 41
                        AND ud.fac_usrdata_code  = 'KPI_TEMP_GROEN_MAX'
                        AND ud.fac_usrdata_verwijder IS NULL
                      ), '24.0') + COALESCE(  (    SELECT ud.fac_usrdata_omschr
                                                    FROM fac_usrdata ud
                                                    WHERE ud.fac_usrtab_key = 41
                                                    AND ud.fac_usrdata_code  = 'KPI_TEMP_ORANJE_MARGE'
                                                    AND ud.fac_usrdata_verwijder IS NULL
                                                ), '1.0'),
          kd.ins_kenmerkdeel_aanmaak, kd.ins_kenmerkdeel_verwijder, NULL
   FROM ins_deel d, ins_srtdeel sd, alg_ruimte r, alg_verdieping v, alg_gebouw g, ins_kenmerkdeel kd,
        alg_onrgoedkenmerk ak, alg_onrgoedkenmerk ak1, alg_onrgoedkenmerk ak2
   WHERE d.ins_deel_verwijder IS NULL
   AND d.ins_srtdeel_key = sd.ins_srtdeel_key (+)
   AND sd.ins_srtgroep_key (+) = 1
   AND r.alg_ruimte_key = d.ins_alg_ruimte_key (+)
   AND v.alg_verdieping_key = r.alg_verdieping_key
   AND g.alg_gebouw_key = v.alg_gebouw_key
   AND kd.ins_deel_key (+) = d.ins_deel_key
   AND kd.ins_kenmerk_key (+) = 1
   AND r.alg_ruimte_key = ak.alg_onrgoed_key
   AND ak.alg_onrgoed_niveau = 'R'
   AND ak.alg_kenmerk_key (+) = 1020
   AND r.alg_ruimte_key = ak1.alg_onrgoed_key (+)
   AND ak1.alg_onrgoed_niveau (+) = 'R'
   AND ak1.alg_kenmerk_key (+) = 1021
   AND r.alg_ruimte_key = ak2.alg_onrgoed_key (+)
   AND ak2.alg_onrgoed_niveau (+) = 'R'
   AND ak2.alg_kenmerk_key (+) = 1022;

CREATE OR REPLACE VIEW arai_v_rap_kpi_temp_per_ruimte
(   alg_ruimte_key,
    join_kpi,
    alg_gebouw_code,
    alg_gebouw_naam,
    alg_verdieping_key,
    alg_verdieping_volgnr,
    alg_ruimte_nr,
    alg_ruimte_omschrijving,
    avg_temp,
    min_temp,
    max_temp,
    min_waarde_oranje,
    max_waarde_oranje,
    min_waarde,
    max_waarde,
    datum,
    url
)
AS
SELECT  alg_ruimte_key,
        MIN(join_kpi),
        MIN(alg_gebouw_code),
        MIN(alg_gebouw_naam),
        MIN(alg_verdieping_key),
        MIN(alg_verdieping_volgnr),
        MIN(alg_ruimte_nr),
        MIN(alg_ruimte_omschrijving),
        ROUND(AVG(ins_kenmerkdeel_waarde),1),
        ROUND(MIN(ins_kenmerkdeel_waarde),1),
        ROUND(MAX(ins_kenmerkdeel_waarde),1),
        MIN(min_waarde_oranje),
        MIN(max_waarde_oranje),
        MIN(min_waarde),
        MIN(max_waarde),
        MIN(ins_kenmerkdeel_aanmaak),
        MIN(url)
FROM arai_v_kpi_temp_per_ruimte
WHERE ins_kenmerkdeel_verwijder IS NULL
AND TRUNC(ins_kenmerkdeel_aanmaak) = TRUNC(SYSDATE)
GROUP BY alg_ruimte_key ;

CREATE OR REPLACE VIEW arai_v_rap_temp_per_datapunt
(   fclt_x_jaar,
    fclt_x_maand,
    fclt_x_dag,
    fclt_x_uur,
    fclt_x_minuut,
    datum,
    fclt_f_gebouw,
    fclt_f_verdieping,
    fclt_f_ruimte,
    ruimtetemperatuur,
    fclt_f_datapunt,
    temperatuur
)
AS SELECT
    to_char(ins_kenmerkdeel_aanmaak,'yyyy'),
    to_char(ins_kenmerkdeel_aanmaak,'mm'),
    to_char(ins_kenmerkdeel_aanmaak,'dd'),
    to_char(ins_kenmerkdeel_aanmaak,'hh24'),
    to_char(ins_kenmerkdeel_aanmaak,'mi'),
    to_char(ins_kenmerkdeel_aanmaak,'dd-mm-yyyy hh24:mi'),
    alg_gebouw_code || '-' || alg_gebouw_naam,
    to_char(alg_verdieping_volgnr),
    alg_ruimte_omschrijving,
    to_char((SELECT ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1)
     FROM arai_v_kpi_temp_per_ruimte y
     WHERE y.alg_ruimte_key = x.alg_ruimte_key
     AND y.ins_kenmerkdeel_aanmaak = x.ins_kenmerkdeel_aanmaak
     GROUP BY alg_ruimte_key, TO_CHAR(ins_kenmerkdeel_aanmaak,'HH24:MI')
    )),
    ins_deel_omschrijving,
    ins_kenmerkdeel_waarde
FROM arai_v_kpi_temp_per_ruimte x;

CREATE OR REPLACE VIEW arai_v_rap_temp_per_ruimte
(   fclt_x_jaar,
    fclt_x_maand,
    fclt_x_dag,
    fclt_x_dagdeel,
    fclt_x_uur,
    fclt_x_minuut,
    fclt_f_gebouw,
    fclt_f_verdieping,
    fclt_f_ruimte,
    ruimtetemperatuur,
    kpi_temp
)
AS SELECT
    to_char(ins_kenmerkdeel_aanmaak,'yyyy'),
    to_char(ins_kenmerkdeel_aanmaak,'mm'),
    to_char(ins_kenmerkdeel_aanmaak,'dd'),
    CASE
        WHEN to_char(ins_kenmerkdeel_aanmaak,'hh24') <= '06' THEN 'nacht'
        WHEN to_char(ins_kenmerkdeel_aanmaak,'hh24') <= '11' THEN 'ochtend'
        WHEN to_char(ins_kenmerkdeel_aanmaak,'hh24') <= '17' THEN 'middag'
        ELSE 'avond'
    END dagdeel,
    to_char(ins_kenmerkdeel_aanmaak,'hh24'),
    to_char(ins_kenmerkdeel_aanmaak,'mi'),
    MIN(alg_gebouw_code) || '-' || MIN(alg_gebouw_naam),
    to_char(MIN(alg_verdieping_volgnr)),
    MIN(alg_ruimte_omschrijving),
    to_char(ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1)),
    CASE
       WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) IS NULL THEN -1
       WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) < MIN(min_waarde) THEN 2
       WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) > MIN(max_waarde) THEN 2
       WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) < MIN(min_waarde_oranje) THEN 1
       WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) > MIN(max_waarde_oranje) THEN 1
       ELSE  0
    END kpi_temp
FROM arai_v_kpi_temp_per_ruimte x
GROUP BY alg_ruimte_key, to_char(ins_kenmerkdeel_aanmaak,'yyyy'), to_char(ins_kenmerkdeel_aanmaak,'mm'),
        to_char(ins_kenmerkdeel_aanmaak,'dd'), to_char(ins_kenmerkdeel_aanmaak,'hh24'), to_char(ins_kenmerkdeel_aanmaak,'mi');



-----------------------------------                              KPI TEMPERATUUR    GRAFIEKEN                      -----------------------------------

-- Grafiek 1: KPI gemiddelde temperatuuur per ruimte van vandaag van max. 4 uur terug in de tijd uitgezet.
CREATE OR REPLACE VIEW arai_v_graph_kpi_temp_vandaag
(
   fclt_key,
   FCLT_XAS_TIJD,
   FCLT_YAS_TEMPERATUUR,
   FCLT_URL
)
AS
    SELECT  alg_ruimte_key,
            TO_CHAR(ins_kenmerkdeel_aanmaak,'HH24:MI'),
            ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1),
            MIN(url)
    FROM  arai_v_kpi_temp_per_ruimte
    WHERE ins_kenmerkdeel_aanmaak >= SYSDATE - 4/24
    AND TRUNC(ins_kenmerkdeel_aanmaak) = TRUNC(SYSDATE)
    GROUP BY alg_ruimte_key, TO_CHAR(ins_kenmerkdeel_aanmaak,'HH24:MI');

-- Grafiek 2: KPI gemiddelde temperatuuur per ruimte van vandaag van max. 4 uur terug in de tijd uitgezet.
-- FCLT_YAS_TEMPERATUUR is de y-as voor rood
-- FCLT_YAS2_TEMPERATUUR is de y-as voor groen
-- FCLT_YAS3_TEMPERATUUR is de y-as voor oranje
-- Barchart met 3 kleuren: groen (temp = okee), oranje (temp is oranje) en rood (temp is rood)
CREATE OR REPLACE VIEW arai_v_graph_kpi_temp2_vandaag
(
   fclt_key,
   FCLT_XAS_TIJD,
   FCLT_YAS_TEMPERATUUR,
   FCLT_YAS2_TEMPERATUUR,
   FCLT_YAS3_TEMPERATUUR,
   FCLT_URL
)
AS
    SELECT  alg_ruimte_key,
            TO_CHAR(ins_kenmerkdeel_aanmaak,'HH24:MI'),
            CASE
               WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) IS NULL THEN 0
               WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) < MIN(min_waarde) THEN ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1)
               WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) > MIN(max_waarde) THEN ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1)
               ELSE  0
            END,
            CASE
               WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) IS NULL THEN 0
               WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) < MIN(min_waarde_oranje) THEN 0
               WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) > MIN(max_waarde_oranje) THEN 0
               ELSE  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1)
            END,
            CASE
               WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) IS NULL THEN 0
               WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) < MIN(min_waarde_oranje) AND
                     ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) >= MIN(min_waarde) THEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1)
               WHEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) > MAX(max_waarde_oranje) AND
                     ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1) <= MIN(max_waarde) THEN  ROUND(AVG(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),1)
               ELSE  0
            END,
            MIN(url)
    FROM  arai_v_kpi_temp_per_ruimte
    WHERE ins_kenmerkdeel_aanmaak >= SYSDATE - 4/24
    AND TRUNC(ins_kenmerkdeel_aanmaak) = TRUNC(SYSDATE)
    GROUP BY alg_ruimte_key, TO_CHAR(ins_kenmerkdeel_aanmaak,'HH24:MI');

CREATE OR REPLACE VIEW arai_v_label_ins_temp
(ins_deel_key, waarde)
AS
   SELECT ins_deel_key,  CHR (10) ||
                            CASE
                                WHEN join_kpi = 3 THEN
                                                       CASE
                                                           WHEN ins_kenmerkdeel_waarde IS NULL THEN '[s750][cff0000]'
                                                           WHEN  ROUND(to_number(COALESCE(ins_kenmerkdeel_waarde,'0')),1) < min_waarde THEN '[s750][cff0000]'
                                                           WHEN  ROUND(to_number(COALESCE(ins_kenmerkdeel_waarde,'0')),1) > max_waarde THEN '[s750][cff0000]'
                                                           WHEN  ROUND(to_number(COALESCE(ins_kenmerkdeel_waarde,'0')),1) < min_waarde_oranje THEN '[s750][cff8800]'
                                                           WHEN  ROUND(to_number(COALESCE(ins_kenmerkdeel_waarde,'0')),1) > max_waarde_oranje THEN '[s750][cff8800]'
                                                           ELSE  '[s500][c00c000]'
                                                        END
                            ELSE
                                '[s500][cc0c0c0]'
                            END ||  ins_kenmerkdeel_waarde   || ' °C'
    FROM arai_v_kpi_temp_per_ruimte
    WHERE ins_kenmerkdeel_verwijder IS NULL
    AND TRUNC(ins_kenmerkdeel_aanmaak) = TRUNC(SYSDATE)
    AND ins_deel_key IS NOT NULL;



---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
---              KPI TOILET SCHOONMAAK                KPI TOILET SCHOONMAAK                      KPI TOILET SCHOONMAAK                    ---
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------


-- View arai_v_kpi_toilet_scan_ruimte zijn de toilet-inspectiepunten die ooit zijn gescan-d.

-- sd.ins_srtgroep_key (+) = 21 is de key van de groep 'Schoonmaak' onder de discipline 'Inspectiepunten'
-- ak.alg_kenmerk_key (+) = 1020 is de key van kenmerk 'Join KPI?'
-- join_kpi heeft de volgende (key)waarden (uit eigen tabel Join KPI): 1 = Nee (doet niet mee), 2 = Nu ff niet, 3 = Ja (doet mee).

-- ins_srtcontrole_key = 11: dit is de inspectie "Toiletschoonmaak".
-- ins_controlemode_key = 10 (Goed) of 11 (Fout)

-- halveuur_1_of_2, geeft aan of de check in het 1e of 2e halve uur van een heel uur is.

-- datum_laatste_check_in_h_uur geeft per halve uur weer wanneer in dat halve uur de laatste check van dat object was.
-- als deze afwijkt van ins_deelsrtcontrole_datum, dan betekent dat die meting/check niet mee moet worden geteld op de hele halve uren,
-- omdat die dus eerder was en wordt overruled door die latere meting/check
CREATE OR REPLACE VIEW arai_v_kpi_toilet_scan_ruimte
(   ins_deel_key,
    alg_ruimte_key,
    join_kpi,
    alg_gebouw_key,
    alg_gebouw_code,
    alg_gebouw_naam,
    alg_verdieping_key,
    alg_verdieping_volgnr,
    alg_ruimte_nr,
    alg_ruimte_omschrijving,
    ins_controlemode_key,
    goed,
    fout,
    ins_controlemode_oms,
    ins_controlemode_opmerking,
    ins_deelsrtcontrole_opmerking,
    ins_deelsrtcontrole_datum,
    tijd,
    halveuur_1_of_2,
    datum_laatste_check_in_h_uur,
    waarde_oranje,
    waarde_rood,
    url
)
AS
   SELECT d.ins_deel_key, r.alg_ruimte_key, COALESCE(ak.alg_onrgoedkenmerk_waarde,'1'),
          g.alg_gebouw_key, g.alg_gebouw_code, g.alg_gebouw_naam, v.alg_verdieping_key, v.alg_verdieping_volgnr, r.alg_ruimte_nr,  r.alg_ruimte_omschrijving,
          c.ins_controlemode_key,
          CASE
               WHEN  c.ins_controlemode_key = 10 THEN 1
               WHEN  c.ins_controlemode_key = 11 THEN 0
               ELSE 0
          END goed,
          CASE
               WHEN  c.ins_controlemode_key = 10 THEN 0
               WHEN  c.ins_controlemode_key = 11 THEN 1
               ELSE 0
          END fout,
          cm.ins_controlemode_oms, cm.ins_controlemode_opmerking, c.ins_deelsrtcontrole_opmerking, c.ins_deelsrtcontrole_datum,
          TO_CHAR(c.ins_deelsrtcontrole_datum, 'HH24:MI'),
          DECODE(SUBSTR(TO_CHAR(ins_deelsrtcontrole_datum,'MI'),1,1), 0, 1, 1, 1, 2, 1, 3, 2, 4, 2, 5, 2) halveuur_1_of_2,
          (SELECT MAX(c1.ins_deelsrtcontrole_datum)
           FROM ins_deelsrtcontrole c1
           WHERE c1.ins_deel_key = c.ins_deel_key
           AND  DECODE(SUBSTR(TO_CHAR(c.ins_deelsrtcontrole_datum,'MI'),1,1), 0, 1, 1, 1, 2, 1, 3, 2, 4, 2, 5, 2) =
                DECODE(SUBSTR(TO_CHAR(c1.ins_deelsrtcontrole_datum,'MI'),1,1), 0, 1, 1, 1, 2, 1, 3, 2, 4, 2, 5, 2)
           AND TRUNC(c.ins_deelsrtcontrole_datum,'HH24')= TRUNC(c1.ins_deelsrtcontrole_datum, 'HH24')
           AND TRUNC(c.ins_deelsrtcontrole_datum)= TRUNC(c1.ins_deelsrtcontrole_datum)
           AND c1.ins_srtcontrole_key = 11) datum_laatste_check_in_h_uur,
          COALESCE(  ( SELECT ud.fac_usrdata_omschr
                        FROM fac_usrdata ud
                        WHERE ud.fac_usrtab_key = 41
                        AND ud.fac_usrdata_code  = 'KPI_SCHONETOILETTEN_GROEN_MIN'
                        AND ud.fac_usrdata_verwijder IS NULL
                      ), '90'),
          COALESCE(  ( SELECT ud.fac_usrdata_omschr
                        FROM fac_usrdata ud
                        WHERE ud.fac_usrtab_key = 41
                        AND ud.fac_usrdata_code  = 'KPI_SCHONETOILETTEN_ORANJE_MIN'
                        AND ud.fac_usrdata_verwijder IS NULL
                      ), '70'),
          NULL
   FROM ins_deel d, ins_srtdeel sd, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_onrgoedkenmerk ak, ins_deelsrtcontrole c, ins_controlemode cm
   WHERE d.ins_deel_verwijder IS NULL
   AND d.ins_srtdeel_key = sd.ins_srtdeel_key
   AND sd.ins_srtdeel_key = 21
   AND r.alg_ruimte_key = d.ins_alg_ruimte_key
   AND v.alg_verdieping_key = r.alg_verdieping_key
   AND g.alg_gebouw_key = v.alg_gebouw_key
   AND r.alg_ruimte_key = ak.alg_onrgoed_key (+)
   AND ak.alg_onrgoed_niveau (+) = 'R'
   AND ak.alg_kenmerk_key (+) = 1020
   AND d.ins_deel_key = c.ins_deel_key
   AND c.ins_srtcontrole_key = 11
   AND c.ins_controlemode_key = cm.ins_controlemode_key;



-----------------------------------                              KPI TOILET GRAFIEKEN                          -----------------------------------

CREATE OR REPLACE VIEW arai_v_graph_kpi_toil_all
(
   datum,
   fclt_key,
   FCLT_XAS_TIJD,
   FCLT_YAS_SCHOON,
   fout,
   FCLT_URL
)
AS
    SELECT  TRUNC(ins_deelsrtcontrole_datum),
            alg_gebouw_key,
            DECODE(halveuur_1_of_2, 1, TO_CHAR(ins_deelsrtcontrole_datum,'HH24'), 2, TO_CHAR(ins_deelsrtcontrole_datum+1/24,'HH24')) || ':' || DECODE(halveuur_1_of_2, 1, '30', 2, '00'),
            ROUND(SUM(goed)/COUNT(*)*100,1),
            ROUND(SUM(fout)/COUNT(*)*100,1),
            MIN(url)
    FROM  arai_v_kpi_toilet_scan_ruimte c
--    WHERE TRUNC(c.ins_deelsrtcontrole_datum) = TRUNC(SYSDATE)
--    AND c.ins_deelsrtcontrole_datum >= SYSDATE - 8/24
    WHERE c.ins_deelsrtcontrole_datum = datum_laatste_check_in_h_uur
    GROUP BY TRUNC(ins_deelsrtcontrole_datum), alg_gebouw_key,
             DECODE(halveuur_1_of_2, 1, TO_CHAR(ins_deelsrtcontrole_datum,'HH24'), 2, TO_CHAR(ins_deelsrtcontrole_datum+1/24,'HH24')) || ':' ||DECODE(halveuur_1_of_2, 1, '30', 2, '00');




-- Grafiek 1 (lijngrafiek): KPI precentage schone toiletten per gebouw, van vandaag van max. 8 uur terug in de tijd uitgezet.
-- Daarbij worden de onregelmatige controle-tijden (naar boven) afgerond op halve uren (dus hh:00 of hh:30),
-- Indien een toilet-object meer dan 1 keer in een half 'heel' half uur is gecontroleerd, telt de laatste daarvan.
-- Dus X-as bestaat uit maximaal 8 uur x 2 (ieder half uur) = 16 waarden, b.v. 10:00, 10:30, 11:00, ... t/m 17:30.
-- De Y-as bestaat uit een percentage van schone toiletten tov. alle gescaned 'laaste' binnen dat halve uur.
-- En dat gegroepeerd op gebouw nivo.

CREATE OR REPLACE VIEW arai_v_graph_kpi_toil_gebouw
(
   fclt_key,
   FCLT_XAS_TIJD,
   FCLT_YAS_SCHOON,
   fout,
   FCLT_URL
)
AS
    SELECT  fclt_key,
            FCLT_XAS_TIJD,
            FCLT_YAS_SCHOON,
            fout,
            FCLT_URL
    FROM  arai_v_graph_kpi_toil_all
    WHERE datum = TRUNC(SYSDATE);


-- Grafiek 2 (barchart met rood/oranje/groen): KPI precentage schone toiletten per gebouw, van vandaag van max. 8 uur terug in de tijd uitgezet.
-- FCLT_YAS_SCHOON is de y-as voor rood
-- FCLT_YAS2_SCHOON is de y-as voor groen
-- FCLT_YAS3_SCHOON is de y-as voor oranje
-- Barchart met 3 kleuren: groen (temp = okee), oranje (temp is oranje) en rood (temp is rood)
CREATE OR REPLACE VIEW arai_v_graph_kpi_toil2_gebouw
(
   fclt_key,
   FCLT_XAS_TIJD,
   FCLT_YAS_SCHOON,
   FCLT_YAS2_SCHOON,
   FCLT_YAS3_SCHOON,
   FCLT_URL
)
AS
    SELECT  alg_gebouw_key,
            DECODE(halveuur_1_of_2, 1, TO_CHAR(ins_deelsrtcontrole_datum,'HH24'), 2, TO_CHAR(ins_deelsrtcontrole_datum+1/24,'HH24')) || ':' || DECODE(halveuur_1_of_2, 1, '30', 2, '00'),
            CASE
               WHEN  ROUND(SUM(goed)/COUNT(*)*100,1) IS NULL THEN 0
               WHEN  ROUND(SUM(goed)/COUNT(*)*100,1) < MIN(waarde_rood) THEN ROUND(SUM(goed)/COUNT(*)*100,1)
               ELSE  0
            END,
            CASE
               WHEN  ROUND(SUM(goed)/COUNT(*)*100,1) IS NULL THEN 0
               WHEN  ROUND(SUM(goed)/COUNT(*)*100,1) >= MIN(waarde_oranje) THEN ROUND(SUM(goed)/COUNT(*)*100,1)
               ELSE  0
            END,
            CASE
               WHEN  ROUND(SUM(goed)/COUNT(*)*100,1) IS NULL THEN 0
               WHEN  ROUND(SUM(goed)/COUNT(*)*100,1) >= MIN(waarde_rood) AND
                     ROUND(SUM(goed)/COUNT(*)*100,1) < MIN(waarde_oranje) THEN ROUND(SUM(goed)/COUNT(*)*100,1)
               ELSE  0
            END,
            MIN(url)
    FROM  arai_v_kpi_toilet_scan_ruimte c
    WHERE TRUNC(c.ins_deelsrtcontrole_datum) = TRUNC(SYSDATE)
-- AND c.ins_deelsrtcontrole_datum >= SYSDATE - 8/24
    AND c.ins_deelsrtcontrole_datum = datum_laatste_check_in_h_uur
    GROUP BY alg_gebouw_key,
             DECODE(halveuur_1_of_2, 1, TO_CHAR(ins_deelsrtcontrole_datum,'HH24'), 2, TO_CHAR(ins_deelsrtcontrole_datum+1/24,'HH24')) || ':' ||DECODE(halveuur_1_of_2, 1, '30', 2, '00');




-- View arai_v_kpi_toilet_scan_h_uur zijn de toilet-inspectiepunten die het !!VORIGE!! 1/2 uur zijn gescan-d (dus als nu 10:15 is, dan de checks van 9:30-10:00u),
-- Indien meerdere scans van dezelfde toilet, dan telt daarvan de laatste!
-- !!Let op!!: er wordt gegroepeerd op halve uren, dus groep 1 = scans van 8:00-8:30, groep 2 = 8:30-9:00, 3= 9:00-9:30 etc
-- Dit is essentieel zodat de grafiek die op hele halve uren gaat (8:00-8:30-9:00-9:30-10:00-10:30 etc) te laten kloppen met de KPI-kleur.
CREATE OR REPLACE VIEW arai_v_kpi_toilet_scan_h_uur
AS
    SELECT * FROM arai_v_kpi_toilet_scan_ruimte c
    WHERE TRUNC(c.ins_deelsrtcontrole_datum) = TRUNC(SYSDATE)
    AND c.ins_deelsrtcontrole_datum >= SYSDATE - 1/24
    AND halveuur_1_of_2 <> DECODE(SUBSTR(TO_CHAR(SYSDATE,'MI'),1,1), 0, 1, 1, 1, 2, 1, 3, 2, 4, 2, 5, 2)
    AND c.ins_deelsrtcontrole_datum = datum_laatste_check_in_h_uur;




-- Union van arai_v_kpi_toilet_scan_h_uur (scans van afgelopen 'hele' halve uur) met alle toiletruimten die afgelopen uur niet zijn gescan-d

CREATE OR REPLACE VIEW arai_v_kpi_toilet_ruimte_uur
(   ins_deel_key,
    alg_ruimte_key,
    join_kpi,
    alg_gebouw_key,
    alg_gebouw_code,
    alg_gebouw_naam,
    alg_verdieping_key,
    alg_verdieping_volgnr,
    alg_ruimte_nr,
    alg_ruimte_omschrijving,
    ins_controlemode_key,
    goed,
    fout,
    ins_controlemode_oms,
    ins_controlemode_opmerking,
    ins_deelsrtcontrole_opmerking,
    ins_deelsrtcontrole_datum,
    waarde_oranje,
    waarde_rood,
    url
)
AS
   SELECT   ins_deel_key,
            alg_ruimte_key,
            join_kpi,
            alg_gebouw_key,
            alg_gebouw_code,
            alg_gebouw_naam,
            alg_verdieping_key,
            alg_verdieping_volgnr,
            alg_ruimte_nr,
            alg_ruimte_omschrijving,
            ins_controlemode_key,
            goed,
            fout,
            ins_controlemode_oms,
            ins_controlemode_opmerking,
            ins_deelsrtcontrole_opmerking,
            ins_deelsrtcontrole_datum,
            waarde_oranje,
            waarde_rood,
            url
    FROM arai_v_kpi_toilet_scan_h_uur
    UNION ALL
    SELECT d.ins_deel_key, r.alg_ruimte_key, COALESCE(ak.alg_onrgoedkenmerk_waarde,'1'),
           g.alg_gebouw_key, g.alg_gebouw_code, g.alg_gebouw_naam, v.alg_verdieping_key, v.alg_verdieping_volgnr, r.alg_ruimte_nr,  r.alg_ruimte_omschrijving,
           NULL, 0, 0, NULL, NULL, NULL, NULL,
           COALESCE(  ( SELECT ud.fac_usrdata_omschr
                        FROM fac_usrdata ud
                        WHERE ud.fac_usrtab_key = 41
                        AND ud.fac_usrdata_code  = 'KPI_SCHONETOILETTEN_GROEN_MIN'
                        AND ud.fac_usrdata_verwijder IS NULL
                      ), '90'),
           COALESCE(  ( SELECT ud.fac_usrdata_omschr
                        FROM fac_usrdata ud
                        WHERE ud.fac_usrtab_key = 41
                        AND ud.fac_usrdata_code  = 'KPI_SCHONETOILETTEN_ORANJE_MIN'
                        AND ud.fac_usrdata_verwijder IS NULL
                      ), '70'), NULL
    FROM ins_deel d, ins_srtdeel sd, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_onrgoedkenmerk ak
    WHERE d.ins_deel_verwijder IS NULL
    AND d.ins_srtdeel_key = sd.ins_srtdeel_key
    AND sd.ins_srtdeel_key = 21
    AND r.alg_ruimte_key = d.ins_alg_ruimte_key
    AND v.alg_verdieping_key = r.alg_verdieping_key
    AND g.alg_gebouw_key = v.alg_gebouw_key
    AND r.alg_ruimte_key = ak.alg_onrgoed_key (+)
    AND ak.alg_onrgoed_niveau (+) = 'R'
    AND ak.alg_kenmerk_key (+) = 1020
    AND NOT EXISTS (select 'x' FROM arai_v_kpi_toilet_scan_h_uur tmp WHERE tmp.ins_deel_key = d.ins_deel_key);



-- View arai_v_kpi_toilet_scan_gebouw zijn de toiletscans op gebouwnivo waarvan minimaal 1 toilet-inspectiepunten afgelopen halve uur is gescan-d.

CREATE OR REPLACE VIEW arai_v_kpi_toilet_scan_gebouw
(   alg_gebouw_key,
    alg_gebouw_code,
    alg_gebouw_naam,
    goed,
    fout,
    KPI_STATUS
)
AS SELECT   alg_gebouw_key,
            alg_gebouw_code,
            alg_gebouw_naam,
            ROUND(SUM(goed)/COUNT(*)*100,1),
            ROUND(SUM(fout)/COUNT(*)*100,1),
            CASE
               WHEN ROUND(SUM(goed)/COUNT(*)*100,1) < min(waarde_rood) THEN 2
               WHEN ROUND(SUM(goed)/COUNT(*)*100,1) < min(waarde_oranje) THEN 1
               ELSE 0
            END KPI_STATUS
    FROM arai_v_kpi_toilet_ruimte_uur
    WHERE ins_controlemode_key IS NOT NULL
    GROUP BY alg_gebouw_key, alg_gebouw_code, alg_gebouw_naam;


-- UNION van arai_v_kpi_toilet_scan_gebouw (toiletscans op gebouwnivo van afgelopen uur) met de gebouwen waar afgelopen uur niet is gescan-d.
CREATE OR REPLACE VIEW arai_v_kpi_toilet_gebouw
(   alg_gebouw_key,
    alg_gebouw_code,
    alg_gebouw_naam,
    goed,
    fout,
    KPI_STATUS
)
AS
    SELECT
        alg_gebouw_key,
        alg_gebouw_code,
        alg_gebouw_naam,
        goed,
        fout,
        KPI_STATUS
    FROM arai_v_kpi_toilet_scan_gebouw
    UNION ALL
    SELECT   alg_gebouw_key,
             alg_gebouw_code,
             alg_gebouw_naam,
             NULL,
             NULL,
             -1
    FROM arai_v_kpi_toilet_ruimte_uur  tr
    WHERE NOT EXISTS (select 'x' FROM arai_v_kpi_toilet_scan_gebouw tmp WHERE tmp.alg_gebouw_key = tr.alg_gebouw_key)
    GROUP BY alg_gebouw_key, alg_gebouw_code, alg_gebouw_naam;




-- fclt_key is eigenlijk alg_gebouw_key, dit is tbv filer-mogelijkheid op gebouwnivo in de usrrap.
-- Dit zijn de inspectieresultaten van ooit van alle inspectiepunten
CREATE OR REPLACE VIEW arai_v_rap_kpi_toilet_all
(   fclt_x_datum,
    fclt_x_gebouw,
    ins_deel_key,
    alg_ruimte_key,
    join_kpi,
    fclt_key,
    alg_gebouw_code,
    alg_gebouw_naam,
    alg_verdieping_key,
    alg_verdieping_volgnr,
    alg_ruimte_nr,
    alg_ruimte_omschrijving,
    ins_controlemode_key,
    goed,
    fout,
    ins_controlemode_oms,
    ins_controlemode_opmerking,
    ins_deelsrtcontrole_opmerking,
    ins_deelsrtcontrole_datum,
    trunc_ins_controle_datum,
    tijd,
    halveuur_1_of_2,
    datum_laatste_check_in_h_uur,
    waarde_oranje,
    waarde_rood,
    url,
    afgeronde_tijd,
    KPI_toilet_pergebouw
)
AS
    SELECT  to_char(ins_deelsrtcontrole_datum,'yyyy-mm-dd'),
            alg_gebouw_code || '-' || alg_gebouw_naam,
            ins_deel_key,
            alg_ruimte_key,
            join_kpi,
            alg_gebouw_key,
            alg_gebouw_code,
            alg_gebouw_naam,
            alg_verdieping_key,
            alg_verdieping_volgnr,
            alg_ruimte_nr,
            alg_ruimte_omschrijving,
            ins_controlemode_key,
            c.goed,
            c.fout,
            ins_controlemode_oms,
            ins_controlemode_opmerking,
            ins_deelsrtcontrole_opmerking,
            ins_deelsrtcontrole_datum,
            TRUNC(ins_deelsrtcontrole_datum),
            tijd,
            halveuur_1_of_2,
            datum_laatste_check_in_h_uur,
            waarde_oranje,
            waarde_rood,
            url,
            DECODE(halveuur_1_of_2, 1, TO_CHAR(ins_deelsrtcontrole_datum,'HH24'), 2, TO_CHAR(ins_deelsrtcontrole_datum+1/24,'HH24')) || ':' || DECODE(halveuur_1_of_2, 1, '30', 2, '00') afgeronde_tijd,
            FCLT_YAS_SCHOON
    FROM arai_v_kpi_toilet_scan_ruimte c, arai_v_graph_kpi_toil_all g
    WHERE c.ins_deelsrtcontrole_datum = datum_laatste_check_in_h_uur
    AND c.alg_gebouw_key = g.fclt_key(+)
    AND DECODE(halveuur_1_of_2, 1, TO_CHAR(ins_deelsrtcontrole_datum,'HH24'), 2, TO_CHAR(ins_deelsrtcontrole_datum+1/24,'HH24')) || ':' || DECODE(halveuur_1_of_2, 1, '30', 2, '00') = g.FCLT_XAS_TIJD (+)
    AND ins_deelsrtcontrole_datum >= SYSDATE - 28;


-- fclt_key is eigenlijk alg_gebouw_key, dit is tbv filer-mogelijkheid op gebouwnivo in de usrrap.
-- Dit zijn de inspectieresultaten van ALLEEN vandaag van alle inspectiepunten

CREATE OR REPLACE VIEW arai_v_rap_kpi_toilet
AS
    SELECT  *
    FROM arai_v_rap_kpi_toilet_all
    WHERE TRUNC(ins_deelsrtcontrole_datum) = TRUNC(SYSDATE);





---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
---                 KPI ICT MITEL               KPI ICT MITEL               KPI ICT MITEL               KPI ICT MITEL                     ---
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------





-- sd.ins_srtgroep_key (+) = 41 is de key van de groep 'Telefonie' onder de discipline 'Telecom'
-- kd.ins_kenmerk_key (+) = 21 is de key van het kenmerk Wachtrij.
-- VERVALLEN: Als aantal wachtenden max. 5 is, dan is dat okee (0 t/m 5 wachtenden, daarna oranje...
-- VERVALLEN: waarde_oranje (grenswaarde voor oranje zone = 6 t/m 10 wachtenden, daarna rood,
-- VERVALLEN: waarde_rood (grenswaarde voor rode zone = 11 en meer wachtenden
-- Als gemiddelde wachttijd max. 60 seconden s, dan is dat okee (0 t/m 60 sec. daarna oranje...
-- waarde_oranje (grenswaarde voor oranje zone is > 60 t/m 180 sec. daarna rood,
-- waarde_rood (grenswaarde voor rode zone is > 180 sec


CREATE OR REPLACE VIEW arai_v_kpi_ict_mitel
(   ins_deel_key,
    ins_deel_omschrijving,
    ins_srtdeel_omschrijving,
    alg_ruimte_key,
    alg_gebouw_code,
    alg_gebouw_naam,
    alg_verdieping_key,
    alg_verdieping_volgnr,
    alg_ruimte_nr,
    kpi_color_overrule,
    ins_kenmerkdeel_waarde,
    waarde_oranje,
    waarde_rood,
    ins_kenmerkdeel_aanmaak,
    trunc_datum,
    ins_kenmerkdeel_verwijder,
    url
)
AS
   SELECT d.ins_deel_key, d.ins_deel_omschrijving, sd.ins_srtdeel_omschrijving, r.alg_ruimte_key,
          g.alg_gebouw_code, g.alg_gebouw_naam, v.alg_verdieping_key, v.alg_verdieping_volgnr, r.alg_ruimte_nr,
          DECODE(ud_color.fac_usrdata_code, 'KPI_GROEN', 0, 'KPI_ORANJE', 1, 'KPI_ROOD', 2, NULL),
          kd.ins_kenmerkdeel_waarde,
          COALESCE(  ( SELECT ud.fac_usrdata_omschr
                        FROM fac_usrdata ud
                        WHERE ud.fac_usrtab_key = 41
                        AND ud.fac_usrdata_code  = 'KPI_ICT_MITEL_GROEN_MAX'
                        AND ud.fac_usrdata_verwijder IS NULL
                      ) + 1, 60),
          COALESCE(  ( SELECT ud.fac_usrdata_omschr
                        FROM fac_usrdata ud
                        WHERE ud.fac_usrtab_key = 41
                        AND ud.fac_usrdata_code  = 'KPI_ICT_MITEL_ORANJE_MAX'
                        AND ud.fac_usrdata_verwijder IS NULL
                      ) + 1, 180),
          kd.ins_kenmerkdeel_aanmaak, TRUNC(kd.ins_kenmerkdeel_aanmaak), kd.ins_kenmerkdeel_verwijder, NULL
   FROM ins_deel d, ins_srtdeel sd, alg_ruimte r, alg_verdieping v, alg_gebouw g, ins_kenmerkdeel kd,
        ins_kenmerkdeel kd_color, fac_usrdata ud_color
   WHERE d.ins_deel_verwijder IS NULL
   AND d.ins_srtdeel_key = sd.ins_srtdeel_key
   AND sd.ins_srtgroep_key = 41
   AND r.alg_ruimte_key = d.ins_alg_ruimte_key
   AND v.alg_verdieping_key = r.alg_verdieping_key
   AND g.alg_gebouw_key = v.alg_gebouw_key
   AND kd.ins_deel_key = d.ins_deel_key
   AND kd.ins_kenmerk_key = 21
   AND kd_color.ins_deel_key (+) = d.ins_deel_key
   AND kd_color.ins_kenmerk_key (+) = 41
   AND ud_color.fac_usrdata_key(+) = to_number(kd_color.ins_kenmerkdeel_waarde);


CREATE OR REPLACE VIEW arai_v_rap_kpi_ict_mitel
AS
   SELECT *
   FROM arai_v_kpi_ict_mitel
   WHERE ins_kenmerkdeel_verwijder IS NULL
   AND trunc_datum = TRUNC(SYSDATE);



-----------------------------------                              KPI ICT MITEL   - GRAFIEKEN                       -----------------------------------


CREATE OR REPLACE VIEW arai_v_graph_kpi_ict_all
(
   datum,
   fclt_key,
   FCLT_XAS_TIJD,
   FCLT_YAS_WACHTTIJD,
   KPI_ICT_MITEL,
   FCLT_URL
)
AS
    SELECT  trunc_datum,
            ins_deel_key,
            TO_CHAR(ins_kenmerkdeel_aanmaak,'HH24:MI'),
            MAX(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))),
            CASE
                WHEN MAX(ins_kenmerkdeel_waarde) IS NULL THEN -1
                WHEN MAX(ins_kenmerkdeel_waarde) >= MIN(waarde_rood) THEN 2
                WHEN MAX(ins_kenmerkdeel_waarde) >= MIN(waarde_oranje) THEN 1
                ELSE 0
            END kpi_ict_mitel,
            MIN(url)
    FROM  arai_v_kpi_ict_mitel
    GROUP BY trunc_datum, ins_deel_key, TO_CHAR(ins_kenmerkdeel_aanmaak,'HH24:MI');

-- Grafiek 1: VERVALLEN: KPI aantal wachtenden van vandaag van max. 2 uur terug in de tijd uitgezet (x-as grafiek wordt bij veel meer niet leesbaar)
-- KPI van gemiddelde wachttijd van vandaag van max. 2 uur terug in de tijd uitgezet (x-as grafiek wordt bij veel meer niet leesbaar)
CREATE OR REPLACE VIEW arai_v_graph_kpi_ict_vandaag
(
   fclt_key,
   FCLT_XAS_TIJD,
   FCLT_YAS_WACHTTIJD,
   FCLT_URL
)
AS
    SELECT  fclt_key,
            FCLT_XAS_TIJD,
            FCLT_YAS_WACHTTIJD,
            FCLT_URL
    FROM arai_v_graph_kpi_ict_all
    WHERE to_date(to_char(datum, 'dd-mm-yyyy') || ' ' ||FCLT_XAS_TIJD,'dd-mm-yyyy hh24:mi')  >= SYSDATE - 2/24
    AND datum = TRUNC(SYSDATE);


-- Grafiek 2: KPI van gemiddelde wachttijd van vandaag van max. 2 uur terug in de tijd uitgezet (x-as grafiek wordt bij veel meer niet leesbaar)
-- FCLT_YAS_TEMPERATUUR is de y-as voor rood
-- FCLT_YAS2_TEMPERATUUR is de y-as voor groen
-- FCLT_YAS3_TEMPERATUUR is de y-as voor oranje
-- Barchart met 3 kleuren: groen (temp = okee), oranje (temp is oranje) en rood (temp is rood)
CREATE OR REPLACE VIEW arai_v_graph_kpi_ict2_vandaag
(
   fclt_key,
   FCLT_XAS_TIJD,
   FCLT_YAS_WACHTTIJD,
   FCLT_YAS2_WACHTTIJD,
   FCLT_YAS3_WACHTTIJD,
   FCLT_URL
)
AS
    SELECT  ins_deel_key,
            TO_CHAR(ins_kenmerkdeel_aanmaak,'HH24:MI'),
            CASE
               WHEN  MAX(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))) IS NULL THEN 0
               WHEN  MAX(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))) >= MIN(waarde_rood) THEN MAX(to_number(COALESCE(ins_kenmerkdeel_waarde,'0')))
               ELSE  0
            END,
            CASE
               WHEN  MAX(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))) IS NULL THEN 0
               WHEN  MAX(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))) < MIN(waarde_oranje) THEN MAX(to_number(COALESCE(ins_kenmerkdeel_waarde,'0')))
               ELSE  0
            END,
            CASE
               WHEN  MAX(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))) IS NULL THEN 0
               WHEN  MAX(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))) < MIN(waarde_rood) AND
                     MAX(to_number(COALESCE(ins_kenmerkdeel_waarde,'0'))) >= MIN(waarde_oranje) THEN MAX(to_number(COALESCE(ins_kenmerkdeel_waarde,'0')))
               ELSE  0
            END,
            MIN(url)
    FROM  arai_v_kpi_ict_mitel
    WHERE ins_kenmerkdeel_aanmaak >= SYSDATE - 2/24
    AND trunc_datum = TRUNC(SYSDATE)
    GROUP BY ins_deel_key, TO_CHAR(ins_kenmerkdeel_aanmaak,'HH24:MI');


-- Dagrapportage van ICT Mitel Telefooncentrale
-- fclt_key is vanuit cust.xsl, voor de actuele rapportage van vandaag (=1), alle andere dagen zijn 0.
CREATE OR REPLACE VIEW arai_v_rap_kpi_ict_all
(
   fclt_f_jaar,
   fclt_f_maand,
   fclt_f_datum,
   fclt_f_dagdeel,
   fclt_f_uur,
   fclt_key,
   tijd,
   wachttijd,
   KPI_ICT_MITEL,
   FCLT_URL
)
AS SELECT   to_char(datum,'yyyy'), to_char(datum,'mm'), to_char(datum,'yyyy-mm-dd'),
            CASE
                WHEN SUBSTR(FCLT_XAS_TIJD,1,2) <= '06' THEN 'nacht'
                WHEN SUBSTR(FCLT_XAS_TIJD,1,2) <= '11' THEN 'ochtend'
                WHEN SUBSTR(FCLT_XAS_TIJD,1,2) <= '17' THEN 'middag'
                ELSE 'avond'
            END dagdeel,
            SUBSTR(FCLT_XAS_TIJD,1,2),
            CASE
                WHEN datum = TRUNC(SYSDATE) THEN 1
                ELSE 0
            END vandaag,
            FCLT_XAS_TIJD,
            FCLT_YAS_WACHTTIJD,
            KPI_ICT_MITEL,
            FCLT_URL
   FROM arai_v_graph_kpi_ict_all;


---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
---              KLACHTEN EXPOSANTEN                KLACHTEN EXPOSANTEN               KLACHTEN EXPOSANTEN                                 ---
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------

-- km.mld_kenmerk_key (+) = 181 is het EBMS-ordernummer suggest-kenmerk.
-- km1.mld_kenmerk_key (+) = 46 is het mailadres van de contactpersoon bij exposant.
-- km2.mld_kenmerk_key (+) = 45 is het telefoonnummer van de contactpersoon bij exposant.
-- km3.mld_kenmerk_key (+) = 44 is de naam van de contactpersoon bij exposant.
-- sd.ins_srtdiscipline_key = 1 is meldingtype 'Klachten'.

-- Let op: kolom fclt_key (volgend op fclt_lopend) is dezelfde, alleen deze kolomnaam moet zo heten ivm usrrap vanuit cust.xsl.

CREATE OR REPLACE VIEW arai_v_rap_mld_klachten
(
    mld_melding_key,
    fclt_f_meldingnr,
    fclt_f_type,
    fclt_3d_discipline_key,
    fclt_f_vakgroep,
    mld_stdmelding_key,
    fclt_f_melding,
    mld_melding_omschrijving,
    mld_melding_opmerking,
    mld_melding_note_omschrijving,
    fclt_f_leverancier,
    fclt_f_jaar,
    fclt_f_kwartaal,
    fclt_f_maand,
    invoer_datum,
    fclt_f_ingevoerd,
    invoer_datum_time,
    operationele_einddatum,
    sla_einddatum,
    mld_operationeel_te_laat,
    mld_sla_te_laat,
    mld_operationeel_dagenuurmin,
    fclt_f_lopend,
    fclt_key,
    fclt_f_status,
    status_code,
    afmeld_datum,
    fclt_f_afgemeld,
    afmeld_datum_time,
    afgemeld_door,
    ingevoerd_door,
    invoerder_email,
    company_contactpersoon,
    company_mailadres,
    company_telefoon,
    eventid,
    fclt_f_evenement,
    bedrijfsnaamid,
    fclt_f_company,
    billtoid,
    billto,
    fclt_f_lokatie,
    ordernummer,
    waarde_oranje,
    waarde_rood
)
AS SELECT
        m.mld_melding_key,
        to_char(m.mld_melding_key),
        sd.ins_srtdiscipline_omschrijving,
        d.ins_discipline_key,
        d.ins_discipline_omschrijving,
        std.mld_stdmelding_key,
        std.mld_stdmelding_omschrijving,
        m.mld_melding_omschrijving,
        m.mld_melding_opmerking,
        (SELECT mld_melding_note_omschrijving
           FROM mld_melding_note
          WHERE mld_melding_note_key IN
                      (SELECT MAX (mld_melding_note_key)
                         FROM mld_melding_note mn
                        WHERE mn.mld_melding_key = m.mld_melding_key))
           mld_melding_note_omschrijving,
        (SELECT prs_bedrijf_naam
        FROM prs_bedrijf
        WHERE prs_bedrijf_key = (SELECT mld_uitvoerende_keys
                                  FROM mld_opdr
                                  WHERE mld_melding_key =  m.mld_melding_key
                                  AND mld_opdr_key =  (SELECT min(mld_opdr_key)
                                                        FROM mld_opdr
                                                        WHERE mld_melding_key =  m.mld_melding_key)
                                  )
        ) leverancier,
        to_char(m.mld_melding_datum,'YYYY'),
        'Q'|| to_char(m.mld_melding_datum,'Q'),
        to_char(m.mld_melding_datum,'MM'),
        m.mld_melding_datum,
        to_char(m.mld_melding_datum,'YYYY-MM-DD'),
        to_char(m.mld_melding_datum,'DD-MM-YYYY HH24:MI'),
        m.mld_melding_einddatum,
        m.mld_melding_einddatum_std,
        CASE
            WHEN m.mld_melding_einddatum < COALESCE(fac.gettrackingdate('MLDAFM',m.mld_melding_key),fac.gettrackingdate('MLDREJ',m.mld_melding_key), SYSDATE) THEN 1
            ELSE 0
        END,
        --CASE
        --    WHEN mld.getactualuitvoer(m.mld_melding_key) + mld_melding_respijt - m.mld_melding_uitvoertijd > 0 THEN 1
        --    ELSE 0
        --END,
        CASE
            WHEN mld.geteinddatum (m.mld_melding_einddatum_std,
                                   m.mld_stdmelding_key,
                                   m.mld_melding_spoed,
                                   m.mld_alg_onroerendgoed_keys,
                                   NULL,
                                   m.mld_melding_t_respijt) <
                    COALESCE (fac.gettrackingdate('MLDAFM', m.mld_melding_key),fac.gettrackingdate('MLDREJ', m.mld_melding_key), SYSDATE)
            THEN 1 -- Te laat volgens SLA als SLA-einddatum + respijt ligt voor gereeddatum/SYSDATE!
            ELSE 0
        END,
        TO_CHAR (FLOOR (COALESCE(fac.gettrackingdate('MLDAFM',m.mld_melding_key),fac.gettrackingdate('MLDREJ',m.mld_melding_key), SYSDATE)- m.mld_melding_datum)) || 'd '
        || TO_CHAR (
             MOD (FLOOR ( (COALESCE(fac.gettrackingdate('MLDAFM',m.mld_melding_key),fac.gettrackingdate('MLDREJ',m.mld_melding_key), SYSDATE) - m.mld_melding_datum) * 24), 24)
          )
        || 'u '
        || TO_CHAR(MOD (
                     ROUND ( (COALESCE(fac.gettrackingdate('MLDAFM',m.mld_melding_key),fac.gettrackingdate('MLDREJ',m.mld_melding_key), SYSDATE) - m.mld_melding_datum) * 24 * 60,
                            0),
                     60
                  ))
        || 'm' dagenuurmin,
        CASE
            WHEN ms.mld_statuses_key IN (0, 2, 3, 4, 7, 99) THEN 'Open'
            ELSE 'Afgesloten'
        END,
        CASE
            WHEN ms.mld_statuses_key IN (0, 2, 3, 4, 7, 99) THEN 1
            ELSE 0
        END,
        ms.mld_statuses_omschrijving,
        ms.mld_statuses_key,
        fac.gettrackingdate('MLDAFM',m.mld_melding_key),
        COALESCE(to_char(fac.gettrackingdate('MLDAFM',m.mld_melding_key),'YYYY-MM-DD'),'Niet afgemeld'),
        to_char(fac.gettrackingdate('MLDAFM',m.mld_melding_key),'DD-MM-YYYY HH24:MI'),
        p2.prs_perslid_naam|| NVL2( p2.prs_perslid_voorletters, ', ' || p2.prs_perslid_voorletters, '')|| NVL2( p2.prs_perslid_tussenvoegsel, ' ' || p2.prs_perslid_tussenvoegsel, '')|| NVL2( p2.prs_perslid_voornaam, ' (' || p2.prs_perslid_voornaam || ')', '') afgemeld_door,
        p.prs_perslid_naam|| NVL2( p.prs_perslid_voorletters, ', ' || p.prs_perslid_voorletters, '')|| NVL2( p.prs_perslid_tussenvoegsel, ' ' || p.prs_perslid_tussenvoegsel, '')|| NVL2( p.prs_perslid_voornaam, ' (' || p.prs_perslid_voornaam || ')', '') ingevoerd_door,
        p.prs_perslid_email,
        km3.mld_kenmerkmelding_waarde company_contactpersoon,
        km1.mld_kenmerkmelding_waarde company_mailadres, REPLACE(REPLACE(km2.mld_kenmerkmelding_waarde ,' ',''),'-','') company_telefoon,
        ebms.eventid, ebms.evenement, ebms.bedrijfsnaamid, ebms.bedrijfsnaam, ebms.billtoid, ebms.billto, ebms.lokatie, ebms.ordernummer,
        COALESCE(  ( SELECT ud.fac_usrdata_omschr
                        FROM fac_usrdata ud
                        WHERE ud.fac_usrtab_key = 41
                        AND ud.fac_usrdata_code  = 'KPI_STANDSCHOON_GROEN_MIN'
                        AND ud.fac_usrdata_verwijder IS NULL
                      ), '90'),
          COALESCE(  ( SELECT ud.fac_usrdata_omschr
                        FROM fac_usrdata ud
                        WHERE ud.fac_usrtab_key = 41
                        AND ud.fac_usrdata_code  = 'KPI_STANDSCHOON_ORANJE_MIN'
                        AND ud.fac_usrdata_verwijder IS NULL
                      ), '80')
        FROM  mld_melding m, mld_statuses ms, mld_stdmelding std, ins_tab_discipline d, ins_srtdiscipline sd,
              mld_kenmerkmelding km, arai_v_ebms ebms,
              mld_kenmerkmelding km1, mld_kenmerkmelding km2, mld_kenmerkmelding km3,
              prs_perslid p, prs_perslid p2
        WHERE m.prs_perslid_key = p.prs_perslid_key
        AND fac.gettrackinguserkey('MLDAFM',m.mld_melding_key) = p2.prs_perslid_key(+)
        AND ms.mld_statuses_key  = mld_melding_status
        AND   m.mld_melding_key = km.mld_melding_key (+)
        AND   km.mld_kenmerk_key (+) IN (2601, 2639, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 
                                         2616, 2617, 2618, 2619, 2620, 2622, 2624, 2625, 2626, 2628, 2629, 2630, 2631, 2632, 2633, 
                                         2634, 2635, 2636, 2637, 2602)
        AND   km.mld_kenmerkmelding_waarde = ebms.arai_ebms_key(+)
        AND  m.mld_melding_key = km1.mld_melding_key (+)
        AND   km1.mld_kenmerk_key (+) = 46
        AND   m.mld_melding_key = km2.mld_melding_key (+)
        AND   km2.mld_kenmerk_key (+) = 45
        AND   m.mld_melding_key = km3.mld_melding_key (+)
        AND   km3.mld_kenmerk_key (+) = 44
        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   sd.ins_srtdiscipline_key = 1;

CREATE OR REPLACE VIEW arai_v_rap_mld_klachten_2
AS SELECT 
    ak.mld_melding_key,
    ak.fclt_f_meldingnr,
    ak.fclt_f_type,
    ak.fclt_3d_discipline_key,
    ak.fclt_f_vakgroep,
    ak.mld_stdmelding_key,
    ak.fclt_f_melding,
    ak.mld_melding_omschrijving,
    ak.mld_melding_opmerking,
    ak.mld_melding_note_omschrijving,
    ak.fclt_f_leverancier,
    ak.fclt_f_jaar,
    ak.fclt_f_kwartaal,
    ak.fclt_f_maand,
    ak.invoer_datum,
    ak.fclt_f_ingevoerd,
    ak.invoer_datum_time,
    ak.operationele_einddatum,
    ak.sla_einddatum,
    ak.mld_operationeel_te_laat,
    ak.mld_sla_te_laat,
    ak.mld_operationeel_dagenuurmin,
    ak.fclt_f_lopend,
    ak.fclt_key,
    ak.fclt_f_status,
    ak.status_code,
    ak.afmeld_datum,
    ak.fclt_f_afgemeld,
    ak.afmeld_datum_time,
    ak.afgemeld_door,
    ak.ingevoerd_door,
    ak.invoerder_email,
    ak.company_contactpersoon,
    ak.company_mailadres,
    ak.company_telefoon,
    ak.eventid,
    COALESCE (ak.fclt_f_evenement, 
    (SELECT evenement
             FROM arai_v_events
            WHERE arai_events_key =
                     (SELECT MAX (mld_kenmerkmelding_waarde)
                        FROM mld_kenmerkmelding km, mld_kenmerk k
                       WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                             AND km.mld_melding_key = ak.mld_melding_key
                             AND k.mld_srtkenmerk_key = 283))) fclt_f_evenement, -- Geen kenmerk EBMS? Dan pakken we het "normale" evenement kenmerk.
    ak.bedrijfsnaamid,
    ak.fclt_f_company,
    ak.billtoid,
    ak.billto,
    ak.fclt_f_lokatie,
    ak.ordernummer,
    ak.waarde_oranje,
    ak.waarde_rood
   FROM arai_v_rap_mld_klachten ak;


---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
---              KLACHTEN ORGANISATOR                KLACHTEN ORGANISATOR               KLACHTEN ORGANISATOR                              ---
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
-- sd.ins_srtdiscipline_key = 21 is de meldingtype 'Klachten organisatoren'
-- km.mld_kenmerk_key (+) = 503 is key van kenmerk voor ebms_event
-- km3.mld_kenmerk_key (+) = 501 is key van kenmerk voor contactpersoon
-- km1.mld_kenmerk_key (+) = 502 is key van kenmerk voor mailadres
-- km2.mld_kenmerk_key (+) = 504 is key van kenmerk voor telefoon

CREATE OR REPLACE VIEW arai_v_rap_mld_org_klachten
(
    mld_melding_key,
    fclt_f_meldingnr,
    fclt_f_type,
    fclt_3d_discipline_key,
    fclt_f_vakgroep,
    mld_stdmelding_key,
    fclt_f_melding,
    mld_melding_omschrijving,
    mld_melding_opmerking,
    mld_melding_note_omschrijving,
    fclt_f_leverancier,
    fclt_f_jaar,
    fclt_f_kwartaal,
    fclt_f_maand,
    invoer_datum,
    fclt_f_ingevoerd,
    invoer_datum_time,
    operationele_einddatum,
    sla_einddatum,
    mld_operationeel_te_laat,
    mld_sla_te_laat,
    mld_operationeel_dagenuurmin,
    fclt_f_lopend,
    fclt_key,
    fclt_f_status,
    status_code,
    afmeld_datum,
    fclt_f_afgemeld,
    afmeld_datum_time,
    afgemeld_door,
    ingevoerd_door,
    invoerder_email,
    organisator_contactpersoon,
    organisator_mailadres,
    organisator_telefoon,
    eventid,
    fclt_f_evenement,
    bedrijfsnaamid,
    fclt_f_company,
    billtoid,
    billto,
    fclt_f_lokatie,
    ordernummer,
    waarde_oranje,
    waarde_rood
)
AS SELECT
        m.mld_melding_key,
        to_char(m.mld_melding_key),
        sd.ins_srtdiscipline_omschrijving,
        d.ins_discipline_key,
        d.ins_discipline_omschrijving,
        std.mld_stdmelding_key,
        std.mld_stdmelding_omschrijving,
        m.mld_melding_omschrijving,
        m.mld_melding_opmerking,
        (SELECT mld_melding_note_omschrijving
           FROM mld_melding_note
          WHERE mld_melding_note_key IN
                      (SELECT MAX (mld_melding_note_key)
                         FROM mld_melding_note mn
                        WHERE mn.mld_melding_key = m.mld_melding_key))
           mld_melding_note_omschrijving,
        (SELECT prs_bedrijf_naam
        FROM prs_bedrijf
        WHERE prs_bedrijf_key = (SELECT mld_uitvoerende_keys
                                  FROM mld_opdr
                                  WHERE mld_melding_key =  m.mld_melding_key
                                  AND mld_opdr_key =  (SELECT min(mld_opdr_key)
                                                        FROM mld_opdr
                                                        WHERE mld_melding_key =  m.mld_melding_key)
                                  )
        ) leverancier,
        to_char(m.mld_melding_datum,'YYYY'),
        'Q'|| to_char(m.mld_melding_datum,'Q'),
        to_char(m.mld_melding_datum,'MM'),
        m.mld_melding_datum,
        to_char(m.mld_melding_datum,'YYYY-MM-DD'),
        to_char(m.mld_melding_datum,'DD-MM-YYYY HH24:MI'),
        m.mld_melding_einddatum,
        m.mld_melding_einddatum_std,
        CASE
            WHEN m.mld_melding_einddatum < COALESCE(fac.gettrackingdate('MLDAFM',m.mld_melding_key),fac.gettrackingdate('MLDREJ',m.mld_melding_key), SYSDATE) THEN 1
            ELSE 0
        END,
        --CASE
        --    WHEN mld.getactualuitvoer(m.mld_melding_key) + mld_melding_respijt - m.mld_melding_uitvoertijd > 0 THEN 1
        --    ELSE 0
        --END,
        CASE
            WHEN mld.geteinddatum (m.mld_melding_einddatum_std,
                                   m.mld_stdmelding_key,
                                   m.mld_melding_spoed,
                                   m.mld_alg_onroerendgoed_keys,
                                   NULL,
                                   m.mld_melding_t_respijt) <
                    COALESCE (fac.gettrackingdate('MLDAFM', m.mld_melding_key),fac.gettrackingdate('MLDREJ', m.mld_melding_key), SYSDATE)
            THEN 1 -- Te laat volgens SLA als SLA-einddatum + respijt ligt voor gereeddatum/SYSDATE!
            ELSE 0
        END,
        TO_CHAR (FLOOR (COALESCE(fac.gettrackingdate('MLDAFM',m.mld_melding_key),fac.gettrackingdate('MLDREJ',m.mld_melding_key), SYSDATE)- m.mld_melding_datum)) || 'd '
        || TO_CHAR (
             MOD (FLOOR ( (COALESCE(fac.gettrackingdate('MLDAFM',m.mld_melding_key),fac.gettrackingdate('MLDREJ',m.mld_melding_key), SYSDATE) - m.mld_melding_datum) * 24), 24)
          )
        || 'u '
        || TO_CHAR(MOD (
                     ROUND ( (COALESCE(fac.gettrackingdate('MLDAFM',m.mld_melding_key),fac.gettrackingdate('MLDREJ',m.mld_melding_key), SYSDATE) - m.mld_melding_datum) * 24 * 60,
                            0),
                     60
                  ))
        || 'm' dagenuurmin,
        CASE
            WHEN ms.mld_statuses_key IN (0, 2, 3, 4, 7, 99) THEN 'Open'
            ELSE 'Afgesloten'
        END,
        CASE
            WHEN ms.mld_statuses_key IN (0, 2, 3, 4, 7, 99) THEN 1
            ELSE 0
        END,
        ms.mld_statuses_omschrijving,
        ms.mld_statuses_key,
        fac.gettrackingdate('MLDAFM',m.mld_melding_key),
        COALESCE(to_char(fac.gettrackingdate('MLDAFM',m.mld_melding_key),'YYYY-MM-DD'),'Niet afgemeld'),
        to_char(fac.gettrackingdate('MLDAFM',m.mld_melding_key),'DD-MM-YYYY HH24:MI'),
        p2.prs_perslid_naam|| NVL2( p2.prs_perslid_voorletters, ', ' || p2.prs_perslid_voorletters, '')|| NVL2( p2.prs_perslid_tussenvoegsel, ' ' || p2.prs_perslid_tussenvoegsel, '')|| NVL2( p2.prs_perslid_voornaam, ' (' || p2.prs_perslid_voornaam || ')', '') afgemeld_door,
        p.prs_perslid_naam|| NVL2( p.prs_perslid_voorletters, ', ' || p.prs_perslid_voorletters, '')|| NVL2( p.prs_perslid_tussenvoegsel, ' ' || p.prs_perslid_tussenvoegsel, '')|| NVL2( p.prs_perslid_voornaam, ' (' || p.prs_perslid_voornaam || ')', '') ingevoerd_door,
        p.prs_perslid_email,
        km3.mld_kenmerkmelding_waarde organisator_contactpersoon,
        km1.mld_kenmerkmelding_waarde organisator_mailadres,
        REPLACE(REPLACE(km2.mld_kenmerkmelding_waarde ,' ',''),'-','') organisator_telefoon,
        ebms.eventid,
        ebms.evenement,
        ebms.bedrijfsnaamid,
        ebms.bedrijfsnaam,
        ebms.billtoid,
        ebms.billto,
        (select alg_onroerendgoed_omschrijving from alg_v_allonrgoed_gegevens where alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys),
        NULL ebms_ordernummer,
        NULL waarde_oranje,
        NULL waarde_rood
        FROM  mld_melding m, mld_statuses ms, mld_stdmelding std, ins_tab_discipline d, ins_srtdiscipline sd,
              mld_kenmerkmelding km, arai_v_events ebms,
              mld_kenmerkmelding km1, mld_kenmerkmelding km2, mld_kenmerkmelding km3,
              prs_perslid p, prs_perslid p2
        WHERE m.prs_perslid_key = p.prs_perslid_key
        AND fac.gettrackinguserkey('MLDAFM',m.mld_melding_key) = p2.prs_perslid_key(+)
        AND ms.mld_statuses_key  = mld_melding_status
        AND   m.mld_melding_key = km.mld_melding_key (+)
        AND   km.mld_kenmerk_key (+) = 503
        AND   km.mld_kenmerkmelding_waarde = ebms.arai_events_key(+)
        AND  m.mld_melding_key = km1.mld_melding_key (+)
        AND   km1.mld_kenmerk_key (+) = 502
        AND   m.mld_melding_key = km2.mld_melding_key (+)
        AND   km2.mld_kenmerk_key (+) = 504
        AND   m.mld_melding_key = km3.mld_melding_key (+)
        AND   km3.mld_kenmerk_key (+) = 501
        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   sd.ins_srtdiscipline_key = 21;

CREATE OR REPLACE VIEW arai_v_rap_mld_org_klachten_2
AS SELECT *
   FROM arai_v_rap_mld_org_klachten;


-----------------------------------------------------------------------------------------------
-- mbmbmb

---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
---                 KLACHTEN BEZOEKER                  KLACHTEN BEZOEKER                 KLACHTEN BEZOEKER                                ---
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
-- sd.ins_srtdiscipline_key = 22 is de meldingtype 'Klachten BEZOEKERS'
-- km.mld_kenmerk_key (+) = 507 is key van kenmerk voor ebms_event
-- km3.mld_kenmerk_key (+) = 505 is key van kenmerk voor Achternaam (contactpersoon)
-- km1.mld_kenmerk_key (+) = 506 is key van kenmerk voor mailadres
-- km2.mld_kenmerk_key (+) = 508 is key van kenmerk voor telefoon
-- km4.mld_kenmerk_key (+) = 510 is key van kenmerk voor voornaam
-- km5.mld_kenmerk_key (+) = 509 is key van kenmerk voor tussenvoegsel


CREATE OR REPLACE VIEW arai_v_rap_mld_bez_klachten
(
    mld_melding_key,
    fclt_f_meldingnr,
    fclt_f_type,
    fclt_3d_discipline_key,
    fclt_f_vakgroep,
    mld_stdmelding_key,
    fclt_f_melding,
    mld_melding_omschrijving,
    mld_melding_opmerking,
    mld_melding_note_omschrijving,
    fclt_f_leverancier,
    fclt_f_jaar,
    fclt_f_kwartaal,
    fclt_f_maand,
    invoer_datum,
    fclt_f_ingevoerd,
    invoer_datum_time,
    operationele_einddatum,
    sla_einddatum,
    mld_operationeel_te_laat,
    mld_sla_te_laat,
    mld_operationeel_dagenuurmin,
    fclt_f_lopend,
    fclt_key,
    fclt_f_status,
    status_code,
    afmeld_datum,
    fclt_f_afgemeld,
    afmeld_datum_time,
    afgemeld_door,
    ingevoerd_door,
    invoerder_email,
    bezoeker_contactpersoon,
    bezoeker_mailadres,
    bezoeker_telefoon,
    eventid,
    fclt_f_evenement,
    bedrijfsnaamid,
    fclt_f_company,
    billtoid,
    billto,
    fclt_f_lokatie,
    ordernummer,
    waarde_oranje,
    waarde_rood
)
AS SELECT
        m.mld_melding_key,
        to_char(m.mld_melding_key),
        sd.ins_srtdiscipline_omschrijving,
        d.ins_discipline_key,
        d.ins_discipline_omschrijving,
        std.mld_stdmelding_key,
        std.mld_stdmelding_omschrijving,
        m.mld_melding_omschrijving,
        m.mld_melding_opmerking,
        (SELECT mld_melding_note_omschrijving
           FROM mld_melding_note
          WHERE mld_melding_note_key IN
                      (SELECT MAX (mld_melding_note_key)
                         FROM mld_melding_note mn
                        WHERE mn.mld_melding_key = m.mld_melding_key))
           mld_melding_note_omschrijving,
        (SELECT prs_bedrijf_naam
        FROM prs_bedrijf
        WHERE prs_bedrijf_key = (SELECT mld_uitvoerende_keys
                                  FROM mld_opdr
                                  WHERE mld_melding_key =  m.mld_melding_key
                                  AND mld_opdr_key =  (SELECT min(mld_opdr_key)
                                                        FROM mld_opdr
                                                        WHERE mld_melding_key =  m.mld_melding_key)
                                  )
        ) leverancier,
        to_char(m.mld_melding_datum,'YYYY'),
        'Q'|| to_char(m.mld_melding_datum,'Q'),
        to_char(m.mld_melding_datum,'MM'),
        m.mld_melding_datum,
        to_char(m.mld_melding_datum,'YYYY-MM-DD'),
        to_char(m.mld_melding_datum,'DD-MM-YYYY HH24:MI'),
        m.mld_melding_einddatum,
        m.mld_melding_einddatum_std,
        CASE
            WHEN m.mld_melding_einddatum < COALESCE(fac.gettrackingdate('MLDAFM',m.mld_melding_key),fac.gettrackingdate('MLDREJ',m.mld_melding_key), SYSDATE) THEN 1
            ELSE 0
        END,
        --CASE
        --    WHEN mld.getactualuitvoer(m.mld_melding_key) + mld_melding_respijt - m.mld_melding_uitvoertijd > 0 THEN 1
        --    ELSE 0
        --END,
        CASE
            WHEN mld.geteinddatum (m.mld_melding_einddatum_std,
                                   m.mld_stdmelding_key,
                                   m.mld_melding_spoed,
                                   m.mld_alg_onroerendgoed_keys,
                                   NULL,
                                   m.mld_melding_t_respijt) <
                    COALESCE (fac.gettrackingdate('MLDAFM', m.mld_melding_key),fac.gettrackingdate('MLDREJ', m.mld_melding_key), SYSDATE)
            THEN 1 -- Te laat volgens SLA als SLA-einddatum + respijt ligt voor gereeddatum/SYSDATE!
            ELSE 0
        END,
        TO_CHAR (FLOOR (COALESCE(fac.gettrackingdate('MLDAFM',m.mld_melding_key),fac.gettrackingdate('MLDREJ',m.mld_melding_key), SYSDATE)- m.mld_melding_datum)) || 'd '
        || TO_CHAR (
             MOD (FLOOR ( (COALESCE(fac.gettrackingdate('MLDAFM',m.mld_melding_key),fac.gettrackingdate('MLDREJ',m.mld_melding_key), SYSDATE) - m.mld_melding_datum) * 24), 24)
          )
        || 'u '
        || TO_CHAR(MOD (
                     ROUND ( (COALESCE(fac.gettrackingdate('MLDAFM',m.mld_melding_key),fac.gettrackingdate('MLDREJ',m.mld_melding_key), SYSDATE) - m.mld_melding_datum) * 24 * 60,
                            0),
                     60
                  ))
        || 'm' dagenuurmin,
        CASE
            WHEN ms.mld_statuses_key IN (0, 2, 3, 4, 7, 99) THEN 'Open'
            ELSE 'Afgesloten'
        END,
        CASE
            WHEN ms.mld_statuses_key IN (0, 2, 3, 4, 7, 99) THEN 1
            ELSE 0
        END,
        ms.mld_statuses_omschrijving,
        ms.mld_statuses_key,
        fac.gettrackingdate('MLDAFM',m.mld_melding_key),
        COALESCE(to_char(fac.gettrackingdate('MLDAFM',m.mld_melding_key),'YYYY-MM-DD'),'Niet afgemeld'),
        to_char(fac.gettrackingdate('MLDAFM',m.mld_melding_key),'DD-MM-YYYY HH24:MI'),
        p2.prs_perslid_naam || NVL2( p2.prs_perslid_voorletters, ', ' || p2.prs_perslid_voorletters, '')|| NVL2( p2.prs_perslid_tussenvoegsel, ' ' || p2.prs_perslid_tussenvoegsel, '')|| NVL2( p2.prs_perslid_voornaam, ' (' || p2.prs_perslid_voornaam || ')', '') afgemeld_door,
        p.prs_perslid_naam || NVL2( p.prs_perslid_voorletters, ', ' || p.prs_perslid_voorletters, '')|| NVL2( p.prs_perslid_tussenvoegsel, ' ' || p.prs_perslid_tussenvoegsel, '')|| NVL2( p.prs_perslid_voornaam, ' (' || p.prs_perslid_voornaam || ')', '') ingevoerd_door,
        p.prs_perslid_email,
        km3.mld_kenmerkmelding_waarde || NVL2( km5.mld_kenmerkmelding_waarde, ', ' || km5.mld_kenmerkmelding_waarde, '')|| NVL2( km4.mld_kenmerkmelding_waarde, ' (' || km4.mld_kenmerkmelding_waarde || ')', '') bezoeker_contactpersoon,
        km1.mld_kenmerkmelding_waarde bezoeker_mailadres,
        REPLACE(REPLACE(km2.mld_kenmerkmelding_waarde ,' ',''),'-','') bezoeker_telefoon,
        ebms.eventid,
        ebms.evenement,
        NULL ebms_bedrijfsnaamid,
        NULL ebms_bedrijfsnaam,
        NULL ebms_billtoid,
        NULL ebms_billto,
        NULL lokatie,
        NULL ebms_ordernummer,
        NULL waarde_oranje,
        NULL waarde_rood
        FROM  mld_melding m, mld_statuses ms, mld_stdmelding std, ins_tab_discipline d, ins_srtdiscipline sd,
              mld_kenmerkmelding km, arai_v_events ebms,
              mld_kenmerkmelding km1, mld_kenmerkmelding km2, mld_kenmerkmelding km3, mld_kenmerkmelding km4, mld_kenmerkmelding km5,
              prs_perslid p, prs_perslid p2
        WHERE m.prs_perslid_key = p.prs_perslid_key
        AND fac.gettrackinguserkey('MLDAFM',m.mld_melding_key) = p2.prs_perslid_key(+)
        AND ms.mld_statuses_key  = mld_melding_status
        AND   m.mld_melding_key = km.mld_melding_key (+)
        AND   km.mld_kenmerk_key (+) = 507
        AND   km.mld_kenmerkmelding_waarde = ebms.arai_events_key(+)
        AND  m.mld_melding_key = km1.mld_melding_key (+)
        AND   km1.mld_kenmerk_key (+) = 506
        AND   m.mld_melding_key = km2.mld_melding_key (+)
        AND   km2.mld_kenmerk_key (+) = 508
        AND   m.mld_melding_key = km3.mld_melding_key (+)
        AND   km3.mld_kenmerk_key (+) = 505
        AND   m.mld_melding_key = km4.mld_melding_key (+)
        AND   km4.mld_kenmerk_key (+) = 510
        AND   m.mld_melding_key = km5.mld_melding_key (+)
        AND   km5.mld_kenmerk_key (+) = 509
        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   sd.ins_srtdiscipline_key = 22;

CREATE OR REPLACE VIEW arai_v_rap_mld_bez_klachten_2
AS SELECT *
   FROM arai_v_rap_mld_bez_klachten;




CREATE OR REPLACE VIEW arai_v_rap_mld_tot_klachten
AS SELECT *
   FROM arai_v_rap_mld_klachten
   UNION ALL
   SELECT *
   FROM arai_v_rap_mld_org_klachten
   UNION ALL
   SELECT *
   FROM arai_v_rap_mld_bez_klachten;

CREATE OR REPLACE VIEW arai_v_rap_mld_tot_klachten_2
AS SELECT *
   FROM arai_v_rap_mld_klachten_2
   UNION ALL
   SELECT *
   FROM arai_v_rap_mld_org_klachten_2
   UNION ALL
   SELECT *
   FROM arai_v_rap_mld_bez_klachten_2;
   
   
-- En nu een view incl of een klacht terecht is of niet   
CREATE OR REPLACE VIEW arai_v_rap_mld_tot_klachten_3
AS
   SELECT a1.*, COALESCE (fac_usrdata_omschr, 'NVT') klacht
     FROM arai_v_rap_mld_klachten_2 a1,
          mld_opdr o,
          (SELECT *
             FROM mld_kenmerkopdr
            WHERE mld_kenmerk_key = 2341) mko,
          fac_usrdata ud
    WHERE a1.mld_melding_key = o.mld_melding_key
          AND o.mld_opdr_key = mko.mld_opdr_key(+)
          AND fac.safe_to_number (mko.mld_kenmerkopdr_waarde) =
                fac_usrdata_key(+)
   UNION ALL
   SELECT a2.*,
          COALESCE (
             (SELECT f.fac_usrdata_omschr
                FROM fac_usrdata f,
                     (  SELECT MAX (mo.mld_opdr_bedrijfopdr_volgnr),
                               mko.mld_kenmerkopdr_waarde,
                               m.mld_melding_key
                          FROM mld_kenmerkopdr mko, mld_opdr mo, mld_melding m
                         WHERE     mko.mld_opdr_key = mo.mld_opdr_key
                               AND mo.mld_melding_key = m.mld_melding_key
                               AND mko.mld_kenmerk_key = 2341
                      GROUP BY m.mld_melding_key, mko.mld_kenmerkopdr_waarde)
                     sub
               WHERE f.fac_usrdata_key =
                        fac.safe_to_number (sub.mld_kenmerkopdr_waarde)
                     AND sub.mld_melding_key = a2.mld_melding_key),
             'NVT')
             klacht
     FROM arai_v_rap_mld_org_klachten_2 a2
   UNION ALL
   SELECT a3.*,
          COALESCE (
             (SELECT f.fac_usrdata_omschr
                FROM fac_usrdata f,
                     (  SELECT MAX (mo.mld_opdr_bedrijfopdr_volgnr),
                               mko.mld_kenmerkopdr_waarde,
                               m.mld_melding_key
                          FROM mld_kenmerkopdr mko, mld_opdr mo, mld_melding m
                         WHERE     mko.mld_opdr_key = mo.mld_opdr_key
                               AND mo.mld_melding_key = m.mld_melding_key
                               AND mko.mld_kenmerk_key = 2341
                      GROUP BY m.mld_melding_key, mko.mld_kenmerkopdr_waarde)
                     sub
               WHERE f.fac_usrdata_key =
                        fac.safe_to_number (sub.mld_kenmerkopdr_waarde)
                     AND sub.mld_melding_key = a3.mld_melding_key),
             'NVT')
             klacht
     FROM arai_v_rap_mld_bez_klachten_2 a3;


--------------------------------------------------------------------------------------------------------------------------
-- Klachten RTM grafieken


--

-- Alle klachten (exp + org + bez) van de afgelopen 12 maanden.
CREATE OR REPLACE VIEW arai_v_graph_kl_maand
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_OP_TIJD,
   FCLT_YAS2_TE_LAAT,
   FCLT_YAS3_TOTAAL,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT NULL, to_char(to_date(fclt_f_maand,'MM'),'mon'), count(*) - SUM(mld_sla_te_laat), SUM(mld_sla_te_laat), count(*),
        'appl/fac/fac_usrrap_list.asp?usrrap_key=181' || '&' || 'fclt_f_colname1=fclt_f_jaar' || '&' || 'fclt_f_colvalue1=' || fclt_f_jaar || '&' || 'fclt_f_colname2=fclt_f_maand' || '&' || 'fclt_f_colvalue2=' || fclt_f_maand,
        fclt_f_jaar || fclt_f_maand
FROM arai_v_rap_mld_tot_klachten_2
WHERE invoer_datum > SYSDATE - 365
GROUP BY fclt_f_jaar, fclt_f_maand;


--

-- Basisview met de laatste 7 dagen (nodig om 'klachtloze' dagen ook in grafiek te kunnen tonen)
CREATE OR REPLACE VIEW arai_v_7_dagen
(datum, dag)
AS
SELECT TRUNC(SYSDATE - (LEVEL - 1)) datum, substr(to_char(SYSDATE - (LEVEL - 1), 'day'), 1, 2) dag
FROM  DUAL
CONNECT BY LEVEL <= 7;

-- Alle klachten (exp + org + bez) van de afgelopen 7 dagen.
CREATE OR REPLACE VIEW arai_v_graph_kl_dag
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_OP_TIJD,
   FCLT_YAS2_TE_LAAT,
   FCLT_YAS3_TOTAAL,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT  NULL, substr(to_char(to_date(fclt_f_ingevoerd, 'YYYY-MM-DD') ,'day'),1,2), count(*) - SUM(mld_sla_te_laat), SUM(mld_sla_te_laat), count(*),
        'appl/fac/fac_usrrap_list.asp?usrrap_key=181' || '&' || 'fclt_f_colname1=fclt_f_ingevoerd' || '&' || 'fclt_f_colvalue1=' || fclt_f_ingevoerd,
        fclt_f_ingevoerd
FROM arai_v_rap_mld_tot_klachten_2
WHERE TRUNC(invoer_datum) > TRUNC(SYSDATE - 7)
GROUP BY to_char(to_date(fclt_f_ingevoerd, 'YYYY-MM-DD') ,'day'),  fclt_f_ingevoerd
UNION
SELECT NULL, dag, 0, 0, 0, '', to_char(datum, 'yyyy-mm-dd')
FROM arai_v_7_dagen
WHERE NOT EXISTS (select 'x' FROM  arai_v_rap_mld_tot_klachten_2
                                 WHERE  TRUNC(invoer_datum) > TRUNC(SYSDATE - 7)
                                 AND   to_char(datum, 'yyyy-mm-dd') = fclt_f_ingevoerd);


-- Basisview met de laatste x-aantal uren (nodig om 'klachtloze' uurtjes ook in grafiek te kunnen tonen)
CREATE OR REPLACE VIEW arai_v_24_uren
(datum, uur)
AS
SELECT TRUNC(SYSDATE - (LEVEL/24 - 1/24)) datum, to_char(SYSDATE - (LEVEL/24 - 1/24), 'hh24') uur
FROM  DUAL
CONNECT BY LEVEL <= 24;


-- Alle klachten (exp + org + bez) van de afgelopen 24 uren.
CREATE OR REPLACE VIEW arai_v_graph_kl_uur
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_OP_TIJD,
   FCLT_YAS2_TE_LAAT,
   FCLT_YAS3_TOTAAL,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT  NULL, to_char(invoer_datum,'hh24'), count(*) - SUM(mld_sla_te_laat), SUM(mld_sla_te_laat), count(*),
        'appl/fac/fac_usrrap_list.asp?usrrap_key=181' || '&' || 'fclt_f_colname1=invoer_datum_time' || '&' || 'fclt_f_colvalue1=' || to_char(invoer_datum,'dd-mm-yyyy') || ' ' || to_char(invoer_datum,'hh24') || ':*',
        to_char(invoer_datum,'hh24')
FROM arai_v_rap_mld_tot_klachten_2
WHERE TRUNC(invoer_datum) = TRUNC(SYSDATE)
GROUP BY to_char(invoer_datum,'dd-mm-yyyy'), to_char(invoer_datum,'hh24')
UNION
SELECT NULL, uur, 0, 0 ,0, '', uur
FROM arai_v_24_uren
WHERE datum = TRUNC(SYSDATE)
AND NOT EXISTS (SELECT 'x' FROM arai_v_rap_mld_tot_klachten_2
                WHERE TRUNC(invoer_datum)=  TRUNC(SYSDATE)
                AND to_char(invoer_datum,'hh24') = uur);


-- Alle openstaande klachten per leverancier.
-- FCLT_YAS_ zijn de klachten die nog op tijd zijn, (blauw)
-- FCLT_YAS2_ zijn de klachten die te laat tijd zijn (rood),
CREATE OR REPLACE VIEW arai_v_graph_kl_open_lev
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT  NULL, fclt_f_leverancier, count(*) - SUM(mld_sla_te_laat), SUM(mld_sla_te_laat),
        'appl/fac/fac_usrrap_list.asp?usrrap_key=181' || '&' || 'fclt_f_colname1=fclt_f_leverancier' || '&' || 'fclt_f_colvalue1=' || fclt_f_leverancier || '&' || 'fclt_f_colname2=fclt_f_lopend' || '&' || 'fclt_f_colvalue2=' || fclt_f_lopend,
        0 - count(*)
FROM arai_v_rap_mld_tot_klachten_2
WHERE UPPER(fclt_f_lopend) = 'OPEN'
GROUP BY fclt_f_leverancier, fclt_f_lopend;

-- Top evenement klachten afgelopen maanden
CREATE OR REPLACE VIEW arai_v_graph_kl_event
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT  NULL, fclt_f_evenement, count(*) - SUM(mld_sla_te_laat), SUM(mld_sla_te_laat),
        'appl/fac/fac_usrrap_list.asp?usrrap_key=181' || '&' || 'fclt_f_colname1=fclt_f_evenement' || '&' || 'fclt_f_colvalue1=' || fclt_f_evenement,
        0 - count(*)
FROM arai_v_rap_mld_tot_klachten_2
WHERE invoer_datum > SYSDATE - 365
GROUP BY fclt_f_evenement;

-- Top leverancier klachten afgelopen maanden
CREATE OR REPLACE VIEW arai_v_graph_kl_lev
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT  NULL, fclt_f_leverancier, count(*) - SUM(mld_sla_te_laat), SUM(mld_sla_te_laat),
        'appl/fac/fac_usrrap_list.asp?usrrap_key=181' || '&' || 'fclt_f_colname1=fclt_f_leverancier' || '&' || 'fclt_f_colvalue1=' || fclt_f_leverancier,
        0 - count(*)
FROM arai_v_rap_mld_tot_klachten_2
WHERE invoer_datum > SYSDATE - 365
GROUP BY fclt_f_leverancier;


---------------------------------------------------------------------------------------------------------------------------
-- Bijzonder handige check-rapportage of er wordt voldaan aan het geheel om automatische opdrachten aan te maken bij stdmelding->dienst->bedrijf

CREATE OR REPLACE VIEW arai_v_rap_mlddienstbedrijf
(
   fclt_f_meldingtype,
   fclt_f_vakgroep,
   MLD_STDMELDING_KEY,
   MLD_STDMELDING_OMSCHRIJVING,
   uitvoertijd_uur,
   auto_opdracht,
   fclt_f_dienst,
   fclt_f_locatie,
   fclt_f_gebouw,
   fclt_f_bedrijf,
   mailadres
)
AS
   SELECT SD.INS_SRTDISCIPLINE_OMSCHRIJVING,
          DIS.INS_DISCIPLINE_OMSCHRIJVING,
          SM.MLD_STDMELDING_KEY,
          SM.MLD_STDMELDING_OMSCHRIJVING,
          --ROUND (MLD_STDMELDING_UITVOERTIJD * 24, 2),
          --TO_CHAR (ROUND (SM.MLD_STDMELDING_T_UITVOERTIJD.tijdsduur, 2)) || SM.MLD_STDMELDING_T_UITVOERTIJD.eenheid,
          CASE
             WHEN SM.MLD_STDMELDING_T_UITVOERTIJD.eenheid = 'D'
             THEN
                ROUND (SM.MLD_STDMELDING_T_UITVOERTIJD.tijdsduur * 24, 2)
             ELSE
                ROUND (SM.MLD_STDMELDING_T_UITVOERTIJD.tijdsduur, 2)
          END,
          DECODE (
             MLD_STDMELDING_autoorder,
             1,
                'Ja - Opdracht: '
             || COALESCE (top.mld_typeopdr_omschrijving, 'Geen')
             || ' - Dienst vereist:'
             || DECODE (MLD_STDMELDING_vereisdienst, 1, 'Ja', 'Nee'),
             'Nee'),
          D.PRS_DIENST_OMSCHRIJVING,
          COALESCE (L.ALG_LOCATIE_OMSCHRIJVING, '*'),
          COALESCE (G.ALG_GEBOUW_NAAM, '*'),
          B.PRS_BEDRIJF_NAAM,
          B.PRS_BEDRIJF_EMAIL
     FROM mld_stdmelding sm,
          prs_dienst d,
          prs_bedrijf b,
          prs_bedrijfdienstlocatie bdl,
          mld_discipline dis,
          ins_srtdiscipline sd,
          alg_locatie l,
          alg_gebouw g,
          mld_typeopdr top
    WHERE     SM.PRS_DIENST_KEY = D.PRS_DIENST_KEY
          AND d.prs_dienst_key = BDL.PRS_DIENST_KEY
          AND BDL.PRS_BEDRIJF_KEY = b.prs_bedrijf_key
          AND SM.MLD_INS_DISCIPLINE_KEY = DIS.INS_DISCIPLINE_KEY
          AND DIS.INS_SRTDISCIPLINE_KEY = SD.INS_SRTDISCIPLINE_KEY
          AND bdl.alg_locatie_key = l.alg_locatie_key(+)
          AND bdl.alg_gebouw_key = g.alg_gebouw_key(+)
          AND sm.MLD_TYPEOPDR_KEY = top.MLD_TYPEOPDR_KEY(+);



---------------------------------------------------------------------------------------------------------------------------












-- Alle standschoonmaak-klachten
CREATE OR REPLACE VIEW arai_v_standschoonmaak_alle
(
    mld_melding_key,
    fclt_f_meldingnr,
    fclt_f_type,
    fclt_discipline_key,
    fclt_f_vakgroep,
    mld_stdmelding_key,
    fclt_f_melding,
    mld_melding_omschrijving,
    mld_melding_opmerking,
    mld_melding_note_omschrijving,
    fclt_f_leverancier,
    fclt_f_jaar,
    fclt_f_kwartaal,
    fclt_f_maand,
    invoer_datum,
    fclt_f_ingevoerd,
    invoer_datum_time,
    operationele_einddatum,
    sla_einddatum,
    mld_operationeel_te_laat,
    mld_sla_te_laat,
    mld_operationeel_dagenuurmin,
    fclt_f_lopend,
    fclt_key,
    fclt_f_status,
    status_code,
    afmeld_datum,
    fclt_f_afgemeld,
    afmeld_datum_time,
    afgemeld_door,
    ingevoerd_door,
    invoerder_email,
    company_contactpersoon,
    company_mailadres,
    company_telefoon,
    eventid,
    fclt_f_evenement,
    bedrijfsnaamid,
    fclt_f_company,
    billtoid,
    billto,
    fclt_f_lokatie,
    ordernummer,
    waarde_oranje,
    waarde_rood
)
AS  SELECT *
    FROM arai_v_rap_mld_klachten
    WHERE fclt_3d_discipline_key = 221;

CREATE OR REPLACE VIEW arai_v_rap_standschoonmaak_all
AS  SELECT *
    FROM arai_v_standschoonmaak_alle;

-- Alle standschoonmaak-klachten die VANDAAG zijn AFGEMELD
CREATE OR REPLACE VIEW arai_v_standschoon_afgemeld
AS  SELECT *
    FROM arai_v_standschoonmaak_alle
    WHERE TRUNC(afmeld_datum) = TRUNC(SYSDATE);



-- Alle LOPENDE! (statuscode in 0, 2, 3, 4, 7, 99) klachten over standschoonmaak, van niet alleen vandaag, maar ook die gisteren, eergisteren etc zijn gemaakt.
CREATE OR REPLACE VIEW arai_v_rap_standschoon_lopend
AS  SELECT *
    FROM arai_v_standschoonmaak_alle
    WHERE status_code IN (0, 2, 3, 4, 7, 99);

-- UNION van arai_v_standschoon_afgemeld + arai_v_rap_standschoon_lopend,
-- Dus Alle afgemelde standschoonmaakklachten van vandaag en de nog lopende (actuele).

CREATE OR REPLACE VIEW arai_v_standschoon_today
AS  SELECT *
    FROM arai_v_standschoon_afgemeld
    UNION
    SELECT *
    FROM arai_v_rap_standschoon_lopend;




-- Deze view gebruiken voor 'random' binnenkomende KPI-metingen als klachten, om een timetable te hebben voor b.v. grafieken
CREATE OR REPLACE VIEW arai_v_timetable_halve_uren (datum, tijd)
AS
SELECT  TRUNC(SYSDATE) + (LEVEL-1)/48 datum,
        TO_CHAR (TRUNC(SYSDATE) + (LEVEL-1)/48, 'HH24:MI') tijd
FROM  DUAL
CONNECT BY LEVEL <= 24*2;



-- Grafiek 1 (lijngrafiek): KPI percentage op tijd afgehandelde klachten schone stands van vandaag van max. 8 uur terug in de tijd uitgezet.
-- Daarbij worden de onregelmatige controle-tijden (naar boven) afgerond op halve uren (dus hh:00 of hh:30),
-- Dus X-as bestaat uit maximaal 8 uur x 2 (ieder half uur) = 16 waarden, b.v. 10:00, 10:30, 11:00, ... t/m 17:30.
-- De Y-as bestaat uit een percentage van op tijd afgehandelde klachten standschoonmaak tov. alle lopende klachten binnen dat tijdstip van het halve uur.

-- Eerst een 1e hulp-tabel (temp-tabel)
CREATE OR REPLACE VIEW arai_v_kpi_schonestand_nu
(
   fclt_f_meldingnr,
   FCLT_XAS_TIJD,
   mld_operationeel_te_laat,
   waarde_oranje,
   waarde_rood
)
  AS  SELECT
        fclt_f_meldingnr,
        TO_CHAR(SYSDATE, 'HH24:MI'),
        CASE
            WHEN SYSDATE <= kpi.operationele_einddatum THEN 0
            ELSE 1
        END,
        waarde_oranje,
        waarde_rood
    FROM  arai_v_rap_standschoon_lopend kpi;


-- Dan een 2e hulp-tabel (temp-tabel)
CREATE OR REPLACE VIEW arai_v_tmp_graph_schonestand
(
   fclt_f_meldingnr,
   FCLT_XAS_TIJD,
   mld_operationeel_te_laat,
   waarde_oranje,
   waarde_rood
)
AS
    SELECT
            fclt_f_meldingnr,
            hu.tijd,
            CASE
                WHEN hu.datum <= kpi.operationele_einddatum THEN 0
                ELSE 1
            END,
            waarde_oranje,
            waarde_rood
        FROM  arai_v_standschoon_today kpi, arai_v_timetable_halve_uren hu
        WHERE hu.datum <= SYSDATE
        AND hu.datum <= COALESCE(kpi.afmeld_datum, SYSDATE)
        AND hu.datum >= kpi.invoer_datum
    UNION
        SELECT fclt_f_meldingnr,
               FCLT_XAS_TIJD,
               mld_operationeel_te_laat,
               waarde_oranje,
               waarde_rood
        FROM arai_v_kpi_schonestand_nu;




CREATE OR REPLACE VIEW arai_v_graph_kpi_schonestand
(
   FCLT_XAS_TIJD,
   FCLT_YAS_PERC,
   goed,
   fout,
   waarde_oranje,
   waarde_rood
)
AS
    SELECT  FCLT_XAS_TIJD,
            ROUND(SUM(mld_operationeel_te_laat)/COUNT(*)*100,1),
            ROUND(100 - (SUM(mld_operationeel_te_laat)/COUNT(*)*100),1),
            ROUND(SUM(mld_operationeel_te_laat)/COUNT(*)*100,1),
            MIN(waarde_oranje),
            MIN(waarde_rood)
    FROM arai_v_tmp_graph_schonestand
    GROUP BY FCLT_XAS_TIJD
 UNION
    SELECT
        hu.tijd, 0, 100, 0, '0', '0'
    FROM  arai_v_timetable_halve_uren hu
    WHERE hu.datum < SYSDATE
    AND NOT EXISTS
        (SELECT 'x'
        FROM arai_v_tmp_graph_schonestand t
        WHERE t.FCLT_XAS_TIJD = hu.tijd);


CREATE OR REPLACE VIEW arai_v_rap_kpi_standschoon
(   FCLT_XAS_TIJD,
    goed,
    fout,
    KPI_STATUS
)
AS
    SELECT FCLT_XAS_TIJD, goed, fout,
        CASE
            WHEN goed >= waarde_oranje  THEN 0
            WHEN goed >= waarde_rood  THEN 1
            ELSE 2
        END
    FROM arai_v_graph_kpi_schonestand
    WHERE fclt_xas_tijd = (select max(fclt_xas_tijd) from arai_v_graph_kpi_schonestand);








-- Grafiek 2 (barchart met rood/oranje/groen): KPI precentage schone toiletten per gebouw, van vandaag van max. 8 uur terug in de tijd uitgezet.
-- FCLT_YAS_SCHOON is de y-as voor rood
-- FCLT_YAS2_SCHOON is de y-as voor groen
-- FCLT_YAS3_SCHOON is de y-as voor oranje
-- Barchart met 3 kleuren: groen (temp = okee), oranje (temp is oranje) en rood (temp is rood)
CREATE OR REPLACE VIEW arai_v_graph_kpi_schonestand2
(
   FCLT_XAS_TIJD,
   FCLT_YAS_PERC,
   FCLT_YAS2_PERC,
   FCLT_YAS3_PERC
)
AS
     SELECT
        FCLT_XAS_TIJD,
        CASE
           WHEN  goed IS NULL THEN 0
           WHEN  goed <  waarde_rood THEN fout
           ELSE  0
        END,
        CASE
           WHEN  goed IS NULL THEN 0
           WHEN  goed >= waarde_oranje THEN fout
           ELSE  0
        END,
        CASE
           WHEN  goed IS NULL THEN 0
           WHEN  goed >= waarde_rood AND
                 goed <  waarde_oranje THEN fout
           ELSE  0
        END
    FROM arai_v_graph_kpi_schonestand;






---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
---              KPI OVERALL                 KPI OVERALL               KPI OVERALL              KPI OVERALL                               ---
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------



-- STATUS = 0 (is okee), 1 = oranje, 2 = rood, -1 = grijs
CREATE OR REPLACE VIEW arai_v_rap_kpi_all
(
   KPI_NAAM,
   KPI_STATUS,
   FCLT_URL,
   USR_RAP_ALL_DETAILS
)
AS
    SELECT 'TEMPERATUUR',
            (SELECT COALESCE(MAX(kpi_temperatuur),-1) FROM
                (SELECT
                        CASE
                           WHEN avg_temp IS NULL THEN 2
                           WHEN avg_temp < min_waarde THEN 2
                           WHEN avg_temp > max_waarde THEN 2
                           WHEN avg_temp < min_waarde_oranje THEN 1
                           WHEN avg_temp > max_waarde_oranje THEN 1
                           ELSE 0
                        END kpi_temperatuur
                FROM  arai_v_rap_kpi_temp_per_ruimte
                WHERE join_kpi = 3)
            ), 'arai_v_rap_kpi_temp_per_ruimte', 'arai_v_rap_temp_per_ruimte'
    FROM DUAL
-- UNION ALL
--    SELECT 'ICT',
--           (SELECT COALESCE(MAX(kpi_ict_mitel),-1) FROM
--                (SELECT
--                    CASE
--                        WHEN kpi_color_overrule IS NOT NULL THEN kpi_color_overrule
--                        WHEN ins_kenmerkdeel_waarde IS NULL THEN -1
--                        WHEN ins_kenmerkdeel_waarde >= waarde_rood THEN 2
--                        WHEN ins_kenmerkdeel_waarde >= waarde_oranje THEN 1
--                        ELSE 0
--                    END kpi_ict_mitel
--                FROM  arai_v_kpi_ict_mitel
--                WHERE ins_kenmerkdeel_verwijder IS NULL
--                AND trunc_datum = TRUNC(SYSDATE))
--          ), 'arai_v_rap_kpi_ict_mitel', ''
--    FROM DUAL
 UNION ALL
    SELECT 'TOILETSCHOONMAAK',
           (SELECT COALESCE(MAX(KPI_STATUS),-1) FROM arai_v_kpi_toilet_gebouw),
           'arai_v_kpi_toilet_gebouw', 'arai_v_rap_kpi_toilet_all'
    FROM DUAL
 UNION ALL
     SELECT 'STANDSCHOONMAAK',
           (SELECT COALESCE(MAX(KPI_STATUS),-1) FROM arai_v_rap_kpi_standschoon),
           'arai_v_rap_kpi_standschoon', 'arai_v_rap_standschoonmaak_all'
    FROM DUAL;








---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
---              QRC TOILET SCHOONMAAK                QRC TOILET SCHOONMAAK                      QRC TOILET SCHOONMAAK                    ---
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------



CREATE OR REPLACE VIEW arai_v_ins_qrc_toilet
(fclt_3d_discipline_key, fclt_3d_locatie_key, fclt_f_locatie, fclt_f_gebouw, plaats, soortruimte, ins_srtdeel_code, ins_srtdeel_omschrijving, ins_deel_omschrijving, ins_deel_key, ins_srtdeel_key,
 fclt_f_objectsoort, ins_alg_ruimte_type, alg_district_key, ins_deel_upper, alg_ruimte_key, hide_f_bookmark_id
)
AS
         SELECT  i.ins_discipline_key,
                 l.alg_locatie_key,
                 l.alg_locatie_omschrijving,
                 o.alg_gebouw_omschrijving,
                 o.alg_plaatsaanduiding plaats,
                 (SELECT r.alg_ruimte_omschrijving
                  FROM alg_ruimte r
                  WHERE r.alg_ruimte_key = i.ins_alg_ruimte_key) soortruimte,
                 s.ins_srtdeel_code,
                 s.ins_srtdeel_omschrijving,
                 i.ins_deel_omschrijving,
                 i.ins_deel_key,
                 s.ins_srtdeel_key,
                 s.ins_srtdeel_upper,
                 i.ins_alg_ruimte_type,
                 l.alg_district_key,
                 ins_deel_upper,
                 i.ins_alg_ruimte_key,
                 b.fac_bookmark_id
            FROM ins_deel i,
                 ins_v_alg_overzicht o,
                 ins_srtdeel s,
                 alg_locatie l,
                 alg_district di,
                 fac_bookmark b
           WHERE b.fac_bookmark_naam = 'KPI_TOILETSCHOONMAAK'
                AND  s.ins_srtdeel_key = 21
                AND  ins_deel_verwijder IS NULL
                 AND i.ins_deel_module = 'INS'
                 AND i.ins_deel_parent_key IS NULL
                 AND o.alg_onroerendgoed_keys = i.ins_alg_ruimte_key
                 AND o.alg_onroerendgoed_type = i.ins_alg_ruimte_type
                 AND i.ins_alg_ruimte_type IN ('T', 'R', 'W')
                 AND o.alg_locatie_key = i.ins_alg_locatie_key
                 AND i.ins_alg_locatie_key = l.alg_locatie_key
                 AND l.alg_district_key = di.alg_district_key
                 AND s.ins_srtdeel_key = i.ins_srtdeel_key;






---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
---              Export URENREGISTRATIE      Export URENREGISTRATIE      Export URENREGISTRATIE      Export URENREGISTRATIE               ---
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------


-- Gedetaileerde versie van de algemene view mld_v_nettotijdsbesteding.
-- De uren van ARAI moeten niet per persoon per opdracht worden weergegeven maar per persoon per dag.
CREATE OR REPLACE VIEW arai_v_persoonuren
(
   mld_opdr_key,
   prs_perslid_key,
   naam,
   datum,
   ntb_prs
)
AS
      SELECT a.mld_opdr_key,
             a.prs_perslid_key,
             naam,
             TRUNC(a.start_date + delta) datum,
             SUM(
                 CASE
                     WHEN TRUNC(a.end_date, 'DD') = TRUNC(a.start_date, 'DD')
                     THEN a.lastdate - a.firstdate
                     WHEN delta = 0
                     THEN TRUNC(a.firstdate + 1) - a.firstdate
                     WHEN TRUNC(a.start_date, 'DD') + delta = TRUNC(a.end_date, 'DD')
                     THEN a.lastdate - TRUNC(a.lastdate)
                     ELSE 1
                 END)
                 ntb_prs
        FROM (SELECT TRUNC(firstdate) start_date, --  Voor CONNECT BY LEVEL de TRUNC van firstdate en lastdate bepalen anders gaat het fout als de tijd van lastdate kleiner is als van firstdate.
                     TRUNC(lastdate) end_date,
                     firstdate,
                     lastdate,
                     prs_perslid_key,
                     prs_perslid_naam_full naam,
                     mld_opdr_key
                FROM (  SELECT st.fac_srtnotificatie_code,
                               LAG(t.fac_tracking_datum)
                                   OVER(PARTITION BY fac_tracking_refkey
                                        ORDER BY fac_tracking_datum)
                                   AS firstdate,
                               t.fac_tracking_datum lastdate,
                               t.prs_perslid_key,
                               p.prs_perslid_naam_full,
                               fac_tracking_refkey mld_opdr_key,
                               t.fac_tracking_key
                          FROM fac_tracking t,
                               fac_srtnotificatie st,
                               prs_v_perslid_fullnames_all p
                         WHERE t.fac_srtnotificatie_key = st.fac_srtnotificatie_key
                           AND t.prs_perslid_key = p.prs_perslid_key
                           AND st.fac_srtnotificatie_code IN ('ORDACP',
                                                              'ORDHLT',
                                                              'ORDRSM',
                                                              'ORDAFM',
                                                              'ORDCAN') -- De gecancelde opdrachten zijn nog meegenomen.
                           AND fac_tracking_datum >= TO_DATE('01-05-2017','dd-mm-yyyy')  -- oude records zijn nog niet ingevuld.
                      ORDER BY fac_tracking_datum,
                               prs_perslid_key) xx
               WHERE xx.fac_srtnotificatie_code IN ('ORDHLT',
                                                    'ORDAFM',
                                                    'ORDCAN')) a, -- De gecancelde opdrachten zijn nog meegenomen.
             (    SELECT LEVEL - 1 AS delta
                    FROM DUAL
              CONNECT BY LEVEL - 1 <= (SELECT MAX(end_date - start_date)
                                         FROM (SELECT TRUNC(firstdate) start_date, --  Voor CONNECT BY LEVEL de TRUNC van firstdate en lastdate bepalen anders gaat het fout als de tijd van lastdate kleiner is als van firstdate.
                                                      TRUNC(lastdate) end_date,
                                                      firstdate,
                                                      lastdate,
                                                      prs_perslid_key,
                                                      mld_opdr_key
                                                 FROM (  SELECT st.fac_srtnotificatie_code,
                                                                LAG(t.fac_tracking_datum)
                                                                    OVER(PARTITION BY fac_tracking_refkey
                                                                         ORDER BY fac_tracking_datum)
                                                                    AS firstdate,
                                                                t.fac_tracking_datum lastdate,
                                                                t.prs_perslid_key,
                                                                p.prs_perslid_naam_full,
                                                                fac_tracking_refkey mld_opdr_key
                                                           FROM fac_tracking t,
                                                                fac_srtnotificatie st,
                                                                prs_v_perslid_fullnames_all p
                                                          WHERE t.fac_srtnotificatie_key = st.fac_srtnotificatie_key
                                                            AND t.prs_perslid_key = p.prs_perslid_key
                                                            AND st.fac_srtnotificatie_code IN ('ORDACP',
                                                                                               'ORDHLT',
                                                                                               'ORDRSM',
                                                                                               'ORDAFM',
                                                                                               'ORDCAN') -- De gecancelde opdrachten zijn nog meegenomen.
                                                            AND fac_tracking_datum >= TO_DATE('01-05-2017','dd-mm-yyyy')  -- oude records zijn nog niet ingevuld.
                                                       ORDER BY fac_tracking_datum,
                                                                prs_perslid_key) xx
                                                WHERE xx.fac_srtnotificatie_code IN ('ORDHLT',
                                                                                     'ORDAFM',
                                                                                     'ORDCAN')))) -- De gecancelde opdrachten zijn nog meegenomen.
       WHERE a.start_date + delta <= a.end_date
    GROUP BY a.mld_opdr_key,
             a.prs_perslid_key,
             naam,
             TRUNC(a.start_date + delta)
    ORDER BY a.prs_perslid_key,
             datum,
             a.mld_opdr_key;

CREATE OR REPLACE VIEW arai_v_export_urenregistratie (
   result,
   result_order
   )
AS
SELECT REPLACE(REPLACE(m.mld_melding_key
       || ';'
       || sm.mld_stdmelding_omschrijving
       || ';'
       || p.prs_perslid_naam
       || ';'
       || p.prs_perslid_voornaam
       || ';'
       || m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr
       || ';'
       || fac.gettrackingdate('ORDAFM', o.mld_opdr_key)
       || ';'
       || ROUND(t.ntb_prs*24*60,2)
      ,CHR (13), ''), CHR (10), '<ret>'), m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr
    FROM mld_opdr o, mld_v_nettotijdsbesteding t, mld_melding m, mld_stdmelding sm, prs_perslid p
    WHERE o.MLD_STATUSOPDR_KEY = 6
    AND o.MLD_TYPEOPDR_KEY = 281
    AND m.mld_melding_key = o.mld_melding_key
    AND sm.mld_stdmelding_key = m.mld_stdmelding_key
    AND o.mld_opdr_key = t.mld_opdr_key
    AND p.prs_perslid_key = t.prs_perslid_key
    AND mld_opdr_datumbegin >= to_date('01-05-2017','dd-mm-yyyy');


CREATE OR REPLACE PROCEDURE arai_select_urenregistratie (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
  v_errormsg       VARCHAR (200);
BEGIN
  v_errormsg := 'Geen akties';
END;
/

-- Procedure om alle geexporteerde facturen naar status verwerkt te zetten.
CREATE OR REPLACE PROCEDURE arai_export_urenregistratie (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
    -- Alle opdrachten van type 'Intern' (key = 281) die zijn afgemeld (status = 6) maar nog niet verwerkt (status = 7) vanaf 1 mei 2017 (release ARAI24).
    -- mld_statusopdr_key = 6 betekent 'afgemelde' opdracht.
    -- mld_typeopdr_key = 281 betekent 'interne' opdracht (dwz urenregistratie opdrachttype)
    -- Let op: Het kan zijn dat er geen tijdsbesteding voor een opdracht wordt berekend, dat komt omdat de opdracht niet eerst is geaccepteerd (expliciet is gestart).
    -- Deze opdrachten die zijn afgemeld worden niet meegenomen, omdat hiervoor geen registratie in mld_opdr_uren kan worden gedaan.
    -- Alle door een persoon bestede tijd (aantal_uren, uitgedrukt in een meestal gebroken getal in uren) wordt op afmeld-datum van de opdracht geregistreerd in mld_opdr_uren.

    -- Er wordt van uitgegaan dat aan het eind van de werkdag de behandeling op HALT wordt gezet en 's morgens weer wordt HERVAT
    -- om een goede urenregistratie te krijgen.
    -- Als de uren per dag meer dan 8 uur is, wordt de behandeling 's morgens niet Hervat en 's avonds niet op HALT gezet.

    -- ARAI#47067: Uren berekening niet robuust tegen handmatig ingevulde uren, aangepast door een extra conditie (not exists) toe te voegen die bestaande urenregistratie
    -- van een opdracht op de datum van een persoon uitsluit
    CURSOR c_opdr_met_uren
    IS
    SELECT o.mld_opdr_key,
           t.prs_perslid_key,
           t.datum,
           t.ntb_prs * 24 aantal_uur
      FROM mld_opdr o,
           arai_v_persoonuren t
     WHERE o.MLD_STATUSOPDR_KEY IN (5, 6, 8) -- Toegekend, Afgemeld, Geaccepteerd/Onderbroken
       AND o.MLD_TYPEOPDR_KEY = 281
       AND o.mld_opdr_key = t.mld_opdr_key
       AND mld_opdr_datumbegin >= TO_DATE('01-05-2017', 'dd-mm-yyyy')
       AND NOT EXISTS ( SELECT 'x' FROM mld_opdr_uren x
                        WHERE o.mld_opdr_key  = x.mld_opdr_key
                        AND   t.datum = x.mld_opdr_uren_datum
                        AND t.prs_perslid_key = x.prs_perslid_key);


    -- Hieronder alle afgemelde opdrachten, met of  zonder uur-besteding, die willen we wel meenemen in de query, zodat ze kunnen worden verwerkt (status 6->7) (en de volgende keer niet meer meedoen).
    CURSOR c_opdr_metofzonder_uren
    IS
    SELECT o.mld_opdr_key
      FROM mld_opdr o
     WHERE o.MLD_STATUSOPDR_KEY = 6
       AND o.MLD_TYPEOPDR_KEY = 281
       AND mld_opdr_datumbegin >= to_date('01-05-2017', 'dd-mm-yyyy');


    v_errormsg       VARCHAR (200);
    oracle_err_num   NUMBER;
    oracle_err_mes   VARCHAR2 (200);
BEGIN
    v_errormsg := 'Geen akties';

    FOR c_uur IN c_opdr_met_uren
    LOOP
      -- Least, omdat aantal uren maximaal 3 cijfers kan bestaan in DB
      INSERT INTO mld_opdr_uren(mld_opdr_key,
                                mld_opdr_uren_datum,
                                prs_perslid_key,
                                mld_opdr_uren_besteed,
                                mld_opdr_uren_status)
          SELECT c_uur.mld_opdr_key,
                 TRUNC(c_uur.datum),
                 c_uur.prs_perslid_key,
                 LEAST(999, ROUND(c_uur.aantal_uur, 2)),
                 3
            FROM DUAL;
    END LOOP;

    FOR c_uur IN c_opdr_metofzonder_uren
    LOOP
        -- ARAI#47067: Uren berekening niet robuust tegen handmatig ingevulde uren, aanpassing is dat nu status 9 (=Afgerond) ipv status 7 (verwerkt) wordt gezet.
      mld.setopdrachtstatus (c_uur.mld_opdr_key, 9, 4);
    END LOOP;

    COMMIT;
END;
/

-- Procedure om alle dagrapportage meldingen automatisch af te melden (dagelijks)
CREATE OR REPLACE PROCEDURE arai_export_dagrapafm (p_applname   IN VARCHAR2,
                                                   p_applrun    IN VARCHAR2,
                                                   p_filedir    IN VARCHAR2,
                                                   p_filename   IN VARCHAR2)
AS
   CURSOR arai_dagrap_afm
   IS
      SELECT m.mld_melding_key, m.mld_melding_status
        FROM mld_melding m, mld_stdmelding std, mld_discipline md
       WHERE     m.mld_stdmelding_key = std.mld_stdmelding_key
             AND std.mld_ins_discipline_key = md.ins_discipline_key
             AND md.ins_discipline_key = 1541
             AND m.mld_melding_status != 5;
BEGIN
   FOR rec IN arai_dagrap_afm
   LOOP
      BEGIN
         UPDATE mld_melding
            SET mld_melding_status = 5
          WHERE mld_melding_key = rec.mld_melding_key;

         fac.trackaction ('MLDAFM',
                          rec.mld_melding_key,
                          NULL,
                          NULL,
                          NULL);
      END;
   END LOOP;
END;
/

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--            Import KPI waarden             Import KPI waarden             Import KPI waarden             Import KPI waarden             Import KPI waarden                    ---
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


----------------------------------------------------------------------------------------------------------------------------------------------------------------
--            Import KPI temperatuur             Import KPI temperatuur             Import KPI temperatuur             Import KPI temperatuur                ---
----------------------------------------------------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE arai_notify_kpi_temp
(
   p_import_key IN NUMBER
)
IS

    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errorhint2              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);


    -- fac_usrtab_key = 21 is de tabel '$KPI_NOTIFY': SYSTEM TABEL: KEEP OUT!
    -- SYNTAX code = KPI_<kpi-naam>_<mail-of-sms>, dus b.v. 'KPI_TEMP_MAIL', 'KPI_ICT_MITEL_MAIL', 'KPI_TEMP_SMS', 'KPI_ICT_MITEL_SMS',
    -- Met volgnr = 1 wordt aangegeven dat het een actieve notificatie is, lege waarde of 0 (of iets anders) is inactief cq. tijdelijk uitgezet.


    CURSOR c_kpi_temp_notify_mail_kpi
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'KPI_TEMP_MAIL%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;


    CURSOR c_kpi_temp_notify_mail_evm
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'EVM_MAIL%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;


    CURSOR c_kpi_temp_notify_sms_kpi
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'KPI_TEMP_SMS%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;

    CURSOR c_kpi_temp_notify_sms_evm
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'EVM_SMS%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;


    CURSOR c_kpi_temp_notify_per_ruimte
    IS
        SELECT  alg_ruimte_key, alg_gebouw_naam, alg_ruimte_nr, alg_ruimte_omschrijving, avg_temp,
                CASE
                   WHEN avg_temp IS NULL THEN -1
                   WHEN avg_temp < min_waarde THEN 2
                   WHEN avg_temp > max_waarde THEN 2
                   WHEN avg_temp < min_waarde_oranje THEN 1
                   WHEN avg_temp > max_waarde_oranje THEN 1
                   ELSE 0
                END kpi_temperatuur
        FROM  arai_v_rap_kpi_temp_per_ruimte
        WHERE join_kpi = 3;


    -- Alleen notificeren gedurende de "openingsdatums" en "openingstijden" van de KPI.
    -- Openingsdatums worden bepaald door settings KPI_ALL_DATUM1 en KPI_ALL_DATUM2 (b.v. 06-09-2012 en 11-09-2012)
    -- Indien deze niet in tabel staan, dan zijn de openingsdatums oneindig (levert altijd OKEE op).
    -- Openingstijden worden bepaald door settings KPI_TEMP_TIME1 en KPI_TEMP_TIME2 (b.v. 08:00 en 17:00)
    -- Indien deze niet in tabel staan, dan zijn de openingstijden van 0:00 t/m 23:59 (24 uurs)
    CURSOR c_kpi_notify_during_opening
    IS
        SELECT
            COALESCE(
                (SELECT
                    CASE WHEN TRUNC(to_date(ud.fac_usrdata_omschr,'DD-MM-YYYY')) <=  TRUNC(sysdate)
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_ALL_DATUM1'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) min_datum,
            COALESCE(
                (SELECT
                    CASE WHEN TRUNC(to_date(ud.fac_usrdata_omschr,'DD-MM-YYYY')) >=  TRUNC(sysdate)
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_ALL_DATUM2'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) max_datum,
            COALESCE(
                (SELECT
                    CASE WHEN to_date(to_char(sysdate,'DD-MM-YYYY') || ' ' || ud.fac_usrdata_omschr,'DD-MM-YYYY HH24:MI') <=  sysdate
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_TEMP_TIME1'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) min_tijd,
            COALESCE(
                (SELECT
                    CASE WHEN to_date(to_char(sysdate,'DD-MM-YYYY') || ' ' || ud.fac_usrdata_omschr,'DD-MM-YYYY HH24:MI') >=  sysdate
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_TEMP_TIME2'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) max_tijd
        FROM DUAL;

    -- Alleen notificeren na verstrijken van de "freqentie-minuten" van de KPI.
    -- Frequentieminuten worden bepaald door setting KPI_TEMP_FREQ_MINUTES (b.v. 30), betekent dat er minimaal 30 minuten zijn verstreken sinds de laatste notificatie is verstuurd.
    -- Indien deze niet in tabel staan, is er geen minimum ingestelde "frequentieminuten" en wordt gewoon genotificeerd.
    -- Levert waarde 0 op indien er nog niet moet worden genotificeerd (tijd is nog niet verstreken), en de waarde 1 indien wel genotificeerd (tijd verstreken of geen instelling).
    CURSOR c_kpi_notify_after_freq_min
    IS
        SELECT
            COALESCE(
                (SELECT
                    CASE
                        WHEN to_date(fac_usrdata_omschr,'DD-MM-YYYY HH24:MI') + fac_usrdata_volgnr/(60*24) <= SYSDATE THEN 1
                        ELSE 0
                    END CASE
                FROM fac_usrdata
                WHERE fac_usrtab_key = 21
                AND fac_usrdata_code = 'KPI_TEMP_FREQ_MINUTES'
                AND fac_usrdata_verwijder IS NULL), 1) freq_min_verstreken
                FROM DUAL;


BEGIN


    FOR rec_open IN c_kpi_notify_during_opening
    LOOP
    -- Deze loop is precies 1 record (feitelijk een if-statement)

        IF rec_open.min_datum = 1 AND rec_open.max_datum = 1 AND rec_open.min_tijd = 1 AND rec_open.max_tijd = 1
        THEN
            -- De sysdate ligt tussen zowel de openingstijd als sluitingstijd van de KPI, dus we kunnen gaan notificeren...

            -- ... Alleen indien de het aantal ingestelde frequentie-minuten sinds de laatste notificatie is verlopen.

            FOR rec_freq IN c_kpi_notify_after_freq_min
            LOOP
            -- Deze loop is precies 1 record (feitelijk een if-statement)

                IF rec_freq.freq_min_verstreken = 1
                THEN
                    -- Het aantal ingestelde frequentie-minuten is sinds de laatste notificatie verstreken, dus we kunnen gaan notificeren...

                    -- Eerst even het notificatie-moment vastleggen voor de volgende keer.
                    UPDATE fac_usrdata
                    SET fac_usrdata_omschr = TO_CHAR(SYSDATE,'dd-mm-yyyy hh24:mi')
                    WHERE fac_usrtab_key = 21
                    AND fac_usrdata_code = 'KPI_TEMP_FREQ_MINUTES'
                    AND fac_usrdata_verwijder IS NULL;

                    COMMIT;

                    FOR rec_kpi_temp IN c_kpi_temp_notify_per_ruimte

                    LOOP
                        BEGIN
                            -- Als ORANJE (1) of ROOD (2), dan notificeren, anders niet (uiteraard)
                            IF rec_kpi_temp.kpi_temperatuur = 1 OR rec_kpi_temp.kpi_temperatuur = 2
                            THEN

                                IF rec_kpi_temp.kpi_temperatuur = 1
                                THEN
                                    -- Code ORANJE voor KPI TEMPERATUUR
                                    -- Mailen naar KPI + EVM, en SMS-en naar KPI en EVM

                                    v_errorhint := 'Alarm ORANJE: Gemiddelde temperatuur in ruimte '  ||  rec_kpi_temp.alg_gebouw_naam || '(' ||  rec_kpi_temp.alg_ruimte_omschrijving  || ') is ' || rec_kpi_temp.avg_temp || ' °C';
                                    v_errormsg := '';


                                    -- 1.Eerst mailen naar alle KPI-eigenaren / betrokkenen
                                    FOR rec_kpi_noti IN c_kpi_temp_notify_mail_kpi
                                    LOOP
                                        BEGIN
                                            -- Mailen
                                            fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                            -- Loggen
                                            v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                            fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                            COMMIT;
                                        END;
                                    END LOOP;

                                    -- 2. Dan mailen naar alle eventmanagers
                                    FOR rec_kpi_noti IN c_kpi_temp_notify_mail_evm
                                    LOOP
                                        BEGIN
                                            -- Mailen
                                            fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                            -- Loggen
                                            v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                            fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                            COMMIT;
                                        END;
                                    END LOOP;

                                    -- 3.Eerst sms-en naar alle KPI-eigenaren / betrokkenen
                                    FOR rec_kpi_noti IN c_kpi_temp_notify_sms_kpi
                                    LOOP
                                        BEGIN
                                            -- SMS-en
                                            fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                            -- Loggen
                                            v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                            fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                            COMMIT;
                                        END;
                                    END LOOP;

                                    -- 4. Dan mailen naar alle eventmanagers
                                    FOR rec_kpi_noti IN c_kpi_temp_notify_sms_evm
                                    LOOP
                                        BEGIN
                                            -- SMS-en
                                            fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                            -- Loggen
                                            v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                            fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                            COMMIT;
                                        END;
                                    END LOOP;
                                ELSE
                                    -- Code ROOD voor KPI TEMPERATUUR
                                    -- Mailen naar KPI + EVM, en SMS-en naar KPI en EVM

                                    v_errorhint := 'Alarm ROOD: Gemiddelde temperatuur in ruimte '  ||  rec_kpi_temp.alg_gebouw_naam || '(' ||  rec_kpi_temp.alg_ruimte_omschrijving  || ') is ' || rec_kpi_temp.avg_temp || ' °C';
                                    v_errormsg := '';


                                    -- 1.Eerst mailen naar alle KPI-eigenaren / betrokkenen
                                    FOR rec_kpi_noti IN c_kpi_temp_notify_mail_kpi
                                    LOOP
                                        BEGIN
                                            -- Mailen
                                            fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                            -- Loggen
                                            v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                            fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                            COMMIT;
                                        END;
                                    END LOOP;

                                    -- 2. Dan mailen naar alle eventmanagers
                                    FOR rec_kpi_noti IN c_kpi_temp_notify_mail_evm
                                    LOOP
                                        BEGIN
                                            -- Mailen
                                            fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                            -- Loggen
                                            v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                            fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                            COMMIT;
                                        END;
                                    END LOOP;

                                    -- 3.Eerst sms-en naar alle KPI-eigenaren / betrokkenen
                                    FOR rec_kpi_noti IN c_kpi_temp_notify_sms_kpi
                                    LOOP
                                        BEGIN
                                            -- SMS-en
                                            fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                            -- Loggen
                                            v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                            fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                            COMMIT;
                                        END;
                                    END LOOP;

                                    -- 4. Dan mailen naar alle eventmanagers
                                    FOR rec_kpi_noti IN c_kpi_temp_notify_sms_evm
                                    LOOP
                                        BEGIN
                                            -- SMS-en
                                            fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                            -- Loggen
                                            v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                            fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                            COMMIT;
                                        END;
                                    END LOOP;

                                END IF;

                            END IF;

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


                        END;
                    END LOOP;

                ELSE
                -- Het aantal frequentie-minuten is nog niet verstreken, dus GEEN notificeren...
                v_errormsg := '';
                v_errorhint := '';
                v_aanduiding := 'Geen notificatie: frequentie-minuten zijn nog niet voorbij' ;
                fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                END IF;

            -- Deze loop is precies 1 record (feitelijk een if-statement)
            END LOOP;

        ELSE
            -- De sysdate ligt buiten de openingstijd en sluitingstijd van de KPI, dus GEEN notificeren...
            v_errormsg := '';
            v_errorhint := '';
            v_aanduiding := 'Geen notificatie: tijd ligt buiten de KPI tijden' ;
            fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
        END IF;

    -- Deze loop is precies 1 record (feitelijk een if-statement)
    END LOOP;

    COMMIT;

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

END arai_notify_kpi_temp;
/



CREATE OR REPLACE PROCEDURE arai_import_kpi_temp (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;
   -- De importvelden:

   v_ins_deel_omschrijving         VARCHAR2 (256);
   v_ins_deel_meetwaarde           VARCHAR2 (256);
   v_ins_deel_opclabel             VARCHAR2 (256);



   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM arai_imp_kpi;

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         -- Lees alle veldwaarden


         -- 01 - Installatiecode: Kolom M (kolomnr 13) is de installatiecode. Indien leeg, dan deze overslaan.
         -- CSV variant: fac.imp_getfield_nr (v_newline, c_fielddelimitor, 13, v_ins_deel_omschrijving);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_ins_deel_omschrijving);

         -- 02 - Meetwaarde: Kolom J (kolomnr 10) is de weergave.
         -- CSV variant: fac.imp_getfield_nr (v_newline, c_fielddelimitor, 10, v_ins_deel_meetwaarde);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_ins_deel_meetwaarde);

         -- 03 - OPC label: Kolom A (kolomnr 1), een interne label cq. tag van de OPC-server oid
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 3, v_ins_deel_opclabel);



         --
         v_aanduiding :=
               '['
            || v_ins_deel_omschrijving
            || '|'
            || v_ins_deel_meetwaarde
            || '|'
            || v_ins_deel_opclabel
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_ins_deel_omschrijving) = 'INSTALLATIECODE'
               AND UPPER (v_ins_deel_meetwaarde) = 'WEERGAVE'
               AND UPPER (v_ins_deel_opclabel) = 'OPC LABEL'

            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

            --
            v_errorhint := 'Ongeldige objectnaam / installatiecode';
            v_ins_deel_omschrijving := TRIM (v_ins_deel_omschrijving);

            IF (v_ins_deel_omschrijving IS NOT NULL)
            THEN
                IF LENGTH (v_ins_deel_omschrijving) > 60
                THEN
                    v_ins_deel_omschrijving := SUBSTR (v_ins_deel_omschrijving, 1, 60);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Objectnaam te lang', 'Objectnaam wordt afgebroken tot [' || v_ins_deel_omschrijving || ']' );
                END IF;
            ELSE
                v_ongeldig := 1;
            END IF;

            v_errorhint := 'Ongeldige meetwaarde';
            v_ins_deel_meetwaarde := TRIM (v_ins_deel_meetwaarde);

            IF (v_ins_deel_meetwaarde IS NOT NULL)
            THEN
                IF LENGTH (v_ins_deel_meetwaarde) > 255
                THEN
                    v_ins_deel_meetwaarde := SUBSTR (v_ins_deel_meetwaarde, 1, 255);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Meetwaarde te lang', 'Meetwaarde wordt afgebroken tot [' || v_ins_deel_meetwaarde || ']' );
                END IF;
            ELSE
                v_ongeldig := 1;
            END IF;

            v_errorhint := 'Ongeldige OPC label';
            v_ins_deel_opclabel := TRIM (v_ins_deel_opclabel);
            IF (v_ins_deel_opclabel IS NOT NULL)
            THEN
                IF LENGTH (v_ins_deel_opclabel) > 255
                THEN
                    v_ins_deel_opclabel := SUBSTR (v_ins_deel_opclabel, 1, 255);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'OPC label te lang', 'Label wordt afgebroken tot [' || v_ins_deel_opclabel || ']' );
                END IF;
            END IF;

            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errorhint :=
                      'Fout bij toevoegen regel aan importtabel arai_imp_kpi';

                  INSERT INTO arai_imp_kpi  (ins_deel_omschrijving, ins_deel_meetwaarde, ins_deel_opclabel)
                  VALUES (v_ins_deel_omschrijving, v_ins_deel_meetwaarde, v_ins_deel_opclabel);

                  COMMIT;
                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog
                             (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Ingelezen regel kan niet worden weggeschreven!'
                             );
                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'KPI: aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
   END IF;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      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',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;
END arai_import_kpi_temp;
/




CREATE OR REPLACE PROCEDURE arai_update_kpi_temp (
   p_import_key IN NUMBER
)
IS

    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);

    c_ins_srtgroep_key_temp  NUMBER (10)    := 1;
    c_ins_kenmerk_key_temp   NUMBER (10)    := 1;

    v_ins_deel_key           NUMBER (10);


    -- Alle kpi_temperatuur meetwaarden: dit zijn de regels waarvan de objectnaam voldoet aan de volgende codering: XX-XXTTXX, met op de X precies 1 karakter.
    CURSOR c_kpi_temp
    IS
        SELECT *
        FROM arai_imp_kpi k
        WHERE k.ins_deel_omschrijving like '%TT%';
        -- AND k.ins_deel_opclabel like '%MET%';

    BEGIN
    v_count_tot := 0;
    v_count_error := 0;


    v_aanduiding := '';


    -- Alle kpi-temperaturen verwerken...
    FOR rec_kpi_temp IN c_kpi_temp
    LOOP
        BEGIN
            v_count_tot := v_count_tot + 1;

            v_errorhint := 'Fout bij bepalen object [' || rec_kpi_temp.ins_deel_omschrijving || ']';

            -- NB sd.ins_srtgroep_key = 1 is de groep van allemaal temperatuurmeter-objecten;
            SELECT d.ins_deel_key
              INTO v_ins_deel_key
              FROM ins_deel d, ins_srtdeel sd
             WHERE d.ins_deel_verwijder IS NULL
               AND UPPER (d.ins_deel_omschrijving) = UPPER (rec_kpi_temp.ins_deel_omschrijving)
               AND d.ins_srtdeel_key = sd.ins_srtdeel_key
               AND sd.ins_srtgroep_key = c_ins_srtgroep_key_temp;

            -- Max 1 record wordt bijgewerkt, namelijk het kenmerk temperatuur van het betreffende object wordt functioneel verwijderd.
            UPDATE ins_kenmerkdeel
            SET ins_kenmerkdeel_verwijder = SYSDATE
            WHERE ins_kenmerk_key = c_ins_kenmerk_key_temp
            AND ins_deel_key = v_ins_deel_key
            AND ins_kenmerkdeel_verwijder IS NULL;

            v_errorhint := 'Fout bij toevoegen temperatuur bij object [' || rec_kpi_temp.ins_deel_omschrijving || ']';
            INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
            SELECT v_ins_deel_key, c_ins_kenmerk_key_temp, rec_kpi_temp.ins_deel_meetwaarde FROM DUAL;

            COMMIT;

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

    -- Als alle temperaturen zijn verwerkt, dan checken of er een ruimte een gemiddelde temperatuur heeft die buiten de grenzen valt.


    fac.imp_writelog (p_import_key,
                    'S',
                       'KPI: verwerkte regels zonder foutmelding: '
                    || TO_CHAR (v_count_tot - v_count_error),
                    ''
                   );
    fac.imp_writelog (p_import_key,
                    'S',
                       'KPI: verwerkte regels met foutmelding: '
                    || TO_CHAR (v_count_error),
                    ''
                   );
    COMMIT;

    -- Tenslotte nog de notificaties uitsturen, als STAART van de import.
    arai_notify_kpi_temp(p_import_key);

END arai_update_kpi_temp;
/



------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--     Import KPI ENERGIE    Import KPI ENERGIE      Import KPI ENERGIE      Import KPI ENERGIE      Import KPI ENERGIE      Import KPI ENERGIE      Import KPI ENERGIE           --
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------





CREATE OR REPLACE PROCEDURE arai_import_kpi_energie (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;
   -- De importvelden:

   v_ins_deel_omschrijving         VARCHAR2 (256);
   v_ins_deel_meetwaarde           VARCHAR2 (256);




   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM arai_imp_kpi_energie;

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         -- Lees alle veldwaarden

         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_ins_deel_omschrijving);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_ins_deel_meetwaarde);



         --
         v_aanduiding :=
               '['
            || v_ins_deel_omschrijving
            || '|'
            || v_ins_deel_meetwaarde
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_ins_deel_omschrijving) = 'INSTALLATIECODE'
               AND UPPER (v_ins_deel_meetwaarde) = 'WEERGAVE'

            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

            --
            v_errorhint := 'Ongeldige objectnaam / installatiecode';
            v_ins_deel_omschrijving := TRIM (v_ins_deel_omschrijving);

            IF (v_ins_deel_omschrijving IS NOT NULL)
            THEN
                IF LENGTH (v_ins_deel_omschrijving) > 60
                THEN
                    v_ins_deel_omschrijving := SUBSTR (v_ins_deel_omschrijving, 1, 60);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Objectnaam te lang', 'Objectnaam wordt afgebroken tot [' || v_ins_deel_omschrijving || ']' );
                END IF;
            ELSE
                v_ongeldig := 1;
            END IF;

            v_errorhint := 'Ongeldige meetwaarde';
            -- LET OP: een eventuele komma verwijderen via REPLACE (a.g.v. getallen > 1000, die worden met scheidingsteken , door Coneco doorgegeven, zij kunnen die niet (!?!?!?) weghalen. Ja ja.)

            v_ins_deel_meetwaarde := REPLACE(TRIM (v_ins_deel_meetwaarde),',','');

            IF (v_ins_deel_meetwaarde IS NOT NULL)
            THEN
                IF LENGTH (v_ins_deel_meetwaarde) > 255
                THEN
                    v_ins_deel_meetwaarde := SUBSTR (v_ins_deel_meetwaarde, 1, 255);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Meetwaarde te lang', 'Meetwaarde wordt afgebroken tot [' || v_ins_deel_meetwaarde || ']' );
                END IF;
            ELSE
                v_ongeldig := 1;
            END IF;



            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errorhint :=
                      'Fout bij toevoegen regel aan importtabel arai_imp_kpi';

                  INSERT INTO arai_imp_kpi_energie  (ins_deel_omschrijving, ins_deel_meetwaarde)
                  VALUES (v_ins_deel_omschrijving, v_ins_deel_meetwaarde);

                  COMMIT;
                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog
                             (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Ingelezen regel kan niet worden weggeschreven!'
                             );
                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'KPI: aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
   END IF;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      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',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;
END arai_import_kpi_energie;
/



CREATE OR REPLACE PROCEDURE arai_update_kpi_energie_items (
   p_import_key IN NUMBER
)
IS

    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);

    -- Very important: om af te dwingen dat bij elkaar horende meetwaarden dezelfde insert-date krijgen, zodat ze in de grafiek-definitie gebruiikt kunnen worden en gegarandeerd dezelfde timestamp hebben
    v_nu                     DATE;

    c_ins_kenmerk_key_opc_meting    NUMBER (10)    := 61;
    c_ins_kenmerk_key_opc_setpoint  NUMBER (10)    := 62;
    c_ins_kenmerk_key_opc_alarm     NUMBER (10)    := 63;


    v_ins_deel_key           NUMBER (10);

    -- STATISCHE kenmerk_key (OPC-label-ID)
    v_ins_kenmerk_key_opc    NUMBER (10);

    -- DYNAMISCHE kenmerk_key (meetwaarde)
    -- Key van de meting, setpoint of alarm, die op slimme manier runtime hieronder wordt bepaald adhv de waarde van INS_KENMERK_LOCATIEKOLOM
    v_ins_kenmerk_key_dyn      NUMBER (10);


    CURSOR c_kpi_energie
    IS
        SELECT *
        FROM arai_imp_kpi_energie k;


BEGIN
    v_count_tot := 0;
    v_count_error := 0;


    v_aanduiding := '';

    SELECT SYSDATE
    INTO v_nu
    FROM dual;


    -- Alle kpi-energie verwerken...
    FOR rec_kpi_energie IN c_kpi_energie
    LOOP
        BEGIN
            v_count_tot := v_count_tot + 1;

            v_errorhint := 'Fout bij bepalen ENERGIE object obv OPC-label [' || rec_kpi_energie.ins_deel_omschrijving || ']';

            -- Bepalen van het object ins_deel adhv het UNIEKE! OPC-label. OPC-label staat in 1 van de 3 kenmerken (defintitie op discipline-nivo) bij het object zijn geregistreerd.
            -- Behalve ins_deel_key wordt ook bijbehorende STATISCHE ins_kenmerk_key opgeleverd (wie van de 3 is dan bekend).
            -- Als die niet kan worden gevonden, dat wordt de betreffende waarde (meting, setpoint of alarm) NIET geregistreerd, en wordt gelogd


            SELECT ins_deel_key, INS_KENMERK_KEY
            INTO v_ins_deel_key, v_ins_kenmerk_key_opc
            FROM ins_kenmerkdeel kd
            WHERE KD.INS_KENMERKDEEL_WAARDE = rec_kpi_energie.ins_deel_omschrijving
            and KD.INS_KENMERK_KEY IN (c_ins_kenmerk_key_opc_meting, c_ins_kenmerk_key_opc_setpoint, c_ins_kenmerk_key_opc_alarm)
            and KD.INS_KENMERKDEEL_VERWIJDER IS NULL;

            -- Daarna wordt adhv de STATISCHE kenmerk_key de DYNAMISCHE ins_kenmerk_key (die van de bijbehorende meetwaarde) bepaald.
            -- Enigzins getruukt, maar wel goed, via de locatiekolom, die een verwijzing naar de statische kenmerk bevat.
            -- Zo is bekend welke STATISCHE KEY bij welke DYNAMISCHE hoort.

            v_errorhint := 'Fout bij bepalen van meetwaarde kenmerk bij object obv OPC-label [' || rec_kpi_energie.ins_deel_omschrijving || ' - ' || v_ins_deel_key || ' - ' || v_ins_kenmerk_key_opc  || ']';
            SELECT ins_kenmerk_key
            INTO v_ins_kenmerk_key_dyn
            FROM ins_kenmerk k
            WHERE K.INS_KENMERK_LOCATIEKOLOM = v_ins_kenmerk_key_opc
            AND K.INS_KENMERK_MEETWAARDE = 1
            AND K.INS_KENMERK_NIVEAU = 'S'
            AND K.INS_SRTINSTALLATIE_KEY = (SELECT ins_srtdeel_key FROM ins_deel WHERE ins_deel_key = v_ins_deel_key);

            v_errorhint := 'Fout bij update van meetwaarde bij object obv OPC-label [' || rec_kpi_energie.ins_deel_omschrijving || ' - ' || v_ins_deel_key || ' - ' || v_ins_kenmerk_key_opc  || ']';
            -- De vorige meetwaarde functioneel verwijderen, er is immers een nieuwe (hieronder)
            UPDATE ins_kenmerkdeel
            SET ins_kenmerkdeel_verwijder = v_nu
            WHERE ins_kenmerk_key = v_ins_kenmerk_key_dyn
            AND ins_deel_key = v_ins_deel_key
            AND ins_kenmerkdeel_verwijder IS NULL;

            v_errorhint := 'Fout bij insert nieuwe van meetwaarde bij object obv OPC-label [' || rec_kpi_energie.ins_deel_omschrijving || ' - ' || v_ins_deel_key || ' - ' || v_ins_kenmerk_key_opc  || ']';
            INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
            SELECT v_ins_deel_key, v_ins_kenmerk_key_dyn, rec_kpi_energie.ins_deel_meetwaarde FROM DUAL;


            COMMIT;

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


    fac.imp_writelog (p_import_key,
                    'S',
                       'KPI ENERGIE: verwerkte regels zonder foutmelding: '
                    || TO_CHAR (v_count_tot - v_count_error),
                    ''
                   );
    fac.imp_writelog (p_import_key,
                    'S',
                       'KPI ENERGIE: verwerkte regels met foutmelding: '
                    || TO_CHAR (v_count_error),
                    ''
                   );
    COMMIT;



END arai_update_kpi_energie_items;
/



CREATE OR REPLACE PROCEDURE arai_update_kpi_halbezetting (
   p_import_key IN NUMBER
)
IS

    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);

    v_ins_deel_key           NUMBER (10);
    c_ins_kenmerk_key_halbezet NUMBER (10)    := 64;
    v_aantal                 NUMBER (10);
    v_nu                     DATE;

    CURSOR c_kpi_halbezet
    IS
        SELECT *
        FROM arai_imp_kpi_energie k;


BEGIN
    v_count_tot := 0;
    v_count_error := 0;
    v_aanduiding := '';

    SELECT SYSDATE
    INTO v_nu
    FROM dual;

    -- Alle kpi-energie verwerken...
    FOR rec_halbezet IN c_kpi_halbezet
    LOOP
        BEGIN
            v_count_tot := v_count_tot + 1;

            v_errorhint := 'Fout bij bepalen BEZETTING object obv OPC-label [' || rec_halbezet.ins_deel_omschrijving || ']';

            -- Bepalen van het object ins_deel adhv het UNIEKE! OPC-label als objectomschrijving
            -- Behalve ins_deel_key wordt ook bijbehorende STATISCHE ins_kenmerk_key opgeleverd (wie van de 3 is dan bekend).
            -- Als die niet kan worden gevonden, dat wordt de betreffende waarde (meting, setpoint of alarm) NIET geregistreerd, en wordt gelogd


            SELECT ins_deel_key
            INTO v_ins_deel_key
            FROM ins_deel d
            WHERE ins_deel_omschrijving = rec_halbezet.ins_deel_omschrijving
            AND D.INS_DEEL_VERWIJDER IS NULL;

            -- Daarna wordt adhv de STATISCHE kenmerk_key de DYNAMISCHE ins_kenmerk_key (die van de bijbehorende meetwaarde) bepaald.
            -- Enigzins getruukt, maar wel goed, via de locatiekolom, die een verwijzing naar de statische kenmerk bevat.
            -- Zo is bekend welke STATISCHE KEY bij welke DYNAMISCHE hoort.



            v_errorhint := 'Fout bij bepalen of meetwaarde halbezetting bij object ' ||  rec_halbezet.ins_deel_omschrijving || ' - ' || v_ins_deel_key || ' (registratie van vandaag is al gebeurd).';

            --SELECT COUNT(*)
            --INTO v_aantal
            --FROM ins_kenmerkdeel
            --WHERE ins_deel_key = v_ins_deel_key
            --AND ins_kenmerk_key = c_ins_kenmerk_key_halbezet
            --AND TRUNC(ins_kenmerkdeel_aanmaak) = TRUNC(SYSDATE);
            -- Voorheen was het eenmaal per dag, nu gewoon elke 10 minuten oid
            v_aantal := 0;
            IF (v_aantal = 0)
            THEN
                BEGIN

                    v_errorhint := 'Fout bij update van vorige meetwaarde halbezetting bij object ' ||  rec_halbezet.ins_deel_omschrijving || ' - ' || v_ins_deel_key || '.';
                    -- De vorige meetwaarde functioneel verwijderen, er is immers een nieuwe (hieronder)
                    UPDATE ins_kenmerkdeel
                    SET ins_kenmerkdeel_verwijder = v_nu
                    WHERE ins_kenmerk_key = c_ins_kenmerk_key_halbezet
                    AND ins_deel_key = v_ins_deel_key
                    AND ins_kenmerkdeel_verwijder IS NULL;

                    v_errorhint := 'Fout bij insert nieuwe van meetwaarde halbezetting bij object ' ||  rec_halbezet.ins_deel_omschrijving || ' - ' || v_ins_deel_key || ' (registratie van vandaag is al gebeurd).';

                    -- MB: ITT wat Coneco aangeeft dat hier alleen een waarde 1 of 2 worden gebruikt, zie ik alleen de waarden 0.1 en 0.2
                    -- In de nieuwste definitie staat hier 1.0 (= niet verhuurd oftewel leeg) of 2.0 (=wel verhuurd, bezet).


                    IF rec_halbezet.ins_deel_meetwaarde = 1.0
                    THEN
                        INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
                        SELECT v_ins_deel_key, c_ins_kenmerk_key_halbezet, 0 FROM DUAL;
                    ELSE
                        INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
                        SELECT v_ins_deel_key, c_ins_kenmerk_key_halbezet, 1 FROM DUAL;
                    END IF;

                EXCEPTION
                      WHEN OTHERS
                      THEN
                         oracle_err_num := SQLCODE;
                         oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                         v_errormsg :=
                               v_errorhint
                            || ' ORACLE (error '
                            || oracle_err_num
                            || '/'
                            || oracle_err_mes
                            || ')';
                         fac.imp_writelog
                                 (p_import_key,
                                  'E',
                                  v_aanduiding || v_errormsg,
                                  'Ingelezen regel kan niet worden weggeschreven!'
                                 );
                         COMMIT;
                   END;
            END IF;

            COMMIT;

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


    fac.imp_writelog (p_import_key,
                    'S',
                       'KPI HALBEZETTING: verwerkte regels zonder foutmelding: '
                    || TO_CHAR (v_count_tot - v_count_error),
                    ''
                   );
    fac.imp_writelog (p_import_key,
                    'S',
                       'KPI HALBEZETTING: verwerkte regels met foutmelding: '
                    || TO_CHAR (v_count_error),
                    ''
                   );
    COMMIT;
END arai_update_kpi_halbezetting;
/


CREATE OR REPLACE PROCEDURE arai_update_kpi_energie (
   p_import_key IN NUMBER
)
IS
BEGIN
    arai_update_kpi_energie_items(p_import_key);
    arai_update_kpi_halbezetting(p_import_key);
END arai_update_kpi_energie;
/

---
-- ins_kenmerk_key = 64 is de kenmerk-key van de 'meetwaarde' ruimte bezet (ja / nee).
-- Extra aanscherping: object moet van objectsoort 'detectie ruimtebezet' (srtdeel_key=65) zijn.
-- kd is kenmerkdeel met meetwaarden (zaal bezet ja of nee): ins_kenmerk_key = 64
-- kd2 is Optioneel: (+) kenmerkdeel met de groepnaam (tbv RTM Energie welke zalen op 1 regel (groep) komen te staan): ins_kenmerk_key = 81
-- kd3 is Optioneel: (+) kenmerkdeel met de ruimtenaam (tbv RTM Energie, kan de standaard ruimteomschr. daarmee overrulen) : ins_kenmerk_key = 82
CREATE OR REPLACE VIEW arai_v_hall_bezetting
(alg_gebouw_key,
 alg_gebouw_naam,
 alg_verdieping_key,
 alg_ruimte_key,
 alg_ruimte_omschrijving,
 ruimtegroep,
 ins_kenmerkdeel_waarde,
 ins_kenmerkdeel_aanmaak
 )
AS
SELECT  g.alg_gebouw_key,
        g.alg_gebouw_naam,
        v.alg_verdieping_key,
        r.alg_ruimte_key,
        COALESCE(kd3.ins_kenmerkdeel_waarde,r.alg_ruimte_omschrijving),
        kd2.ins_kenmerkdeel_waarde,
        kd.ins_kenmerkdeel_waarde,
        kd.ins_kenmerkdeel_aanmaak
FROM ins_kenmerkdeel kd, ins_deel d, alg_ruimte r, alg_verdieping v, alg_gebouw g, ins_kenmerkdeel kd2, ins_kenmerkdeel kd3
            WHERE kd.ins_kenmerk_key = 64
            AND TRUNC(kd.ins_kenmerkdeel_aanmaak) = TRUNC(SYSDATE)
            AND d.ins_srtdeel_key = 65
            AND kd.ins_kenmerkdeel_verwijder IS NULL
            AND d.ins_deel_key =kd.ins_deel_key
            AND D.INS_ALG_RUIMTE_TYPE = 'R'
            AND r.alg_ruimte_key = D.INS_ALG_RUIMTE_KEY
            AND v.alg_verdieping_key = r.alg_verdieping_key
            AND g.alg_gebouw_key = v.alg_gebouw_key
            AND kd2.ins_kenmerk_key(+) = 81
            AND d.ins_deel_key =kd2.ins_deel_key (+)
            AND kd2.ins_kenmerkdeel_verwijder (+) IS NULL
            AND kd3.ins_kenmerk_key(+) = 82
            AND d.ins_deel_key =kd3.ins_deel_key (+)
            AND kd3.ins_kenmerkdeel_verwijder (+) IS NULL;


---
-- Eerst wat algemene energie-views, als BASIS voor de energie-grafieken
-- Let op!! Belangrijk: de K.INS_KENMERK_LOCATIEKOLOM = 61, 62 en 63 zijn de ins_kenmerk_key van de bijbehorende OPC-id's.
-- Die worden elders gebruikt in c_ins_kenmerk_key_opc_meting, c_ins_kenmerk_key_opc_setpoint en c_ins_kenmerk_key_opc_alarm
--
-- Verder van belang: SG.INS_DISCIPLINE_KEY = 281 (de key die de discipline energie gaat krijgen).
---

CREATE OR REPLACE VIEW arai_v_energie_meting_nu
AS
        SELECT sg.ins_srtgroep_key,
               sg.ins_srtgroep_omschrijving,
               sd.ins_srtdeel_key,
               sd.ins_srtdeel_omschrijving,
               d.ins_deel_key,
               d.ins_deel_omschrijving,
               d.ins_deel_x,
               v.ins_kenmerkdeel_waarde verbruik,
               v.ins_kenmerkdeel_aanmaak,
               v.ins_kenmerkdeel_verwijder
            FROM ins_srtgroep sg, ins_srtdeel sd, ins_deel d, ins_kenmerkdeel v
            WHERE SG.INS_DISCIPLINE_KEY = 281
            and SD.INS_SRTGROEP_KEY = SG.INS_SRTGROEP_KEY
            AND d.ins_srtdeel_key = sd.ins_srtdeel_key
            AND v.ins_deel_key = d.ins_deel_key
            AND v.ins_kenmerk_key = (
                SELECT ins_kenmerk_key
                FROM ins_kenmerk k
                WHERE K.INS_KENMERK_LOCATIEKOLOM = 61
                AND K.INS_KENMERK_MEETWAARDE = 1
                AND K.INS_KENMERK_NIVEAU = 'S'
                AND K.INS_SRTINSTALLATIE_KEY = (SELECT ins_srtdeel_key FROM ins_deel WHERE ins_deel_key = d.ins_deel_key)
             )
             AND v.ins_kenmerkdeel_verwijder IS NULL;

CREATE OR REPLACE VIEW arai_v_energie_setpoint_nu
AS
        SELECT sg.ins_srtgroep_key,
               sg.ins_srtgroep_omschrijving,
               sd.ins_srtdeel_key,
               sd.ins_srtdeel_omschrijving,
               d.ins_deel_key,
               d.ins_deel_omschrijving,
               s.ins_kenmerkdeel_waarde setpoint
            FROM ins_srtgroep sg, ins_srtdeel sd, ins_deel d, ins_kenmerkdeel s
            WHERE SG.INS_DISCIPLINE_KEY = 281
            and SD.INS_SRTGROEP_KEY = SG.INS_SRTGROEP_KEY
            AND d.ins_srtdeel_key = sd.ins_srtdeel_key
            AND s.ins_deel_key = d.ins_deel_key
            AND s.ins_kenmerk_key = (
                SELECT ins_kenmerk_key
                FROM ins_kenmerk k
                WHERE K.INS_KENMERK_LOCATIEKOLOM = 62
                AND K.INS_KENMERK_MEETWAARDE = 1
                AND K.INS_KENMERK_NIVEAU = 'S'
                AND K.INS_SRTINSTALLATIE_KEY = (SELECT ins_srtdeel_key FROM ins_deel WHERE ins_deel_key = d.ins_deel_key)
            )
            AND s.ins_kenmerkdeel_verwijder IS NULL;

CREATE OR REPLACE VIEW arai_v_energie_kleur_nu
AS
        SELECT sg.ins_srtgroep_key,
               sg.ins_srtgroep_omschrijving,
               sd.ins_srtdeel_key,
               sd.ins_srtdeel_omschrijving,
               d.ins_deel_key,
               d.ins_deel_omschrijving,
               k.ins_kenmerkdeel_waarde kleur
            FROM ins_srtgroep sg, ins_srtdeel sd, ins_deel d, ins_kenmerkdeel k
            WHERE SG.INS_DISCIPLINE_KEY = 281
            and SD.INS_SRTGROEP_KEY = SG.INS_SRTGROEP_KEY
            AND d.ins_srtdeel_key = sd.ins_srtdeel_key
            AND k.ins_deel_key = d.ins_deel_key
            AND k.ins_kenmerk_key = (
                SELECT ins_kenmerk_key
                FROM ins_kenmerk k
                WHERE K.INS_KENMERK_LOCATIEKOLOM = 63
                AND K.INS_KENMERK_MEETWAARDE = 1
                AND K.INS_KENMERK_NIVEAU = 'S'
                AND K.INS_SRTINSTALLATIE_KEY = (SELECT ins_srtdeel_key FROM ins_deel WHERE ins_deel_key = d.ins_deel_key)
            )
            AND k.ins_kenmerkdeel_verwijder IS NULL;

CREATE OR REPLACE VIEW arai_v_energie_verbruik_nu
AS
    SELECT v.ins_srtgroep_key,
           v.ins_srtgroep_omschrijving,
           v.ins_srtdeel_key,
           v.ins_srtdeel_omschrijving,
           v.ins_deel_key,
           v.ins_deel_omschrijving,
           v.verbruik,
           s.setpoint,
           k.kleur,
           v.ins_kenmerkdeel_aanmaak,
           v.ins_kenmerkdeel_verwijder,
           COALESCE(v.ins_deel_x,1) as volgorde
    FROM arai_v_energie_meting_nu v, arai_v_energie_setpoint_nu s, arai_v_energie_kleur_nu k
    WHERE v.ins_deel_key = s.ins_deel_key(+)
    AND v.ins_deel_key = k.ins_deel_key(+);



-- Let op!! Belangrijk: de K.INS_KENMERK_LOCATIEKOLOM = 61, 62 en 63 zijn de ins_kenmerk_key van de bijbehorende OPC-id's.
-- Die worden elders gebruikt in c_ins_kenmerk_key_opc_meting, c_ins_kenmerk_key_opc_setpoint en c_ins_kenmerk_key_opc_alarm
-- Verder van belang: SG.INS_DISCIPLINE_KEY = 281 (de key die de discipline energie gaat krijgen).

CREATE OR REPLACE VIEW arai_v_energie_verbruik_histry
AS
        SELECT sg.ins_srtgroep_key,
               sg.ins_srtgroep_omschrijving,
               sd.ins_srtdeel_key,
               sd.ins_srtdeel_omschrijving,
               d.ins_deel_key,
               d.ins_deel_omschrijving,
               v.ins_kenmerkdeel_waarde verbruik,
               s.ins_kenmerkdeel_waarde setpoint,
               k.ins_kenmerkdeel_waarde kleur,
               v.ins_kenmerkdeel_aanmaak,
               v.ins_kenmerkdeel_verwijder
            FROM ins_srtgroep sg, ins_srtdeel sd, ins_deel d, ins_kenmerkdeel v, ins_kenmerkdeel s,  ins_kenmerkdeel k
            WHERE SG.INS_DISCIPLINE_KEY = 281
            and SD.INS_SRTGROEP_KEY = SG.INS_SRTGROEP_KEY
            AND d.ins_srtdeel_key = sd.ins_srtdeel_key
            AND v.ins_deel_key = d.ins_deel_key
            AND v.ins_kenmerk_key = (
                SELECT ins_kenmerk_key
                FROM ins_kenmerk k
                WHERE K.INS_KENMERK_LOCATIEKOLOM = 61
                AND K.INS_KENMERK_MEETWAARDE = 1
                AND K.INS_KENMERK_NIVEAU = 'S'
                AND K.INS_SRTINSTALLATIE_KEY = (SELECT ins_srtdeel_key FROM ins_deel WHERE ins_deel_key = d.ins_deel_key)
             )
             AND s.ins_deel_key = d.ins_deel_key
              AND s.ins_kenmerk_key = (
                SELECT ins_kenmerk_key
                FROM ins_kenmerk k
                WHERE K.INS_KENMERK_LOCATIEKOLOM = 62
                AND K.INS_KENMERK_MEETWAARDE = 1
                AND K.INS_KENMERK_NIVEAU = 'S'
                AND K.INS_SRTINSTALLATIE_KEY = (SELECT ins_srtdeel_key FROM ins_deel WHERE ins_deel_key = d.ins_deel_key)
             )
             AND v.ins_kenmerkdeel_aanmaak = s.ins_kenmerkdeel_aanmaak
             AND k.ins_deel_key = d.ins_deel_key
              AND k.ins_kenmerk_key = (
                SELECT ins_kenmerk_key
                FROM ins_kenmerk k
                WHERE K.INS_KENMERK_LOCATIEKOLOM = 63
                AND K.INS_KENMERK_MEETWAARDE = 1
                AND K.INS_KENMERK_NIVEAU = 'S'
                AND K.INS_SRTINSTALLATIE_KEY = (SELECT ins_srtdeel_key FROM ins_deel WHERE ins_deel_key = d.ins_deel_key)
             )
             AND v.ins_kenmerkdeel_aanmaak = k.ins_kenmerkdeel_aanmaak;

CREATE OR REPLACE VIEW arai_v_energie_verbruik_today
AS
        SELECT sg.ins_srtgroep_key,
               sg.ins_srtgroep_omschrijving,
               sd.ins_srtdeel_key,
               sd.ins_srtdeel_omschrijving,
               d.ins_deel_key,
               d.ins_deel_omschrijving,
               v.ins_kenmerkdeel_waarde verbruik,
               v.ins_kenmerkdeel_aanmaak,
               v.ins_kenmerkdeel_verwijder
            FROM ins_srtgroep sg, ins_srtdeel sd, ins_deel d, ins_kenmerkdeel v
            WHERE SG.INS_DISCIPLINE_KEY = 281
            and SD.INS_SRTGROEP_KEY = SG.INS_SRTGROEP_KEY
            AND d.ins_srtdeel_key = sd.ins_srtdeel_key
            AND v.ins_deel_key = d.ins_deel_key
            AND v.ins_kenmerk_key = (
                SELECT ins_kenmerk_key
                FROM ins_kenmerk k
                WHERE K.INS_KENMERK_LOCATIEKOLOM = 61
                AND K.INS_KENMERK_MEETWAARDE = 1
                AND K.INS_KENMERK_NIVEAU = 'S'
                AND K.INS_SRTINSTALLATIE_KEY = (SELECT ins_srtdeel_key FROM ins_deel WHERE ins_deel_key = d.ins_deel_key)
             )
             AND TRUNC(v.ins_kenmerkdeel_aanmaak) = TRUNC(SYSDATE);



CREATE OR REPLACE VIEW arai_v_energie_verbruik_today
(ins_deel_key, ins_deel_omschrijving, verbruik, ins_kenmerkdeel_aanmaak)
AS
SELECT         d.ins_deel_key,
               MIN(d.ins_deel_omschrijving),
               ROUND(AVG(fac.safe_to_number(COALESCE(v.ins_kenmerkdeel_waarde,'0'))),1),
               TO_CHAR(ins_kenmerkdeel_aanmaak,'HH24')
            FROM ins_srtgroep sg, ins_srtdeel sd, ins_deel d, ins_kenmerkdeel v
            WHERE SG.INS_DISCIPLINE_KEY = 281
            and SD.INS_SRTGROEP_KEY = SG.INS_SRTGROEP_KEY
            AND d.ins_srtdeel_key = sd.ins_srtdeel_key
            AND v.ins_deel_key = d.ins_deel_key
            AND v.ins_kenmerk_key = (
                SELECT ins_kenmerk_key
                FROM ins_kenmerk k
                WHERE K.INS_KENMERK_LOCATIEKOLOM = 61
                AND K.INS_KENMERK_MEETWAARDE = 1
                AND K.INS_KENMERK_NIVEAU = 'S'
                AND K.INS_SRTINSTALLATIE_KEY = (SELECT ins_srtdeel_key FROM ins_deel WHERE ins_deel_key = d.ins_deel_key)
             )
             AND TRUNC(v.ins_kenmerkdeel_aanmaak) = TRUNC(SYSDATE)
             GROUP BY d.ins_deel_key, TO_CHAR(ins_kenmerkdeel_aanmaak,'HH24');



-- Discipline Energie, Soortgroep Water (key = 62)
CREATE OR REPLACE VIEW arai_v_water_verbruik_nu
AS SELECT * FROM arai_v_energie_verbruik_nu
WHERE ins_srtgroep_key = 62
UNION ALL
SELECT 62, ' ', 0, ' ', 0, ' ', '0', '0', '1.0', SYSDATE, NULL,0 FROM DUAL
UNION ALL
SELECT 62, ' ', 0, ' ', 0, ' ', '0', '0', '1.0', SYSDATE, NULL,99 FROM DUAL;

-- Discipline Energie, Soortgroep Warmte (key = 64)
CREATE OR REPLACE VIEW arai_v_warmte_verbruik_nu
AS SELECT * FROM arai_v_energie_verbruik_nu
WHERE ins_srtgroep_key = 64;

-- Discipline Energie, Soortgroep Elektra (key = 61)
CREATE OR REPLACE VIEW arai_v_elektra_verbruik_nu
AS SELECT * FROM arai_v_energie_verbruik_nu
WHERE ins_srtgroep_key = 61;

----------------------------------------------------------------

-- WATER
-- Grafiek: KPI Energie Waterverbruik per watermeter van nu (max 10 minuten geleden) van alle watermeters
-- FCLT_YAS_ is de y-as voor groen
-- FCLT_YAS2_ is de y-as voor rood
-- FCLT_YAS3_ is de y-as voor oranje
-- Barchart met 3 kleuren: groen (waterverbruik = okee), oranje (waterverbruik is oranje) en rood (waterverbruik is rood)

-- KLEUR:  1.0 =GROEN
--         3.0 =ORANJE
--         7.0 =ROOD

CREATE OR REPLACE VIEW arai_v_graph_water_nu
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_YAS3_,
   FCLT_URL,
   VOLGORDE
)
AS
    SELECT  ins_deel_key,
            ins_deel_omschrijving,
            CASE
               WHEN  fac.safe_to_number(kleur) = 1.0 THEN fac.safe_to_number(verbruik)
               ELSE  CASE
                        WHEN  fac.safe_to_number(verbruik) >  fac.safe_to_number(setpoint) THEN fac.safe_to_number(setpoint)
                        ELSE  0
                     END
            END,
            CASE
               WHEN  fac.safe_to_number(kleur) = 7.0
               THEN  CASE
                        WHEN  fac.safe_to_number(verbruik) >  fac.safe_to_number(setpoint) THEN fac.safe_to_number(verbruik) -  fac.safe_to_number(setpoint)
                        ELSE  fac.safe_to_number(verbruik)
                     END
               ELSE 0
            END,
            CASE
               WHEN  fac.safe_to_number(kleur) = 3.0
               THEN  CASE
                        WHEN  fac.safe_to_number(verbruik) >  fac.safe_to_number(setpoint) THEN fac.safe_to_number(verbruik) -  fac.safe_to_number(setpoint)
                        ELSE  fac.safe_to_number(verbruik)
                     END
               ELSE 0
            END,
            'appl/ins/ins_deel.asp?urole=fe' || '&' || 'ins_key=' || ins_deel_key,
            volgorde
    FROM  arai_v_water_verbruik_nu;


-- Verbruik van vandaag vanaf maximaal 12 uur geleden.
CREATE OR REPLACE VIEW arai_v_graph_water_today
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_URL
)
AS
SELECT ins_deel_key,
       ins_kenmerkdeel_aanmaak,
       verbruik,
       ''
FROM arai_v_energie_verbruik_today
    WHERE ins_deel_key = 241
    AND ins_kenmerkdeel_aanmaak >=  GREATEST('00', TRIM(TO_CHAR(TO_CHAR(SYSDATE,'HH24') - 12,'00')));



-- ELEKTRA
-- Grafiek: KPI Energie Elektraverbruik per elektrameter van nu (max 10 minuten geleden):
-- ins_deel_key inkoop = 243
-- ins_deel_key wkk = 244
-- ins_deel_key pv = 339 NIET, die gaat in een aparte grafiek (uitdukken in kW)
-- ins_deel_key totaal = 245

-- YAS  voor groen
-- YAS2 voor rood
-- YAS3 voor oranje
-- Barchart met 3 kleuren: groen (verbruik = okee), oranje (verbruik is oranje) en rood (verbruik is rood)
CREATE OR REPLACE VIEW arai_v_graph_elektra_nu
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_YAS3_,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT  ins_deel_key,
            ins_deel_omschrijving,
            CASE
               WHEN  COALESCE(fac.safe_to_number(kleur),1.0) = 1.0 THEN fac.safe_to_number(verbruik)
               ELSE  CASE
                        WHEN  fac.safe_to_number(verbruik) >  fac.safe_to_number(setpoint) THEN fac.safe_to_number(setpoint)
                        ELSE  0
                     END
            END,
            CASE
               WHEN  fac.safe_to_number(kleur) = 7.0
               THEN  CASE
                        WHEN  fac.safe_to_number(verbruik) >  fac.safe_to_number(setpoint) THEN fac.safe_to_number(verbruik) -  fac.safe_to_number(setpoint)
                        ELSE  fac.safe_to_number(verbruik)
                     END
               ELSE 0
            END,
            CASE
               WHEN  fac.safe_to_number(kleur) = 3.0
               THEN  CASE
                        WHEN  fac.safe_to_number(verbruik) >  fac.safe_to_number(setpoint) THEN fac.safe_to_number(verbruik) -  fac.safe_to_number(setpoint)
                        ELSE  fac.safe_to_number(verbruik)
                     END
               ELSE 0
            END,
            'appl/ins/ins_deel.asp?urole=fe' || '&' || 'ins_key=' || ins_deel_key,
            volgorde
    FROM  arai_v_elektra_verbruik_nu
    WHERE ins_deel_key IN (243, 244, 245);


-- MBMB: Check of de ins_deel_key's hieronder okee zijn:
-- ins_deel_key inkoop = 243
-- ins_deel_key wkk = 244
-- ins_deel_key pv = 339 NIET, die gaat in een aparte grafiek (uitdukken in kW)
-- ins_deel_key totaal = 245

CREATE OR REPLACE VIEW arai_v_graph_electra_today
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_INKOOP,
   FCLT_YAS2_WKK,
   FCLT_YAS3_TOTAAL,
   FCLT_URL
)
AS
SELECT totaal.ins_deel_key,
       totaal.ins_kenmerkdeel_aanmaak,
       inkoop.verbruik,
       wkk.verbruik,
       totaal.verbruik,
       ''
    FROM arai_v_energie_verbruik_today inkoop, arai_v_energie_verbruik_today wkk, arai_v_energie_verbruik_today totaal
    WHERE inkoop.ins_deel_key = 243
    AND inkoop.ins_kenmerkdeel_aanmaak >=  GREATEST('00', TRIM(TO_CHAR(TO_CHAR(SYSDATE,'HH24') - 12,'00')))
    AND wkk.ins_deel_key = 244
    AND wkk.ins_kenmerkdeel_aanmaak >=  GREATEST('00', TRIM(TO_CHAR(TO_CHAR(SYSDATE,'HH24') - 12,'00')))
    AND totaal.ins_deel_key = 245
    AND totaal.ins_kenmerkdeel_aanmaak >=  GREATEST('00', TRIM(TO_CHAR(TO_CHAR(SYSDATE,'HH24') - 12,'00')))
    AND inkoop.ins_kenmerkdeel_aanmaak = wkk.ins_kenmerkdeel_aanmaak
    AND wkk.ins_kenmerkdeel_aanmaak = totaal.ins_kenmerkdeel_aanmaak;


-- ELEKTRA
-- Grafiek: KPI Zonne-energie van nu (max 10 minuten geleden)
-- YAS  voor groen
-- ins_deel_key pv = 339 (uitdukken in kW)
-- Barchart met 1 kleur: groen.
CREATE OR REPLACE VIEW arai_v_graph_zon_nu
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_URL,
   VOLGORDE
)
AS
SELECT      ins_deel_key,
            ins_deel_omschrijving,
            fac.safe_to_number(verbruik),
            'appl/ins/ins_deel.asp?urole=fe' || '&' || 'ins_key=' || ins_deel_key,
            volgorde
    FROM  arai_v_elektra_verbruik_nu
    WHERE ins_deel_key IN (339)
UNION ALL
SELECT 0, ' ', 0, ' ', 0 FROM DUAL
UNION ALL
SELECT 0, ' ', 0, ' ', 99 FROM DUAL;

-- MBMB: Check of de ins_deel_key's hieronder okee zijn:
-- ins_deel_key pv = 339

CREATE OR REPLACE VIEW arai_v_graph_zon_today
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_URL
)
AS
SELECT pv.ins_deel_key,
       pv.ins_kenmerkdeel_aanmaak,
       pv.verbruik,
       ''
    FROM arai_v_energie_verbruik_today pv
    WHERE pv.ins_deel_key = 339
    AND pv.ins_kenmerkdeel_aanmaak >=  GREATEST('00', TRIM(TO_CHAR(TO_CHAR(SYSDATE,'HH24') - 12,'00')));





-- WARMTE
-- Grafiek: KPI Energie Warmteverbruik per warmtemeter van nu (max 10 minuten geleden)
-- YAS  voor groen
-- YAS2 voor rood
-- YAS3 voor oranje
-- Barchart met 3 kleuren: groen (verbruik = okee), oranje (verbruik is oranje) en rood (verbruik is rood)
CREATE OR REPLACE VIEW arai_v_graph_warmte_nu
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_,
   FCLT_YAS3_,
   FCLT_URL,
   VOLGORDE
)
AS
    SELECT  ins_deel_key,
            ins_deel_omschrijving,
            CASE
               WHEN  COALESCE(fac.safe_to_number(kleur),1.0) = 1.0 THEN fac.safe_to_number(verbruik)
               ELSE  CASE
                        WHEN  fac.safe_to_number(verbruik) >  fac.safe_to_number(setpoint) THEN fac.safe_to_number(setpoint)
                        ELSE  0
                     END
            END,
            CASE
               WHEN  fac.safe_to_number(kleur) = 7.0
               THEN  CASE
                        WHEN  fac.safe_to_number(verbruik) >  fac.safe_to_number(setpoint) THEN fac.safe_to_number(verbruik) -  fac.safe_to_number(setpoint)
                        ELSE  fac.safe_to_number(verbruik)
                     END
               ELSE 0
            END,
            CASE
               WHEN  fac.safe_to_number(kleur) = 3.0
               THEN  CASE
                        WHEN  fac.safe_to_number(verbruik) >  fac.safe_to_number(setpoint) THEN fac.safe_to_number(verbruik) -  fac.safe_to_number(setpoint)
                        ELSE  fac.safe_to_number(verbruik)
                     END
               ELSE 0
            END,
            'appl/ins/ins_deel.asp?urole=fe' || '&' || 'ins_key=' || ins_deel_key,
            volgorde
    FROM  arai_v_warmte_verbruik_nu;


-- MBMB: Check of de ins_deel_key's hieronder okee zijn:
-- ins_deel_key gas = 242
-- ins_deel_key stadw = 246
-- ins_deel_key wkk = 337
-- ins_deel_key totaal = 338

CREATE OR REPLACE VIEW arai_v_graph_warmte_today
(
   fclt_key,
   FCLT_XAS_,
   FCLT_YAS_GAS,
   FCLT_YAS2_STADW,
   FCLT_YAS3_WKK,
   FCLT_YAS4_TOTAAL,
   FCLT_URL
)
AS
   SELECT totaal.ins_deel_key,
       totaal.ins_kenmerkdeel_aanmaak,
       gas.verbruik,
       stadw.verbruik,
       wkk.verbruik,
       totaal.verbruik,
       ''
    FROM arai_v_energie_verbruik_today gas, arai_v_energie_verbruik_today stadw, arai_v_energie_verbruik_today wkk, arai_v_energie_verbruik_today totaal
    WHERE gas.ins_deel_key = 242
    AND gas.ins_kenmerkdeel_aanmaak >=  GREATEST('00', TRIM(TO_CHAR(TO_CHAR(SYSDATE,'HH24') - 12,'00')))
    AND stadw.ins_deel_key = 246
    AND gas.ins_kenmerkdeel_aanmaak >=  GREATEST('00', TRIM(TO_CHAR(TO_CHAR(SYSDATE,'HH24') - 12,'00')))
    AND wkk.ins_deel_key = 337
    AND wkk.ins_kenmerkdeel_aanmaak >=  GREATEST('00', TRIM(TO_CHAR(TO_CHAR(SYSDATE,'HH24') - 12,'00')))
    AND totaal.ins_deel_key = 338
    AND totaal.ins_kenmerkdeel_aanmaak >=  GREATEST('00', TRIM(TO_CHAR(TO_CHAR(SYSDATE,'HH24') - 12,'00')))
    AND gas.ins_kenmerkdeel_aanmaak = stadw.ins_kenmerkdeel_aanmaak
    AND stadw.ins_kenmerkdeel_aanmaak = wkk.ins_kenmerkdeel_aanmaak
    AND wkk.ins_kenmerkdeel_aanmaak = totaal.ins_kenmerkdeel_aanmaak;






------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--            Import KPI ICT MITEL             Import KPI ICT MITEL              Import KPI ICT MITEL              Import KPI ICT MITEL              Import KPI ICT MITEL         --
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE arai_notify_kpi_ict_mitel
(
   p_import_key IN NUMBER
)
IS

    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errorhint2              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);


    -- fac_usrtab_key = 21 is de tabel '$KPI_NOTIFY': SYSTEM TABEL: KEEP OUT!
    -- SYNTAX code = KPI_<kpi-naam>_<mail-of-sms>, dus b.v. 'KPI_TEMP_MAIL', 'KPI_ICT_MITEL_MAIL', 'KPI_TEMP_SMS', 'KPI_ICT_MITEL_SMS',
    -- Met volgnr = 1 wordt aangegeven dat het een actieve notificatie is, lege waarde of 0 (of iets anders) is inactief cq. tijdelijk uitgezet.


    CURSOR c_kpi_ict_notify_mail_kpi
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'KPI_ICT_MITEL_MAIL%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;


    CURSOR c_kpi_ict_notify_mail_evm
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'EVM_MAIL%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;


    CURSOR c_kpi_ict_notify_sms_kpi
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'KPI_ICT_MITEL_SMS%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;

    CURSOR c_kpi_ict_notify_sms_evm
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'EVM_SMS%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;


    CURSOR c_kpi_ict_mitel
    IS
        SELECT  ins_deel_key, ins_kenmerkdeel_waarde, kpi_color_overrule,
                CASE
                   WHEN kpi_color_overrule IS NOT NULL THEN kpi_color_overrule
                   WHEN ins_kenmerkdeel_waarde IS NULL THEN -1
                   WHEN ins_kenmerkdeel_waarde >= waarde_rood THEN 2
                   WHEN ins_kenmerkdeel_waarde >= waarde_oranje THEN 1
                   ELSE 0
                END kpi_ict_mitel
        FROM  arai_v_kpi_ict_mitel
        WHERE ins_kenmerkdeel_verwijder IS NULL;

    -- Alleen notificeren gedurende de "openingsdatums" en "openingstijden" van de KPI.
    -- Openingsdatums worden bepaald door settings KPI_ALL_DATUM1 en KPI_ALL_DATUM2 (b.v. 06-09-2012 en 11-09-2012)
    -- Indien deze niet in tabel staan, dan zijn de openingsdatums oneindig (levert altijd OKEE op).
    -- Openingstijden worden bepaald door settings KPI_ICT_MITEL_TIME1 en KPI_ICT_MITEL_TIME2 (b.v. 08:00 en 17:00)
    -- Indien deze niet in tabel staan, dan zijn de openingstijden van 0:00 t/m 23:59 (24 uurs)
    CURSOR c_kpi_notify_during_opening
    IS
        SELECT
            COALESCE(
                (SELECT
                    CASE WHEN TRUNC(to_date(ud.fac_usrdata_omschr,'DD-MM-YYYY')) <=  TRUNC(sysdate)
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_ALL_DATUM1'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) min_datum,
            COALESCE(
                (SELECT
                    CASE WHEN TRUNC(to_date(ud.fac_usrdata_omschr,'DD-MM-YYYY')) >=  TRUNC(sysdate)
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_ALL_DATUM2'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) max_datum,
            COALESCE(
                (SELECT
                    CASE WHEN to_date(to_char(sysdate,'DD-MM-YYYY') || ' ' || ud.fac_usrdata_omschr,'DD-MM-YYYY HH24:MI') <=  sysdate
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_ICT_MITEL_TIME1'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) min_tijd,
            COALESCE(
                (SELECT
                    CASE WHEN to_date(to_char(sysdate,'DD-MM-YYYY') || ' ' || ud.fac_usrdata_omschr,'DD-MM-YYYY HH24:MI') >=  sysdate
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_ICT_MITEL_TIME2'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) max_tijd
        FROM DUAL;


BEGIN


    FOR rec_open IN c_kpi_notify_during_opening
    LOOP
    -- Deze loop is precies 1 record (feitelijk een if-statement)

        IF rec_open.min_datum = 1 AND rec_open.max_datum = 1 AND rec_open.min_tijd = 1 AND rec_open.max_tijd = 1
        THEN
            -- De sysdate ligt tussen zowel de openingstijd als sluitingstijd van de KPI, dus we kunnen gaan notificeren...


            FOR rec_kpi_ict_mitel IN c_kpi_ict_mitel
            LOOP
                BEGIN
                    -- Als ORANJE (1) of ROOD (2), dan notificeren, anders niet (uiteraard)
                    IF rec_kpi_ict_mitel.kpi_ict_mitel = 1 OR rec_kpi_ict_mitel.kpi_ict_mitel = 2
                    THEN

                        IF rec_kpi_ict_mitel.kpi_ict_mitel = 1
                        THEN
                            -- Code ORANJE voor KPI ICT MITEL
                            -- Mailen naar KPI + EVM, en SMS-en naar KPI en EVM...

                            -- Maar ALLEEN indien er GEEN handmatige OVERRULE kleur is ingesteld

                            IF rec_kpi_ict_mitel.kpi_color_overrule IS NULL
                            THEN
                                -- Vanuit Mitel, dus geen handmatige ingestelde kleur hier...

                                v_errorhint := 'Alarm ORANJE: Gemiddelde wachttijd ICT Telefooncentrale '  ||  rec_kpi_ict_mitel.ins_kenmerkdeel_waarde  || ' seconden.';
                                v_errormsg := '';


                                -- 1.Eerst mailen naar alle KPI-eigenaren / betrokkenen
                                FOR rec_kpi_noti IN c_kpi_ict_notify_mail_kpi
                                LOOP
                                    BEGIN
                                        -- Mailen
                                        fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                        -- Loggen
                                        v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                        fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                        COMMIT;
                                    END;
                                END LOOP;

                                -- 2. Dan mailen naar alle eventmanagers
                                FOR rec_kpi_noti IN c_kpi_ict_notify_mail_evm
                                LOOP
                                    BEGIN
                                        -- Mailen
                                        fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                        -- Loggen
                                        v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                        fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                        COMMIT;
                                    END;
                                END LOOP;

                                -- 3.Dan nog sms-en naar alle KPI-eigenaren / betrokkenen
                                FOR rec_kpi_noti IN c_kpi_ict_notify_sms_kpi
                                LOOP
                                    BEGIN
                                        -- SMS-en
                                        fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                        -- Loggen
                                        v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                        fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                        COMMIT;
                                    END;
                                END LOOP;

                                -- 4. En sms-en naar alle eventmanagers
                                FOR rec_kpi_noti IN c_kpi_ict_notify_sms_evm
                                LOOP
                                    BEGIN
                                        -- SMS-en
                                        fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                        -- Loggen
                                        v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                        fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                        COMMIT;
                                    END;
                                END LOOP;
                            ELSE
                                -- De KPI KLEUR is handmatig (danwel door de 1e ROOD via MITEL) ingesteld, en OVERRULED het systeem MITEL en dus ook GEEN notifificaties...
                                v_errormsg := '';
                                v_errorhint := '';
                                v_aanduiding := 'Geen notificatie: KPI ICT Mitel is handmatig ingesteld' ;
                                fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);

                            END IF;
                        ELSE
                            -- Code ROOD voor KPI ICT MITEL
                            -- Mailen naar KPI + EVM, en SMS-en naar KPI en EVM

                            -- Maar ALLEEN indien er GEEN handmatige OVERRULE kleur is ingesteld

                            IF rec_kpi_ict_mitel.kpi_color_overrule IS NULL
                            THEN
                                -- Vanuit Mitel, dus geen handmatige ingestelde kleur hier...

                                -- Eerst maar DIRECT de overrule instellen, dan hebbe we die gehad.
                                -- RAI wil graag in geval van ROOD dat die op ROOD blijft, ook al vertelt MITEL dat de wachttijd alweer oplaag is
                                -- Dat heeft te maken met ALGEMEN aankondiging, en daardoor afname van telefoonwachtrij, terwijl het ICT probleem niet is opgelost.
                                -- MB vind dit een kronkel: is eigenlijkj een andere KPI. Maar RAI wil zo, dus geschiedde het...

                                -- kd.ins_kenmerk_key = 41 is de key van kenmerk Overrule Kleur bij telefooncentrale
                                DELETE FROM ins_kenmerkdeel kd
                                WHERE kd.ins_deel_key = rec_kpi_ict_mitel.ins_deel_key AND kd.ins_kenmerk_key = 41;

                                INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
                                SELECT rec_kpi_ict_mitel.ins_deel_key , 41,
                                (SELECT fac_usrdata_key FROM fac_usrdata WHERE fac_usrdata_code = 'KPI_ROOD' and fac_usrdata_verwijder IS NULL) FROM DUAL;


                                v_errorhint := 'Alarm ROOD: Gemiddelde wachttijd ICT Telefooncentrale: '  ||  rec_kpi_ict_mitel.ins_kenmerkdeel_waarde || ' seconden.';
                                v_errormsg := '';


                                -- 1.Eerst mailen naar alle KPI-eigenaren / betrokkenen
                                FOR rec_kpi_noti IN c_kpi_ict_notify_mail_kpi
                                LOOP
                                    BEGIN
                                        -- Mailen
                                        fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                        -- Loggen
                                        v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                        fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                        COMMIT;
                                    END;
                                END LOOP;

                                -- 2. Dan mailen naar alle eventmanagers
                                FOR rec_kpi_noti IN c_kpi_ict_notify_mail_evm
                                LOOP
                                    BEGIN
                                        -- Mailen
                                        fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                        -- Loggen
                                        v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                        fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                        COMMIT;
                                    END;
                                END LOOP;

                                -- 3.Eerst sms-en naar alle KPI-eigenaren / betrokkenen
                                FOR rec_kpi_noti IN c_kpi_ict_notify_sms_kpi
                                LOOP
                                    BEGIN
                                        -- SMS-en
                                        fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                        -- Loggen
                                        v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                        fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                        COMMIT;
                                    END;
                                END LOOP;

                                -- 4. Dan mailen naar alle eventmanagers
                                FOR rec_kpi_noti IN c_kpi_ict_notify_sms_evm
                                LOOP
                                    BEGIN
                                        -- SMS-en
                                        fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                        -- Loggen
                                        v_aanduiding := 'Bestemd voor ' || rec_kpi_noti.fac_usrdata_omschr ;
                                        fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
                                        COMMIT;
                                    END;
                                END LOOP;

                             ELSE
                                -- De KPI KLEUR is handmatig (danwel door de 1e ROOD via MITEL) ingesteld, en OVERRULED het systeem MITEL en dus ook GEEN notifificaties...
                                v_errormsg := '';
                                v_errorhint := '';
                                v_aanduiding := 'Geen notificatie: KPI ICT Mitel is handmatig ingesteld' ;
                                fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);

                            END IF;

                        END IF;

                    END IF;

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


                END;
            END LOOP;
        ELSE
            -- De sysdate ligt buiten de openingstijd en sluitingstijd van de KPI, dus GEEN notificeren...
            v_errormsg := '';
            v_errorhint := '';
            v_aanduiding := 'Geen notificatie: tijd ligt buiten de KPI tijden' ;
            fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
        END IF;

    -- Deze loop is precies 1 record (feitelijk een if-statement)
    END LOOP;

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


END arai_notify_kpi_ict_mitel;
/



CREATE OR REPLACE PROCEDURE arai_import_kpi_ict_mitel (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;
   -- De importvelden:

   v_wachtrij_id                   VARCHAR2 (256);
   v_aantal_wachtenden             VARCHAR2 (256);
   v_aantal_agents                 VARCHAR2 (256);
   -- Gemiddelde wachttijd in seconden
   v_gemiddelde_wachttijd          VARCHAR2 (256);


   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM arai_imp_kpi_ict_mitel;

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         -- Lees alle veldwaarden


         -- Wachtrij-ID, aantal wachtenden, aantal agents en gemiddelde-wachttijd van de telefooncentrale
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_wachtrij_id);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_aantal_wachtenden);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 3, v_aantal_agents);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 4, v_gemiddelde_wachttijd);


         --
         v_aanduiding :=
               '['
            || v_wachtrij_id
            || '|'
            || v_aantal_wachtenden
            || '|'
            || v_aantal_agents
               || '|'
            || v_gemiddelde_wachttijd
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_wachtrij_id) = 'WACHTRIJ_ID'
               AND UPPER (v_aantal_wachtenden) = 'AANTAL_WACHTENDEN'
               AND UPPER (v_aantal_agents) = 'AANTAL_AGENTS'
               AND UPPER (v_gemiddelde_wachttijd) = 'GEMIDDELDE_WACHTTIJD'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden

            --
            v_errorhint := 'Ongeldige objectnaam / installatiecode';
            v_wachtrij_id := TRIM (v_wachtrij_id);

            IF (v_wachtrij_id IS NOT NULL)
            THEN
                IF LENGTH (v_wachtrij_id) > 60
                THEN
                    v_wachtrij_id := SUBSTR (v_wachtrij_id, 1, 60);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Objectnaam te lang', 'Objectnaam wordt afgebroken tot [' || v_wachtrij_id || ']' );
                END IF;
            ELSE
                fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Objectnaam niet gevuld', 'Objectnaam is verplicht');
                v_ongeldig := 1;
            END IF;

            v_errorhint := 'Ongeldige meetwaarde';
            v_aantal_wachtenden := TRIM (v_aantal_wachtenden);

            IF (v_aantal_wachtenden IS NOT NULL)
            THEN
                IF LENGTH (v_aantal_wachtenden) > 10
                THEN
                    v_aantal_wachtenden := SUBSTR (v_aantal_wachtenden, 1, 10);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Aantal wachtenden te lang', 'Aantal wachtenden wordt afgebroken tot [' || v_aantal_wachtenden || ']' );
                END IF;
            ELSE
                --Is wel geldig, maar wel ff loggen...
                fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Aantal wachtenden niet gevuld', 'Aantal wachtenden wordt niet gergeistreerd');
                -- v_ongeldig := 1;
            END IF;

            v_errorhint := 'Aantal agents ongeldig';
            v_aantal_agents := TRIM (v_aantal_agents);
            IF (v_aantal_agents IS NOT NULL)
            THEN
                IF LENGTH (v_aantal_agents) > 10
                THEN
                    v_aantal_agents := SUBSTR (v_aantal_agents, 1, 10);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'OPC label te lang', 'Label wordt afgebroken tot [' || v_aantal_agents || ']' );
                END IF;
            ELSE
                --Is wel geldig, maar wel ff loggen...
                fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Aantal agents is niet gevuld', 'Aantal agents wordt niet geregistreerd');
                -- v_ongeldig := 1;
            END IF;

            v_errorhint := 'Ongeldige (gemiddelde) wachttijd';
            v_gemiddelde_wachttijd := TRIM (v_gemiddelde_wachttijd);

            IF (v_gemiddelde_wachttijd IS NOT NULL)
            THEN
                IF LENGTH (v_gemiddelde_wachttijd) > 10
                THEN
                    v_gemiddelde_wachttijd := SUBSTR (v_gemiddelde_wachttijd, 1, 10);
                    fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Wachttijd te lang', 'Wachttijd wordt afgebroken tot [' || v_gemiddelde_wachttijd || ']' );
                END IF;
            ELSE
                fac.imp_writelog (p_import_key, 'W', v_aanduiding || 'Gemiddelde wachttijd is niet gevuld', 'Gemiddelde wachttijd is verplicht');
                v_ongeldig := 1;
            END IF;


            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errorhint :=
                      'Fout bij toevoegen regel aan importtabel arai_imp_kpi_ict_mitel';

                  INSERT INTO arai_imp_kpi_ict_mitel (wachtrij_id,aantal_wachtenden,aantal_agents, gemiddelde_wachttijd)
                  VALUES (v_wachtrij_id,v_aantal_wachtenden,v_aantal_agents, v_gemiddelde_wachttijd);

                  COMMIT;
                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog
                             (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Ingelezen regel kan niet worden weggeschreven!'
                             );
                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'KPI: aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
   END IF;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      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',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;
END arai_import_kpi_ict_mitel;
/




CREATE OR REPLACE PROCEDURE arai_update_kpi_ict_mitel (
   p_import_key IN NUMBER
)
IS

    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);

    c_ins_srtgroep_key_mitel  NUMBER (10)    := 41;
    c_ins_kenmerk_key_mitel   NUMBER (10)    := 21;

    v_ins_deel_key           NUMBER (10);


    -- Alle kpi_wachtijen van Mitel telefooncentrale
    CURSOR c_kpi_ict_mitel
    IS
        SELECT *
        FROM arai_imp_kpi_ict_mitel k;
        -- WHERE k.ins_deel_omschrijving like '%TT%';
        -- AND k.ins_deel_opclabel like '%MET%';

    BEGIN
    v_count_tot := 0;
    v_count_error := 0;


    v_aanduiding := '';


    -- Alle kpi-wachtrijen verwerken...
    FOR rec_kpi_ict_mitel IN c_kpi_ict_mitel
    LOOP
        BEGIN
            v_count_tot := v_count_tot + 1;

            v_errorhint := 'Fout bij bepalen object [' || rec_kpi_ict_mitel.wachtrij_id || ']';

            -- NB sd.ins_srtgroep_key = 41 is de groep van allemaal telefooncentrale-wachtrij-objecten;
            -- Let op: binnen de srtgroep moet de naam/code/id  van het wachtrij-object wel UNIEK zijn!!!
            SELECT d.ins_deel_key
              INTO v_ins_deel_key
              FROM ins_deel d, ins_srtdeel sd
             WHERE d.ins_deel_verwijder IS NULL
               AND UPPER (d.ins_deel_omschrijving) = UPPER (rec_kpi_ict_mitel.wachtrij_id)
               AND d.ins_srtdeel_key = sd.ins_srtdeel_key
               AND sd.ins_srtgroep_key = c_ins_srtgroep_key_mitel;

            -- Max 1 record wordt bijgewerkt, namelijk het kenmerk wachtrij van het betreffende object wordt functioneel verwijderd.
            UPDATE ins_kenmerkdeel
            SET ins_kenmerkdeel_verwijder = SYSDATE
            WHERE ins_kenmerk_key = c_ins_kenmerk_key_mitel
            AND ins_deel_key = v_ins_deel_key
            AND ins_kenmerkdeel_verwijder IS NULL;

            v_errorhint := 'Fout bij toevoegen wachtrij bij object [' || rec_kpi_ict_mitel.wachtrij_id || ']';
            INSERT INTO ins_kenmerkdeel (ins_deel_key, ins_kenmerk_key, ins_kenmerkdeel_waarde)
            SELECT v_ins_deel_key, c_ins_kenmerk_key_mitel, rec_kpi_ict_mitel.gemiddelde_wachttijd FROM DUAL;

            COMMIT;

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

    -- Als alle wachtrijen zijn verwerkt, dan checken of er een wachtrij buiten de grenzen valt.


    fac.imp_writelog (p_import_key,
                    'S',
                       'KPI: verwerkte regels zonder foutmelding: '
                    || TO_CHAR (v_count_tot - v_count_error),
                    ''
                   );
    fac.imp_writelog (p_import_key,
                    'S',
                       'KPI: verwerkte regels met foutmelding: '
                    || TO_CHAR (v_count_error),
                    ''
                   );
    COMMIT;

    -- Tenslotte nog de notificaties uitsturen, als STAART van de import.
    arai_notify_kpi_ict_mitel(p_import_key);

END arai_update_kpi_ict_mitel;
/


-- Om het HALVE uur de resultaten van het voorgaande halve uur verzamelen, optellen volgens formule en daarop notifceren.
CREATE OR REPLACE PROCEDURE arai_export_kpi_toilet_noti (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
IS
    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errorhint2              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);

CURSOR c_kpi_toilet_notify_mail_kpi
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'KPI_SCHONETOILETTEN_MAIL%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;


    CURSOR c_kpi_toilet_notify_mail_evm
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'EVM_MAIL%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;


    CURSOR c_kpi_toilet_notify_sms_kpi
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'KPI_SCHONETOILETTEN_SMS%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;

    CURSOR c_kpi_toilet_notify_sms_evm
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'EVM_SMS%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;


    CURSOR c_toilet_gebouw
    IS
        SELECT  alg_gebouw_key, alg_gebouw_code, alg_gebouw_naam, goed, kpi_status
        FROM arai_v_kpi_toilet_scan_gebouw;

    -- Alleen notificeren gedurende de "openingsdatums" en "openingstijden" van de KPI.
    -- Openingsdatums worden bepaald door settings KPI_ALL_DATUM1 en KPI_ALL_DATUM2 (b.v. 06-09-2012 en 11-09-2012)
    -- Indien deze niet in tabel staan, dan zijn de openingsdatums oneindig (levert altijd OKEE op).
    -- Openingstijden worden bepaald door settings KPI_ICT_MITEL_TIME1 en KPI_ICT_MITEL_TIME2 (b.v. 08:00 en 17:00)
    -- Indien deze niet in tabel staan, dan zijn de openingstijden van 0:00 t/m 23:59 (24 uurs)

    CURSOR c_kpi_notify_during_opening
    IS
        SELECT
            COALESCE(
                (SELECT
                    CASE WHEN TRUNC(to_date(ud.fac_usrdata_omschr,'DD-MM-YYYY')) <=  TRUNC(sysdate)
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_ALL_DATUM1'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) min_datum,
            COALESCE(
                (SELECT
                    CASE WHEN TRUNC(to_date(ud.fac_usrdata_omschr,'DD-MM-YYYY')) >=  TRUNC(sysdate)
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_ALL_DATUM2'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) max_datum,
            COALESCE(
                (SELECT
                    CASE WHEN to_date(to_char(sysdate,'DD-MM-YYYY') || ' ' || ud.fac_usrdata_omschr,'DD-MM-YYYY HH24:MI') <=  sysdate
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_SCHONETOILETTEN_TIME1'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) min_tijd,
            COALESCE(
                (SELECT
                    CASE WHEN to_date(to_char(sysdate,'DD-MM-YYYY') || ' ' || ud.fac_usrdata_omschr,'DD-MM-YYYY HH24:MI') >=  sysdate
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_SCHONETOILETTEN_TIME2'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) max_tijd
        FROM DUAL;


BEGIN
    FOR rec_open IN c_kpi_notify_during_opening
    LOOP
    -- Deze loop is precies 1 record (feitelijk een if-statement)

        IF rec_open.min_datum = 1 AND rec_open.max_datum = 1 AND rec_open.min_tijd = 1 AND rec_open.max_tijd = 1
        THEN
            -- De sysdate ligt tussen zowel de openingstijd als sluitingstijd van de KPI, dus we kunnen gaan notificeren...

            FOR rec_kpi_toilet IN c_toilet_gebouw

            LOOP
                BEGIN
                    -- Als ORANJE (1) of ROOD (2), dan notificeren, anders niet (uiteraard)
                    IF rec_kpi_toilet.kpi_status = 1 OR rec_kpi_toilet.kpi_status = 2
                    THEN

                        IF rec_kpi_toilet.kpi_status = 1
                        THEN
                            -- Code ORANJE voor KPI TOILET
                            -- Mailen naar KPI + EVM, en SMS-en naar KPI en EVM

                            v_errorhint := 'Alarm ORANJE: Toiletten in gebouw '  ||  rec_kpi_toilet.alg_gebouw_naam || ' is voor ' || rec_kpi_toilet.goed || ' % schoon.';
                            v_errormsg := '';


                            -- 1.Eerst mailen naar alle KPI-eigenaren / betrokkenen
                            FOR rec_kpi_noti IN c_kpi_toilet_notify_mail_kpi
                            LOOP
                                BEGIN
                                    -- Mailen
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                            -- 2. Dan mailen naar alle eventmanagers
                            FOR rec_kpi_noti IN c_kpi_toilet_notify_mail_evm
                            LOOP
                                BEGIN
                                    -- Mailen
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                            -- 3.Eerst sms-en naar alle KPI-eigenaren / betrokkenen
                            FOR rec_kpi_noti IN c_kpi_toilet_notify_sms_kpi
                            LOOP
                                BEGIN
                                    -- SMS-en
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                            -- 4. Dan mailen naar alle eventmanagers
                            FOR rec_kpi_noti IN c_kpi_toilet_notify_sms_evm
                            LOOP
                                BEGIN
                                    -- SMS-en
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                    COMMIT;
                                END;
                            END LOOP;
                        ELSE
                            -- Code ROOD voor KPI TOILET
                            -- Mailen naar KPI + EVM, en SMS-en naar KPI en EVM

                            v_errorhint := 'Alarm ROOD: Toiletten in gebouw '  ||  rec_kpi_toilet.alg_gebouw_naam || ' is voor ' || rec_kpi_toilet.goed || ' % schoon.';
                            v_errormsg := '';


                            -- 1.Eerst mailen naar alle KPI-eigenaren / betrokkenen
                            FOR rec_kpi_noti IN c_kpi_toilet_notify_mail_kpi
                            LOOP
                                BEGIN
                                    -- Mailen
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                            -- 2. Dan mailen naar alle eventmanagers
                            FOR rec_kpi_noti IN c_kpi_toilet_notify_mail_evm
                            LOOP
                                BEGIN
                                    -- Mailen
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                            -- 3.Eerst sms-en naar alle KPI-eigenaren / betrokkenen
                            FOR rec_kpi_noti IN c_kpi_toilet_notify_sms_kpi
                            LOOP
                                BEGIN
                                    -- SMS-en
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                            -- 4. Dan mailen naar alle eventmanagers
                            FOR rec_kpi_noti IN c_kpi_toilet_notify_sms_evm
                            LOOP
                                BEGIN
                                    -- SMS-en
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                        END IF;

                    END IF;

                    EXCEPTION
                    WHEN OTHERS
                        THEN
                           v_count_error := v_count_error + 1;
                           oracle_err_num := SQLCODE;
                           oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                           v_errormsg :=
                                 'OTHERS (error '
                              || oracle_err_num
                              || '/'
                              || oracle_err_mes
                              || ')';
                           COMMIT;


                END;
            END LOOP;
        --ELSE
            -- De sysdate ligt buiten de openingstijd en sluitingstijd van de KPI, dus GEEN notificeren...
            --v_errormsg := '';
            --v_errorhint := '';
            --v_aanduiding := 'Geen notificatie: tijd ligt buiten de KPI tijden' ;
            --fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
        END IF;

    -- Deze loop is precies 1 record (feitelijk een if-statement)
    END LOOP;
    COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
           'OTHERS (arai_export_kpi_toilet_noti error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      COMMIT;

END arai_export_kpi_toilet_noti;
/




-- Om het HALVE uur de resultaten van het voorgaande halve uur verzamelen, optellen volgens formule en daarop notifceren.
CREATE OR REPLACE PROCEDURE arai_export_kpi_schoonstd_noti (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
IS
    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errorhint2              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);

CURSOR c_kpi_notify_mail_kpi
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'KPI_SCHONESTANDS_MAIL%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;


    CURSOR c_kpi_notify_mail_evm
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'EVM_MAIL%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;


    CURSOR c_kpi_notify_sms_kpi
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'KPI_SCHONESTANDS_SMS%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;

    CURSOR c_kpi_notify_sms_evm
    IS
        SELECT fac_usrdata_omschr
        FROM fac_usrdata
        WHERE fac_usrtab_key = 21
        AND fac_usrdata_code like 'EVM_SMS%'
        AND fac_usrdata_verwijder IS NULL
        AND fac_usrdata_volgnr = 1;


    CURSOR c_kpi_schonestand
    IS
        SELECT  FCLT_XAS_TIJD, goed, fout, KPI_STATUS
        FROM arai_v_rap_kpi_standschoon;

    -- Alleen notificeren gedurende de "openingsdatums" en "openingstijden" van de KPI.
    -- Openingsdatums worden bepaald door settings KPI_ALL_DATUM1 en KPI_ALL_DATUM2 (b.v. 06-09-2012 en 11-09-2012)
    -- Indien deze niet in tabel staan, dan zijn de openingsdatums oneindig (levert altijd OKEE op).
    -- Openingstijden worden bepaald door settings KPI_ICT_MITEL_TIME1 en KPI_ICT_MITEL_TIME2 (b.v. 08:00 en 17:00)
    -- Indien deze niet in tabel staan, dan zijn de openingstijden van 0:00 t/m 23:59 (24 uurs)

    CURSOR c_kpi_notify_during_opening
    IS
        SELECT
            COALESCE(
                (SELECT
                    CASE WHEN TRUNC(to_date(ud.fac_usrdata_omschr,'DD-MM-YYYY')) <=  TRUNC(sysdate)
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_ALL_DATUM1'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) min_datum,
            COALESCE(
                (SELECT
                    CASE WHEN TRUNC(to_date(ud.fac_usrdata_omschr,'DD-MM-YYYY')) >=  TRUNC(sysdate)
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_ALL_DATUM2'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) max_datum,
            COALESCE(
                (SELECT
                    CASE WHEN to_date(to_char(sysdate,'DD-MM-YYYY') || ' ' || ud.fac_usrdata_omschr,'DD-MM-YYYY HH24:MI') <=  sysdate
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_SCHONESTANDS_TIME1'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) min_tijd,
            COALESCE(
                (SELECT
                    CASE WHEN to_date(to_char(sysdate,'DD-MM-YYYY') || ' ' || ud.fac_usrdata_omschr,'DD-MM-YYYY HH24:MI') >=  sysdate
                            THEN 1
                            ELSE 0
                    END
                    FROM fac_usrdata ud
                    WHERE ud.fac_usrtab_key = 21
                    AND ud.fac_usrdata_code = 'KPI_SCHONESTANDS_TIME2'
                    AND ud.fac_usrdata_verwijder IS NULL
                ), 1) max_tijd
        FROM DUAL;


BEGIN
    FOR rec_open IN c_kpi_notify_during_opening
    LOOP
    -- Deze loop is precies 1 record (feitelijk een if-statement)

        IF rec_open.min_datum = 1 AND rec_open.max_datum = 1 AND rec_open.min_tijd = 1 AND rec_open.max_tijd = 1
        THEN
            -- De sysdate ligt tussen zowel de openingstijd als sluitingstijd van de KPI, dus we kunnen gaan notificeren...

            FOR rec_kpi IN c_kpi_schonestand

            LOOP
                BEGIN
                    -- Als ORANJE (1) of ROOD (2), dan notificeren, anders niet (uiteraard)
                    IF rec_kpi.kpi_status = 1 OR rec_kpi.kpi_status = 2
                    THEN

                        IF rec_kpi.kpi_status = 1
                        THEN
                            -- Code ORANJE
                            -- Mailen naar KPI + EVM, en SMS-en naar KPI en EVM

                            v_errorhint := 'Alarm ORANJE: Klachten over standschoonmaak. KPI percentage: ' || rec_kpi.goed || ' %';
                            v_errormsg := '';


                            -- 1.Eerst mailen naar alle KPI-eigenaren / betrokkenen
                            FOR rec_kpi_noti IN c_kpi_notify_mail_kpi
                            LOOP
                                BEGIN
                                    -- Mailen
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                            -- 2. Dan mailen naar alle eventmanagers
                            FOR rec_kpi_noti IN c_kpi_notify_mail_evm
                            LOOP
                                BEGIN
                                    -- Mailen
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                            -- 3.Eerst sms-en naar alle KPI-eigenaren / betrokkenen
                            FOR rec_kpi_noti IN c_kpi_notify_sms_kpi
                            LOOP
                                BEGIN
                                    -- SMS-en
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                            -- 4. Dan mailen naar alle eventmanagers
                            FOR rec_kpi_noti IN c_kpi_notify_sms_evm
                            LOOP
                                BEGIN
                                    -- SMS-en
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                    COMMIT;
                                END;
                            END LOOP;
                        ELSE
                            -- Code ROOD voor KPI
                            -- Mailen naar KPI + EVM, en SMS-en naar KPI en EVM

                            v_errorhint := 'Alarm ROOD: Klachten over standschoonmaak. KPI percentage: ' || rec_kpi.goed || ' %';
                            v_errormsg := '';


                            -- 1.Eerst mailen naar alle KPI-eigenaren / betrokkenen
                            FOR rec_kpi_noti IN c_kpi_notify_mail_kpi
                            LOOP
                                BEGIN
                                    -- Mailen
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                            -- 2. Dan mailen naar alle eventmanagers
                            FOR rec_kpi_noti IN c_kpi_notify_mail_evm
                            LOOP
                                BEGIN
                                    -- Mailen
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_kpi_noti.fac_usrdata_omschr, NULL, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                            -- 3.Eerst sms-en naar alle KPI-eigenaren / betrokkenen
                            FOR rec_kpi_noti IN c_kpi_notify_sms_kpi
                            LOOP
                                BEGIN
                                    -- SMS-en
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                            -- 4. Dan mailen naar alle eventmanagers
                            FOR rec_kpi_noti IN c_kpi_notify_sms_evm
                            LOOP
                                BEGIN
                                    -- SMS-en
                                    fac.putnotificationprio (NULL, NULL, v_errorhint, 4, NULL, rec_kpi_noti.fac_usrdata_omschr, 2);
                                    COMMIT;
                                END;
                            END LOOP;

                        END IF;

                    END IF;

                    EXCEPTION
                    WHEN OTHERS
                        THEN
                           v_count_error := v_count_error + 1;
                           oracle_err_num := SQLCODE;
                           oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                           v_errormsg :=
                                 'OTHERS (error '
                              || oracle_err_num
                              || '/'
                              || oracle_err_mes
                              || ')';
                           COMMIT;


                END;
            END LOOP;
        --ELSE
            -- De sysdate ligt buiten de openingstijd en sluitingstijd van de KPI, dus GEEN notificeren...
            --v_errormsg := '';
            --v_errorhint := '';
            --v_aanduiding := 'Geen notificatie: tijd ligt buiten de KPI tijden' ;
            --fac.imp_writelog (p_import_key, 'I',  v_aanduiding || v_errormsg, v_errorhint);
        END IF;

    -- Deze loop is precies 1 record (feitelijk een if-statement)
    END LOOP;
    COMMIT;

EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
           'OTHERS (arai_export_kpi_schoonstd_noti error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      COMMIT;
END arai_export_kpi_schoonstd_noti;
/




-- EXPOSANTEN NOTIFICATIE van klachten

-- Om de 5 minuten de nieuwe meldingen en meldingen die zijn afgemeld van de voorgaande 5 minuten verzamelen en notificeren.
-- De exposanten/klachtindiener krijgt van een nieuwe melding een registratiemail en van een opgeloste klacht feedback.

CREATE OR REPLACE PROCEDURE arai_export_klacht_noti (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
IS
    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errorhint2              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);
    v_tracking               VARCHAR2 (1000);

    -- Nieuwe klachten sinds de laatste keer dat er cust01 of cust02 notificatie is getracked, van ins_srtdiscipline_key = 1 is vakgroeptype 'Klachten exposanten'

    CURSOR c_klacht_new
    IS
        SELECT m.mld_melding_key, km1.mld_kenmerkmelding_waarde exposant_mailadres, REPLACE(REPLACE(km2.mld_kenmerkmelding_waarde ,' ',''),'-','') exposant_telefoon
        FROM  mld_melding m, mld_stdmelding std, ins_tab_discipline d, ins_srtdiscipline sd,
              fac_tracking t, fac_srtnotificatie sn,
              mld_kenmerkmelding km1, mld_kenmerkmelding km2
        WHERE m.mld_melding_key = km1.mld_melding_key (+)
        AND   km1.mld_kenmerk_key (+) = 46
        AND   m.mld_melding_key = km2.mld_melding_key (+)
        AND   km2.mld_kenmerk_key (+) = 45
        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   sd.ins_srtdiscipline_key = 1
        AND   m.mld_melding_key = t.fac_tracking_refkey
        AND   t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
        AND   sn.fac_srtnotificatie_code = 'MLDNEW'
        AND   t.fac_tracking_datum > (  SELECT COALESCE(MAX(FAC_TRACKING_DATUM), SYSDATE - 1)
                                        FROM  fac_tracking t, fac_srtnotificatie sn
                                        WHERE t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                                        AND   sn.fac_srtnotificatie_code IN ( 'CUST01',  'CUST02')
                                      );

 -- AND   t.fac_tracking_datum >= SYSDATE - 1/24/12; Eerder was het sinds de laatste 5 minuten, hierboven verbeterd met sinds laatste notifictaie.


    -- Afgemelde klachten van afgelopen 5 minuten: ins_srtdiscipline_key = 1 is vakgroeptype 'Klachten exposanten'
    CURSOR c_klacht_afgemeld
    IS
        SELECT m.mld_melding_key, km1.mld_kenmerkmelding_waarde exposant_mailadres, REPLACE(REPLACE(km2.mld_kenmerkmelding_waarde ,' ',''),'-','') exposant_telefoon
        FROM  mld_melding m, mld_stdmelding std, ins_tab_discipline d, ins_srtdiscipline sd,
              fac_tracking t, fac_srtnotificatie sn,
              mld_kenmerkmelding km1, mld_kenmerkmelding km2
        WHERE m.mld_melding_key = km1.mld_melding_key (+)
        AND   km1.mld_kenmerk_key (+) = 46
        AND   m.mld_melding_key = km2.mld_melding_key (+)
        AND   km2.mld_kenmerk_key (+) = 45
        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   sd.ins_srtdiscipline_key = 1
        AND   m.mld_melding_key = t.fac_tracking_refkey
        AND   t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
        AND   sn.fac_srtnotificatie_code = 'MLDAFM'
        AND   t.fac_tracking_datum > (  SELECT COALESCE(MAX(FAC_TRACKING_DATUM), SYSDATE - 1)
                                        FROM  fac_tracking t, fac_srtnotificatie sn
                                        WHERE t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                                        AND   sn.fac_srtnotificatie_code IN ( 'CUST01',  'CUST02')
                                      );

-- AND   t.fac_tracking_datum >= SYSDATE - 1/24/12; Eerder was het sinds de laatste 5 minuten, hierboven verbeterd met sinds laatste notifictaie.

BEGIN
    FOR rec_klacht IN c_klacht_new
    LOOP
        BEGIN
            -- Mailen van nieuwe klacht naar de expostant via CUST01, eventueel ook SMS indien 06nummer via CUST02.
            v_errorhint := 'Uw melding '  ||  rec_klacht.mld_melding_key || ' is geregistreerd ';
            v_errormsg := '';

            IF (rec_klacht.exposant_mailadres IS NOT NULL AND INSTR(rec_klacht.exposant_mailadres,'@') > 0)
            THEN
                -- CUST01 = 'Uw melding ##KEY## is geregistereerd' wordt naar exposant gemaild
                fac.putnotificationsrtprio ( NULL, NULL, 'CUST01', rec_klacht.mld_melding_key, 'Your call ##KEY## is registered', NULL, rec_klacht.exposant_mailadres, NULL, NULL, 2, NULL);

                v_tracking := 'Mail naar exposant ' || rec_klacht.exposant_mailadres || ': ' || v_errorhint;
                fac.trackaction ('CUST01', rec_klacht.mld_melding_key, NULL, NULL, v_tracking);

                COMMIT;
            END IF;

            -- SMS versturen doen we (nog) NIET!
            IF 0 = 1
            THEN
                IF (rec_klacht.exposant_telefoon IS NOT NULL AND SUBSTR(rec_klacht.exposant_telefoon, 1,2) = '06')
                THEN
                    -- Het is een mobiel nummer, stuur een SMS

                    -- CUST02 = 'Uw melding ##KEY## is geregistereerd' wordt naar exposant ge-SMSt
                    -- Via de meldingstatus wordt in XSL de tekst bepaald
                    fac.putnotificationsrtprio ( NULL, NULL, 'CUST02', rec_klacht.mld_melding_key, 'Your call ##KEY## is registered', NULL, NULL, rec_klacht.exposant_telefoon, NULL, 2, NULL);

                    v_tracking := 'SMS naar exposant ' || rec_klacht.exposant_telefoon || ': ' || v_errorhint;
                    fac.trackaction ('CUST01', rec_klacht.mld_melding_key, NULL, NULL, v_tracking);

                    COMMIT;
                END IF;
             END IF;


        EXCEPTION
        WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               COMMIT;


        END;
    END LOOP;


    -- Mails en SMS versturen voor afgemelde klachten doen we (nog) NIET!
    IF 0 = 1
    THEN
        FOR rec_klacht IN c_klacht_afgemeld
        LOOP
            BEGIN
                -- Mailen van nieuwe klacht naar de expostant via CUST01, eventueel ook SMS indien 06nummer via CUST02.
                v_errorhint := 'Uw melding '  ||  rec_klacht.mld_melding_key || ' is afgehandeld. ';
                v_errormsg := '';

                IF (rec_klacht.exposant_mailadres IS NOT NULL AND INSTR(rec_klacht.exposant_mailadres,'@') > 0)
                THEN
                    -- CUST01 = 'Uw melding ##KEY## is afgehandeld' wordt naar exposant gemaild
                    fac.putnotificationsrtprio ( NULL, NULL, 'CUST01', rec_klacht.mld_melding_key, 'Your call ##KEY## is signed off', NULL, rec_klacht.exposant_mailadres, NULL, NULL, 2, NULL);

                    v_tracking := 'Mail naar exposant ' || rec_klacht.exposant_mailadres || ': ' || v_errorhint;
                    fac.trackaction ('CUST02', rec_klacht.mld_melding_key, NULL, NULL, v_tracking);

                    COMMIT;
                END IF;

                -- SMS versturen doen we (nog) NIET!
                IF 0 = 1
                THEN
                    IF (rec_klacht.exposant_telefoon IS NOT NULL AND SUBSTR(rec_klacht.exposant_telefoon, 1,2) = '06')
                    THEN
                        -- Het is een mobiel nummer, stuur een SMS

                        -- CUST02 = 'Uw melding ##KEY## is afgehandeld' wordt naar exposant ge-SMSt
                        -- Via de meldingstatus wordt in XSL de tekst bepaald.
                        fac.putnotificationsrtprio ( NULL, NULL, 'CUST02', rec_klacht.mld_melding_key, 'Your call ##KEY## is signed off', NULL, NULL, rec_klacht.exposant_telefoon, NULL, 2, NULL);

                        v_tracking := 'SMS naar exposant ' || rec_klacht.exposant_mailadres || ': ' || v_errorhint;
                        fac.trackaction ('CUST02', rec_klacht.mld_melding_key, NULL, NULL, v_tracking);

                        COMMIT;
                    END IF;
                END IF;

            EXCEPTION
            WHEN OTHERS
                THEN
                   v_count_error := v_count_error + 1;
                   oracle_err_num := SQLCODE;
                   oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                   v_errormsg :=
                         'OTHERS (error '
                      || oracle_err_num
                      || '/'
                      || oracle_err_mes
                      || ')';
                   COMMIT;


            END;
        END LOOP;
    END IF;

    -- Aangezien alles in het Engels-talig moet worden verstuurd, (en dat dit niet bij de klacht of via een instelling taalafhankelijk is) hierbij ff hard op Engels (EN).
    -- Dit zijn de notificaties van het type CUST01 (mail, niewe melding en afgemelde melding) en CUST02 (sms, nieuwe melding en afgemelde melding)
    UPDATE fac_notificatie n
    SET n.fac_notificatie_lang = 'EN'
    WHERE n.fac_srtnotificatie_key IN (SELECT  sn.fac_srtnotificatie_key FROM fac_srtnotificatie sn
                                       WHERE  sn.fac_srtnotificatie_code IN ( 'CUST01',  'CUST02'));

    COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
           'OTHERS (arai_export_kpi_schoonstd_noti error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      COMMIT;

END arai_export_klacht_noti;
/

-- INVOERDER/BALIE krijgen NOTIFICATIE van klachten DIE binnen 10 minuten afgerond moeten zijn!
-- Om de 5 minuten de meldingen die NOG niet zijn afgemeld maar binnen 5 to 10 minuten dat wel zouden moeten verzamelen en notificeren.
-- De invoerder (baliemedewerker) krijgt van deze klacht die op aflopen staat signaleringsmail.

CREATE OR REPLACE PROCEDURE arai_export_klacht_5min_klaar (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
IS
    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errorhint2              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);
    v_count_tot              NUMBER (10);
    v_count_error            NUMBER (10);
    v_count                  NUMBER (10);
    v_tracking               VARCHAR2 (1000);


    -- Klachten die op over 5-10 minuten afgerond/gereed moeten worden gemeld, notificeren naar mailadres de MELDER (BALIE, FRONTOFFICE)
    -- Hierbij voorkomen
    CURSOR c_klacht_5min
    IS
    SELECT fclt_f_meldingnr, fclt_f_leverancier, invoerder_email from arai_v_rap_mld_klachten
    WHERE fclt_key = 1
    AND sysdate >= operationele_einddatum - (10 / (24*60))
    AND sysdate <= operationele_einddatum - (5 / (24*60));


BEGIN
    FOR rec_klacht IN c_klacht_5min
    LOOP
        BEGIN
            v_errorhint := 'Oplostijd van klacht ' || rec_klacht.fclt_f_meldingnr || ' (leverancier ' || rec_klacht.fclt_f_leverancier || ' ) is met +- 5 minuten verstreken.';
            v_errormsg := '';
            -- Mailen naar het mailadres van degene die de klacht heetft ingevoerd (BALIE-medewerker/FrontOffice)

            IF rec_klacht.invoerder_email IS NOT NULL
            THEN
                fac.putnotificationprio (NULL, NULL, v_errorhint, 2, rec_klacht.invoerder_email, NULL, 2);
            END IF;

            COMMIT;
        EXCEPTION
        WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               COMMIT;

        END;
    END LOOP;
    COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      COMMIT;
END arai_export_klacht_5min_klaar;
/





----------------------------------------------------------------------------------------------------------------------------------------------------------
--- ** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **  --
--- ** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **  --
--- ** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **** TEMP **  --
----------------------------------------------------------------------------------------------------------------------------------------------------------



CREATE OR REPLACE PROCEDURE arai_post_import_energie (p_import_key IN NUMBER)
IS
    v_aanduiding             VARCHAR2 (200);
    v_errorhint              VARCHAR2 (1000);
    v_errormsg               VARCHAR2 (1000);
    oracle_err_num           NUMBER;
    oracle_err_mes           VARCHAR2 (200);

    CURSOR c1
      IS
           SELECT   UPPER (ins_discipline_omschrijving) ins_discipline_upper,
                    UPPER (ins_srtgroep_omschrijving) ins_srtgroep_upper,
                    UPPER (ins_srtdeel_code) ins_srtdeel_code_upper,
                    UPPER (ins_srtdeel_omschrijving) ins_srtdeel_upper,
                    MAX (ins_discipline_omschrijving)
                       ins_discipline_omschrijving,
                    MAX (ins_srtgroep_omschrijving) ins_srtgroep_omschrijving,
                    MAX (ins_srtdeel_code) ins_srtdeel_code,
                    MAX (ins_srtdeel_omschrijving) ins_srtdeel_omschrijving,
                    MIN(res_deel_eenheid) res_deel_eenheid
             FROM   arai_imp_ins
         GROUP BY   UPPER (ins_discipline_omschrijving),
                    UPPER (ins_srtgroep_omschrijving),
                    UPPER (ins_srtdeel_code),
                    UPPER (ins_srtdeel_omschrijving);


      v_discipline_key   NUMBER (10);
      v_srtgroep_key     NUMBER (10);
      v_ins_srtdeel_key  NUMBER (10);
      ccount             NUMBER (10);
      v_count_tot        NUMBER (10);
      v_count_update     NUMBER (10);


      c_ins_kenmerk_key_opc_meting    NUMBER (10)    := 61;
      c_ins_kenmerk_key_opc_setpoint  NUMBER (10)    := 62;
      c_ins_kenmerk_key_opc_alarm     NUMBER (10)    := 63;

   BEGIN
      v_count_tot := 0;
      v_count_update := 0;

      FOR rec IN c1
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_errormsg := 'Post-Energie: Fout bij bepalen discipline';

            SELECT   ins_discipline_key
              INTO   v_discipline_key
              FROM   ins_tab_discipline
             WHERE   ins_discipline_verwijder IS NULL
                     AND ins_discipline_module = 'INS'
                     AND UPPER (TRIM (ins_discipline_omschrijving)) =
                           rec.ins_discipline_upper;

            v_errormsg := 'Post-Energie: Fout bij bepalen groepsoort';

            SELECT   ins_srtgroep_key
              INTO   v_srtgroep_key
              FROM   ins_srtgroep
             WHERE       ins_srtgroep_verwijder IS NULL
                     AND ins_srtgroep_module = 'INS'
                     AND ins_discipline_key = v_discipline_key
                     AND TRIM (ins_srtgroep_upper) = rec.ins_srtgroep_upper;

            v_errormsg :=
                  'Post-Energie: Fout bij bepalen objectsoort ['
               || rec.ins_srtdeel_omschrijving
               || ']';

            SELECT   ins_srtdeel_key
              INTO   v_ins_srtdeel_key
              FROM   ins_srtdeel
             WHERE       ins_srtdeel_verwijder IS NULL
                     AND ins_srtdeel_module = 'INS'
                     AND ins_srtgroep_key = v_srtgroep_key
                     AND TRIM (ins_srtdeel_upper) = rec.ins_srtdeel_upper;


            v_errormsg := 'Post-Energie: Fout bij insert srtkenmerk verbruik/meting - ' || rec.ins_srtdeel_upper;
            -- Verbruik soortkenmerk bij dat soort object
            INSERT INTO ins_srtkenmerk (ins_srtkenmerk_omschrijving, ins_srtkenmerk_dimensie, ins_srtkenmerk_kenmerktype, ins_srtkenmerk_lengte, ins_srtkenmerk_dec)
            SELECT rec.ins_srtdeel_upper || '-verbruik', rec.res_deel_eenheid, 'N', 10, 2 FROM DUAL;
            v_errormsg := 'Post-Energie: Fout bij insert kenmerk verbruik/meting - '|| rec.ins_srtdeel_upper;
            -- Met bijbehorende kenmerk bij dat soort object
            INSERT INTO ins_kenmerk (ins_srtkenmerk_key, ins_srtinstallatie_key, ins_kenmerk_niveau, ins_kenmerk_meetwaarde, ins_kenmerk_volgnummer, ins_kenmerk_locatiekolom)
            SELECT ins_srtkenmerk_key, v_ins_srtdeel_key, 'S', 1, 901, c_ins_kenmerk_key_opc_meting
            FROM ins_srtkenmerk
            WHERE ins_srtkenmerk_omschrijving = rec.ins_srtdeel_upper || '-verbruik'
            AND ins_srtkenmerk_kenmerktype = 'N'
            AND ins_srtkenmerk_verwijder IS NULL;

            v_errormsg := 'Post-Energie: Fout bij insert srtkenmerk setpoint - ' || rec.ins_srtdeel_upper;
            -- Setpoint soortkenmerk bij dat soort object
            INSERT INTO ins_srtkenmerk (ins_srtkenmerk_omschrijving, ins_srtkenmerk_dimensie, ins_srtkenmerk_kenmerktype, ins_srtkenmerk_lengte, ins_srtkenmerk_dec)
            SELECT rec.ins_srtdeel_upper || '-setpoint', rec.res_deel_eenheid, 'N', 10, 2 FROM DUAL;
            v_errormsg := 'Post-Energie: Fout bij insert kenmerk setpoint - '|| rec.ins_srtdeel_upper;
            -- Met bijbehorende kenmerk bij dat soort object
            INSERT INTO ins_kenmerk (ins_srtkenmerk_key, ins_srtinstallatie_key, ins_kenmerk_niveau, ins_kenmerk_meetwaarde, ins_kenmerk_volgnummer, ins_kenmerk_locatiekolom)
            SELECT ins_srtkenmerk_key, v_ins_srtdeel_key, 'S', 1, 902, c_ins_kenmerk_key_opc_setpoint
            FROM ins_srtkenmerk
            WHERE ins_srtkenmerk_omschrijving = rec.ins_srtdeel_upper || '-setpoint'
            AND ins_srtkenmerk_kenmerktype = 'N'
            AND ins_srtkenmerk_verwijder IS NULL;

            v_errormsg := 'Post-Energie: Fout bij insert srtkenmerk alarm - ' || rec.ins_srtdeel_upper;
            -- Alarm soortkenmerk bij dat soort object
            INSERT INTO ins_srtkenmerk (ins_srtkenmerk_omschrijving, ins_srtkenmerk_dimensie, ins_srtkenmerk_kenmerktype, ins_srtkenmerk_lengte, ins_srtkenmerk_dec)
            SELECT rec.ins_srtdeel_upper || '-alarm', rec.res_deel_eenheid, 'N', 2, 1 FROM DUAL;
            v_errormsg := 'Post-Energie: Fout bij insert kenmerk alarm - '|| rec.ins_srtdeel_upper;
            -- Met bijbehorende kenmerk bij dat soort object
            INSERT INTO ins_kenmerk (ins_srtkenmerk_key, ins_srtinstallatie_key, ins_kenmerk_niveau, ins_kenmerk_meetwaarde, ins_kenmerk_volgnummer, ins_kenmerk_locatiekolom)
            SELECT ins_srtkenmerk_key, v_ins_srtdeel_key, 'S', 1, 903, c_ins_kenmerk_key_opc_alarm
            FROM ins_srtkenmerk
            WHERE ins_srtkenmerk_omschrijving = rec.ins_srtdeel_upper || '-alarm'
            AND ins_srtkenmerk_kenmerktype = 'N'
            AND ins_srtkenmerk_verwijder IS NULL;

            v_count_update := v_count_update + 1;

            COMMIT;
         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.imp_writelog (p_import_key,
                                 'W',
                                 v_errormsg,
                                 '');
               COMMIT;
         END;
      END LOOP;


      fac.imp_writelog (
         p_import_key,
         'S',
         'Kenmerksoorten/aantal toegevoegd: ' || TO_CHAR (v_count_update),
         ''
      );

      COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      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',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;


END arai_post_import_energie;
/

CREATE OR REPLACE FORCE VIEW arai_v_bedrijveninfo
(
   prs_bedrijf_key,
   prs_bedrijf_naam,
   prs_bedrijf_telefoon,
   prs_bedrijf_info,
   prs_bedrijf_verwijder
)
AS
   SELECT prs_bedrijf_key,
          prs_bedrijf_naam,
          prs_bedrijf_telefoon,
          prs_bedrijf_naam || ' (telnr: ' || prs_bedrijf_telefoon || ')',
          prs_bedrijf_verwijder
FROM prs_bedrijf
WHERE COALESCE(prs_bedrijf_intern,0) = 0;



CREATE OR REPLACE PROCEDURE arai_processemail
                      (pfrom      IN VARCHAR2,
                       pto        IN VARCHAR2,
                       psubject   IN VARCHAR2,
                       pbody      IN VARCHAR2,
                       psessionid IN VARCHAR2,
                       puserkey   IN NUMBER DEFAULT NULL
                      )
AS
    -- puserkey is alvast een nieuwe parameter die per release 2015.2 er gaat komen (FSN#33503), als gevuld, dan deze als aanvrager van melding gebruiken.
  sender                                prs_perslid.prs_perslid_key%TYPE;
  kostenplaats                          prs_afdeling.prs_kostenplaats_key%TYPE;
  v_mldkey                              mld_melding.mld_melding_key%TYPE;
  defaultstdmelding                     fac_setting.fac_setting_default%TYPE;
  kkey                                  mld_kenmerk.mld_kenmerk_key%TYPE;
  errormsg                              fac_result.fac_result_waarde%TYPE;
  v_mailadres_kenmerk_key               mld_kenmerk.mld_kenmerk_key%TYPE;
  v_flexprop_mail                       VARCHAR2(1000);
  v_from                                VARCHAR2 (1000);

  subject_regexp                        fac_setting.fac_setting_default%TYPE;
  v_behandelaar_key                     mld_melding.mld_melding_behandelaar_key%TYPE;
  v_mldnum                              VARCHAR2 (4000);
  v_srtdisc                             VARCHAR2 (4000);
  v_flag_on_fenote                      NUMBER (10);
  v_flag_on_bonote                      NUMBER (10);
  v_gebkey                              NUMBER (10);
  v_gebcode                             VARCHAR2 (4000);
  v_standnr                             NUMBER (10);
  v_standnrpos                          NUMBER (10);


BEGIN
  -- We beschouwen dit als een nieuwe melding die afkomstig zijn van (voor Facilitor) onbekende gebruikers (die dus geen account hebben, althans geen prs_perslid zijn).
  -- Deze externe/onbekende gebruikers zijn bezoekers of omwonenden, die een klacht kunnen mailen, die wordt omgezet in een Facilitor melding.


    -- De melding zetten we op de system-api user voor hotelremarks, waarvan de api-key bekend is.
    -- Vanaf release 2015.2 (FSN#33503) wordt deze api-user netjes als parameter puserkey meegegeven.
    IF puserkey IS NOT NULL
    THEN
        -- Vanaf release 2015.2
        SELECT prs_perslid_key, d.prs_kostenplaats_key
        INTO sender, kostenplaats
        FROM prs_perslid p, prs_afdeling d
        WHERE p.prs_afdeling_key = d.prs_afdeling_key
        AND prs_perslid_key = puserkey;
    ELSE
    IF pto = 'gielissen@arai.facilitor.nl'
    THEN
        SELECT prs_perslid_key, d.prs_kostenplaats_key
        INTO sender, kostenplaats
        FROM prs_perslid p, prs_afdeling d
        WHERE p.prs_afdeling_key = d.prs_afdeling_key
        AND prs_perslid_apikey = 'hKkBBqPfzvKMupzSXZwblvsmTPHXMT';
    ELSE
        -- Tot release 2015.2
        SELECT prs_perslid_key, d.prs_kostenplaats_key
        INTO sender, kostenplaats
        FROM prs_perslid p, prs_afdeling d
        WHERE p.prs_afdeling_key = d.prs_afdeling_key
        AND prs_perslid_apikey = 'IwIyYfSxveyBfiVicoHDgDpLSzuBboXs';
        END IF;
    END IF;

    CASE pto
      WHEN     'hotelremarks@arai.facilitor.nl'
      THEN
                  -- Standaardmelding 1561 heeft omschrijving 'Overig', is van vakgroep 'RAI Hotel Travel Service', die van vakgroeptype 'Exposanten' is
                  defaultstdmelding := 1561;

                  -- kenmerk-key 46, deze is van kenmerksoort 'E-mail (C)' (key 26) op vakgroeptype niveau van vakgroeptype-key 'Exposanten'  (waarop stdmelding 1561 is gebaseerd).
                  v_mailadres_kenmerk_key := 46;
    WHEN    'storingentd@arai.facilitor.nl'
    THEN
                defaultstdmelding := 3741;
    
                v_mailadres_kenmerk_key := 2501;
                
   WHEN    'gielissen@arai.facilitor.nl'
   THEN
       CASE
         WHEN UPPER (psubject) LIKE 'SERVICEBON%'
         THEN         
           CASE
             WHEN UPPER (psubject) LIKE '%MANSVELD%'
             THEN 
                 defaultstdmelding := 460;
                 v_mailadres_kenmerk_key := 46;
                 
             WHEN UPPER (psubject) LIKE '%MTD%'
             THEN 
                 defaultstdmelding := 3443;
                 v_mailadres_kenmerk_key := 46;
            END CASE;
       END CASE;
       
    --ELSE
                -- Standaard /default waarden, nu nog n.v.t., er is 1 concrete mailadres en we hebben (nog) geen vangnet voor de rest...
                --defaultstdmelding := fac.getsetting ('defaultstdmelding');
  END CASE;
  
  -------------------------------------------------

  -- Check of de afzender pfrom een reply op een bestaande melding doet, in dat geval wordt dat in notities genoteerd.
  -- Wat is een bestaande melding:
  -- 1) Eerst uit het onderwerp het meldingnummer proberen te onderscheppen, uitgangspunt dat in het onderwerp het meldingnummer '1234' kan worden opgevist, met ervoor en erna een spatie
  -- 2) Het 1e nummer dat in het onderwerp staat wordt gezien als meldingnummer, eventuele andere nummers later in het onderwerp worden genegeerd.
  -- 3) Het mailadres van de afzender is dezelfde als die van dat gevonden meldingnummer '1234' in het onderwerp, deze afzender (mailadres) staat in flexprop (zie verderop hieronder)

  -- ARAI heeft geen vakgroeptype-prefix, dus [alpha] is nu niet van toepassing
  -- subject_regexp := '[[:alpha:]]*[[:digit:]]{1,}';
  -- Dus alleen het digits-gedeelte...
  subject_regexp := '[[:digit:]]{1,}';
  v_mldnum :=
      REGEXP_SUBSTR (psubject,
                     subject_regexp,
                     1,
                     1,
                     'i');                                    -- 1234, of 12345, of 12, of 1 etc.
                     
  v_gebcode := LPAD(v_mldnum,2,'0');        -- gebouwbepaling voor Gielissen meldingen                   
                     
  IF defaultstdmelding IN (460, 3443)
    THEN
    
    SELECT alg_gebouw_key
        INTO v_gebkey
        FROM alg_gebouw
        WHERE alg_gebouw_code = v_gebcode;
 
 -- Eerst bepalen waar in het onderwerp het standnummer staat
      v_standnrpos := INSTR(psubject, 'Standnr', 1, 1) + 1;
       
  -- Nu we de positie van standnr weten kunnen we de waarde na de spatie ophalen en de hal ervoor plakken
  SELECT AVS.EBMS_KEY
     INTO v_standnr
     FROM ARAI_V_STANDNUMMERS AVS,
     (SELECT SUBSTR(psubject,
              INSTR(psubject, ' ', v_standnrpos, 1) + 1,
              INSTR(psubject, ' ', v_standnrpos, 2) - INSTR(psubject, ' ', v_standnrpos, 1) - 1) STNR FROM DUAL) SUB
     WHERE AVS.STANDNUMMER = fac.safe_to_number (v_gebcode) || '.' || SUB.STNR;
           
   END IF;

  -- ARAI heeft geen vakgroeptype-prefix, dus v_srtdisc is nu niet van toepassing
  --v_srtdisc :=
  --      REGEXP_SUBSTR (v_mldnum,
  --                   '[[:alpha:]]',
  --                   1,
  --                   1,
  --                   'i');                                         -- M
  --v_mldkey := fac.safe_to_number (SUBSTR (v_mldnum, LENGTH (v_srtdisc) + 1)); -- 123, of 12345, of 12, of 1

    v_mldkey := fac.safe_to_number (v_mldnum);

    --  Uit onderwerp is de vermoedelijke juiste v_mldkey geparsed.
    -- Final check: is de afzender van de mail dezelfde als die van v_mldkey, deze afzender (mailadres) staat in flexprop (zie verderop hieronder in gedeelte bij insert melding).

    SELECT MAX(SUBSTR(TRIM(km.mld_kenmerkmelding_waarde),1,50))
    INTO v_flexprop_mail
    FROM mld_kenmerkmelding km
    WHERE mld_melding_key = v_mldkey
    AND mld_kenmerk_key = v_mailadres_kenmerk_key
    AND mld_kenmerkmelding_verwijder IS NULL;


    v_from := SUBSTR(TRIM(pfrom),1,50);



    IF v_flexprop_mail = v_from
  THEN

          -- Gotcha: bestaande melding gevonden
          -- Van deze afzender is een eerdere melding geregistreerd, die  we plakken de subject en body nu als notitie toe (als perslid system-api user).

          INSERT INTO mld_melding_note (mld_melding_key,
                                    mld_melding_note_omschrijving,
                                    prs_perslid_key,
                                    mld_melding_note_flag)
              VALUES (v_mldkey,
                      SUBSTR (
                         psubject || CHR (13) || CHR (10)
                         || REPLACE (
                               SUBSTR (pbody,
                                       1,
                                       4000 - (LENGTH (psubject) + 2)),
                               CHR (13) || CHR (10) || CHR (13) || CHR (10),
                               CHR (13) || CHR (10)),
                         1,
                         4000),              -- verwijder onnodige witregels
                      sender,
                      0);          -- 0 is NIET zichtbaar FE (want is system-user, zinloos).

            -- Vlaggetjes zetten zoals mld_edit_note.asp dat doet
            IF 1=0 -- ARAI heeft geen melding valggetjes, dus onderstaande kan voor nu weg.
            THEN
               BEGIN
                  IF fac.getdbversion() >= 'DB36' -- DB36 forward compatible
                  THEN
                     IF fac.getsetting('mld_melding_actiecode') = 1
                     THEN
                        UPDATE mld_melding
                           SET mld_melding_actiecode = 1+128 -- Backoffice + Attentie
                         WHERE mld_melding_key = v_mldkey;
                     END IF;
                  ELSE
                     v_flag_on_fenote := fac.getsetting('mld_flag_on_fenote');
                     v_flag_on_bonote := fac.getsetting('mld_flag_on_bonote');

                     IF v_flag_on_bonote <> 0 AND v_flag_on_bonote IS NOT NULL
                     THEN
                        UPDATE mld_melding
                           SET mld_melding_flag = v_flag_on_bonote
                         WHERE mld_melding_key = v_mldkey
                           AND ( (mld_melding_flag = v_flag_on_fenote)
                            OR (mld_melding_flag = 0 OR mld_melding_flag IS NULL));
                     END IF;
                  END IF;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     DBMS_OUTPUT.put_line(   'Niet gelukt om flag '
                                        || v_flag_on_bonote
                                        || ' te zetten.');
               END;
            END IF; -- ARAI heef geen vlaggetjes

            -- Default tracking is even goed genoeg
      fac.trackaction ('MLDNOT',
                       v_mldkey,
                       sender,
                       NULL,
                       '#Notitie toegevoegd vanuit e-mail'); -- # voorkomt notificatie

         INSERT INTO fac_result (fac_result_sessionid,
                                fac_result_naam,
                                fac_result_waarde)
            VALUES (psessionid, 'maillog', 'Als notitie toegevoegd aan melding ' || v_mldkey);

          -- Bepalen van de behandelaar van deze melding
            BEGIN
            SELECT mld_melding_behandelaar_key
              INTO v_behandelaar_key
              FROM mld_melding m, prs_perslid p
             WHERE mld_melding_key = v_mldkey
               AND mld_melding_behandelaar_key = p.prs_perslid_key
               AND p.prs_perslid_email IS NOT NULL
               AND p.prs_perslid_verwijder IS NULL;
         EXCEPTION
            WHEN OTHERS
            THEN
               v_behandelaar_key := NULL;
         END;

         IF v_behandelaar_key IS NOT NULL
         THEN
          -- Bestaande melding en behandelaar is bekend.

        -- Notificatie naar behandelaar
        fac.putnotificationsrtprio (
           NULL,
           v_behandelaar_key,
           'MLDNOB',
           v_mldkey,
           'Melding ' || v_mldkey || ' is door de klant aangepast.',
           2,
           NULL,
           NULL,
           NULL,
           2,
           NULL);
            END IF; -- Bestaande melding en behandelaar is bekend.
  ELSE
        -- GEEN bestaande melding gevonden, we gaan een nieuwe melding toevoegen....

      IF defaultstdmelding IS NOT NULL
      THEN
      
         IF defaultstdmelding IN (460, 3443)
            THEN
             BEGIN
              INSERT INTO mld_melding (mld_melding_module,
                                      mld_meldbron_key,
                                      mld_melding_datum,
                                      mld_alg_locatie_key,
                                      mld_alg_onroerendgoed_keys,
                                      mld_melding_onderwerp,
                                      mld_melding_omschrijving,
                                      mld_melding_status,
                                      mld_stdmelding_key,
                                      prs_perslid_key,
                                      prs_perslid_key_voor,
                                      prs_kostenplaats_key,
                                      mld_melding_spoed)
                 VALUES ('MLD',
                         4,                                            -- email
                         SYSDATE,
                         1,                                               -- zie ook HSLE#33348: RAI hier kiezen (alg_locatie_key = 1)
                         v_gebkey,
                         psubject,
                         pbody,
                         NULL,
                         defaultstdmelding,
                         sender,
                         sender,
                         kostenplaats,
                         3)
              RETURNING mld_melding_key
                   INTO v_mldkey;
                   
              INSERT INTO mld_kenmerkmelding (mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde)
              VALUES (v_mldkey, 863, 35181); -- PLMA 2019
          
              INSERT INTO mld_kenmerkmelding (mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde)
              VALUES (v_mldkey, 2901, v_standnr); -- EBMS Standnr   
              
                   
              -- Vullen van kenmerkwaarde "e-mail adres"
                    IF pfrom IS NOT NULL AND v_mailadres_kenmerk_key IS NOT NULL
                    THEN
                        -- Kenmerk mailadres heeft max. 50 tekens, afkappen dus...


                        -- zet v_from met maximaal 50 tekens als kenmerk bij de zojuist aangemaakte melding.
                        INSERT INTO mld_kenmerkmelding (mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde)
                        VALUES (v_mldkey, v_mailadres_kenmerk_key, v_from);
                    END IF;
                   
            mld.setmeldingstatus (v_mldkey, 2, sender);
            INSERT INTO fac_result (fac_result_sessionid,
                                    fac_result_naam,
                                    fac_result_waarde)
               VALUES (psessionid, 'maillog', 'Geregistreerd onder melding ' || v_mldkey);

          END;
                   
          ELSE
          -- suggested extensions:
          -- check for MLDUSE-write autorisations
          -- parse the subject to find an appropriate stdmelding, if uniquely possible
          -- append (as a note?) to an existing melding if #key is found in the subject
          BEGIN
             INSERT INTO mld_melding (mld_melding_module,
                                      mld_meldbron_key,
                                      mld_melding_datum,
                                      mld_alg_locatie_key,
                                      mld_melding_omschrijving,
                                      mld_melding_status,
                                      mld_stdmelding_key,
                                      prs_perslid_key,
                                      prs_perslid_key_voor,
                                      prs_kostenplaats_key,
                                      mld_melding_spoed)
                 VALUES ('MLD',
                         4,                                            -- email
                         SYSDATE,
                         1,                                                                                         -- zie ook HSLE#33348: RAI hier kiezen (alg_locatie_key = 1)
                         SUBSTR (
                            psubject || CHR (13) || CHR(10)
                            || REPLACE (
                                  SUBSTR (pbody,
                                       1,
                                       4000 - (LENGTH (psubject) + 2)),
                                  CHR (13) || CHR (10) || CHR (13) || CHR (10),
                                  CHR (13) || CHR (10)),
                            1,
                            4000),              -- verwijder onnodige witregels
                         NULL,
                         defaultstdmelding,
                         sender,
                         sender,
                         kostenplaats,
                         3)
              RETURNING mld_melding_key
                   INTO v_mldkey;

                    -- Vullen van kenmerkwaarde "e-mail adres"
                    IF pfrom IS NOT NULL AND v_mailadres_kenmerk_key IS NOT NULL
                    THEN
                        -- Kenmerk mailadres heeft max. 50 tekens, afkappen dus...


                        -- zet v_from met maximaal 50 tekens als kenmerk bij de zojuist aangemaakte melding.
                        INSERT INTO mld_kenmerkmelding (mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde)
                        VALUES (v_mldkey, v_mailadres_kenmerk_key, v_from);
                    END IF;

            mld.setmeldingstatus (v_mldkey, 2, sender);
            INSERT INTO fac_result (fac_result_sessionid,
                                    fac_result_naam,
                                    fac_result_waarde)
               VALUES (psessionid, 'maillog', 'Geregistreerd onder melding ' || v_mldkey);

          END;
          END IF; -- defaultstdmelding is gielissen of niet
         END IF; -- defaultstdmelding IS NOT NULL
    END IF;    -- v_flexprop_mail = v_from

    -- Bijlagen gaan we proberen toe te voegen, zowel bij een nieuwe als een bestaande melding....
     -- Dat doen we bij een flexprop van het type 'M' (=folder met bestanden), door het laagste volgnummer te vinden
     -- find the lowest volgnummer of the flexfield of type folder.
     SELECT MIN (mld_kenmerk_key)
   INTO kkey
   FROM mld_kenmerk k,
        mld_srtkenmerk sk,
        mld_stdmelding std,
        ins_tab_discipline d
      WHERE     mld_srtkenmerk_kenmerktype = 'M'
        AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
        AND std.mld_stdmelding_key = defaultstdmelding
        AND std.mld_ins_discipline_key = d.ins_discipline_key
        AND ( (k.mld_stdmelding_key = std.mld_stdmelding_key
               AND k.mld_kenmerk_niveau = 'S')
             OR (k.mld_stdmelding_key = d.ins_discipline_key
                 AND k.mld_kenmerk_niveau = 'D')
             OR (k.mld_stdmelding_key = d.ins_srtdiscipline_key
                 AND k.mld_kenmerk_niveau = 'T'))
        AND k.mld_kenmerk_verwijder IS NULL
        AND NOT EXISTS
              (SELECT mld_kenmerk_volgnummer
                 FROM mld_kenmerk k1,
                      mld_srtkenmerk sk1,
                      mld_stdmelding std1,
                      ins_tab_discipline d1
                WHERE sk1.mld_srtkenmerk_kenmerktype = 'M'
                      AND sk1.mld_srtkenmerk_key =
                            k1.mld_srtkenmerk_key
                      AND std1.mld_stdmelding_key =
                            defaultstdmelding
                      AND std1.mld_ins_discipline_key =
                            d1.ins_discipline_key
                      AND ( (k1.mld_stdmelding_key =
                                std1.mld_stdmelding_key
                             AND k1.mld_kenmerk_niveau = 'S')
                           OR (k1.mld_stdmelding_key =
                                  d1.ins_discipline_key
                               AND k1.mld_kenmerk_niveau = 'D')
                           OR (k1.mld_stdmelding_key =
                                  d1.ins_srtdiscipline_key
                               AND k1.mld_kenmerk_niveau = 'T'))
                      AND k1.mld_kenmerk_verwijder IS NULL
                      AND k1.mld_kenmerk_volgnummer <
                            k.mld_kenmerk_volgnummer);

     IF kkey IS NOT NULL
     THEN
    INSERT INTO fac_result (fac_result_sessionid,
                            fac_result_naam,
                            fac_result_waarde)
        VALUES (psessionid,
                'kenmerkpath',
                'MLD\M' || to_char( TRUNC(v_mldkey/1000), 'FM0000') || '___\M' || v_mldkey || '\' || kkey || '\');
     END IF;

  IF errormsg IS NOT NULL
  THEN
     INSERT INTO fac_result (fac_result_sessionid,
                             fac_result_naam,
                             fac_result_waarde)
         VALUES (psessionid, 'errormsg', errormsg);
  END IF;
EXCEPTION
  WHEN OTHERS
  THEN
     fac.writelog (
                  'PROCESSEMAIL',
                  'W',
                     'Mail kon niet verwerkt worden afzender: '
                  || pfrom
                  || '['
                  || errormsg
                  || ']',
                     'OTHERS (error '
                  || SQLCODE
                  || '/'
                  || SUBSTR (SQLERRM, 1, 100)
                  || ')');
     INSERT INTO fac_result (fac_result_sessionid,
                             fac_result_naam,
                             fac_result_waarde)
         VALUES (psessionid,
                 'errormsg',
                 'Database fout - Neem contact op met uw systeembeheerder');
END;
/

----------------------------------------------------------------------      KPI DEFINITIES     ---------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE ARAI_IMPORT_KPI_DEFINITIE (p_import_key IN NUMBER)
IS
    c_delim                          VARCHAR2 (1) := ';';
    v_newline                        VARCHAR2 (1000);                                  -- Input line
    v_errormsg                       VARCHAR2 (1000);
    v_errorhint                      VARCHAR2 (1000);
    oracle_err_num                   NUMBER;
    oracle_err_mes                   VARCHAR2 (200);
    header_is_valid                  NUMBER;
    v_count_tot                      NUMBER (10);
    v_count_import                   NUMBER (10);
    v_ongeldig                       NUMBER (1);
    v_aanduiding                     VARCHAR2 (200);

    -- De importvelden
    v_kpi_definitie_code         VARCHAR2(255);    --15 BYTE),
    v_kpi_definitie_omschrijving VARCHAR2(255);    --60 BYTE),
    v_kpi_definitie_info         VARCHAR2(4000);   -- 4000 BYTE),
    v_kpi_definitie_categorie1   VARCHAR2(255);    -- 50 BYTE),
    v_kpi_definitie_categorie2   VARCHAR2(255);    -- 50 BYTE),
    v_kpi_definitie_categorie3   VARCHAR2(255);    -- 50 BYTE),
    v_kpi_definitie_drempels_0   VARCHAR2(255);    -- 20 BYTE),
    v_kpi_definitie_drempels_70  VARCHAR2(255);    -- 20 BYTE),
    v_kpi_definitie_drempels_90  VARCHAR2(255);    -- 20 BYTE),
    v_kpi_definitie_drempels_100 VARCHAR2(255);    -- 20 BYTE)
    v_kpi_definitie_drempels_tot VARCHAR2(255);    -- 20 BYTE),

    -- Overige velden:
    CURSOR c1
    IS
          SELECT *
            FROM fac_imp_file
           WHERE fac_import_key = p_import_key
        ORDER BY fac_imp_file_index;
BEGIN
    -- Eerst opruiming
    DELETE FROM ARAI_IMP_KPI_DEFINITIE;

    v_count_tot := 0;
    v_count_import := 0;
    header_is_valid := 0;
    COMMIT;

    FOR rec1 IN c1
    LOOP
        BEGIN
            v_newline := rec1.fac_imp_file_line;
            v_errormsg := 'Fout opvragen te importeren rij';
            v_aanduiding := '';
            v_ongeldig := 0;
            -- Lees alle veldwaarden
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_categorie1);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_categorie2);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_code);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_omschrijving);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_info);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_drempels_0);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_drempels_70);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_drempels_90);
            fac.imp_getfield (v_newline, c_delim, v_kpi_definitie_drempels_100);

            v_aanduiding :=
                   '|'
                || v_kpi_definitie_categorie1
                || '|'
                || v_kpi_definitie_categorie2
                || '|'
                || v_kpi_definitie_code
                || '| ';

            -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
            -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
            -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
            IF (header_is_valid = 0)
            THEN
                IF     UPPER (v_kpi_definitie_categorie1) = 'KPI CATEGORIE 1'
                   AND UPPER (v_kpi_definitie_categorie2) = 'KPI CATEGORIE 2'
                   AND UPPER (v_kpi_definitie_code) = 'KPI CODE'
                   AND UPPER (v_kpi_definitie_omschrijving) = 'KPI OMSCHRIJVING'
                   AND UPPER (v_kpi_definitie_info) = 'KPI INFORMATIE'
                   AND UPPER (v_kpi_definitie_drempels_0) = 'KPI DREMPEL 0'
                   AND UPPER (v_kpi_definitie_drempels_70) = 'KPI DREMPEL 70'
                   AND UPPER (v_kpi_definitie_drempels_90) = 'KPI DREMPEL 90'
                   AND UPPER (v_kpi_definitie_drempels_100) = 'KPI DREMPEL 100'
                THEN
                    header_is_valid := 1;
                END IF;
            ELSE
                v_count_tot := v_count_tot + 1;
                -- Controleer alle veldwaarden

                IF v_kpi_definitie_categorie1 IS NOT NULL
                THEN
	                v_kpi_definitie_categorie1 := TRIM (v_kpi_definitie_categorie1);

	                IF LENGTH (v_kpi_definitie_categorie1) > 50
	                THEN
	                    v_kpi_definitie_categorie1 :=
	                        SUBSTR (TRIM (v_kpi_definitie_categorie1), 1, 50);
	                    fac.imp_writelog (
	                        p_import_key,
	                        'W',
	                        v_aanduiding,
	                           'Categorie 1 wordt afgebroken tot ['
	                        || v_kpi_definitie_categorie1
	                        || ']');
	                END IF;
                ELSE
                	v_ongeldig := 1;
                	fac.imp_writelog (p_import_key, 'W', v_aanduiding, 'Categorie 1 mag NIET leeg zijn: deze regel wordt overgeslagen');
                END IF;

                IF v_kpi_definitie_categorie2 IS NOT NULL
                THEN
	                v_kpi_definitie_categorie2 := TRIM (v_kpi_definitie_categorie2);
									IF LENGTH (v_kpi_definitie_categorie2) > 50
	                THEN
	                    v_kpi_definitie_categorie2 :=
	                        SUBSTR (TRIM (v_kpi_definitie_categorie2), 1, 50);
	                    fac.imp_writelog (
	                        p_import_key,
	                        'W',
	                        v_aanduiding,
	                           'Categorie 2 wordt afgebroken tot ['
	                        || v_kpi_definitie_categorie2
	                        || ']');
	                END IF;
								ELSE
									v_ongeldig := 1;
                	fac.imp_writelog (p_import_key, 'W', v_aanduiding, 'Categorie 2 mag NIET leeg zijn: deze regel wordt overgeslagen');
                END IF;

								IF v_kpi_definitie_code IS NOT NULL
                THEN
	                v_kpi_definitie_code := TRIM (v_kpi_definitie_code);
									IF LENGTH (v_kpi_definitie_code) > 15
	                THEN
	                    v_kpi_definitie_code :=
	                        SUBSTR (TRIM (v_kpi_definitie_code), 1, 15);
	                    fac.imp_writelog (
	                        p_import_key,
	                        'W',
	                        v_aanduiding,
	                           'Code wordt afgebroken tot ['
	                        || v_kpi_definitie_code
	                        || ']');
	                END IF;
								ELSE
									v_ongeldig := 1;
                	fac.imp_writelog (p_import_key, 'W', v_aanduiding, 'Code mag NIET leeg zijn: deze regel wordt overgeslagen');
                END IF;

                IF v_kpi_definitie_omschrijving IS NOT NULL
                THEN

									v_kpi_definitie_omschrijving := TRIM (v_kpi_definitie_omschrijving);
									IF LENGTH (v_kpi_definitie_omschrijving) > 60
	                THEN
	                    v_kpi_definitie_omschrijving :=
	                        SUBSTR (TRIM (v_kpi_definitie_omschrijving), 1, 60);
	                    fac.imp_writelog (
	                        p_import_key,
	                        'W',
	                        v_aanduiding,
	                           'Omschrijving wordt afgebroken tot ['
	                        || v_kpi_definitie_omschrijving
	                        || ']');
	                END IF;
								ELSE
									v_ongeldig := 1;
                	fac.imp_writelog (p_import_key, 'W', v_aanduiding, 'Omschrijving mag NIET leeg zijn: deze regel wordt overgeslagen');
                END IF;

								v_kpi_definitie_info := TRIM (v_kpi_definitie_info);
								IF LENGTH (v_kpi_definitie_info) > 4000
                THEN
                    v_kpi_definitie_info :=
                        SUBSTR (TRIM (v_kpi_definitie_info), 1, 4000);
                    fac.imp_writelog (
                        p_import_key,
                        'W',
                        v_aanduiding,
                           'Informatie wordt afgebroken tot ['
                        || v_kpi_definitie_info
                        || ']');
                END IF;

								IF v_kpi_definitie_drempels_0 IS NOT NULL AND v_kpi_definitie_drempels_70 IS NOT NULL AND v_kpi_definitie_drempels_90 IS NOT NULL AND v_kpi_definitie_drempels_100 IS NOT NULL
								THEN
									v_kpi_definitie_drempels_tot := TRIM (v_kpi_definitie_drempels_0 || '|' || v_kpi_definitie_drempels_70 || '|' || v_kpi_definitie_drempels_90 || '|' ||  v_kpi_definitie_drempels_100);
									IF LENGTH (v_kpi_definitie_drempels_tot) > 20
	                THEN
	                    v_kpi_definitie_drempels_tot :=
	                        SUBSTR (TRIM (v_kpi_definitie_drempels_tot), 1, 20);
	                    fac.imp_writelog (
	                        p_import_key,
	                        'W',
	                        v_aanduiding,
	                           'Dermpels wordt afgebroken tot ['
	                        || v_kpi_definitie_drempels_tot
	                        || ']');
	                END IF;
								ELSE
									v_ongeldig := 1;
                	fac.imp_writelog (p_import_key, 'W', v_aanduiding, 'Alle drempeles MOETEN gevuld zijn: deze regel wordt overgeslagen');
                END IF;


                -- Insert geformatteerde import record
                IF v_ongeldig = 0
                THEN
                    BEGIN
                        INSERT INTO ARAI_IMP_KPI_DEFINITIE (
									                        KPI_DEFINITIE_CODE,
									                        KPI_DEFINITIE_OMSCHRIJVING,
									                        KPI_DEFINITIE_INFO,
									                        KPI_DEFINITIE_CATEGORIE1,
									                        KPI_DEFINITIE_CATEGORIE2,
									                        KPI_DEFINITIE_DREMPELS)
                            VALUES (v_kpi_definitie_code,
                                    v_kpi_definitie_omschrijving,
                                    v_kpi_definitie_info,
                                    v_kpi_definitie_categorie1,
                                    v_kpi_definitie_categorie2,
                                    v_kpi_definitie_drempels_tot);

                        v_count_import := v_count_import + 1;
                    EXCEPTION
                        WHEN OTHERS
                        THEN
                            oracle_err_num := SQLCODE;
                            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                            v_errormsg :=
                                'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                            fac.imp_writelog (
                                p_import_key,
                                'E',
                                v_aanduiding || v_errormsg,
                                'Fout bij toevoegen regel aan importtabel ARAI_IMP_KPI_DEFINITIE.');
                    END;
                END IF;
            END IF;
        END;
    END LOOP;

    IF (header_is_valid = 0)
    THEN
        fac.imp_writelog (p_import_key,
                          'E',
                          'Ongeldig importbestand',
                          'Geen header of header niet volgens specificatie!');
    ELSE
        fac.imp_writelog (
            p_import_key,
            'S',
            'KPI Definitie: aantal ingelezen importregels: ' || TO_CHAR (v_count_tot),
            '');
        fac.imp_writelog (
            p_import_key,
            'S',
            'KPI Definitie: aantal ongeldige niet ingelezen importregels: '
            || TO_CHAR (v_count_tot - v_count_import),
            '');
    END IF;

    COMMIT;
EXCEPTION
    WHEN OTHERS
    THEN
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
        v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
        fac.imp_writelog (p_import_key,
                          'E',
                          v_errormsg,
                          'Inleesproces KPI Definitie afgebroken!');
END ARAI_IMPORT_KPI_DEFINITIE;
/

CREATE OR REPLACE PROCEDURE ARAI_UPDATE_KPI_DEFINITIE (p_import_key IN NUMBER)
AS
    v_errormsg                 VARCHAR2 (1000);
    oracle_err_num             NUMBER;
    oracle_err_mes             VARCHAR2 (200);
    header_is_valid            NUMBER;
    v_count_error              NUMBER (10);
    v_count                    NUMBER (10);
    v_count_tot                NUMBER (10);
    v_count_import             NUMBER (10);
    v_ongeldig                 NUMBER (1);
    v_aanduiding               VARCHAR2 (200);
    v_errorhint                VARCHAR2 (1000);


    CURSOR c_kpi_defs
    IS
        SELECT * FROM ARAI_IMP_KPI_DEFINITIE;
-- MAIN
BEGIN
    FOR rec_ins IN c_kpi_defs
    LOOP
        BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                   rec_ins.kpi_definitie_code
                || ' - '
                || rec_ins.kpi_definitie_categorie1
                || '-'
                || rec_ins.kpi_definitie_categorie2;

            v_errorhint := 'Fout bij insert van kpi definitie';

				    IF 				 rec_ins.kpi_definitie_code IS NOT NULL
                   AND rec_ins.kpi_definitie_categorie1 IS NOT NULL
                   AND rec_ins.kpi_definitie_categorie2 IS NOT NULL
                   AND rec_ins.kpi_definitie_omschrijving IS NOT NULL
                   AND rec_ins.kpi_definitie_drempels IS NOT NULL

            THEN
                INSERT INTO kpi_definitie (  KPI_DEFINITIE_CODE,
                                             KPI_DEFINITIE_OMSCHRIJVING,
                                             KPI_DEFINITIE_INFO,
                                             KPI_DEFINITIE_CATEGORIE1,
                                             KPI_DEFINITIE_CATEGORIE2,
                                             KPI_DEFINITIE_DREMPELS)
                    VALUES (rec_ins.kpi_definitie_code,
                            rec_ins.kpi_definitie_omschrijving,
                            rec_ins.kpi_definitie_info,
                            rec_ins.kpi_definitie_categorie1,
                            rec_ins.kpi_definitie_categorie2,
                            rec_ins.kpi_definitie_drempels
                            );
            ELSE
                fac.imp_writelog (
                    p_import_key,
                    'E',
                    v_aanduiding,
                    'Code, Omschrijving, Categorie1 en 2 en drempels mogen niet leeg zijn');
            END IF;
        EXCEPTION
            WHEN OTHERS
            THEN
                v_count_error := v_count_error + 1;
                oracle_err_num := SQLCODE;
                oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                fac.imp_writelog (p_import_key,
                                  'E',
                                  v_aanduiding || v_errormsg,
                                  v_errorhint);
                COMMIT;
        END;
    END LOOP;
EXCEPTION
    WHEN OTHERS
    THEN
        oracle_err_num := SQLCODE;
        oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
        v_errormsg :=
            v_errormsg || 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
        fac.imp_writelog (p_import_key,
                          'E',
                          'Importproces KPI Definitie afgebroken!',
                          v_errormsg);
END ARAI_UPDATE_KPI_DEFINITIE;
/

----- Views voor berekenen KPI's -----------------------------------------------

-- Views voor berekening (genormeerde) KPI-scores o.b.v. handmatig/automatisch ingevulde KPI-meldingen.
-- KAVEL 1
-- #1-Evenementgebonden Schoonmaak door RAI
-- Deze komen uit de melding met std_melding_key 2943
CREATE OR REPLACE VIEW arai_v_kpi_es_rai
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'ES'),
        scores_rai AS
        (SELECT   m.mld_melding_key,
                  1 alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(ES_01.mld_kenmerkmelding_waarde),0) ES_01_score,
                  COALESCE(fac.safe_to_number(ES_02.mld_kenmerkmelding_waarde),0) ES_02_score,
                  COALESCE(fac.safe_to_number(ES_05.mld_kenmerkmelding_waarde),0) ES_05_score,
                  COALESCE(fac.safe_to_number(ES_06.mld_kenmerkmelding_waarde),0) ES_06_score,
                  COALESCE(fac.safe_to_number(ES_07.mld_kenmerkmelding_waarde),0) ES_07_score,
                  COALESCE(fac.safe_to_number(ES_08.mld_kenmerkmelding_waarde),0) ES_08_score,
                  COALESCE(fac.safe_to_number(ES_03.mld_kenmerkmelding_waarde),0) ES_03_score,
                  COALESCE(fac.safe_to_number(ES_04.mld_kenmerkmelding_waarde),0) ES_04_score,
                  COALESCE(fac.safe_to_number(ES_TO.mld_kenmerkmelding_waarde),0) ES_TO_score -- Aantal stands schoongemaakt (ivm 7% marge)
             FROM mld_melding m,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1509) ES_01,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1506) ES_02,
                    (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1510) ES_05,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1507) ES_06,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1511) ES_07,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1508) ES_08,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1517) ES_03,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1536) ES_04,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 2721) ES_TO -- Aantal stands schoongemaakt
                 -- alg_locatie dloc
            WHERE m.mld_stdmelding_key = 2943
                             AND m.mld_melding_status NOT IN (1)
            --  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND ES_01.mld_melding_key(+) = m.mld_melding_key
              AND ES_02.mld_melding_key(+) = m.mld_melding_key
              AND ES_05.mld_melding_key(+) = m.mld_melding_key
              AND ES_06.mld_melding_key(+) = m.mld_melding_key
              AND ES_07.mld_melding_key(+) = m.mld_melding_key
              AND ES_08.mld_melding_key(+) = m.mld_melding_key
              AND ES_03.mld_melding_key(+) = m.mld_melding_key
              AND ES_04.mld_melding_key(+) = m.mld_melding_key
              AND ES_TO.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                DECODE(n.kpi_code,
                       'ES',    (((CASE WHEN ES_01_score <= 13 THEN 13 ELSE  ES_01_score END)  -  13) * 2) +
                                 (((CASE WHEN ES_02_score <= 10 THEN 10 ELSE  ES_02_score END)  -  10) * 2) +
                                    --    ((DECODE(ES_02_score, 0, 2, 1, 2, ES_02_score)  -  2) * 2) +
                                  (((CASE WHEN ES_05_score <= (ES_TO_score * 0.07) THEN (ES_TO_score * 0.07) ELSE  ES_05_score END)  -  (ES_TO_score * 0.07)) * 2) +
                                   --     ((DECODE(ES_05_score, 0, 2, 1, 2, ES_05_score)  -  2) * 2) +
                                        ((DECODE(ES_06_score, 0, 2, 1, 2, ES_06_score)  -  2) * 2) +
                                        ((DECODE(ES_07_score, 0, 2, 1, 2, ES_07_score)  -  2) * 2) +
                                        ((DECODE(ES_08_score, 0, 2, 1, 2, ES_08_score)  -  2) * 2) +
                                        (ABS(ES_03_score - 1) * 10)  +
                                        (ABS(ES_04_score - 1) * 10)
                       ) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_rai k) m;

-- KAVEL 1
-- #1-Evenementgebonden Schoonmaak door CSU
-- Deze komen uit de melding met std_melding_key 2944

CREATE OR REPLACE VIEW arai_v_kpi_es_csu
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'ES'),
        scores_csu AS
        (SELECT   m.mld_melding_key,
                  1 alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(ES_07.mld_kenmerkmelding_waarde),0) ES_07_score,
                  COALESCE(fac.safe_to_number(ES_08.mld_kenmerkmelding_waarde),0) ES_08_score,
                  COALESCE(fac.safe_to_number(ES_09.mld_kenmerkmelding_waarde),0) ES_09_score,
                  COALESCE(fac.safe_to_number(ES_10.mld_kenmerkmelding_waarde),0) ES_10_score,
                  COALESCE(fac.safe_to_number(ES_11.mld_kenmerkmelding_waarde),0) ES_11_score,
                  COALESCE(fac.safe_to_number(ES_12.mld_kenmerkmelding_waarde),0) ES_12_score,
                  COALESCE(fac.safe_to_number(ES_13.mld_kenmerkmelding_waarde),0) ES_13_score,
                  COALESCE(fac.safe_to_number(ES_14.mld_kenmerkmelding_waarde),0) ES_14_score,
                  COALESCE(fac.safe_to_number(ES_15.mld_kenmerkmelding_waarde),0) ES_15_score,
                  COALESCE(fac.safe_to_number(ES_16.mld_kenmerkmelding_waarde),0) ES_16_score,
                  COALESCE(fac.safe_to_number(ES_18.mld_kenmerkmelding_waarde),0) ES_18_score,
                  COALESCE(fac.safe_to_number(ES_20.mld_kenmerkmelding_waarde),0) ES_20_score
             FROM mld_melding m,
             			(SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1514) ES_07,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1527) ES_08,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1513) ES_09,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1529) ES_10,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1528) ES_11,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1515) ES_12,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1530) ES_13,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1525) ES_14,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1526) ES_15,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1535) ES_16,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1534) ES_18,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1533) ES_20
                 -- alg_locatie dloc
            WHERE m.mld_stdmelding_key = 2944
							AND m.mld_melding_status NOT IN (1)
            --  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND ES_07.mld_melding_key(+) = m.mld_melding_key
              AND ES_08.mld_melding_key(+) = m.mld_melding_key
              AND ES_09.mld_melding_key(+) = m.mld_melding_key
              AND ES_10.mld_melding_key(+) = m.mld_melding_key
              AND ES_11.mld_melding_key(+) = m.mld_melding_key
              AND ES_12.mld_melding_key(+) = m.mld_melding_key
              AND ES_13.mld_melding_key(+) = m.mld_melding_key
              AND ES_14.mld_melding_key(+) = m.mld_melding_key
              AND ES_15.mld_melding_key(+) = m.mld_melding_key
              AND ES_16.mld_melding_key(+) = m.mld_melding_key
              AND ES_18.mld_melding_key(+) = m.mld_melding_key
              AND ES_20.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                DECODE(n.kpi_code,
                       'ES', (ABS(ES_07_score - 1) * 10)  +
                             (ABS(ES_08_score - 1) * 10)  +
                             (ABS(ES_09_score - 1) * 10)  +
                             (ABS(ES_10_score - 1) * 10)  +
                             (ABS(ES_11_score - 1) * 10)  +
                             (ABS(ES_12_score - 1) * 10)  +
                             (ABS(ES_13_score - 1) * 10)  +
                             (ABS(ES_14_score - 1) * 10)  +
                             (ABS(ES_15_score - 1) * 10)  +
                             CASE
													        WHEN ES_16_score < 1 THEN 20
													        WHEN ES_16_score < 2 THEN 17.5
													        WHEN ES_16_score < 3 THEN 15
													        WHEN ES_16_score < 4 THEN 12.5
													        WHEN ES_16_score < 5 THEN 10
													        WHEN ES_16_score < 6 THEN 7.5
													        WHEN ES_16_score < 7 THEN 5
													        ELSE 0
													   END +
                             (ABS(ES_18_score - 1) * 10)  +
                             (ABS(ES_20_score - 1) * 10)
                       ) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_csu k) m;

-- Agv ARAI#37911: kenmerken verhuizen naar csu-view naar de rai-view van kavel 1 (ES), die zijn uit bovenstaande verwijderd en hieronder neergezet
-- Verschil zit 'm in meld_stdmelding_key:
-- De verhuisde kenmerk-keys van 2944 naar mld_stdmelding_key 2943 zijn:
-- 1531 (ES_21)
-- 1505 (ES_17)
-- 1532 (ES_19)
-- 1523 (ES_28)
-- 1516 (ES_29)
-- 1512 (ES_06)
-- 1524 (ES_05)

CREATE OR REPLACE VIEW arai_v_kpi_es_csu_2_rai
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'ES'),
        scores_csu AS
        (SELECT   m.mld_melding_key,
                  1 alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(ES_05.mld_kenmerkmelding_waarde),0) ES_05_score,
                  COALESCE(fac.safe_to_number(ES_06.mld_kenmerkmelding_waarde),0) ES_06_score,
                  COALESCE(fac.safe_to_number(ES_21.mld_kenmerkmelding_waarde),0) ES_21_score,
                  COALESCE(fac.safe_to_number(ES_17.mld_kenmerkmelding_waarde),0) ES_17_score,
                  COALESCE(fac.safe_to_number(ES_19.mld_kenmerkmelding_waarde),0) ES_19_score,
                  COALESCE(fac.safe_to_number(ES_28.mld_kenmerkmelding_waarde),0) ES_28_score,
                  COALESCE(fac.safe_to_number(ES_29.mld_kenmerkmelding_waarde),0) ES_29_score
             FROM mld_melding m,
             			(SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1524) ES_05,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1512) ES_06,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1531) ES_21,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1505) ES_17,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1532) ES_19,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1523) ES_28,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1516) ES_29
                 -- alg_locatie dloc
            WHERE m.mld_stdmelding_key = 2943
							AND m.mld_melding_status NOT IN (1)
           --   AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND ES_05.mld_melding_key(+) = m.mld_melding_key
              AND ES_06.mld_melding_key(+) = m.mld_melding_key
              AND ES_21.mld_melding_key(+) = m.mld_melding_key
              AND ES_17.mld_melding_key(+) = m.mld_melding_key
              AND ES_19.mld_melding_key(+) = m.mld_melding_key
              AND ES_28.mld_melding_key(+) = m.mld_melding_key
              AND ES_29.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                DECODE(n.kpi_code,
                       'ES', 		 (ES_05_score * 10) +
                             		 (ES_06_score * 5)  +
                       			 (ABS(ES_21_score - 1) * 10)  +
                             (ES_17_score * 2) +
                             (ABS(ES_19_score - 1) * 10)  +
                             (ABS(ES_28_score - 1) * 10)  +
                             (ABS(ES_29_score - 1) * 10)
                       ) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_csu k) m;


-- KAVEL 2
-- Afval, Parkeer, Beursvloer cijfers door RAI
-- Deze komen uit de melding met std_melding_key 2945
CREATE OR REPLACE VIEW arai_v_kpi_apb_rai
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'APB'),
        scores_rai AS
        (SELECT   m.mld_melding_key,
                  1 alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(APB_01.mld_kenmerkmelding_waarde),0) APB_01_score,
                  COALESCE(fac.safe_to_number(APB_02.mld_kenmerkmelding_waarde),0) APB_02_score,
                  COALESCE(fac.safe_to_number(APB_05.mld_kenmerkmelding_waarde),0) APB_05_score,
                  COALESCE(fac.safe_to_number(APB_06.mld_kenmerkmelding_waarde),0) APB_06_score,
                  COALESCE(fac.safe_to_number(APB_03.mld_kenmerkmelding_waarde),0) APB_03_score,
                  COALESCE(fac.safe_to_number(APB_04.mld_kenmerkmelding_waarde),0) APB_04_score
             FROM mld_melding m,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1542) APB_01,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1540) APB_02,
                    (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1543) APB_05,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1541) APB_06,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1545) APB_03,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1569) APB_04
                --  alg_locatie dloc
            WHERE m.mld_stdmelding_key = 2945
							AND m.mld_melding_status NOT IN (1)
            --  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND APB_01.mld_melding_key(+) = m.mld_melding_key
              AND APB_02.mld_melding_key(+) = m.mld_melding_key
              AND APB_05.mld_melding_key(+) = m.mld_melding_key
              AND APB_06.mld_melding_key(+) = m.mld_melding_key
              AND APB_03.mld_melding_key(+) = m.mld_melding_key
              AND APB_04.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                DECODE(n.kpi_code,
                       'APB',	((DECODE(APB_01_score, 0, 2, 1, 2, APB_01_score)  -  2) * 2) +
                       			 	((DECODE(APB_02_score, 0, 2, 1, 2, APB_02_score)  -  2) * 2) +
                       			 	(APB_05_score * 2) +
                       			 	((DECODE(APB_06_score, 0, 1, APB_06_score)  -  1) * 2) +
                       			 	(ABS(APB_03_score - 1) * 10)  +
                       			 	(ABS(APB_04_score - 1) * 10)
                       ) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_rai k) m;

-- KAVEL 2
-- Afval, Parkeer, Beursvloer cijfers door CSU
-- Deze komen uit de melding met std_melding_key 2946
CREATE OR REPLACE VIEW arai_v_kpi_apb_csu
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'APB'),
        scores_csu AS
        (SELECT   m.mld_melding_key,
                  1 alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(APB_24.mld_kenmerkmelding_waarde),0) APB_24_score,
                  COALESCE(fac.safe_to_number(APB_07.mld_kenmerkmelding_waarde),0) APB_07_score,
                  COALESCE(fac.safe_to_number(APB_08.mld_kenmerkmelding_waarde),0) APB_08_score,
                  COALESCE(fac.safe_to_number(APB_09.mld_kenmerkmelding_waarde),0) APB_09_score,
                  COALESCE(fac.safe_to_number(APB_10.mld_kenmerkmelding_waarde),0) APB_10_score,
                  COALESCE(fac.safe_to_number(APB_11.mld_kenmerkmelding_waarde),0) APB_11_score,
                  COALESCE(fac.safe_to_number(APB_12.mld_kenmerkmelding_waarde),0) APB_12_score,
                  COALESCE(fac.safe_to_number(APB_13.mld_kenmerkmelding_waarde),0) APB_13_score,
                  COALESCE(fac.safe_to_number(APB_14.mld_kenmerkmelding_waarde),0) APB_14_score,
                  COALESCE(fac.safe_to_number(APB_15.mld_kenmerkmelding_waarde),0) APB_15_score,
                  COALESCE(fac.safe_to_number(APB_16.mld_kenmerkmelding_waarde),0) APB_16_score,
                  COALESCE(fac.safe_to_number(APB_18.mld_kenmerkmelding_waarde),0) APB_18_score,
                  COALESCE(fac.safe_to_number(APB_25.mld_kenmerkmelding_waarde),0) APB_25_score,
                  COALESCE(fac.safe_to_number(APB_26.mld_kenmerkmelding_waarde),0) APB_26_score,
                  COALESCE(fac.safe_to_number(APB_27.mld_kenmerkmelding_waarde),0) APB_27_score,
                  COALESCE(fac.safe_to_number(APB_20.mld_kenmerkmelding_waarde),0) APB_20_score
             FROM mld_melding m,
             			(SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1539) APB_24,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1547) APB_07,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1559) APB_08,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1546) APB_09,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1561) APB_10,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1560) APB_11,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1549) APB_12,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1562) APB_13,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1557) APB_14,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1558) APB_15,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1567) APB_16,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1566) APB_18,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1568) APB_25,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1570) APB_26,
									(SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1548) APB_27,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1565) APB_20
                 -- alg_locatie dloc
            WHERE m.mld_stdmelding_key = 2946
							AND m.mld_melding_status NOT IN (1)
            --  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND APB_24.mld_melding_key(+) = m.mld_melding_key
              AND APB_07.mld_melding_key(+) = m.mld_melding_key
              AND APB_08.mld_melding_key(+) = m.mld_melding_key
              AND APB_09.mld_melding_key(+) = m.mld_melding_key
              AND APB_10.mld_melding_key(+) = m.mld_melding_key
              AND APB_11.mld_melding_key(+) = m.mld_melding_key
              AND APB_12.mld_melding_key(+) = m.mld_melding_key
              AND APB_13.mld_melding_key(+) = m.mld_melding_key
              AND APB_14.mld_melding_key(+) = m.mld_melding_key
              AND APB_15.mld_melding_key(+) = m.mld_melding_key
              AND APB_16.mld_melding_key(+) = m.mld_melding_key
              AND APB_18.mld_melding_key(+) = m.mld_melding_key
              AND APB_25.mld_melding_key(+) = m.mld_melding_key
              AND APB_26.mld_melding_key(+) = m.mld_melding_key
              AND APB_27.mld_melding_key(+) = m.mld_melding_key
              AND APB_20.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                DECODE(n.kpi_code,
                       'APB', ((DECODE(APB_24_score, 0, 1, APB_24_score)  -  1) * 2) +
                       			 (ABS(APB_07_score - 1) * 10)  +
                             (ABS(APB_08_score - 1) * 10)  +
                             (ABS(APB_09_score - 1) * 10)  +
                             (ABS(APB_10_score - 1) * 10)  +
                             (ABS(APB_11_score - 1) * 10)  +
                             (ABS(APB_12_score - 1) * 10)  +
                             (ABS(APB_13_score - 1) * 10)  +
                             (ABS(APB_14_score - 1) * 10)  +
                             (ABS(APB_15_score - 1) * 10)  +
                             CASE
													        WHEN APB_16_score < 1 THEN 10
													        WHEN APB_16_score < 2 THEN 7.5
													        WHEN APB_16_score < 3 THEN 5
													        ELSE 0
													   END +
                             (ABS(APB_18_score - 1) * 10)  +
                             CASE
													        WHEN to_char(k.periode,'YYYY') = '2016' AND APB_25_score < 7  THEN 10
													        WHEN to_char(k.periode,'YYYY') >= '2017' AND APB_25_score < 9  THEN 10
													        ELSE 0
													   END +
                             CASE
													        WHEN APB_26_score < 38  THEN 10
													        ELSE 0
													   END +
                             CASE
													        WHEN APB_27_score < 22.5  THEN 10
													        ELSE 0
													   END +
                             (ABS(APB_20_score - 1) * 10)
                       ) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_csu k) m;


-- Agv ARAI#37911: kenmerken verhuizen naar csu-view naar de rai-view van kavel 2 (APB), die zijn uit bovenstaande verwijderd en hieronder neergezet
-- Verschil zit 'm in meld_stdmelding_key:
-- De verhuisde kenmerk-keys van 2946 naar mld_stdmelding_key 2945 zijn:
-- 1563 (APB_21)
-- 1538 (APB_17)
-- 1564 (APB_19)
-- 1555 (APB_28)
-- 1550 (APB_29)
-- 1544 (APB_06)
-- 1556 (APB_05)
-- 1537 (APB_23)

CREATE OR REPLACE VIEW arai_v_kpi_apb_csu_2_rai
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'APB'),
        scores_csu AS
        (SELECT   m.mld_melding_key,
                  1 alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(APB_05.mld_kenmerkmelding_waarde),0) APB_05_score,
                  COALESCE(fac.safe_to_number(APB_23.mld_kenmerkmelding_waarde),0) APB_23_score,
                  COALESCE(fac.safe_to_number(APB_06.mld_kenmerkmelding_waarde),0) APB_06_score,
                  COALESCE(fac.safe_to_number(APB_21.mld_kenmerkmelding_waarde),0) APB_21_score,
                  COALESCE(fac.safe_to_number(APB_17.mld_kenmerkmelding_waarde),0) APB_17_score,
                  COALESCE(fac.safe_to_number(APB_19.mld_kenmerkmelding_waarde),0) APB_19_score,
                  COALESCE(fac.safe_to_number(APB_28.mld_kenmerkmelding_waarde),0) APB_28_score,
                  COALESCE(fac.safe_to_number(APB_29.mld_kenmerkmelding_waarde),0) APB_29_score
             FROM mld_melding m,
             			(SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1556) APB_05,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1537) APB_23,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1544) APB_06,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1563) APB_21,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1538) APB_17,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1564) APB_19,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1555) APB_28,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1550) APB_29
                --  alg_locatie dloc
            WHERE m.mld_stdmelding_key = 2945
							AND m.mld_melding_status NOT IN (1)
             -- AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND APB_05.mld_melding_key(+) = m.mld_melding_key
              AND APB_23.mld_melding_key(+) = m.mld_melding_key
              AND APB_06.mld_melding_key(+) = m.mld_melding_key
              AND APB_21.mld_melding_key(+) = m.mld_melding_key
              AND APB_17.mld_melding_key(+) = m.mld_melding_key
              AND APB_19.mld_melding_key(+) = m.mld_melding_key
              AND APB_28.mld_melding_key(+) = m.mld_melding_key
              AND APB_29.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                DECODE(n.kpi_code,
                       'APB',		 (APB_05_score * 10) +
                       					 (APB_23_score * 2) +
                             		 (APB_06_score * 5)  +
                             (ABS(APB_21_score - 1) * 10)  +
                             (APB_17_score * 2) +
                             (ABS(APB_19_score - 1) * 10)  +
                             (ABS(APB_28_score - 1) * 10) +
                             (ABS(APB_29_score - 1) * 10)
                       ) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_csu k) m;




-- KAVEL 3
-- Back of House cijfers door RAI
-- Deze komen uit de melding met std_melding_key 2947
CREATE OR REPLACE VIEW arai_v_kpi_bh_rai
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'BH'),
        scores_rai AS
        (SELECT   m.mld_melding_key,
                  1 alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(BH_01.mld_kenmerkmelding_waarde),0) BH_01_score,
                  COALESCE(fac.safe_to_number(BH_02.mld_kenmerkmelding_waarde),0) BH_02_score,
                  COALESCE(fac.safe_to_number(BH_03.mld_kenmerkmelding_waarde),0) BH_03_score,
                  COALESCE(fac.safe_to_number(BH_04.mld_kenmerkmelding_waarde),0) BH_04_score
             FROM mld_melding m,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1574) BH_01,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1573) BH_02,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1580) BH_03,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1595) BH_04
                --  alg_locatie dloc
            WHERE m.mld_stdmelding_key = 2947
							AND m.mld_melding_status NOT IN (1)
            --  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND BH_01.mld_melding_key(+) = m.mld_melding_key
              AND BH_02.mld_melding_key(+) = m.mld_melding_key
              AND BH_03.mld_melding_key(+) = m.mld_melding_key
              AND BH_04.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                DECODE(n.kpi_code,
                       'BH', 	    (BH_01_score * 2) +
                       			 	(BH_02_score * 2) +
                       			 	(ABS(BH_03_score - 1) * 10)  +
                       			 	(ABS(BH_04_score - 1) * 10)
                       ) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_rai k) m;

-- KAVEL 3
-- Kantoorschoonmaak cijfers door CSU
-- Deze komen uit de melding met std_melding_key 2948
CREATE OR REPLACE VIEW arai_v_kpi_bh_csu
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'BH'),
        scores_csu AS
        (SELECT   m.mld_melding_key,
                  1 alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(BH_07.mld_kenmerkmelding_waarde),0) BH_07_score,
                  COALESCE(fac.safe_to_number(BH_08.mld_kenmerkmelding_waarde),0) BH_08_score,
                  COALESCE(fac.safe_to_number(BH_09.mld_kenmerkmelding_waarde),0) BH_09_score,
                  COALESCE(fac.safe_to_number(BH_10.mld_kenmerkmelding_waarde),0) BH_10_score,
                  COALESCE(fac.safe_to_number(BH_11.mld_kenmerkmelding_waarde),0) BH_11_score,
                  COALESCE(fac.safe_to_number(BH_12.mld_kenmerkmelding_waarde),0) BH_12_score,
                  COALESCE(fac.safe_to_number(BH_13.mld_kenmerkmelding_waarde),0) BH_13_score,
                  COALESCE(fac.safe_to_number(BH_14.mld_kenmerkmelding_waarde),0) BH_14_score,
                  COALESCE(fac.safe_to_number(BH_15.mld_kenmerkmelding_waarde),0) BH_15_score,
                  COALESCE(fac.safe_to_number(BH_16.mld_kenmerkmelding_waarde),0) BH_16_score,
                  COALESCE(fac.safe_to_number(BH_18.mld_kenmerkmelding_waarde),0) BH_18_score,
                  COALESCE(fac.safe_to_number(BH_22.mld_kenmerkmelding_waarde),0) BH_22_score,
                  COALESCE(fac.safe_to_number(BH_20.mld_kenmerkmelding_waarde),0) BH_20_score
             FROM mld_melding m,
             			(SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1578) BH_07,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1586) BH_08,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1577) BH_09,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1588) BH_10,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1587) BH_11,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1579) BH_12,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1589) BH_13,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1584) BH_14,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1585) BH_15,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1594) BH_16,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1593) BH_18,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1571) BH_22,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1592) BH_20
                --  alg_locatie dloc
            WHERE m.mld_stdmelding_key = 2948
							AND m.mld_melding_status NOT IN (1)
             -- AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND BH_07.mld_melding_key(+) = m.mld_melding_key
              AND BH_08.mld_melding_key(+) = m.mld_melding_key
              AND BH_09.mld_melding_key(+) = m.mld_melding_key
              AND BH_10.mld_melding_key(+) = m.mld_melding_key
              AND BH_11.mld_melding_key(+) = m.mld_melding_key
              AND BH_12.mld_melding_key(+) = m.mld_melding_key
              AND BH_13.mld_melding_key(+) = m.mld_melding_key
              AND BH_14.mld_melding_key(+) = m.mld_melding_key
              AND BH_15.mld_melding_key(+) = m.mld_melding_key
              AND BH_16.mld_melding_key(+) = m.mld_melding_key
              AND BH_18.mld_melding_key(+) = m.mld_melding_key
              AND BH_22.mld_melding_key(+) = m.mld_melding_key
              AND BH_20.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                DECODE(n.kpi_code,
                       'BH', (ABS(BH_07_score - 1) * 10)  +
                             (ABS(BH_08_score - 1) * 10)  +
                             (ABS(BH_09_score - 1) * 10)  +
                             (ABS(BH_10_score - 1) * 10)  +
                             (ABS(BH_11_score - 1) * 10)  +
                             (ABS(BH_12_score - 1) * 10)  +
                             (ABS(BH_13_score - 1) * 10)  +
                             (ABS(BH_14_score - 1) * 10)  +
                             (ABS(BH_15_score - 1) * 10)  +
                             CASE
													        WHEN BH_16_score < 1 THEN 10
													        WHEN BH_16_score < 2 THEN 7.5
													        WHEN BH_16_score < 3 THEN 5
													        ELSE 0
													   END +
                             (ABS(BH_18_score - 1) * 10)  +
                             (ABS(BH_22_score - 1) * 10)  +
                             (ABS(BH_20_score - 1) * 10)
                       ) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_csu k) m;

-- Agv ARAI#37911: kenmerken verhuizen naar csu-view naar de rai-view van kavel 3 (BH), die zijn uit bovenstaande verwijderd en hieronder neergezet
-- Verschil zit 'm in meld_stdmelding_key:
-- De verhuisde kenmerk-keys van 2948 naar mld_stdmelding_key 2947 zijn:
-- 1590 (BH_21)
-- 1572 (BH_17)
-- 1591 (BH_19)
-- 1575 (BH_06)
-- 1583 (BH_05)
CREATE OR REPLACE VIEW arai_v_kpi_bh_csu_2_rai
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'BH'),
        scores_csu AS
        (SELECT   m.mld_melding_key,
                  1 alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(BH_05.mld_kenmerkmelding_waarde),0) BH_05_score,
                  COALESCE(fac.safe_to_number(BH_06.mld_kenmerkmelding_waarde),0) BH_06_score,
                  COALESCE(fac.safe_to_number(BH_21.mld_kenmerkmelding_waarde),0) BH_21_score,
                  COALESCE(fac.safe_to_number(BH_17.mld_kenmerkmelding_waarde),0) BH_17_score,
                  COALESCE(fac.safe_to_number(BH_19.mld_kenmerkmelding_waarde),0) BH_19_score
             FROM mld_melding m,
             			(SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1583) BH_05,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1575) BH_06,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1590) BH_21,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1572) BH_17,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1591) BH_19
                --  alg_locatie dloc
            WHERE m.mld_stdmelding_key = 2947
							AND m.mld_melding_status NOT IN (1)
            --  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND BH_05.mld_melding_key(+) = m.mld_melding_key
              AND BH_06.mld_melding_key(+) = m.mld_melding_key
              AND BH_21.mld_melding_key(+) = m.mld_melding_key
              AND BH_17.mld_melding_key(+) = m.mld_melding_key
              AND BH_19.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                DECODE(n.kpi_code,
                       'BH', 		 (BH_05_score * 10) +
                             		 (BH_06_score * 5)  +
                       			 (ABS(BH_21_score - 1) * 10)  +
                             (BH_17_score * 2) +
                             (ABS(BH_19_score - 1) * 10)
                       ) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_csu k) m;




-- KAVEL 4
-- Kantoorschoonmaak cijfers door RAI
-- Deze komen uit de melding met std_melding_key 2941
CREATE OR REPLACE VIEW arai_v_kpi_ks_rai
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'KS'),
        scores_rai AS
        (SELECT   m.mld_melding_key,
                  1 alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(KS_01.mld_kenmerkmelding_waarde),0) KS_01_score,
                  COALESCE(fac.safe_to_number(KS_02.mld_kenmerkmelding_waarde),0) KS_02_score,
                  COALESCE(fac.safe_to_number(KS_03.mld_kenmerkmelding_waarde),0) KS_03_score,
                  COALESCE(fac.safe_to_number(KS_04.mld_kenmerkmelding_waarde),0) KS_04_score
             FROM mld_melding m,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1483) KS_01,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1482) KS_02,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1489) KS_03,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1504) KS_04
                --  alg_locatie dloc
            WHERE m.mld_stdmelding_key = 2941
							AND m.mld_melding_status NOT IN (1)
            --  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND KS_01.mld_melding_key(+) = m.mld_melding_key
              AND KS_02.mld_melding_key(+) = m.mld_melding_key
              AND KS_03.mld_melding_key(+) = m.mld_melding_key
              AND KS_04.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                DECODE(n.kpi_code,
                       'KS', ((DECODE(KS_01_score, 0, 1, KS_01_score)  -  1) * 2) +
                       			 ((DECODE(KS_02_score, 0, 1, KS_02_score)  -  1) * 2) +
                       			 (ABS(KS_03_score - 1) * 10)  +
                       			 (ABS(KS_04_score - 1) * 10)
                       ) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_rai k) m;

-- KAVEL 4
-- Kantoorschoonmaak cijfers door CSU
-- Deze komen uit de melding met std_melding_key 2942
CREATE OR REPLACE VIEW arai_v_kpi_ks_csu
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'KS'),
        scores_csu AS
        (SELECT   m.mld_melding_key,
                  1 alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(KS_07.mld_kenmerkmelding_waarde),0) KS_07_score,
                  COALESCE(fac.safe_to_number(KS_08.mld_kenmerkmelding_waarde),0) KS_08_score,
                  COALESCE(fac.safe_to_number(KS_09.mld_kenmerkmelding_waarde),0) KS_09_score,
                  COALESCE(fac.safe_to_number(KS_10.mld_kenmerkmelding_waarde),0) KS_10_score,
                  COALESCE(fac.safe_to_number(KS_11.mld_kenmerkmelding_waarde),0) KS_11_score,
                  COALESCE(fac.safe_to_number(KS_12.mld_kenmerkmelding_waarde),0) KS_12_score,
                  COALESCE(fac.safe_to_number(KS_13.mld_kenmerkmelding_waarde),0) KS_13_score,
                  COALESCE(fac.safe_to_number(KS_14.mld_kenmerkmelding_waarde),0) KS_14_score,
                  COALESCE(fac.safe_to_number(KS_15.mld_kenmerkmelding_waarde),0) KS_15_score,
                  COALESCE(fac.safe_to_number(KS_16.mld_kenmerkmelding_waarde),0) KS_16_score,
                  COALESCE(fac.safe_to_number(KS_18.mld_kenmerkmelding_waarde),0) KS_18_score,
                  COALESCE(fac.safe_to_number(KS_20.mld_kenmerkmelding_waarde),0) KS_20_score
             FROM mld_melding m,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1487) KS_07,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1496) KS_08,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1486) KS_09,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1498) KS_10,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1497) KS_11,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1488) KS_12,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1499) KS_13,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1494) KS_14,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1495) KS_15,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1503) KS_16,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1502) KS_18,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1501) KS_20
                 -- alg_locatie dloc
            WHERE m.mld_stdmelding_key = 2942
							AND m.mld_melding_status NOT IN (1)
            --  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND KS_07.mld_melding_key(+) = m.mld_melding_key
              AND KS_08.mld_melding_key(+) = m.mld_melding_key
              AND KS_09.mld_melding_key(+) = m.mld_melding_key
              AND KS_10.mld_melding_key(+) = m.mld_melding_key
              AND KS_11.mld_melding_key(+) = m.mld_melding_key
              AND KS_12.mld_melding_key(+) = m.mld_melding_key
              AND KS_13.mld_melding_key(+) = m.mld_melding_key
              AND KS_14.mld_melding_key(+) = m.mld_melding_key
              AND KS_15.mld_melding_key(+) = m.mld_melding_key
              AND KS_16.mld_melding_key(+) = m.mld_melding_key
              AND KS_18.mld_melding_key(+) = m.mld_melding_key
              AND KS_20.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                DECODE(n.kpi_code,
                       'KS', (ABS(KS_07_score - 1) * 10)  +
                             (ABS(KS_08_score - 1) * 10)  +
                             (ABS(KS_09_score - 1) * 10)  +
                             (ABS(KS_10_score - 1) * 10)  +
                             (ABS(KS_11_score - 1) * 10)  +
                             (ABS(KS_12_score - 1) * 10)  +
                             (ABS(KS_13_score - 1) * 10)  +
                             (ABS(KS_14_score - 1) * 10)  +
                             (ABS(KS_15_score - 1) * 10)  +
                             CASE
													        WHEN KS_16_score < 1 THEN 10
													        WHEN KS_16_score < 2 THEN 7.5
													        WHEN KS_16_score < 3 THEN 5
													        ELSE 0
													   END +
                             (ABS(KS_18_score - 1) * 10)  +
                             (ABS(KS_20_score - 1) * 10)
                       ) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_csu k) m;

-- Agv ARAI#37911: kenmerken verhuizen naar csu-view naar de rai-view van kavel 4 (KS), die zijn uit bovenstaande verwijderd en hieronder neergezet
-- Verschil zit 'm in meld_stdmelding_key:
-- De verhuisde kenmerk-keys van 2942 naar mld_stdmelding_key 2941 zijn:
-- 1481 (KS_17)
-- 1500 (KS_19)
-- 1484 (KS_06)
-- 1492 (KS_05)
CREATE OR REPLACE VIEW arai_v_kpi_ks_csu_2_rai
AS
   WITH normen AS
        (SELECT kpi_definitie_key,
                kpi_definitie_code kpi_code,
                kpi_definitie_categorie1 kpi_cat1,
                kpi_definitie_categorie2 kpi_cat2,
                kpi_definitie_drempels normscores,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 1)) n000,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 2)) n070,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 3)) n090,
                fac.safe_to_number(REGEXP_SUBSTR(kpi_definitie_drempels, '[^|]+', 1, 4)) n100
           FROM kpi_definitie
          WHERE kpi_definitie_code = 'KS'),
        scores_csu AS
        (SELECT   m.mld_melding_key,
                  1 alg_locatie_key,
                  TRUNC(m.mld_melding_einddatum, 'MM') periode,
                  COALESCE(fac.safe_to_number(KS_05.mld_kenmerkmelding_waarde),0) KS_05_score,
                  COALESCE(fac.safe_to_number(KS_06.mld_kenmerkmelding_waarde),0) KS_06_score,
                  COALESCE(fac.safe_to_number(KS_17.mld_kenmerkmelding_waarde),0) KS_17_score,
                  COALESCE(fac.safe_to_number(KS_19.mld_kenmerkmelding_waarde),0) KS_19_score
             FROM mld_melding m,
             			(SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1492) KS_05,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1484) KS_06,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1481) KS_17,
                  (SELECT * FROM mld_kenmerkmelding
                    WHERE mld_kenmerkmelding_verwijder IS NULL AND mld_kenmerk_key = 1500) KS_19
                 -- alg_locatie dloc
            WHERE m.mld_stdmelding_key = 2941
							AND m.mld_melding_status NOT IN (1)
            --  AND dloc.alg_locatie_key = m.mld_alg_locatie_key
              AND KS_05.mld_melding_key(+) = m.mld_melding_key
              AND KS_06.mld_melding_key(+) = m.mld_melding_key
              AND KS_17.mld_melding_key(+) = m.mld_melding_key
              AND KS_19.mld_melding_key(+) = m.mld_melding_key
          )
   SELECT kpi_definitie_key, periode kpi_score_datum, alg_locatie_key,
          'melding' kpi_score_xmlnode, mld_melding_key kpi_score_refkey,
          n000, n070, n090, n100,
          kpi.getNormScore(score, n000, n070, n090, n100) kpi_score_score,
          normscores  kpi_score_norm_score,
          SUBSTR( TO_CHAR(score), 1, 20) kpi_score_drempels
     FROM (
         SELECT n.kpi_definitie_key, n.normscores,
                k.mld_melding_key,
                k.alg_locatie_key,
                k.periode,
                n.kpi_cat1 proces,
                n.kpi_cat2 onderdeel,
                DECODE(n.kpi_code,
                       'KS', (KS_05_score * 10) +
                             (KS_06_score * 5)  +
                       			 (KS_17_score * 2) +
                             (ABS(KS_19_score - 1) * 10)
                       ) score,
                n.n000, n.n070, n.n090, n.n100
           FROM normen n, scores_csu k) m;



CREATE OR REPLACE VIEW arai_v_kpi_ks
(kpi_definitie_key, kpi_score_datum, alg_locatie_key, kpi_score_xmlnode, kpi_score_refkey, kpi_score_score, kpi_score_norm_score, kpi_score_drempels)
AS
SELECT kpi_definitie_key, kpi_score_datum, alg_locatie_key, 'melding' kpi_score_xmlnode, NULL kpi_score_refkey, kpi.getNormScore(SUM(kpi_score_drempels), n000, n070, n090, n100), MIN(KPI_SCORE_NORM_SCORE), SUM(kpi_score_drempels)
FROM
    (SELECT * FROM arai_v_kpi_ks_rai r
    UNION
    SELECT * FROM arai_v_kpi_ks_csu c
    UNION
    SELECT * FROM arai_v_kpi_ks_csu_2_rai cr
    )
GROUP BY kpi_definitie_key, kpi_score_datum, alg_locatie_key, n000, n070, n090, n100;

CREATE OR REPLACE VIEW arai_v_kpi_bh
(kpi_definitie_key, kpi_score_datum, alg_locatie_key, kpi_score_xmlnode, kpi_score_refkey, kpi_score_score, kpi_score_norm_score, kpi_score_drempels)
AS
SELECT kpi_definitie_key, kpi_score_datum, alg_locatie_key, 'melding' kpi_score_xmlnode, NULL kpi_score_refkey, kpi.getNormScore(SUM(kpi_score_drempels), n000, n070, n090, n100), MIN(KPI_SCORE_NORM_SCORE), SUM(kpi_score_drempels)
FROM
    (SELECT * FROM arai_v_kpi_bh_rai r
    UNION
    SELECT * FROM arai_v_kpi_bh_csu c
    UNION
    SELECT * FROM arai_v_kpi_bh_csu_2_rai cr
    )
GROUP BY kpi_definitie_key, kpi_score_datum, alg_locatie_key, n000, n070, n090, n100;

CREATE OR REPLACE VIEW arai_v_kpi_apb
(kpi_definitie_key, kpi_score_datum, alg_locatie_key, kpi_score_xmlnode, kpi_score_refkey, kpi_score_score, kpi_score_norm_score, kpi_score_drempels)
AS
SELECT kpi_definitie_key, kpi_score_datum, alg_locatie_key, 'melding' kpi_score_xmlnode, NULL kpi_score_refkey, kpi.getNormScore(SUM(kpi_score_drempels), n000, n070, n090, n100), MIN(KPI_SCORE_NORM_SCORE), SUM(kpi_score_drempels)
FROM
    (SELECT * FROM arai_v_kpi_apb_rai r
    UNION
    SELECT * FROM arai_v_kpi_apb_csu c
    UNION
    SELECT * FROM arai_v_kpi_apb_csu_2_rai cr
    )
GROUP BY kpi_definitie_key, kpi_score_datum, alg_locatie_key, n000, n070, n090, n100;

CREATE OR REPLACE VIEW arai_v_kpi_es
(kpi_definitie_key, kpi_score_datum, alg_locatie_key, kpi_score_xmlnode, kpi_score_refkey, kpi_score_score, kpi_score_norm_score, kpi_score_drempels)
AS
SELECT kpi_definitie_key, kpi_score_datum, alg_locatie_key, 'melding' kpi_score_xmlnode, NULL kpi_score_refkey, kpi.getNormScore(SUM(kpi_score_drempels), n000, n070, n090, n100), MIN(KPI_SCORE_NORM_SCORE), SUM(kpi_score_drempels)
FROM
    (SELECT * FROM arai_v_kpi_es_rai r
    UNION
    SELECT * FROM arai_v_kpi_es_csu c
    UNION
    SELECT * FROM arai_v_kpi_es_csu_2_rai cr
    )
GROUP BY kpi_definitie_key, kpi_score_datum, alg_locatie_key, n000, n070, n090, n100;

CREATE OR REPLACE VIEW arai_v_kpi_all
AS
   SELECT * FROM arai_v_kpi_ks
UNION ALL
	 SELECT * FROM arai_v_kpi_bh
UNION ALL
	 SELECT * FROM arai_v_kpi_apb
UNION ALL
	 SELECT * FROM arai_v_kpi_es;

CREATE OR REPLACE PACKAGE arai
AS
   PROCEDURE refreshscore(pUserKey IN NUMBER);
    FUNCTION get_flex_value (
    pmodule               IN VARCHAR2,
    p_kenmerk_key         IN NUMBER,
    p_ref_key             IN NUMBER,
    p_kenmerkdomein_key   IN NUMBER,
    p_niveau              IN VARCHAR2 DEFAULT NULL)
    RETURN VARCHAR2;
END;
/

CREATE OR REPLACE PACKAGE BODY arai
AS
   PROCEDURE refreshscore(pUserKey IN NUMBER)
   AS
   BEGIN
     -- Waarden van de huidige periode(s) verwijderen.
     -- TODO: tricky met KPI's op basis van storingsmeldingen, klachten etc; daar kan voor een
     -- periode maar zo een extra melding afgemeld worden, waardoor de score opnieuw berekend wordt

     DELETE FROM kpi_score;

      --WHERE (kpi_definitie_key, kpi_score_datum, alg_locatie_key) IN (
        -- SELECT DISTINCT kpi_definitie_key, kpi_score_datum, alg_locatie_key
          -- FROM demo_v_kpi_all);

     -- Opnieuw genereren van KPI scores
      INSERT INTO kpi_score (
         kpi_definitie_key,
         kpi_score_datum,
         alg_locatie_key,
         kpi_score_xmlnode,
         kpi_score_refkey,
         kpi_score_score,
         kpi_score_norm_score,
         kpi_score_drempels)
      SELECT * FROM arai_v_kpi_all;

      COMMIT;
   END;
    FUNCTION get_flex_value (
    pmodule               IN VARCHAR2,
    p_kenmerk_key         IN NUMBER,
    p_ref_key             IN NUMBER,
    p_kenmerkdomein_key   IN NUMBER,
    p_niveau              IN VARCHAR2 DEFAULT NULL)
    RETURN VARCHAR2
AS
    v_value               VARCHAR2 (4000);
    v_kenmerkdomein_key   NUMBER (10);
BEGIN
    v_value :=
        flx.getflex (pmodule,
                     p_kenmerk_key,
                     p_ref_key,
                     p_niveau);

    IF p_kenmerkdomein_key IS NOT NULL
    THEN
        v_value := flx.getdomeinwaarde (p_kenmerkdomein_key, v_value);
    END IF;
    RETURN v_value;
END;
END;
/

-- ARAI#37083 QR Code alle objecten
CREATE OR REPLACE VIEW arai_v_ins_qrc_mld
AS
   SELECT i.ins_deel_omschrijving hide_f_sort,
          l.alg_locatie_code||' '||l.alg_locatie_omschrijving fclt_f_locatie,
          o.alg_gebouw_omschrijving fclt_f_gebouw,
          o.alg_plaatsaanduiding fclt_f_plaats,
          d.ins_discipline_omschrijving fclt_f_discipline,
          g.ins_srtgroep_omschrijving fclt_f_objectgroep,
          s.ins_srtdeel_omschrijving fclt_f_objectsoort,
          i.ins_deel_omschrijving fclt_f_identificatie,
          d.ins_discipline_omschrijving||' / '||sm.mld_stdmelding_omschrijving fclt_f_melding,
          i.ins_deel_key,
          s.ins_srtdeel_key,
          o.alg_gebouw_code,
          o.alg_verdieping_code,
          i.ins_discipline_key fclt_3d_discipline_key,
          l.alg_locatie_key fclt_3d_locatie_key,
          i.ins_alg_ruimte_type,
          i.ins_alg_ruimte_key,
          b.fac_bookmark_id hide_f_bookmark_id
     FROM ins_deel i,
          ins_v_alg_overzicht o,
          ins_srtdeel s,
          ins_srtgroep g,
          ins_discipline d,
          alg_locatie l,
          fac_bookmark b,
          mld_stdmelding sm,
          mld_stdmelding_srtinst si
    WHERE b.fac_bookmark_naam = 'QRC_MELDING'
      AND (b.fac_bookmark_expire IS NULL OR b.fac_bookmark_expire > SYSDATE)
      AND ins_deel_verwijder IS NULL
      AND i.ins_deel_module = 'INS'
      AND i.ins_deel_parent_key IS NULL
      AND s.ins_srtdeel_key = i.ins_srtdeel_key
      AND g.ins_srtgroep_key = s.ins_srtgroep_key
      AND d.ins_discipline_key = g.ins_discipline_key
      AND o.alg_onroerendgoed_keys = i.ins_alg_ruimte_key
      AND o.alg_onroerendgoed_type = i.ins_alg_ruimte_type
      AND i.ins_alg_ruimte_type IN ('T', 'R', 'W')
      AND o.alg_locatie_key = i.ins_alg_locatie_key
      AND i.ins_alg_locatie_key = l.alg_locatie_key
      AND sm.mld_stdmelding_key = si.mld_stdmelding_key
      AND si.ins_srtinstallatie_key = DECODE(si.ins_srtinstallatie_niveau,
                                      'S', i.ins_srtdeel_key,
                                      'G', s.ins_srtgroep_key,
                                      'D', g.ins_discipline_key);

CREATE OR REPLACE VIEW arai_v_rap_dagrap_gegevens
(
   melding_key,
   afdeling,
   evenement,
   meldingdatum,
   kenmerkvolgnr,
   kenmerkoms,
   kenmerkwaarde
)
AS
   SELECT DISTINCT
          m.mld_melding_key,
          std.mld_stdmelding_omschrijving || ' '
          || (SELECT fac_usrdata_omschr
                FROM fac_usrdata
               WHERE fac_usrdata_key =
                        (SELECT mld_kenmerkmelding_waarde
                           FROM mld_kenmerkmelding km, mld_kenmerk k
                          WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                                AND km.mld_melding_key = m.mld_melding_key
                                AND k.mld_srtkenmerk_key = 1041)),
          (SELECT evenement
             FROM arai_v_events
            WHERE arai_events_key =
                     (SELECT mld_kenmerkmelding_waarde
                        FROM mld_kenmerkmelding km, mld_kenmerk k
                       WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                             AND km.mld_melding_key = m.mld_melding_key
                             AND k.mld_srtkenmerk_key = 283)),
          m.mld_melding_datum,
          mk.mld_kenmerk_volgnummer,
          msk.mld_srtkenmerk_omschrijving,
             --   TO_CHAR (m.mld_melding_datum, 'hh24:mi') || ' ' || -- Voor het sorteren op het inlegmoment van de melding
             SUBSTR (p.prs_perslid_voornaam, 1, 1)
          || SUBSTR (p.prs_perslid_naam, 1, 1)
          || ': '
          || ARAI.get_flex_value ('MLD',
                                  mk.mld_kenmerk_key,
                                  m.mld_melding_key,
                                  msk.fac_kenmerkdomein_key,
                                  'm')
     FROM mld_srtkenmerk msk,
          mld_kenmerk mk,
          mld_kenmerkmelding km,
          mld_melding m,
          mld_stdmelding std,
          prs_perslid p
    WHERE msk.mld_srtkenmerk_key = mk.mld_srtkenmerk_key
          AND msk.mld_srtkenmerk_key IN
                   (1001,
                    961,
                    1002,
                    943,
                    941,
                    944,
                    942,
                    922,
                    1003,
                    1029,
                    1030,
                    921,
                    1021,
                    1022,
                    1028,
                    1027,
                    1024,
                    1025,
                    1026,
                    1023)
          AND km.mld_kenmerk_key = mk.mld_kenmerk_key
          AND km.mld_melding_key = m.mld_melding_key
          AND m.mld_stdmelding_key = std.mld_stdmelding_key
          AND m.prs_perslid_key = p.prs_perslid_key
          AND std.mld_ins_discipline_key = 1541;

-- Onderstaande is t.b.v. de UDR dagrap, bevat meer kenmerksoorten          
CREATE OR REPLACE VIEW arai_v_rap_dagrap_extradata
(
   melding_key,
   afdeling,
   evenement,
   meldingdatum,
   kenmerkvolgnr,
   kenmerkoms,
   kenmerkwaarde
)
AS
SELECT DISTINCT 
          m.mld_melding_key,
          std.mld_stdmelding_omschrijving,
          (SELECT evenement
             FROM arai_v_events
            WHERE arai_events_key =
                     (SELECT mld_kenmerkmelding_waarde
                        FROM mld_kenmerkmelding km, mld_kenmerk k
                       WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                             AND km.mld_melding_key = m.mld_melding_key
                             AND k.mld_srtkenmerk_key = 283)),
          m.mld_melding_datum,
          mk.mld_kenmerk_volgnummer,
          msk.mld_srtkenmerk_omschrijving,
          SUBSTR (p.prs_perslid_voornaam, 1, 1) || SUBSTR (p.prs_perslid_naam, 1, 1) || ': ' ||
          ARAI.get_flex_value (
          'MLD',
          mk.mld_kenmerk_key,
          m.mld_melding_key,
          msk.fac_kenmerkdomein_key,
          'm')
     FROM mld_srtkenmerk msk,
          mld_kenmerk mk,
          mld_kenmerkmelding km,
          mld_melding m,
          mld_stdmelding std,
          prs_perslid p
    WHERE msk.mld_srtkenmerk_key = mk.mld_srtkenmerk_key
          AND msk.mld_srtkenmerk_key IN
                   (1001,
                    961,
                    1002,
                    943,
                    941,
                    944,
                    942,
                    922,
                    1003,
                    1029,
                    1030,
                    921,
                    1021,
                    1022,
                    1028,
                    1027,
                    1024,
                    1025,
                    1026,
                    1023,
                   -- 1104,
                   -- 1103,
                    1106,
                    1141,
                    1041)
          AND km.mld_kenmerk_key = mk.mld_kenmerk_key
          AND km.mld_melding_key = m.mld_melding_key
          AND m.mld_stdmelding_key = std.mld_stdmelding_key
          AND m.prs_perslid_key = p.prs_perslid_key
          AND std.mld_ins_discipline_key = 1541;          
          
-- Deze dagrap_report is voor gebruik als rapportage in Facilitor, hier kan ook historie in bekeken worden.          
CREATE OR REPLACE VIEW arai_v_rap_dagrap_report
(
   evenement,
   meldingdatum,
   weeknummer,
   kenmerkoms,
   event_managenent,
   food_beverage,
   safety_security,
   front_office,
   facilities_warehouse,
   technical_services,
   traffic_management,
   ict,
   flexmanagement_hcc,
   hide_f_sort
)
AS
     SELECT x.*, y.kenmerkvolgnr
       FROM    (  SELECT afdeling,
                         evenement || ' ('
                         || (SELECT MAX(fac.safe_to_number(SUBSTR (
                                                              a.kenmerkwaarde,
                                                              4,
                                                              INSTR (
                                                                 a.kenmerkwaarde,
                                                                 ':')
                                                              + 50)))
                               FROM arai_v_rap_dagrap_gegevens a
                              WHERE a.kenmerkoms LIKE '%Bezoeker%'
                                    AND a.evenement = b.evenement)
                         || ' bezoekers)'
                            evenement,
                           TRUNC (meldingdatum),
                         TO_CHAR (meldingdatum, 'IW-YYYY') week,
                         kenmerkoms,
                         LISTAGG (kenmerkwaarde, ', ')
                            WITHIN GROUP (ORDER BY meldingdatum)
                            kenmerkwaarde
                    FROM arai_v_rap_dagrap_gegevens b
                GROUP BY afdeling, evenement, kenmerkoms, meldingdatum) PIVOT (MIN(kenmerkwaarde)
                                                          FOR afdeling
                                                          IN ('Event Management',
                                                          'Food & Beverage',
                                                          'Safety & Security',
                                                          'Front Office',
                                                          'Facilities/Warehouse',
                                                          'Technical Services',
                                                          'Traffic Management',
                                                          'ICT',
                                                          'Flexmanagement/HCC')) x
            LEFT JOIN
               (  SELECT MIN (kenmerkvolgnr) kenmerkvolgnr, kenmerkoms
                    FROM arai_v_rap_dagrap_gegevens
                GROUP BY kenmerkoms) y
            ON x.kenmerkoms = y.kenmerkoms
   ORDER BY x.evenement;

-- Nieuwe dagrapportage, klaar voor styling 
CREATE OR REPLACE VIEW arai_v_rap_dagrap_style
(
   datum,
   afdeling,
   evenement,
   kenmerkoms,
   kenmerkwaarde
)
AS
   SELECT TRUNC (SYSDATE - 1) datum, x.*
     FROM (  SELECT afdeling,
                    evenement || ' ('
                    || (SELECT MAX(fac.safe_to_number(SUBSTR (
                                                         a.kenmerkwaarde,
                                                         4,
                                                         INSTR (
                                                            a.kenmerkwaarde,
                                                            ':')
                                                         + 50)))
                          FROM arai_v_rap_dagrap_gegevens a
                         WHERE a.kenmerkoms LIKE '%Bezoeker%'
                               AND a.evenement = b.evenement
                               AND a.meldingdatum BETWEEN TRUNC (SYSDATE - 1)
                                                          + 6 / 24
                                                      AND  TRUNC (SYSDATE)
                                                           + 6 / 24)
                    || ' bezoekers)'
                       evenement,
                    kenmerkoms,
                    LISTAGG (kenmerkwaarde, ', ')
                       WITHIN GROUP (ORDER BY meldingdatum)
                       kenmerkwaarde
               FROM arai_v_rap_dagrap_gegevens b
              WHERE b.meldingdatum BETWEEN TRUNC (SYSDATE - 1) + 6 / 24
                                       AND  TRUNC (SYSDATE) + 6 / 24 -- Alleen meldingen tussen 06:00 en 06:00 uur (24 uur) van de vorige dag
           GROUP BY afdeling, evenement, kenmerkoms
           ORDER BY DECODE (afdeling,
                            'Event Management Congres Centre', 1,
                            'Event Management Holland Complex', 2,
                            'Event Management Europa Complex', 3,
                            'Event Management Gehele complex', 4,
                            'Food & Beverage', 5,
                            'Safety & Security', 6,
                            'Front Office', 7,
                            'Facilities/Warehouse', 8,
                            'Technical Services', 9,
                            'Traffic Management', 10,
                            'ICT', 11,
                            'Flexmanagement/HCC', 12,
                            13),
                    DECODE (kenmerkoms, 'Operationele bijzonderheden', 1, 2)) x,
          DUAL;
   
-- Deze dagrap is voor dagelijkse pdf export, hier zijn alleen evenementen zichtbaar die de vorige dag zijn afgerond.   
CREATE OR REPLACE VIEW arai_v_rap_dagrap
(
   evenement,
   kenmerkoms,
   event_management,
   food_beverage,
   safety_security,
   front_office,
   facilities_warehouse,
   technical_services,
   traffic_management,
   ict,
   flexmanagement_hcc,
   hide_f_sort
)
AS
     SELECT x.*, y.kenmerkvolgnr
       FROM    (  SELECT afdeling,
                         evenement || ' ('
                         || (SELECT MAX(fac.safe_to_number(SUBSTR (
                                                              a.kenmerkwaarde,
                                                              4,
                                                              INSTR (
                                                                 a.kenmerkwaarde,
                                                                 ':')
                                                              + 50)))
                               FROM arai_v_rap_dagrap_gegevens a
                              WHERE a.kenmerkoms LIKE '%Bezoeker%'
                                    AND a.evenement = b.evenement
                                    AND a.meldingdatum BETWEEN trunc (sysdate -1) + 6/24 AND trunc (sysdate) + 6/24)
                         || ' bezoekers)'
                            evenement,
                         kenmerkoms,
                         LISTAGG (kenmerkwaarde, ', ')
                            WITHIN GROUP (ORDER BY meldingdatum)
                            kenmerkwaarde
                    FROM arai_v_rap_dagrap_gegevens b
                    WHERE b.meldingdatum BETWEEN trunc (sysdate -1) + 6/24 AND trunc (sysdate) + 6/24  -- Alleen meldingen tussen 06:00 en 06:00 uur (24 uur) van de vorige dag
                GROUP BY afdeling, evenement, kenmerkoms) PIVOT (MIN(kenmerkwaarde)
                                                          FOR afdeling
                                                          IN ('Event Management',
                                                          'Food & Beverage',
                                                          'Safety & Security',
                                                          'Front Office',
                                                          'Facilities/Warehouse',
                                                          'Technical Services',
                                                          'Traffic Management',
                                                          'ICT',
                                                          'Flexmanagement/HCC')) x
            LEFT JOIN
               (  SELECT MIN (kenmerkvolgnr) kenmerkvolgnr, kenmerkoms
                    FROM arai_v_rap_dagrap_gegevens
                GROUP BY kenmerkoms) y
            ON x.kenmerkoms = y.kenmerkoms
   ORDER BY x.evenement;
   
   -- UDR samengevoegd met de dagrapportage. Voor meer filtering mogelijkheden.
  CREATE OR REPLACE VIEW arai_v_rap_dagrap_udr
(
   meldingnr,
   melder,
   afdeling,
   fclt_3d_afdeling_key,
   invoerder,
   fclt_3d_discipline_key,
   groep,
   subgroep,
   melding_status,
   datum,
   opmerking,
   evenement,
   kenmerk,
   kenmerkwaarde
)
AS
   SELECT mu.meldingnummer,
          mu.melder,
          mu.afdeling_omschrijving,
          mu.fclt_3d_afdeling_key,
          mu.invoerder,
          mu.fclt_3d_discipline_key,
          mu.subproductgroep,
         (SELECT f.fac_usrdata_omschr
          from fac_usrdata f where f.fac_usrdata_key =
          (SELECT mld_kenmerkmelding_waarde
                        FROM mld_kenmerkmelding km, mld_kenmerk k
                       WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                             AND km.mld_melding_key = mu.melding_key
                             AND k.mld_srtkenmerk_key IN (1103, 1104))) sub,
          mu.melding_status,
          TRUNC (mu.melding_datum),
          mu.melding_opmerking,
          ag.evenement,
          ag.kenmerkoms,
          ag.kenmerkwaarde
     FROM mld_v_udr_melding mu, arai_v_rap_dagrap_extradata ag
    WHERE mu.melding_key = ag.melding_key;

CREATE OR REPLACE VIEW arai_v_rap_mat_uur
(
   datum,
   aanvrager,
   organisatie,
   categorie,
   referentie,
   bedrag,
   status,
   kostenplaatsgroep,
   kostenplaatsnr,
   kostenplaats,
   kostensoortgroep,
   kostensoortnr,
   kostensoort,
   ordernr,
   locatie,
   district,
   regio,
   fclt_3d_locatie_key,
   fclt_3d_afdeling_key,
   materiaalkosten,
   uren,
   uurtarief,
   correctie,
   behandelaar,
   uitvoerder,
   vakgroeptype,
   vakgroep,
   evenement,
   opdrkey
)
AS
SELECT f.*,
       mo.mld_opdr_materiaal,
       COALESCE (mou.mld_opdr_uren_besteed, mo.mld_opdr_uren) uren,
       CASE
       WHEN mo.mld_opdr_uurloon IS NULL THEN p.prs_perslid_uurloon
       WHEN mo.mld_opdr_uurloon < 0.01 THEN p.prs_perslid_uurloon
       ELSE
       mo.mld_opdr_uurloon
       END,
       f.bedrag - COALESCE (mo.mld_opdr_materiaal, 0) - COALESCE (mld_opdr_uren * mo.mld_opdr_uurloon, 0) correctie,
       (SELECT prs_perslid_naam_full
          FROM prs_v_perslid_fullnames_all pf
         WHERE pf.prs_perslid_key = mo.prs_perslid_key)
          behandelaar,
       mu.naam,
       srt.ins_srtdiscipline_omschrijving,
       md.ins_discipline_omschrijving,
       mko.evenement,
       mo.mld_opdr_key
  FROM mld_opdr mo,
       mld_v_uitvoerende mu,
       mld_discipline md,
       ins_srtdiscipline srt,
       mld_melding m,
       mld_stdmelding std,
       prs_perslid p,
       mld_opdr_uren mou,
       (  SELECT datum,
                 p.prs_perslid_naam
                 || NVL2 (p.prs_perslid_voorletters,
                          ', ' || p.prs_perslid_voorletters,
                          '')
                 || NVL2 (p.prs_perslid_tussenvoegsel,
                          ' ' || p.prs_perslid_tussenvoegsel,
                          '')
                 || NVL2 (p.prs_perslid_voornaam,
                          ' (' || p.prs_perslid_voornaam || ')',
                          '')
                    aanvrager,
                 d.prs_afdeling_naam organisatie,
                 categorie,
                 categorienummer,
                 SUM (bedrag) bedrag,
                 status,
                 kpg.prs_kostenplaatsgrp_oms,
                 k.prs_kostenplaats_nr,
                 lcl.x ('prs_kostenplaats_omschrijving',
                        k.prs_kostenplaats_key,
                        k.prs_kostenplaats_omschrijving)
                    kostenplaats,
                 ksg.prs_kostensoortgrp_oms,
                 ks.prs_kostensoort_oms,
                 ks.prs_kostensoort_opmerking,
                 ordernr,
                 alg_locatie_code,
                 alg_district_omschrijving,
                 alg_regio_omschrijving,
                 alg_locatie_key,
                 d.prs_afdeling_key
            FROM (SELECT o.prs_kostenplaats_key,
                         o.mld_opdr_datumbegin datum,
                         m.prs_perslid_key prs_perslid_key,
                         mdis.ins_discipline_omschrijving categorie,
                            sd.ins_srtdiscipline_prefix
                         || m.mld_melding_key
                         || '/'
                         || o.mld_opdr_bedrijfopdr_volgnr
                            categorienummer,
                         COALESCE (o.mld_opdr_kosten, 0) bedrag,
                         s.mld_statusopdr_omschrijving status,
                         'MLD' module,
                         COALESCE (s.prs_kostensoort_key,
                                   mdis.prs_kostensoort_key)
                            prs_kostensoort_key,
                         o.mld_opdr_ordernr ordernr,
                         o.mld_opdr_key kostenplaats_item_key,
                         -1 kostenplaats_item_child_key,
                         m.mld_alg_locatie_key locatie_key
                    FROM mld_opdr o,
                         mld_typeopdr ot,
                         mld_melding m,
                         mld_stdmelding s,
                         mld_discipline mdis,
                         ins_srtdiscipline sd,
                         mld_statusopdr s
                   WHERE o.mld_typeopdr_key = ot.mld_typeopdr_key
                         AND o.mld_melding_key = m.mld_melding_key
                         AND s.mld_statusopdr_key = o.mld_statusopdr_key
                         AND m.mld_stdmelding_key = s.mld_stdmelding_key
                         AND mdis.ins_discipline_key = s.mld_ins_discipline_key
                         AND mdis.ins_srtdiscipline_key =
                               sd.ins_srtdiscipline_key
                         AND o.mld_statusopdr_key NOT IN (1, 2, 3, 4, 10)) tab,
                 prs_kostenplaats k,
                 prs_kostenplaatsgrp kpg,
                 prs_kostensoort ks,
                 prs_kostensoortgrp ksg,
                 prs_perslid p,
                 prs_v_afdeling d,
                 alg_locatie l,
                 alg_district d,
                 alg_regio r
           WHERE     tab.prs_kostenplaats_key(+) = k.prs_kostenplaats_key
                 AND tab.prs_kostensoort_key = ks.prs_kostensoort_key(+)
                 AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)
                 AND ks.prs_kostensoortgrp_key = ksg.prs_kostensoortgrp_key(+)
                 AND tab.prs_perslid_key = p.prs_perslid_key(+)
                 AND p.prs_afdeling_key = d.prs_afdeling_key(+)
                 AND tab.locatie_key = l.alg_locatie_key(+)
                 AND l.alg_district_key = d.alg_district_key(+)
                 AND d.alg_regio_key = r.alg_regio_key(+)
                 AND datum >= TO_DATE ('01-01-2010', 'DD-MM-YYYY')
        GROUP BY k.prs_kostenplaats_nr,
                 lcl.x ('prs_kostenplaats_omschrijving',
                        k.prs_kostenplaats_key,
                        k.prs_kostenplaats_omschrijving),
                 datum,
                 p.prs_perslid_naam
                 || NVL2 (p.prs_perslid_voorletters,
                          ', ' || p.prs_perslid_voorletters,
                          '')
                 || NVL2 (p.prs_perslid_tussenvoegsel,
                          ' ' || p.prs_perslid_tussenvoegsel,
                          '')
                 || NVL2 (p.prs_perslid_voornaam,
                          ' (' || p.prs_perslid_voornaam || ')',
                          ''),
                 d.prs_afdeling_naam,
                 d.prs_afdeling_key,
                 categorie,
                 categorienummer,
                 status,
                 kpg.prs_kostenplaatsgrp_oms,
                 ksg.prs_kostensoortgrp_oms,
                 ks.prs_kostensoort_oms,
                 ks.prs_kostensoort_opmerking,
                 ordernr,
                 ksg.prs_kostensoortgrp_oms,
                 alg_locatie_key,
                 alg_district_omschrijving,
                 alg_regio_omschrijving,
                 alg_locatie_code) f,
       (SELECT mkm.mld_melding_key,
               mkm.mld_kenmerkmelding_waarde,
               ae.evenement
          FROM mld_kenmerkmelding mkm, arai_v_events ae, mld_kenmerk mk
         WHERE mk.mld_srtkenmerk_key = 283
               AND ae.arai_events_key =
                     fac.safe_to_number (mkm.mld_kenmerkmelding_waarde)
               AND mkm.mld_kenmerkmelding_verwijder IS NULL
               AND mk.mld_kenmerk_key = mkm.mld_kenmerk_key) mko
 WHERE TO_CHAR (mo.mld_melding_key || '/' || mo.mld_opdr_bedrijfopdr_volgnr) =
          f.categorienummer
       AND mu.mld_uitvoerende_key = mo.mld_uitvoerende_keys
       AND m.mld_stdmelding_key = std.mld_stdmelding_key
       AND std.mld_ins_discipline_key = md.ins_discipline_key
       AND md.ins_srtdiscipline_key = srt.ins_srtdiscipline_key
       AND m.mld_melding_key = mo.mld_melding_key
       AND mo.mld_melding_key = mko.mld_melding_key(+)
       AND mou.prs_perslid_key = p.prs_perslid_key(+)
       AND mo.mld_opdr_key = mou.mld_opdr_key(+);
       
CREATE OR REPLACE VIEW arai_v_rap_mat_uur_berek
(
   datum,
   aanvrager,
   organisatie,
   referentie,
   status,
   kostenplaatsnr,
   kostenplaats,
   kostensoortnr,
   kostensoort,
   materiaalkosten,
   uren,
   uurtarief,
   behandelaar,
   uitvoerder,
   vakgroeptype,
   vakgroep,
   melding,
   evenement,
   opdrkey,
   totaal_berekend,
   correctie,
   totaal_na_cor
)
AS
     SELECT av.datum,
            av.aanvrager,
            av.organisatie,
            av.referentie,
            av.status,
            av.kostenplaatsnr,
            av.kostenplaats,
            av.kostensoortnr,
            av.kostensoort,
            av.materiaalkosten,
            SUM (av.uren),
            av.uurtarief,
            av.behandelaar,
            av.uitvoerder,
            av.vakgroeptype,
            av.vakgroep,
            sub2.mld_stdmelding_omschrijving,
            av.evenement,
            av.opdrkey,
            sub.totaal,
            av.correctie,
            sub.totaalecht
       FROM arai_v_rap_mat_uur av,
            (  SELECT referentie,
                      SUM (uren) * MAX (uurtarief)
                      + COALESCE (MAX (materiaalkosten), 0)
                         totaal,
                        SUM (uren) * MAX (uurtarief)
                      + COALESCE (MAX (materiaalkosten), 0)
                      + COALESCE (MAX (correctie), 0)
                         totaalecht
                 FROM arai_v_rap_mat_uur
             GROUP BY referentie) sub,
            (SELECT std.mld_stdmelding_omschrijving, o.mld_opdr_key
               FROM mld_stdmelding std, mld_melding m, mld_opdr o
              WHERE m.mld_stdmelding_key = std.mld_stdmelding_key
                    AND o.mld_melding_key = m.mld_melding_key) sub2
      WHERE av.referentie = sub.referentie AND av.opdrkey = sub2.mld_opdr_key
   GROUP BY av.datum,
            av.aanvrager,
            av.organisatie,
            av.referentie,
            av.status,
            av.kostenplaatsnr,
            av.kostenplaats,
            av.kostensoortnr,
            av.kostensoort,
            av.materiaalkosten,
            av.uurtarief,
            av.behandelaar,
            av.uitvoerder,
            av.vakgroeptype,
            av.vakgroep,
            av.evenement,
            av.opdrkey,
            sub.totaal,
            av.correctie,
            sub.totaalecht,
            sub2.mld_stdmelding_omschrijving;

CREATE OR REPLACE VIEW arai_v_rap_ortec
(
   melding_nr,
   datumtijd,
   vakgroep,
   melding,
   gereed,
   locatie,
   gebouw,
   gebouw_naam,
   verdieping,
   ruimte,
   standnummer,
   onderwerp,
   omschrijving,
   evenement,
   kenmerk_ebms,
   contactpersoon,
   telefoonnummer,
   email,
   rai_medewerker,
   leverancier,
   status,
   looptijd
)
AS
   SELECT m.mld_melding_key,
          m.mld_melding_datum,
          iva.ins_srtdiscipline_omschrijving,
          std.mld_stdmelding_omschrijving,
          m.mld_melding_einddatum,
          l.alg_locatie_omschrijving,
          og.alg_gebouw_code gebouw,
          og.alg_gebouw_naam gebouw_naam,
          og.alg_verdieping_code verdieping,
          og.alg_ruimte_nr ruimte,
          (SELECT eb.lokatie
             FROM arai_v_ebms eb
            WHERE eb.arai_ebms_key =
          (SELECT mvk.mld_kenmerkmelding_waarde
             FROM mld_kenmerk mk,
                  mld_srtkenmerk msk,
                  mld_v_aanwezigkenmerkmelding mvk
            WHERE     mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key
                  AND mk.mld_kenmerk_key = mvk.mld_kenmerk_key
                  AND mvk.mld_melding_key = m.mld_melding_key
                  AND msk.mld_srtkenmerk_key = 141))
                  standnummer,
          m.mld_melding_omschrijving,
          m.mld_melding_opmerking,
          (SELECT ae.evenement
             FROM arai_v_events ae
            WHERE ae.arai_events_key =
                     (SELECT mvk.mld_kenmerkmelding_waarde
                        FROM mld_kenmerk mk,
                             mld_srtkenmerk msk,
                             mld_v_aanwezigkenmerkmelding mvk
                       WHERE mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key
                             AND mk.mld_kenmerk_key = mvk.mld_kenmerk_key
                             AND mvk.mld_melding_key = m.mld_melding_key
                             AND mk.mld_kenmerk_verwijder IS NULL
                             AND msk.mld_srtkenmerk_key = 283))
             evenement,
           (SELECT eb.arai_ebms_full
             FROM arai_v_ebms eb
            WHERE eb.arai_ebms_key =
          (SELECT mvk.mld_kenmerkmelding_waarde
             FROM mld_kenmerk mk,
                  mld_srtkenmerk msk,
                  mld_v_aanwezigkenmerkmelding mvk
            WHERE     mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key
                  AND mk.mld_kenmerk_key = mvk.mld_kenmerk_key
                  AND mvk.mld_melding_key = m.mld_melding_key
                  AND msk.mld_srtkenmerk_key = 141))
             ebms,
          (SELECT mvk.mld_kenmerkmelding_waarde
             FROM mld_kenmerk mk,
                  mld_srtkenmerk msk,
                  mld_v_aanwezigkenmerkmelding mvk
            WHERE     mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key
                  AND mk.mld_kenmerk_key = mvk.mld_kenmerk_key
                  AND mvk.mld_melding_key = m.mld_melding_key
                  AND msk.mld_srtkenmerk_key = 3)
             contactpersoon,
          (SELECT mvk.mld_kenmerkmelding_waarde
             FROM mld_kenmerk mk,
                  mld_srtkenmerk msk,
                  mld_v_aanwezigkenmerkmelding mvk
            WHERE     mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key
                  AND mk.mld_kenmerk_key = mvk.mld_kenmerk_key
                  AND mvk.mld_melding_key = m.mld_melding_key
                  AND msk.mld_srtkenmerk_key = 7)
             telefoonnummer,
          (SELECT mvk.mld_kenmerkmelding_waarde
             FROM mld_kenmerk mk,
                  mld_srtkenmerk msk,
                  mld_v_aanwezigkenmerkmelding mvk
            WHERE     mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key
                  AND mk.mld_kenmerk_key = mvk.mld_kenmerk_key
                  AND mvk.mld_melding_key = m.mld_melding_key
                  AND msk.mld_srtkenmerk_key = 4)
             email,
          (SELECT mvk.mld_kenmerkmelding_waarde
             FROM mld_kenmerk mk,
                  mld_srtkenmerk msk,
                  mld_v_aanwezigkenmerkmelding mvk
            WHERE     mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key
                  AND mk.mld_kenmerk_key = mvk.mld_kenmerk_key
                  AND mvk.mld_melding_key = m.mld_melding_key
                  AND msk.mld_srtkenmerk_key = 61)
             rai_medewerker,
          (SELECT mvk.mld_kenmerkmelding_waarde
             FROM mld_kenmerk mk,
                  mld_srtkenmerk msk,
                  mld_v_aanwezigkenmerkmelding mvk
            WHERE     mk.mld_srtkenmerk_key = msk.mld_srtkenmerk_key
                  AND mk.mld_kenmerk_key = mvk.mld_kenmerk_key
                  AND mvk.mld_melding_key = m.mld_melding_key
                  AND msk.mld_srtkenmerk_key = 942)
             leverancier,
          mst.mld_statuses_omschrijving,
       -- substr(cast (m.mld_melding_t_uitvoertijd as varchar2 (10)), 1, instr(cast (m.mld_melding_t_uitvoertijd as varchar2 (10)), ';')-1)
        mu.doorlooptijd_werkdgn
     FROM mld_melding m,
          ins_v_aanwezigsrtdiscipline iva,
          mld_discipline md,
          mld_stdmelding std,
          alg_locatie l,
          alg_v_allonrgoed_gegevens og,
          mld_statuses mst,
          mld_v_udr_melding mu
    WHERE     m.mld_stdmelding_key = std.mld_stdmelding_key
          AND std.mld_ins_discipline_key = md.ins_discipline_key
          AND md.ins_srtdiscipline_key = iva.ins_srtdiscipline_key
          AND m.mld_alg_locatie_key = l.alg_locatie_key
          AND m.mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys
          AND m.mld_melding_status = mst.mld_statuses_key
          AND m.mld_melding_key = mu.melding_key
          AND std.mld_stdmelding_verwijder IS NULL
          AND md.ins_discipline_verwijder IS NULL
          AND iva.ins_srtdiscipline_key = 1;

CREATE OR REPLACE VIEW arai_v_rap_standkeuringmenu
(
   mld_melding_key,
   datum,
   tijd,
   evenement,
   standnummer,
   resultaat,
   bevindingen,
   risicoklasse,
   steekproef,
   apparaat,
   discipline,
   stdmelding,
   omschrijving,
   opmerking,
   status,
   behandelaar,
   fclt_f_discipline_key
)
AS
   SELECT m.mld_melding_key,
          TRUNC (m.mld_melding_datum),                                -- datum
          TO_CHAR (m.mld_melding_datum, 'hh24:mi'),                -- tijdstip
          (SELECT evenement
             FROM arai_v_events
            WHERE arai_events_key =
                     (SELECT mld_kenmerkmelding_waarde
                        FROM mld_kenmerkmelding km, mld_kenmerk k
                       WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                             AND km.mld_melding_key = m.mld_melding_key
                             AND k.mld_srtkenmerk_key = 283))
             evenement,
          (SELECT lokatie
             FROM arai_v_ebms
            WHERE arai_ebms_key =
                     (SELECT mld_kenmerkmelding_waarde
                        FROM mld_kenmerkmelding km, mld_kenmerk k
                       WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                             AND km.mld_melding_key = m.mld_melding_key
                             AND k.mld_srtkenmerk_key = 1261))
             standnr,
          (SELECT fac_usrdata_omschr
             FROM fac_usrdata
            WHERE fac_usrdata_key =
                     (SELECT mld_kenmerkmelding_waarde
                        FROM mld_kenmerkmelding km, mld_kenmerk k
                       WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                             AND km.mld_melding_key = m.mld_melding_key
                             AND k.mld_srtkenmerk_key = 1181))
             resultaat,
          (SELECT fac_usrdata_omschr
             FROM fac_usrdata
            WHERE fac_usrdata_key =
                     (SELECT mld_kenmerkmelding_waarde
                        FROM mld_kenmerkmelding km, mld_kenmerk k
                       WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                             AND km.mld_melding_key = m.mld_melding_key
                             AND k.mld_kenmerk_key = 2741))
          || ' '
          || (SELECT fac_usrdata_omschr
                FROM fac_usrdata
               WHERE fac_usrdata_key =
                        (SELECT mld_kenmerkmelding_waarde
                           FROM mld_kenmerkmelding km, mld_kenmerk k
                          WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                                AND km.mld_melding_key = m.mld_melding_key
                                AND k.mld_kenmerk_key = 2782))
          || ' '
          || (SELECT fac_usrdata_omschr
                FROM fac_usrdata
               WHERE fac_usrdata_key =
                        (SELECT mld_kenmerkmelding_waarde
                           FROM mld_kenmerkmelding km, mld_kenmerk k
                          WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                                AND km.mld_melding_key = m.mld_melding_key
                                AND k.mld_kenmerk_key = 2783))
          || ' '
          || (SELECT fac_usrdata_omschr
                FROM fac_usrdata
               WHERE fac_usrdata_key =
                        (SELECT mld_kenmerkmelding_waarde
                           FROM mld_kenmerkmelding km, mld_kenmerk k
                          WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                                AND km.mld_melding_key = m.mld_melding_key
                                AND k.mld_kenmerk_key = 2784))
          || ' '
          || (SELECT fac_usrdata_omschr
                FROM fac_usrdata
               WHERE fac_usrdata_key =
                        (SELECT mld_kenmerkmelding_waarde
                           FROM mld_kenmerkmelding km, mld_kenmerk k
                          WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                                AND km.mld_melding_key = m.mld_melding_key
                                AND k.mld_kenmerk_key = 2785))
             bevindingen,
          (SELECT fac_usrdata_omschr
             FROM fac_usrdata
            WHERE fac_usrdata_key =
                     (SELECT mld_kenmerkmelding_waarde
                        FROM mld_kenmerkmelding km, mld_kenmerk k
                       WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                             AND km.mld_melding_key = m.mld_melding_key
                             AND k.mld_kenmerk_key = 2701))
             risicoklasse,
          DECODE (
             (SELECT mld_kenmerkmelding_waarde
                FROM mld_kenmerkmelding km, mld_kenmerk k
               WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                     AND km.mld_melding_key = m.mld_melding_key
                     AND k.mld_kenmerk_key = 2761),
             '1',
             'Ja',
             'Nee')
             steekproef,
          (SELECT mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding km, mld_kenmerk k
            WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                  AND km.mld_melding_key = m.mld_melding_key
                  AND k.mld_kenmerk_key = 2801)
             steekproef_apparaat,
          md.ins_discipline_omschrijving,
          std.mld_stdmelding_omschrijving,
          m.mld_melding_omschrijving,
          m.mld_melding_opmerking,
          mst.mld_statuses_omschrijving,
          m.mld_melding_behandelaar_key,
          md.ins_discipline_key                        --fclt_f_discipline_key
     FROM mld_melding m,
          mld_stdmelding std,
          mld_discipline md,
          mld_statuses mst
    WHERE     m.mld_stdmelding_key = std.mld_stdmelding_key
          AND std.mld_ins_discipline_key = md.ins_discipline_key
          AND m.mld_stdmelding_key = 3481                    -- Standkeuringen
          AND m.mld_melding_status = mst.mld_statuses_key
          AND m.mld_melding_status IN (0, 1, 2, 3, 4, 99);
          
-- Prio opdrachten rapportages t.b.v. knoppen in mobile    
CREATE OR REPLACE VIEW arai_v_rap_opdrprio
(
   mld_opdr_key,
   opdrachtnr,
   status,
   melding,
   prioriteit,
   behandelaar,
   plaats,
   omschrijving,
   prs_perslid_key
)
AS
   SELECT o.mld_opdr_key,
          TO_CHAR (o.mld_melding_key) || '/' || o.mld_opdr_bedrijfopdr_volgnr
             opdrachtnummer,
          DECODE (os.mld_statusopdr_key, 8, DECODE (o.mld_opdr_halted, 1, 'Onderbroken', os.mld_statusopdr_omschrijving), os.mld_statusopdr_omschrijving) status,
          std.mld_stdmelding_omschrijving,
          DECODE (m.mld_melding_spoed,
                  '1', lcl.l ('lcl_mld_urg_kritiek'),
                  lcl.l ('lcl_mld_urg_hoog'))
             prio,
          p.prs_perslid_naam_full,
          DECODE (
             v.alg_plaatsaanduiding,
             '',
             ' (' || l.alg_locatie_omschrijving || ')',
             v.alg_plaatsaanduiding
             || DECODE (v.alg_plaatsomschrijving,
                        '', '',
                        ' (' || v.alg_plaatsomschrijving || ')'))
             plaats,
          TRIM(REGEXP_REPLACE (
                  REGEXP_SUBSTR (o.mld_opdr_omschrijving,
                                 '(([^ ]*)( |$)*){10}'),
                  '[[:space:]]',
                  ' '))
          || '...',
          p.prs_perslid_key
     FROM mld_opdr o,
          mld_melding m,
          prs_v_perslid_fullnames p,
          ins_tab_discipline d,
          mld_stdmelding std,
          alg_v_allonrgoed_gegevens v,
          alg_locatie l,
          mld_v_uitvoerende mu,
          mld_statusopdr os
    WHERE     o.mld_melding_key = m.mld_melding_key(+)
          AND m.mld_melding_spoed IN ('1', '2')               -- Kritiek, hoog
          AND o.prs_perslid_key = p.prs_perslid_key
          AND o.mld_typeopdr_key = 281                     -- Interne opdracht
          AND m.mld_stdmelding_key = std.mld_stdmelding_key(+)
          AND std.mld_ins_discipline_key = d.ins_discipline_key(+)
          AND l.alg_locatie_key = v.alg_locatie_key
          AND m.mld_alg_onroerendgoed_keys = v.alg_onroerendgoed_keys(+)
          AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
          AND o.mld_statusopdr_key IN (4, 5, 8)
          AND o.mld_uitvoerende_keys = mu.mld_uitvoerende_key
          AND o.mld_uitvoerende_keys = 21
          AND os.mld_statusopdr_key = o.mld_statusopdr_key;

CREATE OR REPLACE VIEW arai_v_rap_opdrprio_normlaag
(
   mld_opdr_key,
   opdrachtnr,
   status,
   melding,
   behandelaar,
   plaats,
   geplande_aanvang,
   omschrijving,
   prs_perslid_key
)
AS
   SELECT o.mld_opdr_key,
          TO_CHAR (o.mld_melding_key) || '/' || o.mld_opdr_bedrijfopdr_volgnr
          opdrachtnummer,
          DECODE (os.mld_statusopdr_key, 8, DECODE (o.mld_opdr_halted, 1, 'Onderbroken', os.mld_statusopdr_omschrijving), os.mld_statusopdr_omschrijving) status,
          std.mld_stdmelding_omschrijving,
          p.prs_perslid_naam_full,
          DECODE (
             v.alg_plaatsaanduiding,
             '',
             ' (' || l.alg_locatie_omschrijving || ')',
             v.alg_plaatsaanduiding
             || 
             DECODE (v.alg_plaatsomschrijving,
                     '', '',
                     ' (' || v.alg_plaatsomschrijving || ')')
                  ) plaats,
          o.mld_opdr_plandatum,
          TRIM(regexp_replace(regexp_substr(o.mld_opdr_omschrijving, '(([^ ]*)( |$)*){10}'), '[[:space:]]',' ')) || '...',
          p.prs_perslid_key
     FROM mld_opdr o,
          mld_melding m,
          prs_v_perslid_fullnames p,
          ins_tab_discipline d,
          mld_stdmelding std,
          alg_v_allonrgoed_gegevens v,
          alg_locatie l,
          mld_v_uitvoerende mu,
          mld_statusopdr os
    WHERE     o.mld_melding_key = m.mld_melding_key(+)
          AND m.mld_melding_spoed NOT IN ('1', '2')           -- Niet kritiek of hoog
          AND o.prs_perslid_key = p.prs_perslid_key
          AND o.mld_typeopdr_key = 281                     -- Interne opdracht
          AND m.mld_stdmelding_key = std.mld_stdmelding_key(+)
          AND std.mld_ins_discipline_key = d.ins_discipline_key(+)
          AND l.alg_locatie_key = v.alg_locatie_key
          AND m.mld_alg_onroerendgoed_keys = v.alg_onroerendgoed_keys(+)
          AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
          AND o.mld_statusopdr_key IN (4, 5, 8)
          AND o.mld_uitvoerende_keys = mu.mld_uitvoerende_key
          AND o.mld_uitvoerende_keys = 21
          AND TRUNC (mld_opdr_plandatum) <= TRUNC (sysdate + 3)
          AND os.mld_statusopdr_key = o.mld_statusopdr_key;
          
CREATE OR REPLACE VIEW arai_v_rap_noplan_normlaag
(
   mld_opdr_key,
   opdrachtnr,
   status,
   melding,
   prioriteit,
   behandelaar,
   plaats,
   omschrijving,
   prs_perslid_key
)
AS
   SELECT o.mld_opdr_key,
          TO_CHAR (o.mld_melding_key) || '/' || o.mld_opdr_bedrijfopdr_volgnr
          opdrachtnummer,
          DECODE (os.mld_statusopdr_key, 8, DECODE (o.mld_opdr_halted, 1, 'Onderbroken', os.mld_statusopdr_omschrijving), os.mld_statusopdr_omschrijving) status,
          std.mld_stdmelding_omschrijving,
          DECODE (m.mld_melding_spoed,
                   '3', lcl.l ('lcl_mld_urg_normaal'),
                   lcl.l ('lcl_mld_urg_laag'))
          prio,
          p.prs_perslid_naam_full,
          DECODE (
             v.alg_plaatsaanduiding,
             '',
             ' (' || l.alg_locatie_omschrijving || ')',
             v.alg_plaatsaanduiding
             || 
             DECODE (v.alg_plaatsomschrijving,
                     '', '',
                     ' (' || v.alg_plaatsomschrijving || ')')
                  ) plaats,
          TRIM(regexp_replace(regexp_substr(o.mld_opdr_omschrijving, '(([^ ]*)( |$)*){10}'), '[[:space:]]',' ')) || '...',
          p.prs_perslid_key
     FROM mld_opdr o,
          mld_melding m,
          prs_v_perslid_fullnames p,
          ins_tab_discipline d,
          mld_stdmelding std,
          alg_v_allonrgoed_gegevens v,
          alg_locatie l,
          mld_v_uitvoerende mu,
          mld_statusopdr os
    WHERE     o.mld_melding_key = m.mld_melding_key(+)
          AND m.mld_melding_spoed NOT IN ('1', '2')           -- Niet kritiek of hoog
          AND o.prs_perslid_key = p.prs_perslid_key
          AND o.mld_typeopdr_key = 281                     -- Interne opdracht
          AND m.mld_stdmelding_key = std.mld_stdmelding_key(+)
          AND std.mld_ins_discipline_key = d.ins_discipline_key(+)
          AND l.alg_locatie_key = v.alg_locatie_key
          AND m.mld_alg_onroerendgoed_keys = v.alg_onroerendgoed_keys(+)
          AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
          AND o.mld_statusopdr_key IN (4, 5, 8)
          AND o.mld_uitvoerende_keys = mu.mld_uitvoerende_key
          AND o.mld_uitvoerende_keys = 21
          AND mld_opdr_plandatum IS NULL
          AND os.mld_statusopdr_key = o.mld_statusopdr_key;

-- Rapport voor het controleren van keyusers        
CREATE OR REPLACE VIEW arai_v_rap_keyusers
(
   perslid_key,
   naam,
   keyuser,
   laatste_login
)
AS
   SELECT pf.prs_perslid_key,
          pf.prs_perslid_naam_full,
          DECODE (fl.prs_perslid_key, NULL, 'Nee', 'Ja'),
          p.prs_perslid_login
     FROM fac_v_lcrap_key_stats fl, prs_v_perslid_fullnames pf, prs_perslid p
    WHERE pf.prs_perslid_key = p.prs_perslid_key
          AND pf.prs_perslid_key = fl.prs_perslid_key(+)
          AND p.prs_perslid_verwijder IS NULL;

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- MJOB import
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE arai_post_import_mjob (p_import_key IN NUMBER)
AS
	v_errorhint               VARCHAR2 (400);
BEGIN
   v_errorhint := 'arai_post_import_mjob';
END;
/


CREATE OR REPLACE PROCEDURE arai_import_mjob (p_import_key IN NUMBER)
AS
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_errormsg                VARCHAR2 (400);
   v_errorhint               VARCHAR2 (400);
BEGIN


  v_errorhint := 'arai_import_mjob';
  -- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid proc

  fac_import_ins (p_import_key);
	COMMIT;

	-- After import korrektie gebeurt nu...
	arai_post_import_mjob(p_import_key);


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


CREATE OR REPLACE PROCEDURE arai_post_update_mjob (p_import_key IN NUMBER, p_max_ins_srtdeel_key IN NUMBER, p_max_ins_deel_key IN NUMBER)
AS
	oracle_err_num            NUMBER;
  oracle_err_mes            VARCHAR2 (200);
  v_errormsg                VARCHAR2 (400);
  v_errorhint               VARCHAR2 (400);

	v_receptnr								VARCHAR2 (1000);
	v_kosten									VARCHAR2 (1000);
	v_periode 								VARCHAR2 (1000);
	v_perc_onderhoud					VARCHAR2 (1000);

	v_ctr_discipline_key      NUMBER(10);

	v_fin_btwtabelwaarde_key  fin_btwtabelwaarde.fin_btwtabelwaarde_key%TYPE;

	l_kosten									ins_srtcontrole.ins_srtcontrole_materiaal%TYPE;
	l_periode									ins_srtcontrole.ins_srtcontrole_periode%TYPE;
	l_perc_onderhoud					ins_srtcontrole.ins_srtcontrole_percentage%TYPE;

	v_mx_ins_srtcontroledl_xcp_key NUMBER(10);

	v_kpn_bestaat             NUMBER(10);


	-- Flexprops in de FIP-INS Excelsheet
  -- ins_kenmerkwaarde  Flexprop
  -- 1 									Receptnummer					} Srtcontrole
  -- 2									Receptomschrijving		}
  -- 3									Totaalbedr.
  -- 4        					StJr
  -- 5 									Duur
  -- 6									EiJr
  -- 7									ExJr
  -- 8									VvJr
  -- 9 									Aant. Aanw.          } Aantal geregistreerde objecten
  -- 10 								Perc. Onderh         } Percentage van dat aantal (vorige kolom) dat voor onderhoud cyclus in aanmerking komt, default 100%
  -- 11									Aantal niet
  -- 12									Aant.Overh.
  -- 13									Eh.										} Eenheid --> Stoppen we nu in standaard kolom Eenheid (kolom I)
  -- 14									Cycl
  -- 15									Fo
  -- 16									Fonds
  -- 17									Taak categorie				} ctr_discipline
  -- 18									kenmerk18
  -- 19									kenmerk19
  -- 20									kenmerk20


  CURSOR c0
  IS   -- Taakcategorie
	SELECT DISTINCT(UPPER(ins_kenmerkwaarde17)) AS ctr_discipline_omschrijving
	FROM fac_imp_ins
	order by ctr_discipline_omschrijving;


  CURSOR c0a (p_taak_categorie VARCHAR2)
  IS   -- Disciplines bij 1 taakcategorie
	SELECT DISTINCT(ins_discipline_key) AS ins_discipline_key
	FROM fac_imp_ins i, ins_discipline d
	WHERE UPPER(i.ins_discipline_omschrijving) = UPPER(d.ins_discipline_omschrijving)
	AND UPPER(ins_kenmerkwaarde17) = UPPER(p_taak_categorie)
	AND d.ins_discipline_verwijder IS NULL;


  -- LET OP: WE GAAN ERVAN UIT DAT
  -- 1. bij een Receptnummer (1) altijd dezelfde Receptomschrijving(2) en Eenheid (13) horen. M.a.w. bij 2 regels Receptnr (1) zijn (2) en (13) ook gelijk.
  -- 2. een receptnummer uniek is over Taakcategorie heen (d.w.z. het kan niet voorkomen dat hetzelfde receptnummer onder taakcategorie A en B bestaat (anders moeten we cursors c1 etc ook hierop filteren)

 	CURSOR c1
  IS   -- receptnummer,      receptomschrijving,
	SELECT DISTINCT(ins_kenmerkwaarde1)
	FROM fac_imp_ins
	order by ins_kenmerkwaarde1;

  -- Alle geimporteerde regels (objecten met controles) die nog geen standaard srtcontrole hebben, en dus een uitzondering controle (xcp) moeten krijgen.
	CURSOR c2 (p_max_ins_deel_key NUMBER, p_receptnr VARCHAR2, p_kosten VARCHAR2, p_periode VARCHAR2, p_perc_onderhoud VARCHAR2)
	IS
			SELECT d.ins_deel_key, d.ins_deel_omschrijving, c.ins_srtcontrole_key, ins_kenmerkwaarde14 periode, 4,
			 			 fac.safe_to_number(replace(replace(ins_kenmerkwaarde3, '.'), ',','.')) kosten, fac.safe_to_number(replace(replace(ins_kenmerkwaarde10, '.'), ',','.')) perc_onderhoud,
			 			 fac.safe_to_date('01-01-' || ins_kenmerkwaarde8 ,'dd-mm-yyyy') verval_datum
 			FROM fac_imp_ins i, ins_deel d, ins_srtcontrole c, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
 			WHERE i.ins_deel_omschrijving = d.ins_deel_omschrijving
 			AND i.alg_locatie_code = l.alg_locatie_code
      AND i.alg_gebouw_code = g.alg_gebouw_code
      AND i.alg_verdieping_volgnr =  v.alg_verdieping_volgnr
      AND i.alg_ruimte_nr =  r.alg_ruimte_nr
      AND d.ins_alg_ruimte_type = 'R'
      AND d.ins_alg_ruimte_key = r.alg_ruimte_key
      AND r.alg_verdieping_key = v.alg_verdieping_key
      AND v.alg_gebouw_key = g.alg_gebouw_key
      AND g.alg_locatie_key = l.alg_locatie_key
 			AND  d.ins_deel_key > p_max_ins_deel_key
 			AND  i.ins_kenmerkwaarde1 = p_receptnr
			AND  (i.ins_kenmerkwaarde3 <> p_kosten OR i.ins_kenmerkwaarde14 <> p_periode OR i.ins_kenmerkwaarde10 <> p_perc_onderhoud)
			AND  i.ins_kenmerkwaarde3 IS NOT NULL
			AND  i.ins_kenmerkwaarde14 IS NOT NULL
			AND  i.ins_kenmerkwaarde10 IS NOT NULL
			AND  i.ins_kenmerkwaarde1 = c.ins_srtcontrole_omschrijving;

	-- Alle geimporteerde regels (objecten met controles) die NA cursor C2 een standaard srtcontrole hebben gekregen, maar eigenlijk toch een uitzondering controle (xcp) moeten krijgen vanwege vervaljaar via cursor 6.
	-- Dus alle record met een gevuld vervaljaar (ins_kenmerkwaarde8) krijgen een xcp.
  CURSOR c6 (p_max_ins_deel_key NUMBER, p_receptnr VARCHAR2, p_kosten VARCHAR2, p_periode VARCHAR2, p_perc_onderhoud VARCHAR2)
  IS
			SELECT d.ins_deel_key, d.ins_deel_omschrijving, c.ins_srtcontrole_key, ins_kenmerkwaarde14 periode, 4,
			            fac.safe_to_number(replace(replace(ins_kenmerkwaarde3, '.'), ',','.')) kosten, fac.safe_to_number(replace(replace(ins_kenmerkwaarde10, '.'), ',','.')) perc_onderhoud,
			            fac.safe_to_date('01-01-' || ins_kenmerkwaarde8 ,'dd-mm-yyyy') verval_datum
			FROM fac_imp_ins i, ins_deel d, ins_srtcontrole c, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
			WHERE i.ins_deel_omschrijving = d.ins_deel_omschrijving
			AND i.alg_locatie_code = l.alg_locatie_code
      AND i.alg_gebouw_code = g.alg_gebouw_code
      AND i.alg_verdieping_volgnr =  v.alg_verdieping_volgnr
      AND i.alg_ruimte_nr =  r.alg_ruimte_nr
      AND d.ins_alg_ruimte_type = 'R'
      AND d.ins_alg_ruimte_key = r.alg_ruimte_key
      AND r.alg_verdieping_key = v.alg_verdieping_key
      AND v.alg_gebouw_key = g.alg_gebouw_key
      AND g.alg_locatie_key = l.alg_locatie_key
			AND  d.ins_deel_key > p_max_ins_deel_key
			AND  i.ins_kenmerkwaarde1 = p_receptnr
			AND  i.ins_kenmerkwaarde3 = p_kosten
			AND  i.ins_kenmerkwaarde14 = p_periode
			AND  i.ins_kenmerkwaarde10 = p_perc_onderhoud
			AND  i.ins_kenmerkwaarde3 IS NOT NULL
			AND  i.ins_kenmerkwaarde14 IS NOT NULL
			AND  i.ins_kenmerkwaarde10 IS NOT NULL
			AND  i.ins_kenmerkwaarde1 = c.ins_srtcontrole_omschrijving
			AND  i.ins_kenmerkwaarde8 IS NOT NULL;

	CURSOR c4 (p_max_ins_srtcontroledl_xcp NUMBER)
	IS
			SELECT ins_srtcontroledl_xcp_key, ins_deel_key, c.ins_srtcontrole_key, ins_srtcontrole_omschrijving,
				CASE
				WHEN ins_srtcontrole_materiaal IS NOT NULL AND ins_srtcontroledl_xcp_materia IS NOT NULL AND ins_srtcontrole_materiaal = ins_srtcontroledl_xcp_materia
					THEN 1
					ELSE 0
				END set_materia_null,
				CASE
				WHEN ins_srtcontrole_periode IS NOT NULL AND ins_srtcontroledl_xcp_periode IS NOT NULL AND ins_srtcontrole_periode = ins_srtcontroledl_xcp_periode
					THEN 1
					ELSE 0
				END set_periode_null,
				CASE
				WHEN ins_srtcontrole_percentage IS NOT NULL AND ins_srtcontroledl_xcp_perc IS NOT NULL AND ins_srtcontrole_percentage = ins_srtcontroledl_xcp_perc
					THEN 1
					ELSE 0
				END set_perc_onderhoud_null
 			FROM ins_srtcontrole c, ins_srtcontroledl_xcp x
 			WHERE x.ins_srtcontroledl_xcp_key > p_max_ins_srtcontroledl_xcp
 			AND x.ins_srtcontrole_key = c.ins_srtcontrole_key;


	-- Let op: de eenheid kolom I wordt (itt hetgeen ik dacht) niet in ins_srtdeel_eenheid verwerkt, maar in res_deel_eenheid.
	-- Verder: ins_srtdeel_code is verder helemaal NIET uniek, niet over de DB, niet per discipline en/of groep.
	-- We kunnen daarom volstaan door hier verder ook niet te groeperen op discipline of iets dergelijks, we gaan gewoon op objectsoort-code groeperen, en ze krijgen allen dezelfde eenheid.
	CURSOR c3
	IS
	SELECT ins_srtdeel_code,  res_deel_eenheid
	FROM fac_imp_ins
	GROUP BY  ins_srtdeel_code,  res_deel_eenheid;

	-- Fondscodes/Projectgroepen gaan we als (gebouw)kostenplaatsen opvoeren
	CURSOR c5
	IS
	SELECT ins_kenmerkwaarde15,  ins_kenmerkwaarde16
	FROM fac_imp_ins
	GROUP BY  ins_kenmerkwaarde15,  ins_kenmerkwaarde16;

	-- Ten slotte hebben we ook nog de handmatige verschuivingen vanuit Tobias TMJ of StraVIS die komen overwaaien, die willen we niet verloren laten gaan.
	-- B.v. alle schilderwerk is naar jaar 2018 verschoven, die willen we niet verloren laten gaan, daarvoor maken we ins_deelsrtcontrole records aan met een plandatum [ins_deelsrtcontrole_plandatum] aan, te weten
	-- voor ieder record fac_imp_ins met een gevulde kolom ExJr (7e kolom uit de FIP sheet)

	CURSOR c7 (p_max_ins_deel_key NUMBER)
  IS
			SELECT d.ins_deel_key, d.ins_deel_omschrijving, c.ins_srtcontrole_key,  fac.safe_to_date('01-01-' || ins_kenmerkwaarde7 ,'dd-mm-yyyy') plan_datum
			FROM fac_imp_ins i, ins_deel d, ins_srtcontrole c, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
			WHERE i.ins_deel_omschrijving = d.ins_deel_omschrijving
			AND i.alg_locatie_code = l.alg_locatie_code
      AND i.alg_gebouw_code = g.alg_gebouw_code
      AND i.alg_verdieping_volgnr =  v.alg_verdieping_volgnr
      AND i.alg_ruimte_nr =  r.alg_ruimte_nr
      AND d.ins_alg_ruimte_type = 'R'
      AND d.ins_alg_ruimte_key = r.alg_ruimte_key
      AND r.alg_verdieping_key = v.alg_verdieping_key
      AND v.alg_gebouw_key = g.alg_gebouw_key
      AND g.alg_locatie_key = l.alg_locatie_key
			AND  d.ins_deel_key > p_max_ins_deel_key
			AND  i.ins_kenmerkwaarde1 = c.ins_srtcontrole_omschrijving
			AND  i.ins_kenmerkwaarde7 IS NOT NULL;


BEGIN
    v_errorhint := 'arai_post_update_mjob';

   	-- Eerst maar eens beginnen met de verwerking van de kostenplaatsen cursor 5
   	FOR rec IN c5
   	LOOP
   		SELECT COUNT(*)
   		INTO v_kpn_bestaat
   		FROM prs_kostenplaats
   		WHERE prs_kostenplaats_upper = UPPER(rec.ins_kenmerkwaarde15)
   		AND prs_kostenplaats_verwijder IS NULL;

   		IF v_kpn_bestaat = 0
   		THEN
   			INSERT INTO prs_kostenplaats (prs_kostenplaats_nr, prs_kostenplaats_omschrijving, prs_kostenplaats_module, prs_kostenplaats_extern, prs_kostenplaats_limietperiode, prs_kostenplaats_fiat)
   			VALUES(rec.ins_kenmerkwaarde15, rec.ins_kenmerkwaarde16, 'ALG', 0, 0, 1);
			END IF;
   	END LOOP;

   	-- Eerst maar eens beginnen met de verwerking van ins_srtdeel_eenheid
   	FOR rec IN c3
   	LOOP
   		UPDATE ins_srtdeel
   		SET ins_srtdeel_eenheid = rec.res_deel_eenheid
   		WHERE ins_srtdeel_code = rec.ins_srtdeel_code
   		AND ins_srtdeel_key > p_max_ins_srtdeel_key
   		AND ins_srtdeel_verwijder IS NULL;
   	END LOOP;

   	-- Verder moet van alle ins_srtdeel die zijn toegevoegd de 'hoort bij persoon' eraf worden gehaald (sie in de standaard FIP erop is gezet), dus ins_srtdeel_binding van 17 -> 1
   	UPDATE ins_srtdeel
   	SET ins_srtdeel_binding = 1
   	WHERE ins_srtdeel_key > p_max_ins_srtdeel_key
   	AND ins_srtdeel_verwijder IS NULL;


   	-- Bepalen van de default BTW % 21...
   	SELECT MIN(fin_btwtabelwaarde_key)
   	INTO v_fin_btwtabelwaarde_key
   	FROM fin_btwtabelwaarde
	  WHERE fin_btwtabelwaarde_perc = 21
	  AND COALESCE(fin_btwtabelwaarde_verlegd,0) = 0
	  AND fin_btwtabelwaarde_verwijder IS NULL;


   	-- We gaan hier per receptnummer het MEEST UNIFORME (algemene) eruit vissen.
   	-- Dat doen we door te kijken waarvan de combinatie van dezelfde kosten (aant_K) met dezelfde periode het vaakst voorkomen (aant_P).


   	-- Voorbeeld hieronder: enkele regels bij 1 object A: recept R1 kost 100 euro per eenhied en wordt elke 2 jaar gepland, elke regel daarna heeft betrekking op ander object
   	-- recept(1)      kosten(3)     periode(14)
   	-- R1             100           2
   	-- R1             100           2
   	-- R1             150           2
   	-- R1             100           1
   	-- Hier is de meest algemene recept die met kosten 100 en om de 2 jaar (regel 1 en 2), de andere recepten (regel 3 en 4) zijn uitzonderingen (XCP) op de algemene regel.

   	-- We gaan (gebaseerd op de sheet van WaardWonen) hier ook nog eens rekening houden met Perc.Onderh, die default 100 staat.
   	-- Maar als de regel is 50%, dan is dat de norm, en elke afwijking van 50% is dus uitzondering, dus we gaan OOK op zoek naar de meeste regels met dezelfde Perc. Onderh.
   	-- Dus
   	-- recept(1)      kosten(3)     periode(14) %onderh (10)
   	-- R1             100           2           75
   	-- R1             100           2           50              <-- Hiervan zijn er 2, dit is de standaard taak (srtcontrole)
   	-- R1             150           2           100
   	-- R1             100           1           100
   	-- R1             100           2           50              <-- Hiervan zijn er 2, dit is de standaard taak (srtcontrole)

   	v_errormsg := 'Loop rec0';
		FOR rec0 IN c0
		LOOP
		  BEGIN

			-- Bepalen van de ctr discipline waaronder de terugkerende taken worden vastgelegd.
	   	SELECT MIN(ins_discipline_key)
	   	INTO v_ctr_discipline_key
	    FROM ctr_discipline d, ctr_disc_params dp
	    WHERE dp.ctr_ins_discipline_key = d.ins_discipline_key
	    AND d.ins_discipline_verwijder IS NULL
	    AND dp.ctr_disc_params_ismjob = 1
	    AND UPPER(d.ins_discipline_omschrijving) = UPPER(rec0.ctr_discipline_omschrijving);

	   	IF v_ctr_discipline_key IS NULL
	   	THEN
	   			-- Is niet gevonden, dan voegen we hem eerst maar eens toe...
	   			-- Deze 2 regels zijn verplaatst uit arai_mjob_ini.sql
					INSERT INTO ins_tab_discipline (ins_discipline_module, ins_discipline_omschrijving)
											values ('CTR', rec0.ctr_discipline_omschrijving)
					RETURNING ins_discipline_key INTO v_ctr_discipline_key;

					INSERT INTO ctr_disc_params(ctr_ins_discipline_key, ctr_disc_params_controle_type, ctr_disc_params_ismjob)
					SELECT v_ctr_discipline_key, 2, 1 FROM dual;
	   	END IF;

	   	-- Nu hebben we v_ctr_discipline_key voor onderstaande loop c1 (en de loops daar weer genest in)

	   	-- Per Taakcategorie een autorisatie-groepen voor 'MJOB' met alleen leesrechten en schrijfrechten vastleggen (de administrator is in ini al aangemaakt)
	   	-- WE GAAN ERVAN UIT DAT DEZE NOG NIET BESTAAT (ANDERS CRASHT DEZE PROC!)
			INSERT INTO fac_groep(fac_groep_omschrijving) VALUES('MJOB-R: ' || substr(rec0.ctr_discipline_omschrijving,1,20));
			-- Nu nog de autorisatiegroep MJOB met schrijfrechten
			-- WE GAAN ERVAN UIT DAT DEZE NOG NIET BESTAAT (ANDERS CRASHT DEZE PROC!)
			INSERT INTO fac_groep(fac_groep_omschrijving) VALUES('MJOB-W:' ||  substr(rec0.ctr_discipline_omschrijving,1,20));


			--  1. Eerst MJOB-R (Leesrechten): ALGUSE READ
			INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key,
						  fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
			SELECT
			(SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-R: ' || substr(rec0.ctr_discipline_omschrijving,1,20)),
			fac_functie_key,
			-1, 9, -1, 9
			FROM fac_functie
			WHERE fac_functie_code = 'WEB_ALGUSE';

			--  2. Dan MJOB-W (Schrijfrechten): ook ALGUSE READ en GEEN! WRITE. Reden is de koppeling van vastgoed met Tobias-AX (bron). Wijzigingen zullen derhalve in de bron (Tobias-AX) moeten gebeuren.
			INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key,
						  fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
			SELECT
			(SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-W:' ||  substr(rec0.ctr_discipline_omschrijving,1,20)),
			fac_functie_key,
			-1, 9, -1, 9
			FROM fac_functie
			WHERE fac_functie_code = 'WEB_ALGUSE';

	   	v_errormsg := 'Loop rec0a';
	  	FOR rec0a IN c0a(rec0.ctr_discipline_omschrijving)
			LOOP
		 	  BEGIN

			   	--- En tenslotte gaan we de 3 MJOB autorisatiegroepen MJOB-R, MJOB-W en MJOB-A de rechten op INSUSE, INSMAN en CTRUSE uitdelen....
					--  1. Eerst MJOB-R (Leesrechten): INSUSE READ en INSMAN READ op elke INS-discipline en CTRUSE READ op de MJOB-discipline (v_ctr_discipline_key)
					INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key, ins_discipline_key,
								  fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
					SELECT
					(SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-R: ' || substr(rec0.ctr_discipline_omschrijving,1,20)),
					fac_functie_key,
					rec0a.ins_discipline_key,
					-1, 9, -1, 9
					FROM fac_functie
					WHERE fac_functie_code = 'WEB_INSUSE';

					INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key, ins_discipline_key,
								  fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
					SELECT
					(SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-R: ' || substr(rec0.ctr_discipline_omschrijving,1,20)),
					fac_functie_key,
					rec0a.ins_discipline_key,
					-1, 9, -1, 9
					FROM fac_functie
					WHERE fac_functie_code = 'WEB_INSMAN';

					INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key, ins_discipline_key,
								  fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
					SELECT
					(SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-R: ' || substr(rec0.ctr_discipline_omschrijving,1,20)),
					fac_functie_key,
					v_ctr_discipline_key,
					-1, 9, -1, 9
					FROM fac_functie
					WHERE fac_functie_code = 'WEB_CTRUSE';

					--  2. Dan MJOB-W (Schrijfrechten): INSUSE WRITE en INSMAN WRITE op elke INS-discipline en CTRUSE WRITE op de MJOB-discipline (v_ctr_discipline_key)

					INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key, ins_discipline_key,
								  fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
					SELECT
					(SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-W:' ||  substr(rec0.ctr_discipline_omschrijving,1,20)),
					fac_functie_key,
					rec0a.ins_discipline_key,
					-1, -1, -1, -1
					FROM fac_functie
					WHERE fac_functie_code = 'WEB_INSUSE';

					INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key, ins_discipline_key,
								  fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
					SELECT
					(SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-W:' ||  substr(rec0.ctr_discipline_omschrijving,1,20)),
					fac_functie_key,
					rec0a.ins_discipline_key,
					-1, -1, -1, -1
					FROM fac_functie
					WHERE fac_functie_code = 'WEB_INSMAN';

					INSERT INTO fac_groeprechten (fac_groep_key, fac_functie_key, ins_discipline_key,
								  fac_gebruiker_prs_level_read, fac_gebruiker_prs_level_write, fac_gebruiker_alg_level_read, fac_gebruiker_alg_level_write)
					SELECT
					(SELECT fac_groep_key FROM fac_groep WHERE fac_groep_upper = 'MJOB-W:' ||  substr(rec0.ctr_discipline_omschrijving,1,20)),
					fac_functie_key,
					v_ctr_discipline_key,
					-1, -1, -1, -1
					FROM fac_functie
					WHERE fac_functie_code = 'WEB_CTRUSE';

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

			END LOOP; -- c0a

	   	v_errormsg := 'Loop rec c1';
			FOR rec IN c1
		  LOOP
		  	BEGIN

		  	SELECT ins_kenmerkwaarde1, ins_kenmerkwaarde3, ins_kenmerkwaarde14, ins_kenmerkwaarde10
		  	INTO v_receptnr, v_kosten, v_periode, v_perc_onderhoud
		  	FROM (

							SELECT  a.ins_kenmerkwaarde1, a.ins_kenmerkwaarde3, a.ins_kenmerkwaarde14, ins_kenmerkwaarde10, count(*) aantal  FROM fac_imp_ins a
	            WHERE   a.ins_kenmerkwaarde1 = rec.ins_kenmerkwaarde1
	            HAVING count(*) = (SELECT MAX(COUNT(*)) FROM fac_imp_ins b
	                                        WHERE b.ins_kenmerkwaarde1 = a.ins_kenmerkwaarde1
	                                        GROUP by ins_kenmerkwaarde1, ins_kenmerkwaarde3, ins_kenmerkwaarde14, ins_kenmerkwaarde10
	                                        )
	            GROUP by ins_kenmerkwaarde1, ins_kenmerkwaarde3, a.ins_kenmerkwaarde14, ins_kenmerkwaarde10)
	      WHERE rownum = 1;

	      -- Algemene soort controles (terugkerende taken) toevoegen op alle soortdelen die zijn toegevoegd in deze import ( > p_max_ins_srtdeel_key)
	      -- Daartoe bepalen we eerst van alle controles op een objectsoort de grootste gemene deler, de rest (= afwijkingen daarop) worden xcp-records.
	      -- Definitie "Grootste gemene deler" = het meeste aantal records met dezelfde kosten, periode en onderhoudspercentage.

	      -- Fondscode ook in (laatste, zojuist ingeschoten record) ins_srtcontrole verwerken...
				-- We gaan ervan uit, en dat is terecht, dat er 1 fondscode (en niet meer dan 1) bij een v_receptnr bestaat.
				-- Voor het geval dat er toch is (d.i. een fout in het importbestand) doen we veiligheidshalve MAX.

				-- FSN#38080:  kolom AA (VvJr = vervaljaar = kenmerk8) gaan we nu ook gebruiken bij de import (deden we tot nu toe nog niets mee, deze stond altijd ingevuld met een berekende waarde
	      -- indien gevuld met een jaar, dan is dat het vervaljaar van die activiteit bij dat element.
	      -- Let op: vervaljaar doet NIET! mee in de bepaling van de "grootste gemene deler" voor ins_srtcontrole.

		  	INSERT INTO ins_srtcontrole (ctr_discipline_key, ins_srtinstallatie_key, ins_srtcontrole_niveau, ins_srtcontrole_omschrijving, ins_srtcontrole_groep,
	                                   ins_srtcontrole_info, ins_srtcontrole_periode, ins_srtcontrole_eenheid, ins_srtcontrole_mode, ins_srtcontrole_materiaal, fin_btwtabelwaarde_key,
	                                   ins_srtcontrole_percentage, prs_kostenplaats_key)
				SELECT v_ctr_discipline_key, ins_srtdeel_key, 'S', ins_kenmerkwaarde1, MAX (ins_kenmerkwaarde2),
							MAX(ins_kenmerkwaarde2) || ' [' || MAX(ins_kenmerkwaarde13) || ']' , v_periode, 4, 1, fac.safe_to_number(replace(replace(v_kosten, '.'), ',','.')),
							v_fin_btwtabelwaarde_key,
							fac.safe_to_number(replace(replace(v_perc_onderhoud, '.'), ',','.')),
							(SELECT prs_kostenplaats_key
							FROM prs_kostenplaats
							WHERE prs_kostenplaats_verwijder IS NULL
							AND prs_kostenplaats_module = 'ALG'
							AND prs_kostenplaats_upper = (SELECT UPPER(MAX(ins_kenmerkwaarde15))
																						FROM fac_imp_ins
																						WHERE ins_kenmerkwaarde1 = v_receptnr))
				FROM 	ins_srtdeel sd, fac_imp_ins i, ins_srtgroep sg, ins_discipline d
				WHERE ins_srtdeel_key > p_max_ins_srtdeel_key
				AND   sd.ins_srtdeel_code = i.ins_srtdeel_code
				AND   sd.ins_srtgroep_key = sg.ins_srtgroep_key
	      AND   sg.ins_discipline_key = d.ins_discipline_key
	      AND   i.ins_discipline_omschrijving = d.ins_discipline_omschrijving
	      AND   i.ins_srtgroep_omschrijving = sg.ins_srtgroep_omschrijving
				AND   i.ins_kenmerkwaarde1 = v_receptnr
				AND   i.ins_kenmerkwaarde3 = v_kosten
				AND   i.ins_kenmerkwaarde14 = v_periode
				AND   i.ins_kenmerkwaarde10 = v_perc_onderhoud
				AND NOT EXISTS (SELECT 'x' FROM ins_srtcontrole
												WHERE ins_srtinstallatie_key = ins_srtdeel_key
												AND   ins_srtcontrole_niveau = 'S'
												AND  	ins_srtcontrole_groep = v_receptnr)
				GROUP BY ins_srtdeel_key, ins_kenmerkwaarde1;




				-- Uitzonderingen op de algemene (reguliere) soort controle, die dus afwijken van kosten en/of periode, worden toegevoegd als XCP
				-- Let op: hier wordt aantal nog in GROEP gestopt, vraag is of we de eenheid moeten stoppen in ins_srtdeel_aantal of in ins_srtcontrole_aantal /  ins_srtcontroledl_xcp_aantal op dieper nivo.

				-- Check via onderstaande query op araio@labs levert op dat er een paar verschillen in aantal zitten:

				--  araio_waardwonen_verschil_aantal_andere_eenheid.xls: 15 objecten met meerdere activiteiten, verschillend aantal, andere eenheid.
				--	select  a.ins_deel_omschrijving, b.ins_kenmerkwaarde1, b.ins_kenmerkwaarde2, b.ins_kenmerkwaarde13, b.ins_kenmerkwaarde10, c.ins_kenmerkwaarde10,  c.ins_kenmerkwaarde13, c.ins_kenmerkwaarde1, c.ins_kenmerkwaarde2 from
				--	(select ins_deel_omschrijving, count(*) from fac_imp_ins
				--	having count(*) > 1
				--	group by ins_deel_omschrijving) a,
				--	fac_imp_ins b,
				--	fac_imp_ins c
				--	where a.ins_deel_omschrijving = b.ins_deel_omschrijving
				--	AND   b.ins_deel_omschrijving = c.ins_deel_omschrijving
				--	AND   b.ins_kenmerkwaarde1 <> c.ins_kenmerkwaarde1
				--	AND   b.ins_kenmerkwaarde10 <> c.ins_kenmerkwaarde10
				--	AND   b.ins_kenmerkwaarde13 <> c.ins_kenmerkwaarde13
				--	ORDER BY a.ins_deel_omschrijving;

				--  araio_waardwonen_verschil_aantal_dezelfde_eenheid.xls: 30 objecten met meerdere activiteiten, verschillend aantal, dezelfde eenheid
				--	select  a.ins_deel_omschrijving, b.ins_kenmerkwaarde1, b.ins_kenmerkwaarde2, b.ins_kenmerkwaarde13, b.ins_kenmerkwaarde10, c.ins_kenmerkwaarde10,  c.ins_kenmerkwaarde13, c.ins_kenmerkwaarde1, c.ins_kenmerkwaarde2 from
				--	(select ins_deel_omschrijving, count(*) from fac_imp_ins
				--	having count(*) > 1
				--	group by ins_deel_omschrijving) a,
				--	fac_imp_ins b,
				--	fac_imp_ins c
				--	where a.ins_deel_omschrijving = b.ins_deel_omschrijving
				--	AND   b.ins_deel_omschrijving = c.ins_deel_omschrijving
				--	AND   b.ins_kenmerkwaarde1 <> c.ins_kenmerkwaarde1
				--	AND   b.ins_kenmerkwaarde10 <> c.ins_kenmerkwaarde10
				--	AND   b.ins_kenmerkwaarde13 = c.ins_kenmerkwaarde13
				--	ORDER BY a.ins_deel_omschrijving;

				--  araio_waardwonen_meer_activiteiten_met_gelijk_aantal.xlsx: 354 objecten met meerdere activiteiten, gelijke aantal, (dezelfde of afwijkend eenheid).
				--select  a.ins_deel_omschrijving, b.ins_kenmerkwaarde1, b.ins_kenmerkwaarde2, b.ins_kenmerkwaarde13, b.ins_kenmerkwaarde10, c.ins_kenmerkwaarde10,  c.ins_kenmerkwaarde13, c.ins_kenmerkwaarde1, c.ins_kenmerkwaarde2 from
				--(select ins_deel_omschrijving, count(*) from fac_imp_ins
				--having count(*) > 1
				--group by ins_deel_omschrijving) a,
				--fac_imp_ins b,
				--fac_imp_ins c
				--where a.ins_deel_omschrijving = b.ins_deel_omschrijving
				--AND   b.ins_deel_omschrijving = c.ins_deel_omschrijving
				--AND   b.ins_kenmerkwaarde1 <> c.ins_kenmerkwaarde1
				--AND   b.ins_kenmerkwaarde10 = c.ins_kenmerkwaarde10
				---- AND   b.ins_kenmerkwaarde13 = c.ins_kenmerkwaarde13
				--ORDER BY a.ins_deel_omschrijving;
				--;

				--araio_waardwonen_objecten_met_1_activiteit.xlsx: 2940 objecten met 1 activiteit, aantal dont care, eenheid dont care.
				--select ins_deel_omschrijving, MAX(b.ins_kenmerkwaarde1), MAX(b.ins_kenmerkwaarde2), MAX(b.ins_kenmerkwaarde13), MAX(b.ins_kenmerkwaarde10) from fac_imp_ins b
				--having count(*) = 1
				--group by ins_deel_omschrijving;

				-- Aantal objecten ingelezen: 3344.
				-- select distinct (ins_deel_omschrijving) from fac_imp_ins;


				-- Uitzonderingen op de algemene (reguliere) soort controle die we zojuist hebben toegevoegd, die dus afwijken van kosten en/of periode, worden toegevoegd als XCP
				-- Let op: hier wordt aantal nog in GROEP gestopt, vraag is of we de eenheid moeten stoppen in ins_srtdeel_aantal of in ins_srtcontrole_aantal /  ins_srtcontroledl_xcp_aantal op dieper nivo.
				-- Let op 2: Dit zijn natuurlijk alleen de objecten die in deze import zijn toegevoegd (d.ins_deel_key > p_max_ins_deel_key) en afwijkende kosten en afwijkende periode hebben.
	      --			     Verder moet de algemene ins_srtcontrole wel gevonden kunnen worden om een xcp daarop te kunnen maken (foreign-key)

				-- Waneer de kosten OF(!) de periode niet zijn ingevuld (NULL-value), dan gaan we ervan uit dat deze de default volgen, en wordt er geen XCP aangemaakt,
				-- Dus als een van beide ontbreekt, dan volgt die de standaard.

				-- Hier nog ff onthouden wat de laatste xcp record is, is straks nodig voor een nabewerking (cursor 4)
				SELECT coalesce(max(ins_srtcontroledl_xcp_key),0)
	  		INTO v_mx_ins_srtcontroledl_xcp_key
	  		FROM ins_srtcontroledl_xcp;


				v_errormsg := 'Soort controle gegevens: ' ||  ' recept=[' || v_receptnr || '],' || ' kosten=[' || v_kosten || '],' ||
											 															  ' periode=[' || v_periode || '],' || ' percentage=[' || v_perc_onderhoud || '],';

				FOR rec2 IN c2 (p_max_ins_deel_key, v_receptnr, v_kosten, v_periode, v_perc_onderhoud)
				LOOP
					BEGIN


						v_errormsg := 'C2: INSERT INTO ins_srtcontroledl_xcp: ' || 'ins_deel_key=['|| rec2.ins_deel_key || '],' || 'objectomschrijving=[' || rec2.ins_deel_omschrijving || '] ' ||
																																	 'ins_srtcontrole_key=[' || rec2.ins_srtcontrole_key || '],' ||
																																	 'recept=[' || v_receptnr || '],' || 'kosten=[' || rec2.kosten || '],' ||
											 																					   'periode=[' || rec2.periode || '],' || ' percentage=[' || v_perc_onderhoud || '],';

						fac.imp_writelog (p_import_key,
		                                 'I',
		                                 v_errormsg,
		                                 v_errorhint
		                                );

						INSERT INTO ins_srtcontroledl_xcp ( ins_deel_key, ins_srtcontrole_key,  ins_srtcontroledl_xcp_periode,
				  																			ins_srtcontroledl_xcp_materia, ins_srtcontroledl_xcp_perc, ins_srtcontroledl_xcp_eind)
				  	SELECT rec2.ins_deel_key, rec2.ins_srtcontrole_key, rec2.periode, rec2.kosten, rec2.perc_onderhoud, rec2.verval_datum FROM dual;

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


		    FOR rec6 IN c6 (p_max_ins_deel_key, v_receptnr, v_kosten, v_periode, v_perc_onderhoud)
				LOOP
					BEGIN


						v_errormsg := 'C6: VERVALJAAR -> ins_srtcontroledl_xcp: ' || 'ins_deel_key=['|| rec6.ins_deel_key || '],' || 'objectomschrijving=[' || rec6.ins_deel_omschrijving || '] ' ||
																																	 'ins_srtcontrole_key=[' || rec6.ins_srtcontrole_key || '],' ||
																																	 'recept=[' || v_receptnr || '],' || 'kosten=[' || rec6.kosten || '],' ||
											 																					   'periode=[' || rec6.periode || '],' || ' percentage=[' || v_perc_onderhoud || '],';

						fac.imp_writelog (p_import_key,
		                                 'I',
		                                 v_errormsg,
		                                 v_errorhint
		                                );

						INSERT INTO ins_srtcontroledl_xcp ( ins_deel_key, ins_srtcontrole_key, ins_srtcontroledl_xcp_eind)
				  	SELECT rec6.ins_deel_key, rec6.ins_srtcontrole_key, rec6.verval_datum FROM dual;

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



				-- "After" post-processing van de XCP records die zojuist - in voorgaande loop- zijn toegevoegd.
				-- De kolommen (materiaal, periode, percentage) die dezelfde waarde hebben als de standaard ins_srtcontrole moeten op NULL worden gezet,
				-- Maw alleen de echte afwijkingen moeten een waarde (NOT NULL) hebben.
				-- In de cursor c2 worden de records opgehaald waarvan minimaal 1 afwijking is, dat betekent dat er dus ook mogelijk dezelfde waarde als de standaard bestaat.

				v_errormsg := 'NABEWERKING ins_srtcontroledl_xcp: ';

				FOR rec4 IN c4 (v_mx_ins_srtcontroledl_xcp_key)
				LOOP
					BEGIN
						v_errorhint := 'C4: NABEWERKING ins_srtcontroledl_xcp: ' || 'key=[' || rec4.ins_srtcontroledl_xcp_key || '], controle=[ ' || rec4.ins_srtcontrole_omschrijving || ']';
						IF rec4.set_materia_null = 1
						THEN
						  v_errorhint := 'C4a - set_materia_null ' || v_errorhint;
							UPDATE ins_srtcontroledl_xcp SET ins_srtcontroledl_xcp_materia = NULL WHERE ins_srtcontroledl_xcp_key = rec4.ins_srtcontroledl_xcp_key;
						END IF;
						IF rec4.set_periode_null = 1
						THEN
						  v_errorhint := 'C4b - set_periode_null ' || v_errorhint;
							UPDATE ins_srtcontroledl_xcp SET ins_srtcontroledl_xcp_periode = NULL WHERE ins_srtcontroledl_xcp_key = rec4.ins_srtcontroledl_xcp_key;
						END IF;
						IF rec4.set_perc_onderhoud_null = 1
						THEN
						  v_errorhint := 'C4c - set_perc_onderhoud_null ' || v_errorhint;
							UPDATE ins_srtcontroledl_xcp SET ins_srtcontroledl_xcp_perc = NULL WHERE ins_srtcontroledl_xcp_key = rec4.ins_srtcontroledl_xcp_key;
						END IF;

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

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

		  END LOOP; -- cursor c1
		  fac.imp_writelog (p_import_key, 'I', v_receptnr || ',' || v_kosten|| ',' || v_periode|| ',' || v_perc_onderhoud, 'v_receptnr, v_kosten, v_periode, v_perc_onderhoud');

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

		END LOOP; -- cursor c0

   	-- De handmatige verschuivingen vanuit Tobias TMJ of StraVIS die komen overwaaien, die willen we niet verloren laten gaan....
   	FOR rec7 IN c7 (p_max_ins_deel_key)
		LOOP
			BEGIN


				v_errormsg := 'C7: INSPECTIE record -> ins_deelsrtcontrole: ' || 'ins_deel_key=['|| rec7.ins_deel_key || '],' || 'objectomschrijving=[' || rec7.ins_deel_omschrijving || '] ' ||
																															 'ins_srtcontrole_key=[' || rec7.ins_srtcontrole_key || '],';

				fac.imp_writelog (p_import_key,
                                 'I',
                                 v_errormsg,
                                 v_errorhint
                                );

				INSERT INTO ins_deelsrtcontrole (ins_deel_key, ins_srtcontrole_key, ins_deelsrtcontrole_plandatum, ins_deelsrtcontrole_status)
		  	SELECT rec7.ins_deel_key, rec7.ins_srtcontrole_key, rec7.plan_datum, 0 FROM dual;

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


   	-- We gaan dan nog het aantal objecten (ins_deel_aantal) die standaard op 1 staat, bijwerken met kolom 9 (aantal geregistreerde objecten).
   	-- Hiervoor nemen we het hoogste aantal (het object kan voor meerdere activiteiten met verschillende aantal (icm eenheid) worden ingezet), b.v.:

   	-- object A (kozijnen) 10 m2  schilderen
   	-- object A (kozijnen) 2  st. vervangen
   	-- We registeren dan bij object A 10??? (of is 2 beter, omdat dit de preferred eenheid stuks is)?
    fac.imp_writelog (p_import_key, 'I', 'update ins_deel_aantal', '');
   	UPDATE ins_deel d
   	SET ins_deel_aantal = (SELECT COALESCE(fac.safe_to_number(max(ins_kenmerkwaarde9)),1)
   												 FROM 	fac_imp_ins i, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
   												 WHERE  i.ins_deel_omschrijving = d.ins_deel_omschrijving
   												 AND i.alg_locatie_code = l.alg_locatie_code
											     AND i.alg_gebouw_code = g.alg_gebouw_code
											     AND i.alg_verdieping_volgnr =  v.alg_verdieping_volgnr
											     AND i.alg_ruimte_nr =  r.alg_ruimte_nr
											     AND d.ins_alg_ruimte_key = r.alg_ruimte_key
											     AND r.alg_verdieping_key = v.alg_verdieping_key
											     AND v.alg_gebouw_key = g.alg_gebouw_key
											     AND g.alg_locatie_key = l.alg_locatie_key
   												 )
   	WHERE d.ins_deel_key > p_max_ins_deel_key
		AND d.ins_deel_verwijder IS NULL;


		-- De aanmaakdatums van de ins_delen die zijn toegevoegd ( > p_max_ins_deel_key) bepalen de volgende controle-momenten, dus dat komt natuurlijk wel wat nauw.
		-- Daarom wordt StJr (ins_kenmerkwaarde4) als startjaar bij alle objecten (ins_delen) van het betreffende pand gezet.
		fac.imp_writelog (p_import_key, 'I', 'update ins_deel_aanmaak', '');
		UPDATE ins_deel d
		SET ins_deel_aanmaak = (SELECT min( to_date (ins_kenmerkwaarde4, 'yyyy'))
														FROM fac_imp_ins i, alg_ruimte r, alg_verdieping v, alg_gebouw g, alg_locatie l
														WHERE i.ins_deel_omschrijving = d.ins_deel_omschrijving
														AND i.alg_locatie_code = l.alg_locatie_code
											      AND i.alg_gebouw_code = g.alg_gebouw_code
											      AND i.alg_verdieping_volgnr =  v.alg_verdieping_volgnr
											      AND i.alg_ruimte_nr =  r.alg_ruimte_nr
											      AND d.ins_alg_ruimte_key = r.alg_ruimte_key
											      AND r.alg_verdieping_key = v.alg_verdieping_key
											      AND v.alg_gebouw_key = g.alg_gebouw_key
											      AND g.alg_locatie_key = l.alg_locatie_key
														)
		WHERE d.ins_deel_key > p_max_ins_deel_key
		AND d.ins_deel_verwijder IS NULL;


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



CREATE OR REPLACE PROCEDURE arai_update_mjob (
   p_import_key IN NUMBER
) IS

	v_count           			NUMBER;
	v_max_ins_srtdeel_key 	NUMBER(10);
  v_max_ins_deel_key 			NUMBER(10);
BEGIN

  -- Even snel registreren wat de laatst toegevoegde ins_srtdeel is, dan weten we dat er door deze import-procedure wordt toegevoegd (alles > dan deze max).
  SELECT coalesce(max(ins_srtdeel_key),0)
  INTO v_max_ins_srtdeel_key
  FROM ins_srtdeel
  WHERE ins_srtdeel_verwijder IS NULL;

  -- Idem voor laatst toegevoegde ins_deel is, dan weten we dat er door deze import-procedure wordt toegevoegd (alles > dan deze max).
  SELECT coalesce(max(ins_deel_key),0)
  INTO v_max_ins_deel_key
  FROM ins_deel
  WHERE ins_deel_verwijder IS NULL;

  fac_update_ins (p_import_key);

	-- After update ...
	arai_post_update_mjob(p_import_key, v_max_ins_srtdeel_key, v_max_ins_deel_key);

END arai_update_mjob;
/


-- Alle meldingen ouder dan 5 jaar binnen vakgroeptype "Bezoekers en Omwonenden" anonimiseren (ivm AVG)
CREATE OR REPLACE PROCEDURE arai_export_bezomwanon (p_applname   IN VARCHAR2,
                                                    p_applrun    IN VARCHAR2,
                                                    p_filedir    IN VARCHAR2,
                                                    p_filename   IN VARCHAR2)
AS
   CURSOR arai_bezomw_anon
   IS
     SELECT m.mld_melding_key, m.mld_melding_datum
       FROM mld_melding m, mld_discipline md, mld_stdmelding mst
      WHERE     mld_melding_datum <= SYSDATE - INTERVAL '5' YEAR
            AND m.mld_stdmelding_key = mst.mld_stdmelding_key
            AND mst.mld_ins_discipline_key = md.ins_discipline_key
            AND md.ins_srtdiscipline_key = 22;
BEGIN
   FOR rec IN arai_bezomw_anon
   LOOP
      BEGIN
         UPDATE mld_melding
            SET mld_melding_omschrijving = '-GEANONIMISEERD-',
                mld_melding_opmerking = '-GEANONIMISEERD-'
          WHERE mld_melding_key = rec.mld_melding_key;

          UPDATE mld_kenmerkmelding
          SET mld_kenmerkmelding_waarde = 'GEANONIMISEERD'
          WHERE mld_melding_key = rec.mld_melding_key
          AND mld_kenmerk_key IN (506, 506, 508, 509, 510);
      END;
   END LOOP;
END;
/

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