-- Script containing customer specific db-configuration for ARBO.
-- (c) 2011 SG|facilitor bv
-- $Revision$
-- $Id$
--
-- Support: +31 53 4800700

set echo on

spool xarbo.lst

CREATE OR REPLACE VIEW arbo_v_rap_import_log
AS
   SELECT   imp_log_status fclt_f_status,
            imp_log_omschrijving omschrijving,
            imp_log_hint opmerking
     FROM   imp_log l
    WHERE   l.fac_import_key = (SELECT   MAX (fac_import_key)
                                  FROM   fac_import
                                 WHERE   fac_import_app_key = 61);

/* Formatted on 30-3-2011 14:00:30 (QP5 v5.115.810.9015) */
CREATE OR REPLACE PROCEDURE arbo_import_prs (p_import_key IN NUMBER)
IS
   c_fielddelimitor                VARCHAR2 (1) := ';';
   -- LET OP: moet idem zijn als declaratie bij ARBO_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_titel             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_afdeling_omschrijving     VARCHAR2 (256);
   v_prs_srtperslid_omschrijving   VARCHAR2 (256);
   v_alg_locatie_code              VARCHAR2 (256);
   v_alg_gebouw_code               VARCHAR2 (256);
   v_alg_verdieping_code           VARCHAR2 (256);
   v_alg_ruimte_nr                 VARCHAR2 (256);
   v_prs_perslid_telefoonnr        VARCHAR2 (256);
   v_prs_perslid_email             VARCHAR2 (256);
   v_prs_perslid_oslogin           VARCHAR2 (256);
   v_prs_perslid_ingangsdatum      VARCHAR2 (256);
   v_prs_perslid_einddatum         VARCHAR2 (256);
   -- Overig:
   v_prs_perslid_ingangs_date      DATE;
   v_prs_perslid_eind_date         DATE;

   CURSOR c1
   IS
        SELECT   *
          FROM   fac_imp_file
         WHERE   fac_import_key = p_import_key
      ORDER BY   fac_imp_file_index;
BEGIN
   DELETE FROM   arbo_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
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_nr);
         -- 02
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_titel);
         -- 03
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_naam);
         -- 04
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_tussenvoegsel);
         -- 05
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_voorletters);
         -- 06
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_voornaam);
         -- 07
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_afdeling_naam);
         -- 08
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_afdeling_omschrijving);
         -- 09
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_srtperslid_omschrijving);
         -- 10
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_locatie_code);
         -- 11
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_gebouw_code);
         -- 12
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_alg_verdieping_code);
         -- 13
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_ruimte_nr);
         -- 14
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_telefoonnr);
         -- 15
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_email);
         -- 16
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_oslogin);
         -- 17
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_ingangsdatum);
         -- 18
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_einddatum);
         --
         v_aanduiding :=
               '['
            || v_prs_perslid_nr
            || '|'
            || v_prs_perslid_naam
            || '|'
            || v_prs_perslid_tussenvoegsel
            || '|'
            || v_prs_perslid_voornaam
            || '] ';

         -- 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_nr) = 'PERSONEELSNUMMER'
               AND UPPER (v_prs_perslid_titel) = 'TITEL'
               AND UPPER (v_prs_perslid_naam) = 'NAAM'
               AND UPPER (v_prs_perslid_tussenvoegsel) = 'TUSSENVOEGSEL'
               AND UPPER (v_prs_perslid_voorletters) = 'VOORLETTERS'
               AND UPPER (v_prs_perslid_voornaam) = 'VOORNAAM'
               AND UPPER (v_prs_afdeling_naam) = 'AFDELINGSCODE'
               AND UPPER (v_prs_afdeling_omschrijving) =
                     'AFDELINGSOMSCHRIJVING'
               AND UPPER (v_prs_srtperslid_omschrijving) = 'FUNCTIE'
               AND UPPER (v_alg_locatie_code) = 'LOCATIECODE'
               AND UPPER (v_alg_gebouw_code) = 'GEBOUWCODE'
               AND UPPER (v_alg_verdieping_code) = 'BOUWLAAGVOLGNUMMER'
               AND UPPER (v_alg_ruimte_nr) = 'RUIMTENUMMER'
               AND UPPER (v_prs_perslid_telefoonnr) = 'TELEFOON'
               AND UPPER (v_prs_perslid_email) = 'EMAIL'
               AND UPPER (v_prs_perslid_oslogin) = 'LOGINNAAM'
               AND UPPER (v_prs_perslid_ingangsdatum) = 'INDIENSTDATUM'
               AND UPPER (v_prs_perslid_einddatum) = 'UITDIENSTDATUM'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errorhint := 'Ongeldig personeelsnummer';
            v_prs_perslid_nr := TRIM (v_prs_perslid_nr);

            IF (v_prs_perslid_nr IS NULL)
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  v_aanduiding || 'Personeelsnummer (= login) onbekend',
                  'Personeelsnummer is verplicht; regel wordt overgeslagen!'
               );
               COMMIT;
            ELSE
               -- Personeelsnummers met lengte <5 links aanvullen met nullen!!!
               -- LET OP: Personeelsnummer wordt 1-op-1 gebruikt als loginnaam!
               IF LENGTH (v_prs_perslid_nr) < 5
               THEN
                  v_prs_perslid_nr := SUBSTR ('0000' || v_prs_perslid_nr, -5);
               ELSE
                  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
                        || ']'
                     );
                     COMMIT;
                  END IF;
               END IF;
            END IF;

            --
            v_errorhint := 'Ongeldige titel';
            v_prs_perslid_titel := TRIM (v_prs_perslid_titel);

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

            --
            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 || ']'
               );
               COMMIT;
            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!'
                  );
                  COMMIT;
               END IF;
            END IF;

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

            IF LENGTH (v_prs_perslid_tussenvoegsel) > 10
            THEN
               v_prs_perslid_tussenvoegsel :=
                  SUBSTR (v_prs_perslid_tussenvoegsel, 1, 10);
               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
                  || ']'
               );
               COMMIT;
            ELSE
               IF (v_prs_perslid_voornaam IS NULL)
               THEN
                  v_prs_perslid_voornaam := '-';
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding || 'Voornaam onbekend',
                                    'Voornaam wordt gezet op [-]');
                  COMMIT;
               END IF;
            END IF;

            --
            v_errorhint := 'Ongeldige afdelingscode';
            v_prs_afdeling_naam := TRIM (v_prs_afdeling_naam);

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

            --
            v_errorhint := 'Ongeldige afdelingsomschrijving';
            v_prs_afdeling_omschrijving := TRIM (v_prs_afdeling_omschrijving);

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

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

            IF LENGTH (v_prs_srtperslid_omschrijving) > 60
            THEN
               v_prs_srtperslid_omschrijving :=
                  SUBSTR (v_prs_srtperslid_omschrijving, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Functie te lang',
                     'Functie wordt afgebroken tot ['
                  || v_prs_srtperslid_omschrijving
                  || ']'
               );
               COMMIT;
            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!'
                  );
                  COMMIT;
               END IF;
            END IF;

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

            IF LENGTH (v_alg_locatie_code) > 10
            THEN
               v_alg_locatie_code := SUBSTR (v_alg_locatie_code, 1, 10);
               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 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 := 'Ongeldige verdiepingcode';
            v_alg_verdieping_code := TRIM (v_alg_verdieping_code);

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

            --
            v_errorhint := 'Ongeldig ruimtenummer';
            v_alg_ruimte_nr := TRIM (v_alg_ruimte_nr);

            IF LENGTH (v_alg_ruimte_nr) > 10
            THEN
               v_alg_ruimte_nr := SUBSTR (v_alg_ruimte_nr, 1, 10);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Ruimtenummer te lang',
                     'Ruimtenummer wordt afgebroken tot ['
                  || v_alg_ruimte_nr
                  || ']'
               );
               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;

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

            IF LENGTH (v_prs_perslid_email) > 50
            THEN
               v_prs_perslid_email := SUBSTR (v_prs_perslid_email, 1, 50);
               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;

            -- LET OP: Personeelsnummer wordt 1-op-1 gebruikt als loginnaam!
            v_errorhint := 'Ongeldige loginnaam';
            v_prs_perslid_oslogin := v_prs_perslid_nr;

            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
                  || ']'
               );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldige datum in dienst';
            v_prs_perslid_ingangsdatum := TRIM (v_prs_perslid_ingangsdatum);

            IF v_prs_perslid_ingangsdatum IS NOT NULL
            THEN
               BEGIN
                  v_prs_perslid_ingangs_date :=
                     TO_DATE (v_prs_perslid_ingangsdatum, 'dd-mm-yyyy');
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     v_ongeldig := 1;
                     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,
                                       'Regel wordt overgeslagen!');
                     COMMIT;
               END;
            ELSE
               v_prs_perslid_ingangs_date := NULL;
            END IF;

            --
            v_errorhint := 'Ongeldige datum uit dienst';
            v_prs_perslid_einddatum := TRIM (v_prs_perslid_einddatum);

            IF v_prs_perslid_einddatum IS NOT NULL
            THEN
               BEGIN
                  v_prs_perslid_eind_date :=
                     TO_DATE (v_prs_perslid_einddatum, 'dd-mm-yyyy');
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     v_ongeldig := 1;
                     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,
                                       'Regel wordt overgeslagen!');
                     COMMIT;
               END;
            ELSE
               v_prs_perslid_eind_date := NULL;
            END IF;

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

                  INSERT INTO arbo_imp_prs (imp_datum,
                                            prs_perslid_nr,
                                            prs_perslid_titel,
                                            prs_perslid_naam,
                                            prs_perslid_tussenvoegsel,
                                            prs_perslid_voorletters,
                                            prs_perslid_voornaam,
                                            prs_afdeling_naam,
                                            prs_afdeling_omschrijving,
                                            prs_srtperslid_omschrijving,
                                            alg_gebouw_code,
                                            alg_verdieping_code,
                                            alg_ruimte_nr,
                                            prs_perslid_telefoonnr,
                                            prs_perslid_email,
                                            prs_perslid_oslogin,
                                            prs_perslid_ingangsdatum,
                                            prs_perslid_einddatum)
                    VALUES   (SYSDATE,
                              v_prs_perslid_nr,
                              v_prs_perslid_titel,
                              v_prs_perslid_naam,
                              v_prs_perslid_tussenvoegsel,
                              v_prs_perslid_voorletters,
                              v_prs_perslid_voornaam,
                              v_prs_afdeling_naam,
                              v_prs_afdeling_omschrijving,
                              v_prs_srtperslid_omschrijving,
                              v_alg_gebouw_code,
                              v_alg_verdieping_code,
                              v_alg_ruimte_nr,
                              v_prs_perslid_telefoonnr,
                              v_prs_perslid_email,
                              v_prs_perslid_oslogin,
                              v_prs_perslid_ingangs_date,
                              v_prs_perslid_eind_date);

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

/* Formatted on 30-3-2011 14:00:30 (QP5 v5.115.810.9015) */
CREATE OR REPLACE PROCEDURE arbo_update_prs (p_import_key IN NUMBER)
IS
   -- LET OP: moet idem zijn als declaratie bij ARBO_IMPORT_PRS
   c_persoon_inactief       VARCHAR2 (30) := 'INACTIEF: ';
   -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers met een e-mail
   c_max_delta_percentage   NUMBER (10) := 20;
   -- Groep waar personen in geplaatst worden (indien nog geen groep)
   c_groep_upper            VARCHAR2 (30) := '_DEFAULT';
   c_profiel_omschrijving   VARCHAR2 (30) := 'DEFAULT';
   v_aanduiding             VARCHAR2 (200);
   v_errorhint              VARCHAR2 (1000);
   v_errormsg               VARCHAR2 (1000);
   oracle_err_num           NUMBER;
   oracle_err_mes           VARCHAR2 (200);
   v_count_prs_import       NUMBER (10);     -- #actieve personen  na  import!
   v_count_prs_actual       NUMBER (10);     -- #actieve personen voor import!
   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_kostenplaats_key       NUMBER (10);
   v_srtperslid_key         NUMBER (10);
   v_locatie_key            NUMBER (10);
   v_gebouw_key             NUMBER (10);
   v_gebouw_code            VARCHAR2 (10);
   v_verdieping_key         NUMBER (10);
   v_ruimte_key             NUMBER (10);
   v_ruimte_nr              VARCHAR2 (10);
   v_wp_volgnr              NUMBER (3);
   v_wp_oms                 VARCHAR2 (30);
   v_wp_key                 NUMBER (10);
   v_groep_key              NUMBER (10);
   v_profiel_key            NUMBER (10);

   -- Let op! Personen die niet meer in dienst zijn -> niet in arbo_imp_prs!
   -- Dubbele nummers? Dan wordt iemand mogelijk niet verwijderd/INACTIEF!
   CURSOR cdelprs
   IS
      SELECT   p.prs_perslid_key,
               p.prs_perslid_nr,
               p.prs_perslid_naam,
               p.prs_perslid_voornaam
        FROM   prs_v_aanwezigperslid p
       WHERE   p.prs_perslid_nr IS NOT NULL
               --AND p.prs_perslid_oslogin NOT LIKE '\_%' ESCAPE '\'
               AND NOT EXISTS
                     (SELECT   1
                        FROM   arbo_imp_prs ip
                       WHERE   UPPER (ip.prs_perslid_nr) =
                                  UPPER (p.prs_perslid_nr));

   -- Let op! Personen die niet meer in dienst zijn -> niet in arbo_imp_prs!
   CURSOR csrtperslid
   IS
        SELECT   MIN (prs_perslid_nr) prs_perslid_nr,
                 MIN (prs_perslid_naam) prs_perslid_naam,
                 MIN (prs_perslid_voornaam) prs_perslid_voornaam,
                 MIN (prs_srtperslid_omschrijving) prs_srtperslid_omschrijving
          FROM   arbo_imp_prs
      GROUP BY   UPPER (prs_srtperslid_omschrijving);

   -- Let op! Personen die niet meer in dienst zijn -> niet in arbo_imp_prs!
   -- Dubbele nummers? Dan wordt slechts 1 set persoongegevens toegevoegd!
   -- Ook wordt in deze loop de afdelingsomschrijving eventueel bijgewerkt!
   CURSOR cperslid
   IS
      SELECT   * FROM arbo_imp_prs;

   -- Let op! Personen die niet meer in dienst zijn -> niet in arbo_imp_prs!
   -- Dubbele nummers? Dan krijgt iemand mogelijk de verkeerde plaats!
   CURSOR cwp
   IS
      SELECT   p.*,
               ip.alg_locatie_code,
               ip.alg_gebouw_code,
               ip.alg_verdieping_code,
               ip.alg_ruimte_nr
        FROM   arbo_imp_prs ip, prs_v_aanwezigperslid p
       WHERE   UPPER (ip.prs_perslid_nr) = UPPER (p.prs_perslid_nr)
               AND (   ip.alg_locatie_code IS NOT NULL
                    OR ip.alg_gebouw_code IS NOT NULL
                    OR ip.alg_verdieping_code IS NOT NULL
                    OR ip.alg_ruimte_nr IS NOT NULL);

   -- Alle actieve personen met nummer (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
        FROM   prs_v_aanwezigperslid p
       WHERE   p.prs_perslid_nr IS NOT NULL
               AND p.prs_perslid_naam NOT LIKE c_persoon_inactief || '%'
               AND NOT EXISTS
                     (SELECT   1
                        FROM   prs_v_aanwezigperslidwerkplek pw
                       WHERE   pw.prs_perslid_key = p.prs_perslid_key);

   -- Alle aanwezige personen met nummer (ie. de import-doelgroep) niet in een groep
   CURSOR cnogroup
   IS
      SELECT   p.prs_perslid_key,
               p.prs_perslid_nr,
               p.prs_perslid_naam,
               p.prs_perslid_voornaam
        FROM   prs_v_aanwezigperslid p
       WHERE   p.prs_perslid_nr IS NOT NULL
               AND NOT EXISTS
                     (SELECT   1
                        FROM   fac_gebruikersgroep g
                       WHERE   g.prs_perslid_key = p.prs_perslid_key);
BEGIN
   -- Bepaal nummer-match tussen Facilitor en RECENT importbestand ofwel het aantal
   -- actieve personen na import.
   -- RECENT betekent niet meer dan een kwartiertje oud (14,4 minuten); dit voorkomt
   -- dat - als er geen nieuw importbestand is aangeleverd - telkens dezelfde fouten
   -- worden gerapporteerd (nl. op basis van een oud importbestand in ARBO_IMP_PRS).
   SELECT   COUNT ( * )
     INTO   v_count_prs_import
     FROM   prs_v_aanwezigperslid p, arbo_imp_prs ip
    WHERE       p.prs_perslid_nr IS NOT NULL
            AND UPPER (p.prs_perslid_nr) = UPPER (ip.prs_perslid_nr)
            AND (ip.imp_datum + 0.01) > SYSDATE;

   -- Bepaal huidig aantal actieve personen in Facilitor.
   SELECT   DECODE (COUNT ( * ), 0, 1, COUNT ( * ))
     INTO   v_count_prs_actual
     FROM   prs_v_aanwezigperslid
    WHERE   prs_perslid_nr IS NOT NULL;

   IF ( (TRUNC ( (v_count_prs_import / v_count_prs_actual) * 100) >=
              (100 - c_max_delta_percentage)))
   THEN
      -- Geldig importbestand wat betreft aantal personen
      v_errorhint := 'Fout bij bepalen profiel';

      SELECT   MAX (fac_profiel_key), COUNT ( * )
        INTO   v_profiel_key, v_count
        FROM   fac_profiel
       WHERE   UPPER (TRIM (fac_profiel_omschrijving)) =
                  c_profiel_omschrijving;

      IF (v_count = 0)
      THEN
         fac.imp_writelog (
            p_import_key,
            'I',
               'Standaard profiel ['
            || c_profiel_omschrijving
            || '] niet gevonden.',
            'Personen zonder profiel kunnen niet worden gekoppeld aan een profiel.'
         );
         COMMIT;
      END IF;

      FOR recdelprs IN cdelprs
      LOOP
         BEGIN
            v_aanduiding :=
                  recdelprs.prs_perslid_nr
               || '|'
               || recdelprs.prs_perslid_naam
               || '|'
               || recdelprs.prs_perslid_voornaam
               || ' - ';
            v_errorhint := 'Fout bij bepalen verplichtingen';

            -- 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 nummer ['
                  || recdelprs.prs_perslid_nr
                  || '] en naam ['
                  || recdelprs.prs_perslid_naam
                  || ', '
                  || recdelprs.prs_perslid_voornaam
                  || '] is verwijderd',
                  'Persoon is verwijderd'
               );
               COMMIT;
            ELSE
               -- Staat persoon INACTIEF?
               v_errorhint := 'Fout bij bepalen 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 maken persoon';

                  -- Persoon INACTIEF maken (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 nummer ['
                     || recdelprs.prs_perslid_nr
                     || '] en naam ['
                     || recdelprs.prs_perslid_naam
                     || ', '
                     || recdelprs.prs_perslid_voornaam
                     || '] is INACTIEF gemaakt',
                     'Persoon is INACTIEF gemaakt'
                  );
               ELSE
                  v_errorhint := 'Fout bij INACTIEF houden persoon';

                  -- Persoon INACTIEF houden (reset oslogin; indien handmatig INACTIEF gemaakt)
                  UPDATE   prs_perslid
                     SET   prs_perslid_oslogin = NULL
                   WHERE   prs_perslid_naam LIKE c_persoon_inactief || '%'
                           AND prs_perslid_oslogin IS NOT NULL;

                  fac.imp_writelog (
                     p_import_key,
                     'I',
                        'Persoon met nummer ['
                     || recdelprs.prs_perslid_nr
                     || '] en naam ['
                     || recdelprs.prs_perslid_naam
                     || ', '
                     || recdelprs.prs_perslid_voornaam
                     || '] is INACTIEF',
                     'Persoon is INACTIEF'
                  );
               END IF;

               COMMIT;
            END IF;
         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_aanduiding || v_errormsg,
                                 v_errorhint);
               COMMIT;
         END;
      END LOOP;

      v_count_tot := 0;
      v_count_error := 0;

      FOR recsrtperslid IN csrtperslid
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  recsrtperslid.prs_perslid_nr
               || '|'
               || recsrtperslid.prs_perslid_naam
               || '|'
               || recsrtperslid.prs_perslid_voornaam
               || '|'
               || recsrtperslid.prs_srtperslid_omschrijving
               || ' - ';
            v_errorhint := 'Fout bij bepalen functie';

            SELECT   COUNT ( * )
              INTO   v_count
              FROM   prs_v_aanwezigsrtperslid
             WHERE   UPPER (prs_srtperslid_omschrijving) =
                        UPPER (recsrtperslid.prs_srtperslid_omschrijving);

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

               INSERT INTO prs_srtperslid (prs_srtperslid_omschrijving)
                 VALUES   (recsrtperslid.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;

      FOR recperslid IN cperslid
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  recperslid.prs_perslid_nr
               || '|'
               || 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_v_aanwezigsrtperslid
             WHERE   UPPER (prs_srtperslid_omschrijving) =
                        UPPER (recperslid.prs_srtperslid_omschrijving);

            v_errorhint :=
                  'Fout bij bepalen afdeling ['
               || recperslid.prs_afdeling_naam
               || ']';

            SELECT   prs_afdeling_key
              INTO   v_afdeling_key
              FROM   prs_v_aanwezigafdeling
             WHERE   prs_afdeling_upper =
                        UPPER (recperslid.prs_afdeling_naam);

            v_errorhint :=
                  'Fout bij wijzigen afdelingsomschrijving ['
               || recperslid.prs_afdeling_naam
               || '|'
               || recperslid.prs_afdeling_omschrijving
               || ']';

            UPDATE   prs_afdeling
               SET   prs_afdeling_omschrijving =
                        COALESCE (recperslid.prs_afdeling_omschrijving,
                                  prs_afdeling_omschrijving)
             WHERE   prs_afdeling_key = v_afdeling_key;

            COMMIT;

            v_errorhint :=
                  'Fout bij bepalen kostenplaats ['
               || recperslid.prs_afdeling_naam
               || ']';

            SELECT   COUNT ( * )
              INTO   v_count
              FROM   prs_v_aanwezigkostenplaats
             WHERE   prs_kostenplaats_upper =
                        UPPER (recperslid.prs_afdeling_naam);

            IF v_count = 1
            THEN
               SELECT   prs_kostenplaats_key
                 INTO   v_kostenplaats_key
                 FROM   prs_v_aanwezigkostenplaats
                WHERE   prs_kostenplaats_upper =
                           UPPER (recperslid.prs_afdeling_naam);

               v_errorhint :=
                     'Fout bij wijzigen kostenplaatsomschrijving ['
                  || recperslid.prs_afdeling_naam
                  || '|'
                  || recperslid.prs_afdeling_omschrijving
                  || ']';

               UPDATE   prs_kostenplaats
                  SET   prs_kostenplaats_omschrijving =
                           COALESCE (recperslid.prs_afdeling_omschrijving,
                                     prs_kostenplaats_omschrijving)
                WHERE   prs_kostenplaats_key = v_kostenplaats_key;

               COMMIT;
            ELSE
               fac.imp_writelog (
                  p_import_key,
                  'I',
                  v_aanduiding || v_errorhint,
                  'Kostenplaats volgens afdeling bestaat niet!'
               );
               COMMIT;
            END IF;

            v_errorhint := 'Fout bij bepalen persoon';

            SELECT   COUNT ( * ), MAX (prs_perslid_key)
              INTO   v_count, v_perslid_key
              FROM   prs_v_aanwezigperslid
             WHERE   UPPER (prs_perslid_nr) =
                        UPPER (recperslid.prs_perslid_nr);

            IF v_count > 1
            THEN
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errorhint,
                                 'Kan persoon niet 1-duidig bepalen!');
               COMMIT;
            ELSE
               IF v_count = 0
               THEN
                  v_errorhint := 'Fout bij toevoegen persoon';

                  INSERT INTO prs_perslid (
                                              prs_perslid_module,
                                              prs_srtperslid_key,
                                              prs_afdeling_key,
                                              prs_perslid_nr,
                                              prs_perslid_naam,
                                              prs_perslid_tussenvoegsel,
                                              prs_perslid_voorletters,
                                              prs_perslid_voornaam,
                                              prs_perslid_titel,
                                              prs_perslid_telefoonnr,
                                              prs_perslid_email,
                                              prs_perslid_oslogin,
                                              prs_perslid_ingangsdatum,
                                              prs_perslid_einddatum,
                                              fac_profiel_key
                              )
                     VALUES   (
                                  'PRS',
                                  v_srtperslid_key,
                                  v_afdeling_key,
                                  recperslid.prs_perslid_nr,
                                  recperslid.prs_perslid_naam,
                                  recperslid.prs_perslid_tussenvoegsel,
                                  recperslid.prs_perslid_voorletters,
                                  recperslid.prs_perslid_voornaam,
                                  recperslid.prs_perslid_titel,
                                  recperslid.prs_perslid_telefoonnr,
                                  recperslid.prs_perslid_email,
                                  recperslid.prs_perslid_oslogin,
                                  COALESCE (
                                     recperslid.prs_perslid_ingangsdatum,
                                     SYSDATE
                                  ),
                                  recperslid.prs_perslid_einddatum,
                                  v_profiel_key
                              )
                  RETURNING   prs_perslid_key      INTO   v_perslid_key;
               ELSE
                  v_errorhint := 'Fout bij wijzigen persoon';

                  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_tussenvoegsel =
                              recperslid.prs_perslid_tussenvoegsel,
                           prs_perslid_voorletters =
                              recperslid.prs_perslid_voorletters,
                           prs_perslid_voornaam =
                              recperslid.prs_perslid_voornaam,
                           prs_perslid_titel = recperslid.prs_perslid_titel,
                           prs_perslid_telefoonnr =
                              recperslid.prs_perslid_telefoonnr,
                           prs_perslid_email = recperslid.prs_perslid_email,
                           prs_perslid_oslogin =
                              recperslid.prs_perslid_oslogin,
                           prs_perslid_ingangsdatum =
                              COALESCE (recperslid.prs_perslid_ingangsdatum,
                                        prs_perslid_ingangsdatum),
                           prs_perslid_einddatum =
                              recperslid.prs_perslid_einddatum,
                           fac_profiel_key =
                              COALESCE (fac_profiel_key, v_profiel_key)
                   WHERE   prs_perslid_key = v_perslid_key;
               END IF;

               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;

      FOR recwp IN cwp
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  recwp.prs_perslid_nr
               || '|'
               || recwp.prs_perslid_naam
               || '|'
               || recwp.prs_perslid_voornaam
               || '|'
               || recwp.alg_locatie_code
               || '|'
               || recwp.alg_gebouw_code
               || '|'
               || recwp.alg_verdieping_code
               || '|'
               || recwp.alg_ruimte_nr
               || ' - ';
            v_errorhint := 'Fout bij bepalen persoon';

            SELECT   prs_perslid_key
              INTO   v_perslid_key
              FROM   prs_v_aanwezigperslid
             WHERE   UPPER (prs_perslid_nr) = UPPER (recwp.prs_perslid_nr);

            v_locatie_key := NULL;
            v_gebouw_key := NULL;
            v_verdieping_key := NULL;
            v_ruimte_key := NULL;

            v_errorhint := 'Fout bij bepalen locatie';

            SELECT   alg_locatie_key
              INTO   v_locatie_key
              FROM   alg_v_aanweziglocatie
             WHERE   UPPER (alg_locatie_code) =
                        UPPER (recwp.alg_locatie_code);

            v_errorhint := 'Fout bij bepalen gebouw';

            SELECT   alg_gebouw_key
              INTO   v_gebouw_key
              FROM   alg_v_aanweziggebouw
             WHERE   UPPER (alg_gebouw_code) = UPPER (recwp.alg_gebouw_code)
                     AND alg_locatie_key = v_locatie_key;

            v_errorhint := 'Fout bij bepalen verdieping';

            SELECT   alg_verdieping_key
              INTO   v_verdieping_key
              FROM   alg_v_aanwezigverdieping
             WHERE   UPPER (alg_verdieping_code) =
                        UPPER (recwp.alg_verdieping_code)
                     AND alg_gebouw_key = v_gebouw_key;

            v_errorhint := 'Fout bij bepalen ruimte';

            SELECT   alg_ruimte_key
              INTO   v_ruimte_key
              FROM   alg_v_aanwezigruimte
             WHERE   UPPER (alg_ruimte_nr) = UPPER (recwp.alg_ruimte_nr)
                     AND alg_verdieping_key = v_verdieping_key;

            -- Verwijder oude werkplek op dezelfde locatie, tenzij ongewijzigd!
            v_errorhint := 'Fout bij bepalen of werkplek is gewijzigd';

            SELECT   COUNT ( * )
              INTO   v_count
              FROM   prs_v_aanwezigperslidwerkplek pw, prs_werkplek w
             WHERE       pw.prs_perslid_key = v_perslid_key
                     AND pw.prs_werkplek_key = w.prs_werkplek_key
                     AND w.prs_alg_ruimte_key = v_ruimte_key;

            IF v_count = 0
            THEN
               v_errorhint := 'Fout bij verwijderen oude werkplek op locatie';

               UPDATE   prs_perslidwerkplek
                  SET   prs_perslidwerkplek_verwijder = SYSDATE
                WHERE   prs_perslidwerkplek_key IN
                              (SELECT   pw.prs_perslidwerkplek_key
                                 FROM   prs_v_aanwezigperslidwerkplek pw,
                                        prs_werkplek w,
                                        alg_ruimte r,
                                        alg_verdieping v,
                                        alg_gebouw g
                                WHERE   pw.prs_perslid_key = v_perslid_key
                                        AND pw.prs_werkplek_key =
                                              w.prs_werkplek_key
                                        AND w.prs_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 = v_locatie_key);

               COMMIT;
            END IF;

            -- Als persoon nu nog een werkplek heeft op locatie, dan gebeurt
            -- daar niets mee (nl. ongewijzgd)!
            v_errorhint :=
               'Fout bij bepalen of persoon op locatie een werkplek heeft';

            SELECT   COUNT ( * )
              INTO   v_count
              FROM   prs_v_aanwezigperslidwerkplek pw,
                     prs_werkplek w,
                     alg_ruimte r,
                     alg_verdieping v,
                     alg_gebouw g
             WHERE       pw.prs_perslid_key = v_perslid_key
                     AND pw.prs_werkplek_key = w.prs_werkplek_key
                     AND w.prs_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 = v_locatie_key;

            -- v_count=0 -> persoon verhuist naar/krijgt wp op locatie.
            IF v_count = 0 AND v_ruimte_key IS NOT NULL
            THEN
               v_errorhint := 'Fout bij bepalen vrije werkplek';

               SELECT   COUNT ( * )
                 INTO   v_count
                 FROM   prs_v_aanwezigwerkplek w
                WHERE   w.prs_alg_ruimte_key = v_ruimte_key
                        AND NOT EXISTS
                              (SELECT   1
                                 FROM   prs_v_aanwezigperslidwerkplek pw
                                WHERE   pw.prs_werkplek_key =
                                           w.prs_werkplek_key);

               IF v_count > 0
               THEN
                  SELECT   MIN (w.prs_werkplek_key)
                    INTO   v_wp_key
                    FROM   prs_v_aanwezigwerkplek w
                   WHERE   w.prs_alg_ruimte_key = v_ruimte_key
                           AND NOT EXISTS
                                 (SELECT   1
                                    FROM   prs_v_aanwezigperslidwerkplek pw
                                   WHERE   pw.prs_werkplek_key =
                                              w.prs_werkplek_key);

                  -- Verwijder (hard) de mogelijk eerder logisch verwijderde
                  -- koppeling tussen dezelfde persoon en werkplek!!!
                  DELETE FROM   prs_perslidwerkplek pw
                        WHERE   pw.prs_perslid_key = v_perslid_key
                                AND pw.prs_werkplek_key = v_wp_key
                                AND pw.prs_perslidwerkplek_verwijder IS NOT NULL;

                  v_errorhint :=
                     'Fout bij koppelen persoon aan vrije werkplek';

                  INSERT INTO prs_perslidwerkplek (
                                                      prs_perslid_key,
                                                      prs_werkplek_key,
                                                      prs_perslidwerkplek_bezetting
                             )
                    VALUES   (v_perslid_key, v_wp_key, 100);

                  COMMIT;
               ELSE
                  v_errorhint := 'Fout bij bepalen nieuwe werkplek';

                  SELECT   COALESCE (MAX (w.prs_werkplek_volgnr), 0) + 1
                    INTO   v_wp_volgnr
                    FROM   prs_werkplek w
                   WHERE   w.prs_alg_ruimte_key = v_ruimte_key;

                  v_wp_oms := v_ruimte_nr || '/' || TO_CHAR (v_wp_volgnr);

                  v_errorhint := 'Fout bij toevoegen nieuwe werkplek';

                  INSERT INTO prs_werkplek (prs_werkplek_module,
                                            prs_werkplek_volgnr,
                                            prs_werkplek_omschrijving,
                                            prs_alg_ruimte_key)
                     VALUES   ('PRR',
                               v_wp_volgnr,
                               v_wp_oms,
                               v_ruimte_key)
                  RETURNING   prs_werkplek_key      INTO   v_wp_key;

                  v_errorhint :=
                     'Fout bij koppelen persoon aan nieuwe werkplek';

                  INSERT INTO prs_perslidwerkplek (
                                                      prs_perslid_key,
                                                      prs_werkplek_key,
                                                      prs_perslidwerkplek_bezetting
                             )
                    VALUES   (v_perslid_key, v_wp_key, 100);

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

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

      FOR recnowp IN cnowp
      LOOP
         BEGIN
            fac.imp_writelog (
               p_import_key,
               'I',
                  'Persoon met nummer ['
               || recnowp.prs_perslid_nr
               || '] en naam ['
               || recnowp.prs_perslid_naam
               || ', '
               || recnowp.prs_perslid_voornaam
               || '] heeft geen werkplek',
               'Geen werkplek'
            );
            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;

      FOR recnogroup IN cnogroup
      LOOP
         BEGIN
            v_aanduiding :=
                  recnogroup.prs_perslid_nr
               || '|'
               || recnogroup.prs_perslid_naam
               || '|'
               || recnogroup.prs_perslid_voornaam
               || ' - ';
            v_errorhint := 'Fout bij bepalen groep [' || c_groep_upper || ']';

            SELECT   fac_groep_key
              INTO   v_groep_key
              FROM   fac_groep
             WHERE   fac_groep_upper = c_groep_upper;

            v_errorhint :=
                  'Fout bij koppelen persoon aan groep ['
               || c_groep_upper
               || ']';

            INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key)
              VALUES   (v_groep_key, 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;

      -- Verwijder ongebruikte functies; deze import bepaalt de functies!
      DELETE FROM   prs_srtperslid sp
            WHERE   NOT EXISTS
                       (SELECT   1
                          FROM   prs_perslid p
                         WHERE   p.prs_srtperslid_key = sp.prs_srtperslid_key);

      COMMIT;
   ELSE
      IF (v_count_prs_import = 0)
      THEN
         fac.imp_writelog (
            p_import_key,
            'S',
            'Geen nieuw/recent bestand met te importeren personen aangetroffen!',
            ''
         );
      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)
            || ']'
         );
      END IF;

      COMMIT;
   END IF;

   COMMIT;
END arbo_update_prs;
/

-- ARBO#20210 AutoClose alle bestellingen noti-dagen na aanmaken.
CREATE OR REPLACE PROCEDURE arbo_select_autoclose (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
BEGIN
   NULL;
END;
/

CREATE OR REPLACE FORCE VIEW arbo_v_export_autoclose (RESULT, result_order)
AS
   SELECT '', 0
     FROM DUAL
    WHERE 1 = 0;
/

/* Formatted on 1-4-2011 14:48:18 (QP5 v5.115.810.9015) */
CREATE OR REPLACE PROCEDURE arbo_export_autoclose (p_applname   IN VARCHAR2,
                                                   p_applrun    IN VARCHAR2,
                                                   p_filedir    IN VARCHAR2,
                                                   p_filename   IN VARCHAR2)
AS
BEGIN
   FOR rc
   IN (SELECT   boi.bes_bestelopdr_item_key, bo.bes_bestelopdr_key
         FROM   bes_bestelopdr_item boi,
                bes_bestelopdr bo,
                bes_bestelling_item bi,
                bes_bestelling b,
                bes_srtdeel sd,
                bes_srtgroep sg,
                bes_disc_params bdp
        WHERE       boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
                AND bo.bes_bestelopdr_status = 4              -- In bestelling
                AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
                AND bi.bes_bestelling_key = b.bes_bestelling_key
                AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
                AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
                --AND sg.ins_discipline_key = -1
                AND sg.ins_discipline_key = bdp.bes_ins_discipline_key
                AND bdp.bes_disc_params_noti_dagen IS NOT NULL
                AND (b.bes_bestelling_datum IS NULL
                     OR fac.datumtijdplusuitvoertijd (
                          b.bes_bestelling_leverdatum,
                          bdp.bes_disc_params_noti_dagen,
                          'DAGEN'
                       ) < SYSDATE))
   LOOP
      UPDATE   bes_bestelopdr_item
         SET   bes_bestelopdr_item_aantalontv = bes_bestelopdr_item_aantal
       WHERE   bes_bestelopdr_item_key = rc.bes_bestelopdr_item_key;

      bes.updatebestelopdrstatus (rc.bes_bestelopdr_key, NULL);

      COMMIT;
   END LOOP;

   FOR rc
   IN (SELECT   bi.bes_bestelling_item_key, bi.bes_bestelling_key
         FROM   bes_bestelling_item bi, bes_bestelopdr_item boi
        WHERE   bi.bes_bestelling_item_aantal <>
                   NVL (bi.bes_bestelling_item_aantalontv, 0)
                AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
                AND boi.bes_bestelopdr_item_aantal =
                      boi.bes_bestelopdr_item_aantalontv)
   LOOP
      UPDATE   bes_bestelling_item
         SET   bes_bestelling_item_aantalontv = bes_bestelling_item_aantal
       WHERE   bes_bestelling_item_key = rc.bes_bestelling_item_key;

      bes.updatebestellingstatus (rc.bes_bestelling_key, NULL);

      COMMIT;
   END LOOP;
END;
/

/* Formatted on 14-10-2011 16:26:54 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW arbo_v_rap_ruimteoverzicht
(
   fclt_f_locatie,
   fclt_f_gebouw,
   fclt_f_verdieping,
   ruimtenr,
   omschrijving,
   fclt_f_ruimtefunctie,
   fclt_f_vloersoort,
   oppervlak
)
AS
   SELECT   a.alg_locatie_code,
            a.alg_gebouw_code,
            a.alg_verdieping_code,
            a.alg_ruimte_nr,
            a.alg_ruimte_omschrijving,
            a.ruimtefunctie,
            b.vloersoort,
            a.opp
     FROM      (SELECT   r.alg_ruimte_key,
                         r.alg_ruimte_nr,
                         r.alg_ruimte_omschrijving,
                         v.alg_verdieping_code,
                         g.alg_gebouw_code,
                         l.alg_locatie_code,
                         sr.alg_srtruimte_upper ruimtefunctie,
                         r.alg_ruimte_bruto_vloeropp opp
                  FROM   alg_v_aanwezigruimte r,
                         alg_verdieping v,
                         alg_gebouw g,
                         alg_locatie l,
                         alg_srtruimte sr
                 WHERE       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 r.alg_srtruimte_key = sr.alg_srtruimte_key(+)) a
            LEFT JOIN
               (SELECT   ok.alg_onrgoed_key, ud.fac_usrdata_omschr vloersoort
                  FROM   alg_onrgoedkenmerk ok, fac_usrdata ud
                 WHERE   ok.alg_kenmerk_key = 1020               -- Vloersoort
                         AND ok.alg_onrgoed_niveau = 'R'
                         AND ok.alg_onrgoedkenmerk_waarde =
                               ud.fac_usrdata_key) b
            ON a.alg_ruimte_key = b.alg_onrgoed_key;

-- Bevat CUST01- en CUST02-reminder naar beheerder verantwoordelijk voor de
-- keuring van betreffende objecten.
-- CUST01: wekelijks mbt. over 2 tot 3 weken te keuren objecten!
-- CUST02: wekelijks mbt. objecten waarvan keuringsdatum een week is verstreken!
/* Formatted on 26-1-2012 10:10:10 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW ARBO_V_NOTI_KEURINGREMINDER
(
   code,
   sender,
   receiver,
   text,
   KEY,
   par1,
   par2,
   xkey
)
AS
   SELECT   DISTINCT
            sn.fac_srtnotificatie_code code,
            NULL sender,
            gg.prs_perslid_key receiver,
            REPLACE (
               REPLACE (
                  REPLACE (
                     sn.fac_srtnotificatie_oms,
                     '##SRTGROEP##',
                     DECODE (x.min_srtgroep_oms,
                             x.max_srtgroep_oms, x.min_srtgroep_oms,
                             x.min_srtgroep_oms || ', ...')
                  ),
                  '##AANTAL##',
                  x.aantal
               ),
               '##REGIO##',
               (SELECT   alg_regio_omschrijving
                  FROM   alg_regio
                 WHERE   alg_regio_key = x.alg_regio_key)
            )
               subject,
            x.dummy_deel_key,                                  -- Dummy key!!!
            NULL,
            NULL,
            x.alg_regio_key
     FROM   (  SELECT   o.alg_regio_key,
                        MIN (o.ins_srtgroep_omschrijving) min_srtgroep_oms,
                        MAX (o.ins_srtgroep_omschrijving) max_srtgroep_oms,
                        MIN (o.ins_deel_key) dummy_deel_key,
                        COUNT (DISTINCT o.ins_deel_key) aantal
                 FROM         (SELECT   scs.ins_srtinstallatie_key
                                           ins_srtdeel_key,
                                        scs.ins_srtcontrole_key,
                                        scs.ins_srtcontrole_omschrijving,
                                        scs.ins_srtcontrole_periode
                                 FROM   ins_srtcontrole scs
                                WHERE   scs.ins_srtcontrole_niveau = 'S'
                               UNION ALL
                               SELECT   sd.ins_srtdeel_key,
                                        scg.ins_srtcontrole_key,
                                        scg.ins_srtcontrole_omschrijving,
                                        scg.ins_srtcontrole_periode
                                 FROM   ins_srtcontrole scg, ins_srtdeel sd
                                WHERE   scg.ins_srtcontrole_niveau = 'G'
                                        AND scg.ins_srtinstallatie_key =
                                              sd.ins_srtgroep_key
                               UNION ALL
                               SELECT   sd.ins_srtdeel_key,
                                        scd.ins_srtcontrole_key,
                                        scd.ins_srtcontrole_omschrijving,
                                        scd.ins_srtcontrole_periode
                                 FROM   ins_srtcontrole scd,
                                        ins_srtgroep sg,
                                        ins_srtdeel sd
                                WHERE   scd.ins_srtcontrole_niveau = 'D'
                                        AND scd.ins_srtinstallatie_key =
                                              sg.ins_discipline_key
                                        AND sg.ins_srtgroep_key =
                                              sd.ins_srtgroep_key) cso -- ControleSoortObjecten
                           LEFT JOIN
                              (SELECT   d.ins_deel_key,
                                        d.ins_deel_aanmaak,
                                        sd.ins_srtdeel_key,
                                        sg.ins_srtgroep_omschrijving,
                                        td.ins_discipline_key,
                                        td.ins_discipline_omschrijving,
                                        d.alg_regio_key
                                 FROM   ins_v_aanwezigdeel d,
                                        ins_srtdeel sd,
                                        ins_srtgroep sg,
                                        ins_tab_discipline td,
                                        alg_locatie l,
                                        alg_district d
                                WHERE   d.ins_srtdeel_key = sd.ins_srtdeel_key
                                        AND sd.ins_srtgroep_key =
                                              sg.ins_srtgroep_key
                                        AND sg.ins_discipline_key =
                                              td.ins_discipline_key
                                        AND d.ins_alg_locatie_key =
                                              l.alg_locatie_key
                                        AND l.alg_district_key =
                                              d.alg_district_key) o -- Objecten
                           ON cso.ins_srtdeel_key = o.ins_srtdeel_key
                        LEFT JOIN
                           (SELECT   dsc.ins_deel_key,
                                     dsc.ins_srtcontrole_key,
                                     dsc.ins_deelsrtcontrole_datum,
                                     dsc.ins_deelsrtcontrole_opmerking
                              FROM   ins_deelsrtcontrole dsc
                             WHERE   dsc.ins_deelsrtcontrole_datum =
                                        (SELECT   MAX (
                                                     ins_deelsrtcontrole_datum
                                                  )
                                           FROM   ins_deelsrtcontrole
                                          WHERE   ins_deel_key =
                                                     dsc.ins_deel_key
                                                  AND ins_srtcontrole_key =
                                                        dsc.ins_srtcontrole_key))
                           olc                        -- ObjectLaatsteControle
                        ON o.ins_deel_key = olc.ins_deel_key
                           AND cso.ins_srtcontrole_key =
                                 olc.ins_srtcontrole_key
                WHERE   COALESCE (olc.ins_deelsrtcontrole_datum,
                                  o.ins_deel_aanmaak)
                        + cso.ins_srtcontrole_periode BETWEEN TRUNC (
                                                                 SYSDATE + 14
                                                              )
                                                          AND  TRUNC (
                                                                  SYSDATE + 21
                                                               )
             GROUP BY   o.alg_regio_key) x,
            alg_district d,
            alg_locatie l,
            alg_gebouw g,
            alg_verdieping v,
            alg_ruimte r,
            prs_v_aanwezigwerkplek wp,
            prs_v_aanwezigperslidwerkplek pw,
            fac_gebruikersgroep gg,
            fac_srtnotificatie sn
    WHERE       x.alg_regio_key = d.alg_regio_key
            AND d.alg_district_key = l.alg_district_key
            AND l.alg_locatie_key = g.alg_locatie_key
            AND g.alg_gebouw_key = v.alg_gebouw_key
            AND v.alg_verdieping_key = r.alg_verdieping_key
            AND r.alg_ruimte_key = wp.prs_alg_ruimte_key
            AND wp.prs_werkplek_key = pw.prs_werkplek_key
            AND pw.prs_perslid_key = gg.prs_perslid_key
            AND gg.fac_groep_key IN (23, 161) -- BO Huismeester/Onderhoudscoordinator
            AND sn.fac_srtnotificatie_code = 'CUST01'
   UNION ALL
   SELECT   DISTINCT
            sn.fac_srtnotificatie_code code,
            NULL sender,
            gg.prs_perslid_key receiver,
            REPLACE (
               REPLACE (
                  REPLACE (
                     sn.fac_srtnotificatie_oms,
                     '##SRTGROEP##',
                     DECODE (x.min_srtgroep_oms,
                             x.max_srtgroep_oms, x.min_srtgroep_oms,
                             x.min_srtgroep_oms || ', ...')
                  ),
                  '##AANTAL##',
                  x.aantal
               ),
               '##REGIO##',
               (SELECT   alg_regio_omschrijving
                  FROM   alg_regio
                 WHERE   alg_regio_key = x.alg_regio_key)
            )
               subject,
            x.dummy_deel_key,                                  -- Dummy key!!!
            NULL,
            NULL,
            x.alg_regio_key
     FROM   (  SELECT   o.alg_regio_key,
                        MIN (o.ins_srtgroep_omschrijving) min_srtgroep_oms,
                        MAX (o.ins_srtgroep_omschrijving) max_srtgroep_oms,
                        MIN (o.ins_deel_key) dummy_deel_key,
                        COUNT (DISTINCT o.ins_deel_key) aantal
                 FROM         (SELECT   scs.ins_srtinstallatie_key
                                           ins_srtdeel_key,
                                        scs.ins_srtcontrole_key,
                                        scs.ins_srtcontrole_omschrijving,
                                        scs.ins_srtcontrole_periode
                                 FROM   ins_srtcontrole scs
                                WHERE   scs.ins_srtcontrole_niveau = 'S'
                               UNION ALL
                               SELECT   sd.ins_srtdeel_key,
                                        scg.ins_srtcontrole_key,
                                        scg.ins_srtcontrole_omschrijving,
                                        scg.ins_srtcontrole_periode
                                 FROM   ins_srtcontrole scg, ins_srtdeel sd
                                WHERE   scg.ins_srtcontrole_niveau = 'G'
                                        AND scg.ins_srtinstallatie_key =
                                              sd.ins_srtgroep_key
                               UNION ALL
                               SELECT   sd.ins_srtdeel_key,
                                        scd.ins_srtcontrole_key,
                                        scd.ins_srtcontrole_omschrijving,
                                        scd.ins_srtcontrole_periode
                                 FROM   ins_srtcontrole scd,
                                        ins_srtgroep sg,
                                        ins_srtdeel sd
                                WHERE   scd.ins_srtcontrole_niveau = 'D'
                                        AND scd.ins_srtinstallatie_key =
                                              sg.ins_discipline_key
                                        AND sg.ins_srtgroep_key =
                                              sd.ins_srtgroep_key) cso -- ControleSoortObjecten
                           LEFT JOIN
                              (SELECT   d.ins_deel_key,
                                        d.ins_deel_aanmaak,
                                        sd.ins_srtdeel_key,
                                        sg.ins_srtgroep_omschrijving,
                                        td.ins_discipline_key,
                                        td.ins_discipline_omschrijving,
                                        d.alg_regio_key
                                 FROM   ins_v_aanwezigdeel d,
                                        ins_srtdeel sd,
                                        ins_srtgroep sg,
                                        ins_tab_discipline td,
                                        alg_locatie l,
                                        alg_district d
                                WHERE   d.ins_srtdeel_key = sd.ins_srtdeel_key
                                        AND sd.ins_srtgroep_key =
                                              sg.ins_srtgroep_key
                                        AND sg.ins_discipline_key =
                                              td.ins_discipline_key
                                        AND d.ins_alg_locatie_key =
                                              l.alg_locatie_key
                                        AND l.alg_district_key =
                                              d.alg_district_key) o -- Objecten
                           ON cso.ins_srtdeel_key = o.ins_srtdeel_key
                        LEFT JOIN
                           (SELECT   dsc.ins_deel_key,
                                     dsc.ins_srtcontrole_key,
                                     dsc.ins_deelsrtcontrole_datum,
                                     dsc.ins_deelsrtcontrole_opmerking
                              FROM   ins_deelsrtcontrole dsc
                             WHERE   dsc.ins_deelsrtcontrole_datum =
                                        (SELECT   MAX (
                                                     ins_deelsrtcontrole_datum
                                                  )
                                           FROM   ins_deelsrtcontrole
                                          WHERE   ins_deel_key =
                                                     dsc.ins_deel_key
                                                  AND ins_srtcontrole_key =
                                                        dsc.ins_srtcontrole_key))
                           olc                        -- ObjectLaatsteControle
                        ON o.ins_deel_key = olc.ins_deel_key
                           AND cso.ins_srtcontrole_key =
                                 olc.ins_srtcontrole_key
                WHERE   COALESCE (olc.ins_deelsrtcontrole_datum,
                                  o.ins_deel_aanmaak)
                        + cso.ins_srtcontrole_periode < TRUNC (SYSDATE - 7)
             GROUP BY   o.alg_regio_key) x,
            alg_district d,
            alg_locatie l,
            alg_gebouw g,
            alg_verdieping v,
            alg_ruimte r,
            prs_v_aanwezigwerkplek wp,
            prs_v_aanwezigperslidwerkplek pw,
            fac_gebruikersgroep gg,
            fac_srtnotificatie sn
    WHERE       x.alg_regio_key = d.alg_regio_key
            AND d.alg_district_key = l.alg_district_key
            AND l.alg_locatie_key = g.alg_locatie_key
            AND g.alg_gebouw_key = v.alg_gebouw_key
            AND v.alg_verdieping_key = r.alg_verdieping_key
            AND r.alg_ruimte_key = wp.prs_alg_ruimte_key
            AND wp.prs_werkplek_key = pw.prs_werkplek_key
            AND pw.prs_perslid_key = gg.prs_perslid_key
            AND gg.fac_groep_key IN (23, 161) -- BO Huismeester/Onderhoudscoordinator
            AND sn.fac_srtnotificatie_code = 'CUST02';

/* Formatted on 9-2-2012 13:24:42 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW ARBO_V_UC_RELATIES (BEDRIJF_KEY, BEDRIJF_NAAM)
AS
   SELECT   b.prs_bedrijf_key, b.prs_bedrijf_naam
     FROM   prs_v_aanwezigbedrijf b
    WHERE   b.prs_bedrijf_uitvoerende = 1 OR b.prs_bedrijf_contract = 1;

/* Formatted on 30-3-2012 14:52:32 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW ARBO_V_GRAPH_MLD_PMND
(
   FCLT_XAS_,
   FCLT_YAS_,
   VOLGORDE
)
AS
     SELECT   DECODE (SUBSTR (TO_CHAR (m.mld_melding_datum, 'yyyymm'), 5),
                      '01', 'Januari',
                      '02', 'Februari',
                      '03', 'Maart',
                      '04', 'April',
                      '05', 'Mei',
                      '06', 'Juni',
                      '07', 'Juli',
                      '08', 'Augustus',
                      '09', 'September',
                      '10', 'Oktober',
                      '11', 'November',
                      'December'),
              COUNT (d.ins_discipline_omschrijving),
              TO_CHAR (m.mld_melding_datum, 'yyyymm')
       FROM   mld_melding m, mld_stdmelding sm, ins_tab_discipline d
      WHERE   m.mld_melding_datum BETWEEN ADD_MONTHS (
                                             TO_DATE (
                                                TO_CHAR (SYSDATE, 'yyyymm')
                                                || '01',
                                                'yyyymmdd'
                                             ),
                                             -11
                                          )
                                      AND  SYSDATE
              AND m.mld_stdmelding_key = sm.mld_stdmelding_key
              AND sm.mld_ins_discipline_key = d.ins_discipline_key
   GROUP BY   TO_CHAR (m.mld_melding_datum, 'yyyymm');

/* Formatted on 2-4-2012 13:45:04 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW ARBO_V_GRAPH_MLD_BEHANDELAAR
(
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_
)
AS
     SELECT   behandelaar,
              COUNT (mld_key) - SUM (uitvoeringoptijd) totaal,
              SUM (uitvoeringoptijd) op_tijd
       FROM   (SELECT   m.mld_melding_key mld_key,
                        CASE SIGN(fac.datumtijdplusuitvoertijd (
                                     m.mld_melding_datum,
                                     m.mld_melding_uitvoertijd,
                                     'DAGEN'
                                  )
                                  - SYSDATE)
                           WHEN -1
                           THEN
                              0
                           ELSE
                              1
                        END
                           uitvoeringoptijd,
                        DECODE (
                           m.mld_melding_status,
                           4,
                           DECODE (
                              (SELECT   COUNT ( * )
                                 FROM   mld_opdr o
                                WHERE   o.mld_melding_key = m.mld_melding_key
                                        AND o.mld_statusopdr_key IN
                                                 (3, 4, 5, 8)), -- 3-Ter fiattering, 4-Gefiatteerd, 5-Uitgegeven, 8-Geaccepteerd
                              0,
                              p.prs_perslid_naam_full,
                              NULL
                           ),
                           7,
                           NULL,
                           p.prs_perslid_naam_full
                        )
                           behandelaar
                 FROM   mld_melding m, prs_v_perslid_fullnames p
                WHERE   m.mld_melding_behandelaar_key = p.prs_perslid_key(+)
                        AND m.mld_melding_status IN (2, 3, 4, 7, 0)) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
      WHERE   behandelaar IS NOT NULL
   GROUP BY   behandelaar
   UNION ALL        -- Extra kolom zodat voorgaande kolommen helemaal getoond?
   SELECT   '-', 0 totaal, 0 op_tijd
     FROM   DUAL
    WHERE   EXISTS (SELECT   1
                      FROM   mld_melding m
                     WHERE   m.mld_melding_status IN (2, 3, 4, 7, 0));

/* Formatted on 2-4-2012 13:45:04 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW ARBO_V_GRAPH_MLD_UITVOERENDE
(
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_
)
AS
     SELECT   uitvoerende,
              COUNT (opdr_key) - SUM (uitvoeringoptijd) totaal,
              SUM (uitvoeringoptijd) op_tijd
       FROM   (SELECT   o.mld_opdr_key opdr_key,
                        CASE SIGN(fac.datumtijdplusuitvoertijd (
                                     m.mld_melding_datum,
                                     m.mld_melding_uitvoertijd,
                                     'DAGEN'
                                  )
                                  - SYSDATE)
                           WHEN -1
                           THEN
                              0
                           ELSE
                              1
                        END
                           uitvoeringoptijd,
                        b.prs_bedrijf_naam uitvoerende
                 FROM   mld_opdr o, mld_melding m, prs_bedrijf b
                WHERE       o.mld_melding_key = m.mld_melding_key
                        AND o.mld_uitvoerende_keys = b.prs_bedrijf_key
                        AND o.mld_statusopdr_key IN (3, 4, 5, 8)) -- 3-Ter fiattering, 4-Gefiatteerd, 5-Uitgegeven, 8-Geaccepteerd
      WHERE   uitvoerende IS NOT NULL
   GROUP BY   uitvoerende
   UNION ALL        -- Extra kolom zodat voorgaande kolommen helemaal getoond?
   SELECT   '-', 0 totaal, 0 op_tijd
     FROM   DUAL
    WHERE   EXISTS
               (SELECT   1
                  FROM   mld_opdr o, prs_bedrijf b
                 WHERE   o.mld_uitvoerende_keys = b.prs_bedrijf_key
                         AND o.mld_statusopdr_key IN (3, 4, 5, 8));

/* Formatted on 30-3-2012 15:48:14 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW ARBO_V_GRAPH_VAKGROEP_OPEN
(
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_URL,
   FCLT_3D_DISCIPLINE_KEY
)
AS
     SELECT   md.ins_discipline_omschrijving,
              COUNT (md.ins_discipline_omschrijving),
                 'appl/mld/mld_search.asp?urole=fo'
              || '&'
              || 'autosearch=1'
              || '&'
              || 'disc_key_str='
              || md.ins_discipline_key,
              md.ins_discipline_key
       FROM   mld_melding m, mld_stdmelding sm, mld_discipline md
      WHERE       m.mld_stdmelding_key = sm.mld_stdmelding_key
              AND sm.mld_ins_discipline_key = md.ins_discipline_key
              AND m.mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
   GROUP BY   md.ins_discipline_key, md.ins_discipline_omschrijving
   ORDER BY   COUNT (md.ins_discipline_omschrijving) DESC;

/* Formatted on 30-3-2012 16:26:36 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW ARBO_V_GRAPH_PPI_ACP
(
   FCLT_XAS_,
   FCLT_YAS_
)
AS
   SELECT   SUM (acceptatieoptijd) aantal, COUNT (mld_key) totaal
     FROM   (SELECT   DISTINCT
                      m.mld_melding_key mld_key,
                      CASE SIGN(fac.datumtijdplusuitvoertijd (
                                   fac.gettrackingdate ('MLDNEW',
                                                        m.mld_melding_key),
                                   sm.mld_stdmelding_urgentie,
                                   'UREN'
                                )
                                - SYSDATE)
                         WHEN -1
                         THEN
                            0
                         ELSE
                            1
                      END
                         acceptatieoptijd
               FROM   mld_melding m, mld_stdmelding sm
              WHERE   m.mld_stdmelding_key = sm.mld_stdmelding_key
                      AND m.mld_melding_status IN (2, 3) -- 2-Ingevoerd, 3-Ingezien
                                                        );

/* Formatted on 30-3-2012 16:26:36 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW ARBO_V_GRAPH_PPI_AFM
(
   FCLT_XAS_,
   FCLT_YAS_
)
AS
   SELECT   SUM (uitvoeringoptijd) aantal, COUNT (mld_key) totaal
     FROM   (SELECT   DISTINCT
                      m.mld_melding_key mld_key,
                      CASE SIGN(fac.datumtijdplusuitvoertijd (
                                   m.mld_melding_datum,
                                   m.mld_melding_uitvoertijd,
                                   'DAGEN'
                                )
                                - SYSDATE)
                         WHEN -1
                         THEN
                            0
                         ELSE
                            1
                      END
                         uitvoeringoptijd
               FROM   mld_melding m
              WHERE   m.mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
                                                             );

/* Formatted on 7-6-2012 14:16:18 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW arbo_v_rap_hv_per_loc
(
   fclt_f_vestiging,
   contractnummer,
   einddatum,
   opzegtermijn,
   huurkosten_pj,
   servkosten_pj,
   aantal_m2,
   huurkosten_m2,
   servkosten_m2,
   bezet_m2,
   leeg_m2,
   bezettingsperc
)
AS
   SELECT   basis.alg_locatie_code,
            hvcnt.contractnummer,
            TO_CHAR (hvcnt.einddatum, 'dd-mm-yyyy'),
            hvcnt.opzegtermijn,
            fac.safe_to_number (hvcnt.huurkosten),
            fac.safe_to_number (hvcnt.servicekosten),
            ROUND (COALESCE (totm2.opp, 0), 2) totaal,
            DECODE (
               totm2.opp,
               NULL,
               NULL,
               0,
               NULL,
               REPLACE (
                  TO_CHAR (
                     ROUND (
                        fac.safe_to_number (
                           COALESCE (hvcnt.huurkosten, '0') / totm2.opp
                        ),
                        2
                     ),
                     '999999990D99'
                  ),
                  '.',
                  ','
               )
            ),
            DECODE (
               totm2.opp,
               NULL,
               NULL,
               0,
               NULL,
               REPLACE (
                  TO_CHAR (
                     ROUND (
                        fac.safe_to_number (
                           COALESCE (hvcnt.servicekosten, '0') / totm2.opp
                        ),
                        2
                     ),
                     '999999990D99'
                  ),
                  '.',
                  ','
               )
            ),
            ROUND (COALESCE (bezm2.opp, 0), 2) bezet,
            ROUND (COALESCE (totm2.opp, 0) - COALESCE (bezm2.opp, 0), 2) leeg,
            DECODE (
               totm2.opp,
               NULL,
               NULL,
               0,
               NULL,
               TO_CHAR (100 * ROUND (COALESCE (bezm2.opp, 0) / totm2.opp, 2))
               || '%'
            )
     FROM            (SELECT   alg_locatie_key, alg_locatie_code
                        FROM   alg_v_aanweziglocatie) basis
                  LEFT JOIN
                     (  SELECT   g.alg_locatie_key,
                                 SUM (g.alg_gebouw_bruto_vloeropp) opp
                          --SUM (r.alg_ruimte_bruto_vloeropp) opp
                          FROM   alg_gebouw g
                      --alg_verdieping v,
                      --alg_v_aanwezigruimte r
                      --WHERE   g.alg_gebouw_key = v.alg_gebouw_key
                      --        AND v.alg_verdieping_key =
                      --              r.alg_verdieping_key
                      GROUP BY   g.alg_locatie_key) totm2
                  ON basis.alg_locatie_key = totm2.alg_locatie_key
               LEFT JOIN
                  (  SELECT   g.alg_locatie_key,
                              SUM (r.alg_ruimte_bruto_vloeropp) opp
                       FROM   alg_gebouw g,
                              alg_verdieping v,
                              alg_v_aanwezigruimte r,
                              prs_v_aanwezigwerkplek wp,
                              (  SELECT   prs_werkplek_key, COUNT ( * )
                                   FROM   prs_v_aanwezigperslidwerkplek
                               GROUP BY   prs_werkplek_key) pw
                      WHERE       g.alg_gebouw_key = v.alg_gebouw_key
                              AND v.alg_verdieping_key = r.alg_verdieping_key
                              AND r.alg_ruimte_key = wp.prs_alg_ruimte_key
                              AND wp.prs_werkplek_key = pw.prs_werkplek_key
                   GROUP BY   g.alg_locatie_key) bezm2
               ON basis.alg_locatie_key = bezm2.alg_locatie_key
            LEFT JOIN
               (SELECT   cp.cnt_alg_plaats_key,
                         c.cnt_contract_nummer_intern contractnummer,
                         c.cnt_contract_looptijd_tot einddatum,
                         t.cnt_termijn_omschrijving opzegtermijn,
                         (SELECT   kc.cnt_kenmerkcontract_waarde
                            FROM   cnt_kenmerkcontract kc
                           WHERE   kc.cnt_kenmerk_key = 44             -- Huur
                                   AND kc.cnt_contract_key =
                                         c.cnt_contract_key)
                            huurkosten,
                         (SELECT   kc.cnt_kenmerkcontract_waarde
                            FROM   cnt_kenmerkcontract kc
                           WHERE   kc.cnt_kenmerk_key = 101         -- Service
                                   AND kc.cnt_contract_key =
                                         c.cnt_contract_key)
                            servicekosten
                  FROM   cnt_contract_plaats cp,
                         cnt_v_aanwezigcontract c,
                         cnt_termijn t
                 WHERE       cp.cnt_alg_plaats_code = 'L'
                         AND cp.cnt_contract_key = c.cnt_contract_key
                         AND c.ins_discipline_key = 181      -- Huurcontracten
                         AND c.cnt_contract_opzegtermijn = t.cnt_termijn_key)
               hvcnt
            ON basis.alg_locatie_key = hvcnt.cnt_alg_plaats_key;

/* Formatted on 7-6-2012 14:16:18 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW arbo_v_rap_hv_per_afd
(
   hide_f_sortering,
   fclt_f_afdeling,
   fclt_f_vestiging,
   tot_m2,
   afd_m2,
   bezettingsperc
)
AS
   SELECT   prs_afdeling_naam || '1',
            prs_afdeling_omschrijving || ' (' || prs_afdeling_naam || ')',
            totm2.alg_locatie_code,
            REPLACE (
               TO_CHAR (ROUND (COALESCE (totm2.opp, 0), 2), '999999990D99'),
               '.',
               ','
            ),
            REPLACE (
               TO_CHAR (ROUND (COALESCE (afdm2.opp, 0), 2), '999999990D99'),
               '.',
               ','
            ),
            DECODE (
               totm2.opp,
               NULL,
               NULL,
               0,
               NULL,
               TO_CHAR (100 * ROUND (COALESCE (afdm2.opp, 0) / totm2.opp, 2))
               || '%'
            )
               bezetting
     FROM         (SELECT   prs_afdeling_key,
                            prs_afdeling_naam,
                            prs_afdeling_omschrijving
                     FROM   prs_afdeling
                    WHERE   prs_afdeling_verwijder IS NULL) basis
               LEFT JOIN
                  (  SELECT   ra.prs_afdeling_key,
                              g.alg_locatie_key,
                              SUM( (r.alg_ruimte_bruto_vloeropp
                                    * ra.prs_ruimteafdeling_bezetting)
                                  / 100)
                                 opp
                       FROM   prs_ruimteafdeling ra,
                              alg_v_aanwezigruimte r,
                              alg_verdieping v,
                              alg_gebouw g
                      WHERE       ra.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
                   GROUP BY   ra.prs_afdeling_key, g.alg_locatie_key) afdm2
               ON basis.prs_afdeling_key = afdm2.prs_afdeling_key
            LEFT JOIN
               (  SELECT   l.alg_locatie_key,
                           l.alg_locatie_code,
                           SUM (r.alg_ruimte_bruto_vloeropp) opp
                    FROM   alg_v_aanwezigruimte r,
                           alg_verdieping v,
                           alg_gebouw g,
                           alg_locatie l
                   WHERE       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
                GROUP BY   l.alg_locatie_key, l.alg_locatie_code) totm2
            ON afdm2.alg_locatie_key = totm2.alg_locatie_key
    WHERE   totm2.alg_locatie_code IS NOT NULL
   UNION ALL
   SELECT   prs_afdeling_naam || '2',
            prs_afdeling_omschrijving || ' (' || prs_afdeling_naam || ')',
            '*** Landelijk ***',
            REPLACE (
               TO_CHAR (ROUND (COALESCE (totm2.opp, 0), 2), '999999990D99'),
               '.',
               ','
            ),
            REPLACE (
               TO_CHAR (ROUND (COALESCE (afdm2.opp, 0), 2), '999999990D99'),
               '.',
               ','
            ),
            DECODE (
               totm2.opp,
               NULL,
               NULL,
               0,
               NULL,
               TO_CHAR (100 * ROUND (COALESCE (afdm2.opp, 0) / totm2.opp, 2))
               || '%'
            )
               bezetting
     FROM         (SELECT   prs_afdeling_key,
                            prs_afdeling_naam,
                            prs_afdeling_omschrijving
                     FROM   prs_afdeling
                    WHERE   prs_afdeling_verwijder IS NULL) basis
               LEFT JOIN
                  (  SELECT   ra.prs_afdeling_key,
                              SUM( (r.alg_ruimte_bruto_vloeropp
                                    * ra.prs_ruimteafdeling_bezetting)
                                  / 100)
                                 opp
                       FROM   prs_ruimteafdeling ra, alg_v_aanwezigruimte r
                      WHERE   ra.alg_ruimte_key = r.alg_ruimte_key
                   GROUP BY   ra.prs_afdeling_key) afdm2
               ON basis.prs_afdeling_key = afdm2.prs_afdeling_key
            LEFT JOIN
               (SELECT   SUM (g.alg_gebouw_bruto_vloeropp) opp
                  FROM   alg_v_aanweziggebouw g) totm2
            ON 1 = 1;

/* Formatted on 7-6-2012 14:22:35 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW arbo_v_rap_cntoverzicht
(
   fclt_f_dienst,
   fclt_f_contractsoort,
   contractnummer,
   startdatum,
   einddatum,
   opzegtermijn,
   fclt_f_scope,
   contractwaarde
)
AS
   SELECT   basis.dienst,
            basis.contractsoort,
            basis.contractnummer,
            TO_CHAR (basis.startdatum, 'dd-mm-yyyy'),
            TO_CHAR (basis.einddatum, 'dd-mm-yyyy'),
            basis.opzegtermijn,
            x.scope,
            basis.contractwaarde
     FROM      (SELECT   c.cnt_contract_key,
                         c.cnt_contract_nummer_intern contractnummer,
                         c.cnt_contract_looptijd_van startdatum,
                         c.cnt_contract_looptijd_tot einddatum,
                         c.cnt_contract_kosten contractwaarde,
                         cd.ins_discipline_omschrijving contractsoort,
                         t.cnt_termijn_omschrijving opzegtermijn,
                         d.prs_dienst_omschrijving dienst
                  FROM   cnt_v_aanwezigcontract c,
                         cnt_discipline cd,
                         cnt_termijn t,
                         prs_dienst d
                 WHERE       c.ins_discipline_key != 181     -- Huurcontracten
                         AND c.ins_discipline_key = cd.ins_discipline_key
                         AND c.cnt_contract_opzegtermijn = t.cnt_termijn_key
                         AND c.prs_dienst_key = d.prs_dienst_key) basis
            LEFT JOIN
               (SELECT   cp.cnt_contract_key,
                            l.alg_locatie_code
                         || ' ('
                         || l.alg_locatie_omschrijving
                         || ')'
                            scope
                  FROM   cnt_contract_plaats cp, alg_locatie l
                 WHERE       cp.cnt_alg_plaats_code = 'L'
                         AND cp.cnt_contract_plaats_verwijder IS NULL
                         AND cp.cnt_alg_plaats_key = l.alg_locatie_key
                UNION ALL
                SELECT   cp.cnt_contract_key,
                         g.alg_gebouw_code || ' ' || g.alg_gebouw_naam scope
                  FROM   cnt_contract_plaats cp, alg_gebouw g
                 WHERE       cp.cnt_alg_plaats_code = 'G'
                         AND cp.cnt_contract_plaats_verwijder IS NULL
                         AND cp.cnt_alg_plaats_key = g.alg_gebouw_key
                UNION ALL
                SELECT   co.cnt_contract_key,
                         sd.ins_srtdeel_omschrijving scope
                  FROM   cnt_contract_object co, ins_srtdeel sd
                 WHERE   co.cnt_contract_object_verwijder IS NULL
                         AND co.cnt_ins_srtdeel_key = sd.ins_srtdeel_key
                UNION ALL
                SELECT   co.cnt_contract_key,
                            d.ins_deel_omschrijving
                         || ' ('
                         || sd.ins_srtdeel_omschrijving
                         || ')'
                            scope
                  FROM   cnt_contract_object co, ins_deel d, ins_srtdeel sd
                 WHERE       co.cnt_contract_object_verwijder IS NULL
                         AND co.cnt_ins_deel_key = d.ins_deel_key
                         AND d.ins_srtdeel_key = sd.ins_srtdeel_key) x
            ON basis.cnt_contract_key = x.cnt_contract_key;

/* Formatted on 15-5-2012 10:55:15 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW arbo_v_rap_rtm_openmld
(
   fclt_f_rubriek,
   kengetal
)
AS
   SELECT   '# Totaal', TO_CHAR (COUNT ( * )) aantal
     FROM   mld_melding m
    WHERE   m.mld_melding_status IN (2, 3, 4, 7, 0) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending
   UNION ALL
   SELECT   'Intern: ' || FCLT_XAS_, TO_CHAR (FCLT_YAS_ + FCLT_YAS2_) aantal
     FROM   ARBO_V_GRAPH_MLD_BEHANDELAAR
    WHERE   FCLT_XAS_ != '-'
   UNION ALL
   SELECT   'Extern: ' || FCLT_XAS_, TO_CHAR (FCLT_YAS_ + FCLT_YAS2_) aantal
     FROM   ARBO_V_GRAPH_MLD_UITVOERENDE
    WHERE   FCLT_XAS_ != '-'
   UNION ALL
   SELECT   'Vakgroep: ' || FCLT_XAS_, TO_CHAR (FCLT_YAS_) aantal
     FROM   ARBO_V_GRAPH_VAKGROEP_OPEN
   UNION ALL
   SELECT   '% Acceptatie (nog) op tijd',
            DECODE (
               FCLT_YAS_,
               0,
               NULL,
               NULL,
               NULL,
               REPLACE (
                  TO_CHAR (
                     ROUND ( (COALESCE (FCLT_XAS_, 0) / FCLT_YAS_) * 100, 1),
                     '990D9'
                  ),
                  '.',
                  ','
               )
               || '%'
            )
               aantal
     FROM   ARBO_V_GRAPH_PPI_ACP
   UNION ALL
   SELECT   '% Uitvoering (nog) op tijd',
            DECODE (
               FCLT_YAS_,
               0,
               NULL,
               NULL,
               NULL,
               REPLACE (
                  TO_CHAR (
                     ROUND ( (COALESCE (FCLT_XAS_, 0) / FCLT_YAS_) * 100, 1),
                     '990D9'
                  ),
                  '.',
                  ','
               )
               || '%'
            )
               aantal
     FROM   ARBO_V_GRAPH_PPI_AFM;

/* Formatted on 15-5-2012 11:12:04 (QP5 v5.115.810.9015)
CREATE OR REPLACE VIEW arbo_v_rap_res_top5_noshow
(
   fclt_f_maand,
   gebruiker,
   afdeling,
   no_shows
)
AS
     SELECT   TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyy-mm') maand,
              pf.prs_perslid_naam_full,
              a.prs_afdeling_omschrijving || ' (' || a.prs_afdeling_naam || ')',
              COUNT ( * ) aantal
       FROM   res_v_aanwezigrsv_ruimte rrr,
              prs_perslid p,
              prs_v_perslid_fullnames pf,
              prs_afdeling a
      WHERE   (rrr.res_rsv_ruimte_noshow = 1
               OR rrr.res_rsv_ruimte_bezoekers_shown IS NOT NULL)
              AND rrr.res_rsv_ruimte_contact_key = p.prs_perslid_key
              AND p.prs_perslid_key = pf.prs_perslid_key
              AND p.prs_afdeling_key = a.prs_afdeling_key
              AND rrr.res_rsv_ruimte_van >
                    TRUNC (ADD_MONTHS (SYSDATE, -12), 'yyyy')
              AND rrr.res_rsv_ruimte_van <
                    TO_DATE (TO_CHAR (SYSDATE, 'yyyy-mm') || '-01',
                             'yyyy-mm-dd')
   GROUP BY   TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyy-mm'),
              pf.prs_perslid_naam_full,
                 a.prs_afdeling_omschrijving
              || ' ('
              || a.prs_afdeling_naam
              || ')';
*/
/* Formatted on 15-5-2012 12:44:46 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW arbo_v_rap_res_top5_noshow
(
   fclt_f_maand,
   hide_f_sortering,
   gebruiker,
   afdeling,
   no_shows
)
AS
   SELECT   maand,
            r,
            gebruiker,
            afdeling,
            aantal
     FROM   (SELECT   maand,
                      gebruiker,
                      afdeling,
                      aantal,
                      RANK ()
                         OVER (PARTITION BY maand
                               ORDER BY maand, aantal DESC, gebruiker)
                         r
               FROM   (  SELECT   TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyy-mm')
                                     maand,
                                  pf.prs_perslid_naam_full gebruiker,
                                     a.prs_afdeling_omschrijving
                                  || ' ('
                                  || a.prs_afdeling_naam
                                  || ')'
                                     afdeling,
                                  COUNT ( * ) aantal
                           FROM   res_v_aanwezigrsv_ruimte rrr,
                                  prs_perslid p,
                                  prs_v_perslid_fullnames pf,
                                  prs_afdeling a
                          WHERE   (rrr.res_rsv_ruimte_noshow = 1
                                   OR rrr.res_rsv_ruimte_bezoekers_shown IS NOT NULL)
                                  AND rrr.res_rsv_ruimte_contact_key =
                                        p.prs_perslid_key
                                  AND p.prs_perslid_key = pf.prs_perslid_key
                                  AND p.prs_afdeling_key = a.prs_afdeling_key
                                  AND rrr.res_rsv_ruimte_van >
                                        TRUNC (ADD_MONTHS (SYSDATE, -12),
                                               'yyyy')
                                  AND rrr.res_rsv_ruimte_van <
                                        TO_DATE (
                                           TO_CHAR (SYSDATE, 'yyyy-mm')
                                           || '-01',
                                           'yyyy-mm-dd'
                                        )
                       GROUP BY   TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyy-mm'),
                                  pf.prs_perslid_naam_full,
                                     a.prs_afdeling_omschrijving
                                  || ' ('
                                  || a.prs_afdeling_naam
                                  || ')'))
    WHERE   r <= 5;

/* Formatted on 15-5-2012 9:58:14 (QP5 v5.115.810.9015)
CREATE OR REPLACE VIEW arbo_v_rap_res_bezetting
(
   fclt_f_maand,
   fclt_f_zaal,
   gebruik_uren,
   beschikbaar_uren,
   bezettingsperc
)
AS
   SELECT   bes.maand,
            bes.res_ruimte_nr,
            bez.uren bez_uren,
            bes.uren bes_uren,
            DECODE (
               bes.uren,
               0,
               NULL,
               REPLACE (
                  TO_CHAR (
                     ROUND ( (COALESCE (bez.uren, 0) / bes.uren) * 100, 1),
                     '990D9'
                  ),
                  '.',
                  ','
               )
               || '%'
            )
               bezetting
     FROM      (SELECT   periode.maand,
                         rr.res_ruimte_nr,
                         DECODE (
                            periode.maand,
                            '2012-05',   -- T/m 5.2.1 fout in count_work_days!
                            21,
                            fac.count_work_days (
                               TO_DATE (periode.maand || '-01', 'yyyy-mm-dd')
                               - 1,
                               LAST_DAY(TO_DATE (periode.maand || '-01',
                                                 'yyyy-mm-dd'))
                            )
                         )
                         * (COALESCE (rr.res_ruimte_eindtijd, 20)
                            - COALESCE (rr.res_ruimte_begintijd, 7))
                            uren
                  FROM   res_ruimte rr,
                         (    SELECT   TO_CHAR (ADD_MONTHS (bdate, LEVEL - 1),
                                                'yyyy-mm')
                                          maand
                                FROM   (SELECT   TRUNC (
                                                    ADD_MONTHS (SYSDATE, -12),
                                                    'yyyy'
                                                 )
                                                    bdate,
                                                 TO_DATE (
                                                    TO_CHAR (SYSDATE, 'yyyy-mm')
                                                    || '-01',
                                                    'yyyy-mm-dd'
                                                 )
                                                 - 1
                                                    edate
                                          FROM   DUAL)
                          CONNECT BY   LEVEL <=
                                          MONTHS_BETWEEN (
                                             TRUNC (edate, 'mm'),
                                             TRUNC (bdate, 'mm')
                                          )
                                          + 1) periode
                 WHERE   rr.res_discipline_key NOT IN (121, 401)
                         AND rr.res_ruimte_aanmaak <
                               TO_DATE (periode.maand || '-01', 'yyyy-mm-dd')
                         AND (rr.res_ruimte_verwijder IS NULL
                              OR rr.res_ruimte_verwijder >
                                   LAST_DAY(TO_DATE (periode.maand || '-01',
                                                     'yyyy-mm-dd')))) bes
            LEFT JOIN
               (  SELECT   TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyy-mm') maand,
                           rr.res_ruimte_nr,
                           SUM(LEAST (
                                  fac.safe_to_number (
                                     TO_CHAR (rrr.res_rsv_ruimte_tot, 'sssss')
                                  )
                                  / 3600,
                                  COALESCE (rr.res_ruimte_eindtijd, 20)
                               )
                               - GREATEST (
                                    fac.safe_to_number(TO_CHAR (
                                                          rrr.res_rsv_ruimte_van,
                                                          'sssss'
                                                       ))
                                    / 3600,
                                    COALESCE (rr.res_ruimte_begintijd, 7)
                                 ))
                              uren
                    FROM   res_rsv_ruimte rrr,
                           res_ruimte_opstelling ro,
                           res_ruimte rr
                   WHERE   rrr.res_rsv_ruimte_verwijder IS NULL
                           AND rrr.res_status_fo_key IN (1, 2)   -- Optie/Def.
                           AND rrr.res_ruimte_opstel_key =
                                 ro.res_ruimte_opstel_key
                           AND ro.res_ruimte_key = rr.res_ruimte_key
                           AND rrr.res_rsv_ruimte_van >
                                 TRUNC (ADD_MONTHS (SYSDATE, -12), 'yyyy')
                           AND TO_CHAR (rrr.res_rsv_ruimte_van, 'd') >= 2 -- Ma
                           AND TO_CHAR (rrr.res_rsv_ruimte_van, 'd') <= 6 -- Vr
                           AND TRUNC (rrr.res_rsv_ruimte_van) NOT IN
                                    (SELECT   TRUNC (mld_vrije_dagen_datum)
                                       FROM   mld_vrije_dagen)
                GROUP BY   TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyy-mm'),
                           rr.res_ruimte_nr) bez
            ON bes.maand = bez.maand
               AND bes.res_ruimte_nr = bez.res_ruimte_nr;
*/
/* Formatted on 7-6-2012 14:10:48 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW arbo_v_rap_res_bezetting
(
   fclt_f_maand,
   fclt_f_vestiging,
   fclt_f_kamer,
   gebruik_uren,
   beschikbaar_uren,
   bezettingsperc
)
AS
   SELECT   bes.maand,
            rg.alg_locatie_code,
               rg.alg_ruimte_aanduiding
            || ' ['
            || rr.res_ruimte_nr
            || DECODE (bes.aantal, 1, ']', '...]'),
            bez.uren bez_uren,
            bes.uren bes_uren,
            DECODE (
               bes.uren,
               0,
               NULL,
               REPLACE (
                  TO_CHAR (
                     ROUND ( (COALESCE (bez.uren, 0) / bes.uren) * 100, 1),
                     '990D9'
                  ),
                  '.',
                  ','
               )
               || '%'
            )
               bezetting
     FROM      (  SELECT   periode.maand,
                           ra.alg_ruimte_key,
                           COUNT (rr.res_ruimte_key) aantal,
                           MAX(DECODE (
                                  periode.maand,
                                  '2012-05', -- T/m 5.2.1 fout in count_work_days!
                                  21,
                                  fac.count_work_days (
                                     TO_DATE (periode.maand || '-01',
                                              'yyyy-mm-dd')
                                     - 1,
                                     LAST_DAY(TO_DATE (periode.maand || '-01',
                                                       'yyyy-mm-dd'))
                                  )
                               )
                               * (COALESCE (rr.res_ruimte_eindtijd, 20)
                                  - COALESCE (rr.res_ruimte_begintijd, 7)))
                              uren
                    FROM   res_ruimte rr,
                           res_alg_ruimte ra,
                           (    SELECT   TO_CHAR (ADD_MONTHS (bdate, LEVEL - 1),
                                                  'yyyy-mm')
                                            maand
                                  FROM   (SELECT   TRUNC (
                                                      ADD_MONTHS (SYSDATE, -12),
                                                      'yyyy'
                                                   )
                                                      bdate
                                            FROM   DUAL)
                            CONNECT BY   LEVEL <=
                                            MONTHS_BETWEEN (
                                               TRUNC (SYSDATE, 'mm'),
                                               TRUNC (bdate, 'mm')
                                            )) periode
                   WHERE   rr.res_discipline_key NOT IN (121, 401)
                           AND rr.res_ruimte_key = ra.res_ruimte_key
                           AND ra.res_alg_ruimte_aanmaak <
                                 TO_DATE (periode.maand || '-01', 'yyyy-mm-dd')
                           AND (ra.res_alg_ruimte_verwijder IS NULL
                                OR ra.res_alg_ruimte_verwijder >
                                     LAST_DAY(TO_DATE (periode.maand || '-01',
                                                       'yyyy-mm-dd')))
                GROUP BY   periode.maand, ra.alg_ruimte_key) bes
            LEFT JOIN
               (  SELECT   TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyy-mm') maand,
                           ra.alg_ruimte_key,
                           SUM(LEAST (
                                  fac.safe_to_number (
                                     TO_CHAR (rrr.res_rsv_ruimte_tot, 'sssss')
                                  )
                                  / 3600,
                                  COALESCE (rr.res_ruimte_eindtijd, 20)
                               )
                               - GREATEST (
                                    fac.safe_to_number(TO_CHAR (
                                                          rrr.res_rsv_ruimte_van,
                                                          'sssss'
                                                       ))
                                    / 3600,
                                    COALESCE (rr.res_ruimte_begintijd, 7)
                                 ))
                              uren
                    FROM   res_rsv_ruimte rrr,
                           res_ruimte_opstelling ro,
                           res_ruimte rr,
                           res_alg_ruimte ra
                   WHERE   rrr.res_rsv_ruimte_verwijder IS NULL
                           AND rrr.res_status_fo_key IN (1, 2)   -- Optie/Def.
                           AND rrr.res_ruimte_opstel_key =
                                 ro.res_ruimte_opstel_key
                           AND ro.res_ruimte_key = rr.res_ruimte_key
                           AND rr.res_ruimte_key = ra.res_ruimte_key
                           AND rrr.res_rsv_ruimte_van >
                                 TRUNC (ADD_MONTHS (SYSDATE, -12), 'yyyy')
                           AND TO_CHAR (rrr.res_rsv_ruimte_van, 'd') >= 2 -- Ma
                           AND TO_CHAR (rrr.res_rsv_ruimte_van, 'd') <= 6 -- Vr
                           AND TRUNC (rrr.res_rsv_ruimte_van) NOT IN
                                    (SELECT   TRUNC (mld_vrije_dagen_datum)
                                       FROM   mld_vrije_dagen)
                GROUP BY   TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyy-mm'),
                           ra.alg_ruimte_key) bez
            ON bes.maand = bez.maand
               AND bes.alg_ruimte_key = bez.alg_ruimte_key,
            alg_v_ruimte_gegevens_all rg,
            (SELECT   alg_ruimte_key, res_ruimte_key
               FROM   (SELECT   rar1.alg_ruimte_key,
                                rar1.res_ruimte_key,
                                RANK ()
                                   OVER (
                                      PARTITION BY rar1.alg_ruimte_key
                                      ORDER BY
                                         rar1.alg_ruimte_key,
                                         DECODE (
                                            rar1.res_alg_ruimte_verwijder,
                                            NULL,
                                            1,
                                            2
                                         ),
                                         rar2.aantal
                                   )
                                   r
                         FROM   res_alg_ruimte rar1,
                                (  SELECT   res_ruimte_key,
                                            COUNT (alg_ruimte_key) aantal
                                     FROM   res_alg_ruimte
                                 GROUP BY   res_ruimte_key) rar2
                        WHERE   rar1.res_ruimte_key = rar2.res_ruimte_key(+))
              WHERE   r = 1) rar,
            res_ruimte rr
    WHERE       bes.alg_ruimte_key = rg.alg_ruimte_key
            AND rg.alg_ruimte_key = rar.alg_ruimte_key
            AND rar.res_ruimte_key = rr.res_ruimte_key;

/* Formatted on 15-5-2012 9:58:14 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW arbo_v_rap_bez_aantal
(
   fclt_f_maand,
   fclt_f_vestiging,
   aantal_bezoekers
)
AS
     SELECT   TO_CHAR (a.bez_afspraak_datum, 'yyyy-mm') maand,
              l.alg_locatie_code,
              COUNT ( * ) sum_visitors
       FROM   bez_afspraak a, bez_bezoekers b, alg_locatie l
      WHERE   a.bez_afspraak_key = b.bez_afspraak_key
              AND a.alg_locatie_key = l.alg_locatie_key
              AND a.bez_afspraak_datum >
                    TRUNC (ADD_MONTHS (SYSDATE, -12), 'yyyy')
              AND a.bez_afspraak_datum <
                    TO_DATE (TO_CHAR (SYSDATE, 'yyyy-mm') || '-01',
                             'yyyy-mm-dd')
   GROUP BY   TO_CHAR (a.bez_afspraak_datum, 'yyyy-mm'), l.alg_locatie_code;
 
 
-- ARBO#26005 view tbv kenmerkdomein met koffieautomaten
-- key 202 = groep koffieautomaat  
CREATE OR REPLACE VIEW ARBO_V_MLD_KOFFIEAUTOMATEN
(
   INS_DEEL_KEY,
   OMSCHRIJVING
)
AS
     SELECT   ins_deel_key,
                 l.alg_locatie_omschrijving
              || ' - '
              || v.alg_verdieping_code
              || '-'
              || r.alg_ruimte_nr
              || ' ('
              || r.alg_ruimte_omschrijving
              || ')'
              || ' - '
              || ins_deel_omschrijving
                 omschrijving
       FROM   ins_deel d,
              ins_srtdeel srt,
              alg_ruimte r,
              alg_verdieping v,
              alg_gebouw g,
              alg_locatie l
      WHERE       d.ins_srtdeel_key = srt.ins_srtdeel_key
              AND srt.ins_srtgroep_key = 202     -- objectgroep koffieautomaat
              AND ins_deel_verwijder IS NULL
              AND ins_srtdeel_verwijder IS NULL
              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
   ORDER BY   alg_locatie_omschrijving, alg_verdieping_code; 

BEGIN fac.registercustversion('ARBO', 6); END;
/
BEGIN adm.systrackscript('$Workfile: arbo.sql $', '$Revision$', 0); END;
/
commit;

spool off
