--
-- $Id$
--
-- Script containing customer specific db-configuration for DENB.
DEFINE thisfile = 'DENB.SQL'
DEFINE dbuser   = '^DENB'

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

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

/* Formatted on 26-3-2010 12:45:12 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW denb_v_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 = 21);

/* Formatted on 27-1-2010 16:35:45 (QP5 v5.115.810.9015) */
CREATE OR REPLACE PROCEDURE denb_import_prs (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   -- LET OP: moet idem zijn als declaratie bij denb_update_prs
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER          := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;
   -- De importvelden:
   v_prs_perslid_nr                VARCHAR2 (256);
   v_prs_perslid_naam              VARCHAR2 (256);
   v_prs_perslid_tussenvoegsel     VARCHAR2 (256);
   v_prs_perslid_voorletters       VARCHAR2 (256);
   v_prs_perslid_voornaam          VARCHAR2 (256);
   v_prs_afdeling_naam             VARCHAR2 (256);
   v_prs_srtperslid_omschrijving   VARCHAR2 (256);
   v_prs_perslid_ingangsdatum      VARCHAR2 (256);
   v_prs_perslid_einddatum         VARCHAR2 (256);
   v_dienstverbandcode             VARCHAR2 (256);                      -- N2
   v_alg_gebouw_code               VARCHAR2 (256);                     -- A10
   v_afdelingsdomein               VARCHAR2 (256);                      -- A2
   v_prs_perslid_telefoonnr        VARCHAR2 (256);
   v_prs_perslid_email             VARCHAR2 (256);
   v_prs_perslid_oslogin           VARCHAR2 (256);
   -- Overig:
   v_prs_perslid_ingangs_date      DATE;
   v_prs_perslid_eind_date         DATE;
   v_dienstverbandcode_n           NUMBER (2);                          -- N2

   CURSOR c1
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM denb_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_naam);
         -- 03
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_tussenvoegsel
                          );
         -- 04
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_voorletters
                          );
         -- 05
         fac.imp_getfield (v_newline, c_fielddelimitor,
                           v_prs_perslid_voornaam);
         -- 06
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_afdeling_naam);
         -- 07
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_srtperslid_omschrijving
                          );
         -- 08
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_ingangsdatum
                          );
         -- 09
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_einddatum
                          );
         -- 10
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dienstverbandcode);
         -- 11
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_gebouw_code);
         -- 12
         fac.imp_getfield (v_newline, c_fielddelimitor, v_afdelingsdomein);
         -- 13
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_telefoonnr
                          );
         -- 14
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_email);
         -- 15
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_oslogin);
         --
         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_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_srtperslid_omschrijving) = 'FUNCTIE'
               AND UPPER (v_prs_perslid_ingangsdatum) = 'INDIENSTDATUM'
               AND UPPER (v_prs_perslid_einddatum) = 'UITDIENSTDATUM'
               AND UPPER (v_dienstverbandcode) = 'DIENSTVERBANDCODE'
               AND UPPER (v_alg_gebouw_code) = 'DIENSTVERBANDGEBOUW'
               AND UPPER (v_afdelingsdomein) = 'AFDELINGSDOMEIN'
               AND UPPER (v_prs_perslid_telefoonnr) = 'TELEFOON'
               AND UPPER (v_prs_perslid_email) = 'EMAIL'
               AND UPPER (v_prs_perslid_oslogin) = 'LOGINNAAM'
            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 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
                                 || ']'
                                );
            ELSE
               IF (v_prs_perslid_nr IS NULL)
               THEN
                  v_ongeldig := 1;
                  fac.imp_writelog
                     (p_import_key,
                      'E',
                      v_aanduiding || 'Personeelsnummer onbekend',
                      'Personeelsnummer is verplicht; regel wordt overgeslagen!'
                     );
               END IF;
            END IF;

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

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

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

            IF LENGTH (v_prs_perslid_tussenvoegsel) > 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
                                 || ']'
                                );
            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 [-]'
                                   );
               END IF;
            END IF;

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

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

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

            COMMIT;
            --
            v_errorhint := 'Ongeldige 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;

            --
            v_errorhint := 'Ongeldige dienstverbandcode';
            v_dienstverbandcode := TRIM (v_dienstverbandcode);

            IF v_dienstverbandcode IS NOT NULL
            THEN
               BEGIN
                  v_dienstverbandcode_n :=
                                     fac.safe_to_number (v_dienstverbandcode);

                  IF v_dienstverbandcode_n NOT BETWEEN 0 AND 99
                  THEN
                     v_dienstverbandcode_n := NULL;
                     fac.imp_writelog (p_import_key,
                                       'W',
                                       v_aanduiding || v_errorhint,
                                       'Dienstverbandcode niet ingelezen'
                                      );
                     COMMIT;
                  END IF;
               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,
                                       'W',
                                       v_aanduiding || v_errormsg,
                                       'Regel wordt overgeslagen!'
                                      );
                     COMMIT;
               END;
            END IF;

            --
            v_errorhint := 'Ongeldig dienstverbandgebouw';
            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 || 'Dienstverbandgebouw te lang',
                                 'Dienstverbandgebouw wordt afgebroken tot ['
                              || v_alg_gebouw_code
                              || ']'
                             );
               COMMIT;
            END IF;

            --
            v_errorhint := 'Ongeldig afdelingsdomein';
            v_afdelingsdomein := UPPER (TRIM (v_afdelingsdomein));

            BEGIN
               IF     v_afdelingsdomein IS NOT NULL
                  AND (   LENGTH (v_afdelingsdomein) <> 2
                       OR SUBSTR (v_afdelingsdomein || '--', 1, 1) NOT
                             BETWEEN 'A'
                                 AND 'Z'
                       OR SUBSTR (v_afdelingsdomein || '--', 2, 1) NOT
                             BETWEEN '0'
                                 AND '9'
                      )
               THEN
                  v_afdelingsdomein := NULL;
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding || v_errorhint,
                                    'Afdelingsdomein niet ingelezen'
                                   );
                  COMMIT;
               END IF;
            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,
                                    'W',
                                    v_aanduiding || v_errormsg,
                                    'Regel wordt overgeslagen!'
                                   );
                  COMMIT;
            END;

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

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

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

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

                  INSERT INTO denb_imp_prs
                              (prs_perslid_nr, prs_perslid_naam,
                               prs_perslid_tussenvoegsel,
                               prs_perslid_voorletters,
                               prs_perslid_voornaam, prs_afdeling_naam,
                               prs_srtperslid_omschrijving,
                               prs_perslid_ingangsdatum,
                               prs_perslid_einddatum, dienstverbandcode,
                               alg_gebouw_code, afdelingsdomein,
                               prs_perslid_telefoonnr,
                               prs_perslid_email, prs_perslid_oslogin
                              )
                       VALUES (v_prs_perslid_nr, v_prs_perslid_naam,
                               v_prs_perslid_tussenvoegsel,
                               v_prs_perslid_voorletters,
                               v_prs_perslid_voornaam, v_prs_afdeling_naam,
                               v_prs_srtperslid_omschrijving,
                               v_prs_perslid_ingangs_date,
                               v_prs_perslid_eind_date, v_dienstverbandcode,
                               v_alg_gebouw_code, v_afdelingsdomein,
                               v_prs_perslid_telefoonnr,
                               v_prs_perslid_email, v_prs_perslid_oslogin
                              );

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

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

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

/* Formatted on 24-5-2016 10:50:10 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE denb_update_prs (p_import_key IN NUMBER)
IS
   -- LET OP: moet idem zijn als declaratie bij denb_import_prs
   c_persoon_inactief       VARCHAR2 (30) := 'INACTIEF: ';
   -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers met een nummer
   c_max_delta_percentage   NUMBER (10) := 20;
   -- District waar personen in geplaatst worden (met locaties/gebouwen zichtbaar voor FEs)
   c_district_key_zfe       NUMBER (10) := 1;                   -- ZichtbaarFE
   -- Gebouw waar personen in geplaatst worden (indien gebouw volgens beaufort onzichtbaar)
   c_gebouw_key_anders      NUMBER (10) := 2601;
   -- Ruimte waar personen in geplaatst worden (indien nog niet geplaatst in andere ruimte)
   c_ruimte_nr              VARCHAR2 (10) := '000';
   -- 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_profiel_key            NUMBER (10);
   v_srtperslid_key         NUMBER (10);
   v_afdeling_key           NUMBER (10);
   v_perslid_key            NUMBER (10);
   v_kenmerklink_key        NUMBER (10);
   v_district_key           NUMBER (10);
   v_gebouw_key             NUMBER (10);
   v_verdieping_key         NUMBER (10);
   v_ruimte_key             NUMBER (10);
   v_ruimte_nr              VARCHAR2 (10);
   v_groep_key              NUMBER (10);

   -- Let op! Personen die niet meer in dienst zijn -> niet in denb_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 NOT EXISTS
                   (SELECT 1
                      FROM denb_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 denb_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 denb_imp_prs
      GROUP BY UPPER (prs_srtperslid_omschrijving);

   -- Let op! Personen die niet meer in dienst zijn -> niet in denb_imp_prs!
   -- Dubbele nummers? Dan wordt slechts 1 set persoongegevens toegevoegd!
   -- Nieuwe én bestaande WXL-ers worden/blijven geplaatst in 'Default WXL'-
   -- groep en alléén nieuwe WXL-ers wordt '_Default'-groep afgenomen!
   CURSOR cperslid
   IS
      SELECT ip.*, DECODE (a.prs_afdeling_naam, NULL, 0, 1) wxl
        FROM denb_imp_prs ip,
             (SELECT a.prs_afdeling_naam
                FROM prs_afdeling a, prs_v_afdeling_boom ab
               WHERE prs_afdeling_verwijder IS NULL
                 AND a.prs_afdeling_key = ab.prs_afdeling_key
                 AND ab.prs_afdeling_key1 = 721) a                      -- WXL
       WHERE ip.prs_afdeling_naam = a.prs_afdeling_naam(+);

   -- Let op! Personen die niet meer in dienst zijn -> niet in denb_imp_prs!
   -- Dubbele nummers? Dan krijgt iemand mogelijk de verkeerde plaats!
   CURSOR cwp
   IS
      SELECT p.*,
             ip.alg_gebouw_code,
             SUBSTR (ip.afdelingsdomein, 2, 1) || SUBSTR (ip.afdelingsdomein, 1, 1)
                afdelingsdomein
        FROM denb_imp_prs ip, prs_v_aanwezigperslid p
       WHERE UPPER (ip.prs_perslid_nr) = UPPER (p.prs_perslid_nr);

   -- Alle actieve personen met personeelsnummer (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_perslidwerkplek pw
                              WHERE pw.prs_perslid_key = p.prs_perslid_key);

   -- Alle aanwezige personen met personeelsnummer (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
   SELECT DECODE (COUNT ( * ), 0, 1, COUNT ( * ))
     INTO v_count_prs_import
     FROM prs_v_aanwezigperslid p, denb_imp_prs ip
    WHERE p.prs_perslid_nr IS NOT NULL
          AND UPPER (p.prs_perslid_nr) = UPPER (ip.prs_perslid_nr);

   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?
               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_afdeling
             WHERE prs_afdeling_upper = UPPER (recperslid.prs_afdeling_naam)
               AND prs_afdeling_verwijder IS NULL;

            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 || 'Kan persoon niet 1-duidig bepalen',
                  v_errorhint);
               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_voorletters,
                                           prs_perslid_tussenvoegsel,
                                           prs_perslid_voornaam,
                                           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_voorletters,
                              recperslid.prs_perslid_tussenvoegsel,
                              recperslid.prs_perslid_voornaam,
                              recperslid.prs_perslid_telefoonnr,
                              recperslid.prs_perslid_email,
                              recperslid.prs_perslid_oslogin,
                              recperslid.prs_perslid_ingangsdatum,
                              recperslid.prs_perslid_einddatum,
                              v_profiel_key)
                   RETURNING prs_perslid_key
                        INTO v_perslid_key;
                  COMMIT;

                  -- Nieuwe WXL-ers de '_Default'-groep afnemen en plaatsen in
                  -- de 'Default WXL'-groep!
                  IF recperslid.wxl = 1
                  THEN
                     v_errorhint := 'Fout bij afnemen _Default';

                     DELETE FROM fac_gebruikersgroep
                           WHERE fac_groep_key = 1 AND prs_perslid_key = v_perslid_key;

                     v_errorhint := 'Fout bij toekennen Default WXL';

                     INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key)
                         VALUES (481, v_perslid_key);
                  END IF;
               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_nr = recperslid.prs_perslid_nr,
                         prs_perslid_naam = recperslid.prs_perslid_naam,
                         prs_perslid_voorletters = recperslid.prs_perslid_voorletters,
                         prs_perslid_tussenvoegsel = recperslid.prs_perslid_tussenvoegsel,
                         prs_perslid_voornaam = recperslid.prs_perslid_voornaam,
                         prs_perslid_telefoonnr =
                            COALESCE (recperslid.prs_perslid_telefoonnr, prs_perslid_telefoonnr),
                         prs_perslid_email =
                            COALESCE (recperslid.prs_perslid_email, prs_perslid_email),
                         prs_perslid_oslogin = recperslid.prs_perslid_oslogin,
                         prs_perslid_ingangsdatum = recperslid.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;
                  COMMIT;

                  -- Bestaande WXL-ers behouden in de 'Default WXL'-groep!
                  IF recperslid.wxl = 1
                  THEN
                     v_errorhint := 'Fout bij behouden Default WXL';

                     INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key)
                        SELECT 481, v_perslid_key
                         FROM DUAL
                        WHERE NOT EXISTS
                                 (SELECT 1
                                    FROM fac_gebruikersgroep
                                   WHERE fac_groep_key = 481 AND prs_perslid_key = v_perslid_key);
                  END IF;
               END IF;
               COMMIT;

               IF recperslid.dienstverbandcode IS NOT NULL
               THEN
                  v_errorhint := 'Fout bij bepalen dienstverbandcode';

                  SELECT COUNT ( * ), MAX (prs_kenmerklink_key)
                    INTO v_count, v_kenmerklink_key
                    FROM prs_v_aanwezigkenmerklink
                   WHERE     prs_link_key = v_perslid_key
                         AND prs_kenmerklink_niveau = 'P'
                         AND prs_kenmerk_key = 1001;      -- Dienstverbandcode

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

                     INSERT INTO prs_kenmerklink (prs_link_key,
                                                  prs_kenmerklink_niveau,
                                                  prs_kenmerk_key,
                                                  prs_kenmerklink_waarde)
                         VALUES (v_perslid_key,
                                 'P',
                                 1001,
                                 recperslid.dienstverbandcode);
                  ELSE                                          -- v_count = 1
                     v_errorhint := 'Fout bij wijzigen dienstverbandcode';

                     UPDATE prs_kenmerklink
                        SET prs_kenmerklink_waarde = recperslid.dienstverbandcode
                      WHERE prs_kenmerklink_key = v_kenmerklink_key;
                  END IF;
                  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',
         '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_gebouw_code
               || '|'
               || recwp.afdelingsdomein
               || '] ';
            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_district_key := NULL;
            --v_gebouw_key := NULL;
            v_errorhint := 'Fout bij bepalen gebouw';

            SELECT COUNT ( * ), MAX (l.alg_district_key), MAX (g.alg_gebouw_key)
              INTO v_count, v_district_key, v_gebouw_key
              FROM alg_v_aanweziggebouw g, alg_locatie l
             WHERE UPPER (g.alg_gebouw_code) = UPPER (recwp.alg_gebouw_code)
                   AND g.alg_locatie_key = l.alg_locatie_key;

            IF COALESCE (v_district_key, -1) != c_district_key_zfe
            THEN
               IF v_count = 0
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'I',
                     v_aanduiding || 'Gebouw volgens import niet in FACILITOR',
                     v_errorhint);
                  COMMIT;
               END IF;

               v_gebouw_key := c_gebouw_key_anders;
            END IF;

            v_verdieping_key := NULL;
            v_ruimte_key := NULL;
            v_errorhint := 'Fout bij bepalen verdieping';

            IF recwp.afdelingsdomein IS NOT NULL
            THEN
               v_ruimte_nr := recwp.afdelingsdomein;

               SELECT COUNT ( * ), MAX (alg_verdieping_key)
                 INTO v_count, v_verdieping_key
                 FROM alg_v_aanwezigverdieping
                WHERE alg_gebouw_key = v_gebouw_key
                      AND alg_verdieping_volgnr = fac.safe_to_number (SUBSTR (v_ruimte_nr, 1, 1));
            ELSE
               v_ruimte_nr := c_ruimte_nr;

               SELECT COUNT ( * ), MAX (alg_verdieping_key)
                 INTO v_count, v_verdieping_key
                 FROM alg_v_aanwezigverdieping
                WHERE alg_gebouw_key = v_gebouw_key
                      AND alg_verdieping_volgnr =
                            (SELECT MIN (v.alg_verdieping_volgnr)
                               FROM alg_v_aanwezigverdieping v
                              WHERE v.alg_gebouw_key = v_gebouw_key
                                    AND v.alg_verdieping_volgnr >= 0);
            END IF;

            IF v_count = 0                                 -- ELSE v_count = 1
            THEN
               v_errorhint := 'Fout bij toevoegen verdieping';

               INSERT INTO alg_verdieping (alg_gebouw_key, alg_verdieping_volgnr, alg_verdieping_code, alg_verdieping_omschrijving)
                   VALUES (v_gebouw_key, 0, '0', 'Verdieping 0')
                RETURNING alg_verdieping_key
                     INTO v_verdieping_key;
               COMMIT;
            END IF;

            v_errorhint := 'Fout bij bepalen ruimte';

            SELECT COUNT ( * ), MAX (alg_ruimte_key)
              INTO v_count, v_ruimte_key
              FROM alg_v_aanwezigruimte
             WHERE alg_verdieping_key = v_verdieping_key
                   AND alg_ruimte_nr = v_ruimte_nr;

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

               INSERT INTO alg_ruimte (alg_verdieping_key, alg_srtruimte_key, alg_ruimte_nr)
                   VALUES (v_verdieping_key, 101, v_ruimte_nr) -- Domein/Fictief
                RETURNING alg_ruimte_key
                     INTO v_ruimte_key;
               COMMIT;
            END IF;

            v_errorhint := 'Fout bij bepalen of persoon in gebouw een werkplek heeft';

            SELECT COUNT ( * )
              INTO v_count
              FROM prs_perslidwerkplek pw, prs_werkplek w, alg_ruimte r, alg_verdieping v
             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 = v_gebouw_key;

            -- Als persoon in gebouw reeds een werkplek heeft en de nieuwe zou
            -- in de default ruimte zijn (want ongedefinieerd bij import!), dan
            -- wordt onderstaande overgeslagen.
            IF (v_count = 0 OR v_ruimte_nr != c_ruimte_nr)
            THEN
               v_errorhint := 'Fout bij verhuizen naar nieuwe werkplek';
               PRS.movetoruimte (v_perslid_key, v_ruimte_key, 'G');
            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_aanduiding || 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_aanduiding || 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
      fac.imp_writelog (
         p_import_key,
         'E',
         'Verschil tussen het actuele aantal en het te importeren aantal personen te groot; zie specificatie!',
            '- max. verschilpercentage = ['
         || TO_CHAR (c_max_delta_percentage)
         || '%] <br> '
         || '- #personen importbestand = ['
         || TO_CHAR (v_count_prs_import)
         || '] <br> '
         || '- #personen Facilitor = ['
         || TO_CHAR (v_count_prs_actual)
         || ']');
      COMMIT;
   END IF;                  -- Geldig importbestand wat betreft aantal inserts
END denb_update_prs;
/

/* Formatted on 7-6-2010 18:58:58 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW DENB_V_RAP_RES_MAANDTOTALEN
(
   FCLT_F_MAAND,
   ORGANISATIE,
   HIDE_F_TIMESTAMP,
   DAG,
   VAN,
   TOT,
   RUIMTE,
   OMSCHRIJVING,
   AANVRAGER,
   GASTHEER,
   RESNR,
   GEBOEKT_OP,
   AFGEMELD_OP,
   KOSTENPLAATS,
   PERS,
   PRIJS_PP,
   PRIJS_TOT
)
AS
   SELECT   DECODE (b.afgemeld, 0, TO_CHAR (a.van, 'yyyy-mm'), 'Open') maand,
            a.organisatie,
            a.van hide_ts,
            TO_CHAR (a.van, 'dd-mm-yyyy') dag,
            TO_CHAR (a.van, 'hh24:mi') van,
            TO_CHAR (a.tot, 'hh24:mi') tot,
            a.ruimte,
            a.omschrijving,
            a.aanvrager,
            a.gastheer,
            a.resnr,
            a.geboekt_op,
            a.afgemeld_op,
            a.kostenplaats,
            TO_CHAR (a.personen),
            REPLACE (
               TO_CHAR (ROUND (b.tot / COALESCE (a.personen, 1), 2),
                        '999999990D99'),
               '.',
               ','
            )
               prijs_pp,
            ROUND (b.tot, 2) prijs_tot
     FROM      (SELECT   rr.res_rsv_ruimte_key,
                         a.prs_afdeling_omschrijving organisatie,
                         rr.res_rsv_ruimte_van van,
                         rr.res_rsv_ruimte_tot tot,
                         r.res_ruimte_nr ruimte,
                         rr.res_rsv_ruimte_omschrijving omschrijving,
                         pa.prs_perslid_naam_full aanvrager,
                         pg.prs_perslid_naam_full gastheer,
                            rr.res_reservering_key
                         || '/'
                         || rr.res_rsv_ruimte_volgnr
                            resnr,
                         TO_CHAR (rr.res_rsv_ruimte_aanmaak, 'dd-mm-yyyy')
                            geboekt_op,
                         TO_CHAR (
                            fac.gettrackingdate ('RESAFM',
                                                 rr.res_rsv_ruimte_key),
                            'dd-mm-yyyy'
                         )
                            afgemeld_op,
                         k.prs_kostenplaats_nr kostenplaats,
                         rr.res_rsv_ruimte_bezoekers personen
                  FROM   res_v_aanwezigrsv_ruimte rr,
                         res_ruimte_opstelling ro,
                         res_ruimte r,
                         prs_v_perslid_fullnames_all pa,
                         prs_perslid p,
                         prs_v_perslid_fullnames_all pg,
                         prs_afdeling a,
                         prs_kostenplaats k
                 WHERE   rr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                         AND ro.res_ruimte_key = r.res_ruimte_key
                         AND rr.res_rsv_ruimte_contact_key =
                               pa.prs_perslid_key
                         AND rr.res_rsv_ruimte_host_key = p.prs_perslid_key
                         AND p.prs_perslid_key = pg.prs_perslid_key
                         AND p.prs_afdeling_key = a.prs_afdeling_key
                         AND a.prs_kostenplaats_key =
                               k.prs_kostenplaats_key(+)) a
            LEFT JOIN
               (  SELECT   ra.res_rsv_ruimte_key,
                           SUM (DECODE (ra.res_status_bo_key, 2, 1, 0))
                              afgemeld,
                           SUM (res.getartikelprijs (ra.res_rsv_artikel_key))
                              tot
                    FROM   res_v_aanwezigrsv_artikel ra
                GROUP BY   ra.res_rsv_ruimte_key) b
            ON a.res_rsv_ruimte_key = b.res_rsv_ruimte_key
    WHERE   COALESCE (b.tot, 0) > 0
   UNION ALL
   SELECT   DECODE (b.afgemeld, 0, TO_CHAR (a.van, 'yyyy-mm'), 'Open') maand,
            a.organisatie,
            a.van hide_ts,
            TO_CHAR (a.van, 'dd-mm-yyyy') dag,
            TO_CHAR (a.van, 'hh24:mi') van,
            TO_CHAR (a.tot, 'hh24:mi') tot,
            a.ruimte,
            a.omschrijving,
            a.aanvrager,
            a.gastheer,
            a.resnr,
            a.geboekt_op,
            a.afgemeld_op,
            a.kostenplaats,
            TO_CHAR (a.personen),
            REPLACE (
               TO_CHAR (ROUND (b.tot / COALESCE (a.personen, 1), 2),
                        '999999990D99'),
               '.',
               ','
            )
               prijs_pp,
            ROUND (b.tot, 2) prijs_tot
     FROM      (SELECT   rr.res_rsv_ruimte_key,
                         a.prs_afdeling_omschrijving organisatie,
                         rr.res_rsv_ruimte_van van,
                         rr.res_rsv_ruimte_tot tot,
                            r.alg_ruimte_nr
                         || ' - '
                         || r.alg_ruimte_omschrijving
                            ruimte,
                         rr.res_rsv_ruimte_omschrijving omschrijving,
                         pa.prs_perslid_naam_full aanvrager,
                         pg.prs_perslid_naam_full gastheer,
                            rr.res_reservering_key
                         || '/'
                         || rr.res_rsv_ruimte_volgnr
                            resnr,
                         TO_CHAR (rr.res_rsv_ruimte_aanmaak, 'dd-mm-yyyy')
                            geboekt_op,
                         TO_CHAR (
                            fac.gettrackingdate ('RESAFM',
                                                 rr.res_rsv_ruimte_key),
                            'dd-mm-yyyy'
                         )
                            afgemeld_op,
                         k.prs_kostenplaats_nr kostenplaats,
                         rr.res_rsv_ruimte_bezoekers personen
                  FROM   res_v_aanwezigrsv_ruimte rr,
                         alg_ruimte r,
                         prs_v_perslid_fullnames_all pa,
                         prs_perslid p,
                         prs_v_perslid_fullnames_all pg,
                         prs_afdeling a,
                         prs_kostenplaats k
                 WHERE   rr.alg_ruimte_key = r.alg_ruimte_key
                         AND rr.res_rsv_ruimte_contact_key =
                               pa.prs_perslid_key
                         AND rr.res_rsv_ruimte_host_key = p.prs_perslid_key
                         AND p.prs_perslid_key = pg.prs_perslid_key
                         AND p.prs_afdeling_key = a.prs_afdeling_key
                         AND a.prs_kostenplaats_key =
                               k.prs_kostenplaats_key(+)) a
            LEFT JOIN
               (  SELECT   ra.res_rsv_ruimte_key,
                           SUM (DECODE (ra.res_status_bo_key, 2, 1, 0))
                              afgemeld,
                           SUM (res.getartikelprijs (ra.res_rsv_artikel_key))
                              tot
                    FROM   res_v_aanwezigrsv_artikel ra
                GROUP BY   ra.res_rsv_ruimte_key) b
            ON a.res_rsv_ruimte_key = b.res_rsv_ruimte_key
    WHERE   COALESCE (b.tot, 0) > 0;

/* Formatted on 7-6-2010 19:06:46 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW DENB_V_RAP_BES_MAANDTOTALEN
(
   FCLT_F_MAAND,
   FCLT_F_CATALOGUS,
   FCLT_F_SECTOR,
   ORGANISATIE,
   FCLT_F_KOSTENPLAATS,
   AANVRAGER,
   BESTELNR,
   BESTELD_OP,
   AFGEMELD_OP,
   ARTIKEL,
   AANTAL,
   PRIJS,
   PRIJS_TOT,
   STATUS
)
AS
   SELECT   DECODE (
               b.bes_bestelling_status,
               6,
               TO_CHAR (
                  COALESCE (
                     fac.gettrackingdate ('BESOTV', b.bes_bestelling_key),
                     bo.bes_bestelopdr_leverdatum
                  ),
                  'yyyy-mm'
               ),
               'Lopend'
            )
               maand,
            d.ins_discipline_omschrijving catalogus,
            a1.prs_afdeling_omschrijving sector,
            a2.prs_afdeling_omschrijving organisatie,
            k.prs_kostenplaats_nr kostenplaats,
            pf.prs_perslid_naam_full aanvrager,
            TO_CHAR (b.bes_bestelling_key) bestelnr,
            TO_CHAR (b.bes_bestelling_datum, 'dd-mm-yyyy') besteld_op,
            TO_CHAR (
               COALESCE (
                  fac.gettrackingdate ('BESOTV', b.bes_bestelling_key),
                  bo.bes_bestelopdr_leverdatum
               ),
               'dd-mm-yyyy'
            )
               afgemeld_op,
            sd.bes_srtdeel_omschrijving artikel,
            TO_CHAR (bi.bes_bestelling_item_aantal) aantal,
            REPLACE (TO_CHAR (bi.bes_bestelling_item_prijs), '.', ',') prijs,
            (bi.bes_bestelling_item_aantal * bi.bes_bestelling_item_prijs)
               prijs_tot,
            s.bes_bestellingstatuses_omschr status
     FROM   bes_bestelling b,
            bes_bestellingstatuses s,
            bes_bestelling_item bi,
            bes_bestelopdr_item boi,
            bes_bestelopdr bo,
            bes_srtdeel sd,
            bes_srtgroep sg,
            ins_tab_discipline d,
            prs_perslid p,
            prs_v_perslid_fullnames_all pf,
            prs_v_afdeling_boom ab,
            prs_v_afdeling a1,
            prs_v_afdeling a2,
            prs_kostenplaats k
    WHERE       b.bes_bestelling_status = s.bes_bestellingstatuses_key
            AND b.bes_bestelling_key = bi.bes_bestelling_key
            AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key(+)
            AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key(+)
            AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
            AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
            AND sg.ins_discipline_key = d.ins_discipline_key
            AND b.prs_perslid_key = p.prs_perslid_key
            AND p.prs_perslid_key = pf.prs_perslid_key
            AND p.prs_afdeling_key = ab.prs_afdeling_key
            AND ab.prs_afdeling_key1 = a1.prs_afdeling_key
            AND ab.prs_afdeling_key = a2.prs_afdeling_key
            AND a2.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
            AND b.bes_bestelling_status <> 1;

/* Formatted on 1-2-2010 22:52:52 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW DENB_V_RAP_LOCKERGEGEVENS
(
   FCLT_F_LOCKER_SOORT,
   FCLT_F_LOCKER_NR,
   LOCATIE,
   GEBOUW,
   VERDIEPING,
   FCLT_F_RUIMTE,
   FCLT_F_SLEUTEL_NR,
   FCLT_F_GEBRUIKER,
   AFDELING,
   TELEFOON_NR
)
AS
   SELECT   a.locker_soort,
            a.locker_nr,
            a.locatie,
            a.gebouw,
            a.verdieping,
            a.ruimte_nr,
            b.sleutel_nr,
            c.gebruiker,
            c.afdeling,
            c.telefoon_nr
     FROM         (SELECT   d.ins_deel_key,
                            sd.ins_srtdeel_omschrijving locker_soort,
                            d.ins_deel_omschrijving locker_nr,
                            l.alg_locatie_code locatie,
                            g.alg_gebouw_code gebouw,
                            v.alg_verdieping_code verdieping,
                            r.alg_ruimte_nr ruimte_nr
                     FROM   ins_v_aanwezigdeel d,
                            ins_srtdeel sd,
                            alg_ruimte r,
                            alg_verdieping v,
                            alg_gebouw g,
                            alg_locatie l
                    WHERE   d.ins_srtdeel_key IN (261, 262, 263, 264, 265)
                            AND d.ins_alg_ruimte_type = 'R'
                            AND d.ins_srtdeel_key = sd.ins_srtdeel_key
                            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) a
               LEFT JOIN
                  (SELECT   kd.ins_deel_key,
                            kd.ins_kenmerkdeel_waarde sleutel_nr
                     FROM   ins_v_aanwezigkenmerkdeel kd
                    WHERE   kd.ins_kenmerk_key = 1) b
               ON a.ins_deel_key = b.ins_deel_key
            LEFT JOIN
               (SELECT   kd.ins_deel_key,
                         fn.prs_perslid_naam_full gebruiker,
                         a.prs_afdeling_omschrijving afdeling,
                         p.prs_perslid_telefoonnr telefoon_nr
                  FROM   ins_v_aanwezigkenmerk k,
                         ins_v_aanwezigkenmerkdeel kd,
                         prs_perslid p,
                         prs_v_perslid_fullnames_all fn,
                         prs_afdeling a
                 WHERE       k.ins_srtkenmerk_key = 2
                         AND k.ins_kenmerk_key = kd.ins_kenmerk_key
                         AND kd.ins_kenmerkdeel_waarde = p.prs_perslid_key
                         AND p.prs_perslid_key = fn.prs_perslid_key
                         AND p.prs_afdeling_key = a.prs_afdeling_key) c
            ON a.ins_deel_key = c.ins_deel_key;

/* Formatted on 18-10-2011 15:10:05 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW denb_v_rap_voorraad
(
   hide_f_extern_diskey,
   fclt_f_catalogus,
   artikel_nr,
   artikel_omschrijving,
   artikel_prijs,
   min_voorraad,
   max_voorraad,
   inkoop_geleverd,                              -- IN: daadwerkelijk geleverd
   intern_besteld,                  -- UIT: in bestelling + besteld + geleverd
   voorraad,
   hide_f_voorraad_gisteren,
   inkoop_besteld,                              -- IN: in bestelling + besteld
   inkoop_gewenst                         -- IN: tot maximum als onder minimum
)
AS
   SELECT   extern.dkey,
            COALESCE (intern.ins_discipline_omschrijving,
                      extern.ins_discipline_omschrijving),
            extern.bes_srtdeel_nr,
            COALESCE (intern.bes_srtdeel_omschrijving,
                      extern.bes_srtdeel_omschrijving),
            COALESCE (intern.srtdeel_prijs, extern.srtdeel_prijs),
            extern.vmin,
            extern.vmax,
            extern.geleverd,
            intern.besteld,
            extern.geleverd - COALESCE (intern.besteld, 0) voorraad,
            extern.geleverd_gisteren - COALESCE (intern.besteld_gisteren, 0)
               voorraad_gisteren,
            extern.besteld,
            CASE
               WHEN ( (COALESCE (extern.besteld, 0)
                       + COALESCE (extern.geleverd, 0))
                     - COALESCE (intern.besteld, 0)) < extern.vmin
               THEN
                  extern.vmax
                  - ( (COALESCE (extern.besteld, 0)
                       + COALESCE (extern.geleverd, 0))
                     - COALESCE (intern.besteld, 0))
               ELSE
                  NULL
            END
               extern_gewenst
     FROM      (SELECT   bd.ins_discipline_key dkey,             -- INKOOP-key
                         sd.bes_srtdeel_nr,                  -- ext. artikelnr
                         sd.bes_srtdeel_omschrijving,
                         bes.getsrtdeelprijs (sd.bes_srtdeel_key, NULL)
                            srtdeel_prijs,
                         bd.ins_discipline_omschrijving, -- ext. catalogusnaam
                         sd.bes_srtdeel_voorraadmin vmin,  -- ext. voorraadmin
                         sd.bes_srtdeel_voorraadmax vmax,  -- ext. voorraadmax
                         (SELECT   SUM (bi.bes_bestelling_item_aantal)
                            FROM   bes_bestelling b, bes_bestelling_item bi
                           WHERE   b.bes_bestelling_status IN (2, 3, 4, 5)
                                   AND b.bes_bestelling_key =
                                         bi.bes_bestelling_key
                                   AND bi.bes_srtdeel_key =
                                         sd.bes_srtdeel_key)
                            besteld,
                         (SELECT   SUM (bi.bes_bestelling_item_aantal)
                            FROM   bes_bestelling b, bes_bestelling_item bi
                           WHERE   b.bes_bestelling_status > 5
                                   AND b.bes_bestelling_key =
                                         bi.bes_bestelling_key
                                   AND bi.bes_srtdeel_key =
                                         sd.bes_srtdeel_key)
                            geleverd,
                         (SELECT   SUM (bi.bes_bestelling_item_aantal)
                            FROM   bes_bestelling b, bes_bestelling_item bi
                           WHERE   b.bes_bestelling_datum < TRUNC (SYSDATE)
                                   AND b.bes_bestelling_status > 5
                                   AND b.bes_bestelling_key =
                                         bi.bes_bestelling_key
                                   AND bi.bes_srtdeel_key =
                                         sd.bes_srtdeel_key)
                            geleverd_gisteren
                  FROM   bes_srtdeel sd,
                         bes_srtgroep g,
                         bes_discipline bd,
                         bes_disc_params dp
                 WHERE       sd.bes_srtdeel_verwijder IS NULL
                         AND sd.bes_srtgroep_key = g.bes_srtgroep_key
                         AND g.ins_discipline_key = bd.ins_discipline_key
                         AND bd.ins_discipline_key =
                               dp.bes_ins_discipline_key
                         AND dp.bes_ins_discipline_key_inkoop IS NULL
                         AND bd.ins_discipline_key IN
                                  (SELECT   bes_ins_discipline_key_inkoop
                                     FROM   bes_disc_params
                                    WHERE   bes_ins_discipline_key_inkoop IS NOT NULL))
               extern               -- Inkoop artikelen uit externe catalogus!
            FULL JOIN
               (SELECT   dp.bes_ins_discipline_key_inkoop dkey,  -- INKOOP-key
                         sd.bes_srtdeel_nr,                  -- int. artikelnr
                         sd.bes_srtdeel_omschrijving,
                         bes.getsrtdeelprijs (sd.bes_srtdeel_key, NULL)
                            srtdeel_prijs,
                         bd.ins_discipline_omschrijving, -- int. catalogusnaam
                         (SELECT   SUM (bi.bes_bestelling_item_aantal)
                            FROM   bes_bestelling b, bes_bestelling_item bi
                           WHERE   b.bes_bestelling_key =
                                      bi.bes_bestelling_key
                                   AND bi.bes_srtdeel_key =
                                         sd.bes_srtdeel_key)
                            besteld,
                         (SELECT   SUM (bi.bes_bestelling_item_aantal)
                            FROM   bes_bestelling b, bes_bestelling_item bi
                           WHERE   b.bes_bestelling_datum < TRUNC (SYSDATE)
                                   AND b.bes_bestelling_key =
                                         bi.bes_bestelling_key
                                   AND bi.bes_srtdeel_key =
                                         sd.bes_srtdeel_key)
                            besteld_gisteren
                  FROM   bes_srtdeel sd,
                         bes_srtgroep g,
                         bes_discipline bd,
                         bes_disc_params dp
                 WHERE       sd.bes_srtdeel_verwijder IS NULL
                         AND sd.bes_srtgroep_key = g.bes_srtgroep_key
                         AND g.ins_discipline_key = bd.ins_discipline_key
                         AND bd.ins_discipline_key =
                               dp.bes_ins_discipline_key
                         AND dp.bes_ins_discipline_key_inkoop IS NOT NULL)
               intern              -- Verkoop artikelen uit interne catalogus!
            ON extern.dkey = intern.dkey
               AND extern.bes_srtdeel_nr = intern.bes_srtdeel_nr;

-- Bevat CUST01/02-notificaties (eind van de dag) naar COMM-medewerkers dat
-- 1 of meer producten onder de minimale voorraad zitten!
/* Formatted on 10-12-2010 16:34:34 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW denb_v_noti_voorraadreminder
(
   code,
   sender,
   receiver,
   text,
   KEY,
   par1,
   par2,
   xkey
)
AS
   SELECT   DISTINCT sn.fac_srtnotificatie_code,
                     NULL,
                     gg.prs_perslid_key,
                     sn.fac_srtnotificatie_oms,
                     (SELECT   fac_usrrap_key
                        FROM   fac_usrrap
                       WHERE   fac_usrrap_view_name = 'denb_v_rap_voorraad'),
                     NULL,
                     NULL,
                     NULL
     FROM   denb_v_rap_voorraad v,
            fac_gebruikersgroep gg,
            fac_srtnotificatie sn
    WHERE       v.voorraad < v.min_voorraad
            AND v.hide_f_voorraad_gisteren >= v.min_voorraad
            AND v.hide_f_extern_diskey = 561   -- Representatiegeschenken-cat.
            AND gg.fac_groep_key = 61          -- COMM/Representatiegeschenken
            AND sn.fac_srtnotificatie_code = 'CUST01'
   UNION ALL
   SELECT   DISTINCT sn.fac_srtnotificatie_code,
                     NULL,
                     gg.prs_perslid_key,
                     sn.fac_srtnotificatie_oms,
                     (SELECT   fac_usrrap_key
                        FROM   fac_usrrap
                       WHERE   fac_usrrap_view_name = 'denb_v_rap_voorraad'),
                     NULL,
                     NULL,
                     NULL
     FROM   denb_v_rap_voorraad v,
            fac_gebruikersgroep gg,
            fac_srtnotificatie sn
    WHERE       v.voorraad < v.min_voorraad
            AND v.hide_f_voorraad_gisteren >= v.min_voorraad
            AND v.hide_f_extern_diskey = 562        -- Bestuursgeschenken-cat.
            AND gg.fac_groep_key = 121              -- COMM/Bestuursgeschenken
            AND sn.fac_srtnotificatie_code = 'CUST02';

CREATE OR REPLACE VIEW DENB_V_THEMA_RUIMTE_RSV
(
   ALG_RUIMTE_KEY,
   WAARDE
)
AS
     SELECT rar.alg_ruimte_key,  MIN (DECODE (bezet.res_ruimte_opstel_key, NULL, 'Vrij', 'Bezet')) waarde
       FROM res_ruimte_opstelling rro,
            res_ruimte rr,
            res_alg_ruimte rar,
            (SELECT res_ruimte_opstel_key
               FROM res_v_aanwezigrsv_ruimte
              WHERE SYSDATE BETWEEN res_rsv_ruimte_van AND res_rsv_ruimte_tot)
            bezet
      WHERE rro.res_ruimte_key = rr.res_ruimte_key
            AND rr.res_ruimte_key = rar.res_ruimte_key
            AND rar.res_alg_ruimte_verwijder IS NULL
            AND rro.res_ruimte_opstel_key = bezet.res_ruimte_opstel_key(+)
   GROUP BY rar.alg_ruimte_key;

CREATE OR REPLACE VIEW denb_v_res_deel_late
(
   res_rsv_ruimte_key,
   fclt_3d_discipline_key,
   res_nr,
   res_object,
   res_object_opmerking,
   van,
   tot,
   res_omschrijving,
   contactpersoon,
   gastheer,
   activiteit
)
AS
   SELECT rrr.res_rsv_ruimte_key,
          dsc.ins_discipline_key,
          res_reservering_key || '/' || res_rsv_ruimte_volgnr,
          rd.res_deel_omschrijving,
          rd.res_deel_opmerking,
          res_rsv_deel_van,
          rrd.res_rsv_deel_tot,
          res_rsv_ruimte_omschrijving,
          pf1.prs_perslid_naam_full contactpersoon,
          pf2.prs_perslid_naam_full gastheer,
          ra.res_activiteit_omschrijving
     FROM res_rsv_deel rrd,
          res_rsv_ruimte rrr,
          res_deel rd,
          ins_deel d,
          (  SELECT rd.res_deel_key, MAX (res_rsv_deel_tot) res_rsv_deel_tot
               FROM res_rsv_deel rrd, res_deel rd, ins_deel d
              WHERE     res_rsv_deel_verwijder IS NULL
                    AND res_rsv_deel_afgemeld IS NULL
                    AND res_rsv_deel_tot < SYSDATE
                    AND rd.res_deel_key = rrd.res_deel_key
                    AND rd.res_deel_verwijder IS NULL
                    AND (rd.res_deel_vervaldatum IS NULL
                         OR rd.res_deel_vervaldatum > SYSDATE)
                    AND rd.res_ins_deel_key = d.ins_deel_key
                    AND ins_deel_verwijder IS NULL
                    AND rd.res_discipline_key != 701
                    AND res_rsv_deel_dirtlevel = 0
                    AND rd.res_deel_key NOT IN
                             (  SELECT rd.res_deel_key
                                  FROM res_rsv_deel rrd, res_deel rd, ins_deel d
                                 WHERE     res_rsv_deel_verwijder IS NULL
                                       AND res_rsv_deel_afgemeld IS NULL
                                       AND res_rsv_deel_tot >= SYSDATE
                                       AND res_rsv_deel_van <= SYSDATE
                                       AND rd.res_deel_key = rrd.res_deel_key
                                       AND rd.res_deel_verwijder IS NULL
                              GROUP BY rd.res_deel_key)
           GROUP BY rd.res_deel_key) laatste_res,
          prs_v_perslid_fullnames_all pf1,
          prs_v_perslid_fullnames_all pf2,
          res_activiteit ra,
          res_discipline dsc
    WHERE     res_rsv_deel_verwijder IS NULL
          AND res_rsv_deel_afgemeld IS NULL
          AND rrr.res_rsv_ruimte_key = rrd.res_rsv_ruimte_key
          AND rd.res_deel_key = rrd.res_deel_key
          AND rd.res_deel_verwijder IS NULL
          AND (rd.res_deel_vervaldatum IS NULL
               OR rd.res_deel_vervaldatum > SYSDATE)
          AND rd.res_ins_deel_key = d.ins_deel_key
          AND ins_deel_verwijder IS NULL
          AND rd.res_discipline_key != 701
          AND dsc.ins_discipline_key = rd.res_discipline_key
          AND dsc.ins_discipline_verwijder IS NULL
          AND res_rsv_deel_dirtlevel = 0
          AND laatste_res.res_deel_key = rd.res_deel_key
          AND laatste_res.res_rsv_deel_tot = rrd.res_rsv_deel_tot
          AND pf1.prs_perslid_key = rrr.res_rsv_ruimte_contact_key
          AND pf2.prs_perslid_key = rrr.res_rsv_ruimte_host_key
          AND ra.res_activiteit_key = rrr.res_activiteit_key;

-- DENB#51465: Domein tbv. BBS met alle huurders (debiteuren).
CREATE OR REPLACE VIEW denb_v_bbs_huurders
(
   prs_bedrijf_key,
   prs_bedrijf_naam,
   prs_bedrijf_verwijder
)
AS
   SELECT prs_bedrijf_key, prs_bedrijf_naam || ' [' || deb.prs_kenmerklink_waarde || ']', prs_bedrijf_verwijder
     FROM    (SELECT *
                FROM prs_bedrijf
               WHERE prs_bedrijf_huurder = 1) x
          LEFT JOIN
             prs_v_aanwezigkenmerklink deb
          ON x.prs_bedrijf_key = deb.prs_link_key
             AND deb.prs_kenmerk_key = 1020                     -- Deb.nr. K2F
;

-- Bronview met alle BBS-reserveringen tot *nu*!
-- DENB#55783: Toevoegen 'Referentie aanvrager'!
-- DENB#56634: Niet factureren nul-bedragen!
CREATE OR REPLACE VIEW denb_v_bbs_res_all
(
   sortering,
   res_rsv_ruimte_key,
   res_rsv_artikel_key,
   res_rsv_deel_key,
   res_reservering_key,
   res_rsv_ruimte_volgnr,
   reslev,
   resver,
   res_status_bo_key,
   res_rsv_ruimte_ordernr,
   bedrag,                                          -- Nettobedrag (excl. BTW)
   btw_kode,                          -- 6, 21 of - bij misconfiguratie - leeg
   ecl_lang, -- 83362 (Ruimte incl. annulering/schoonmaak)/83402 (Verbruik)/82980 (Overig)
   regel_omschrijving,                     -- Ruimte/Verbruik/Overig(/Uitleen)
   regel_aanvulling,                        -- Ruimtenaam/Korting/Artikel/Deel
   debiteurennummer,              -- Geregistreerd bij huurder in kenmerk 1020
   interne_huurder,   -- NULL of '1'/Geregistreerd bij huurder in kenmerk 1021
   notagebonden_tekst,            -- Geregistreerd bij huurder in kenmerk 1040
   ref_aanvrager,          -- Geregistreerd bij reservering in kenmerk 183/202
   alg_locatie_key,
   alg_locatie_code,
   alg_locatie_omschrijving,
   fcl_lang                             -- Grootboek per BBS-locatie (64807xx)
)
AS
     SELECT x.sortering,
            x.res_rsv_ruimte_key, x.res_rsv_artikel_key, x.res_rsv_deel_key,
            x.res_reservering_key, x.res_rsv_ruimte_volgnr,
            x.reslev,
            fac.gettrackingdate ('RESVER', x.res_rsv_ruimte_key) resver,
            x.res_status_bo_key,
            x.res_rsv_ruimte_ordernr,
            COALESCE (x.verw_prijs, x.prijs) bedrag,
            --DECODE (idb.prs_kenmerklink_waarde,
            --        NULL, x.btw,                           -- Externe huurder!
            --        TO_NUMBER (NULL))                      -- Interne huurder!
            --   btw_kode,
            x.btw btw_kode,   -- Alleen verbruiksartikelen historisch bewaard!
            x.ecl_lang,
            x.regel_omschrijving,
            x.regel_aanvulling,       -- R0/1-regels igv. Uitleen uitgesloten!
            deb.prs_kenmerklink_waarde debiteurennummer,
            idb.prs_kenmerklink_waarde interne_huurder, -- Interne huurder='1'
            ngt.prs_kenmerklink_waarde notagebonden_tekst,
            ref.res_kenmerkreservering_waarde ref_aanvr,
            l.alg_locatie_key,
            l.alg_locatie_code,
            l.alg_locatie_omschrijving,
            fcl.alg_onrgoedkenmerk_waarde fcl_lang
       FROM (SELECT TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyymmdd') || SUBSTR ('000' || TO_CHAR (res_reservering_key), -9) || 'R' sortering,
                    rrr.res_rsv_ruimte_key, NULL res_rsv_artikel_key, NULL res_rsv_deel_key,
                    rrr.res_reservering_key, rrr.res_rsv_ruimte_volgnr,
                    rrr.res_rsv_ruimte_van reslev, rrr.res_status_bo_key, rrr.res_rsv_ruimte_ordernr,
                    DECODE (vht.res_kenmerkreservering_waarde, -- 841=Sociaal/842=Commercieel
                            '841', rrr.res_rsv_ruimte_prijs,
                            (24 * (rrr.res_rsv_ruimte_tot - rrr.res_rsv_ruimte_van) * rr.res_ruimte_prijs_dag)) - COALESCE (rrr.res_rsv_ruimte_korting, 0)
                       verw_prijs,
                    DECODE (vht.res_kenmerkreservering_waarde, -- 841=Sociaal/842=Commercieel
                            '841', res.getruimteprijs (rrr.res_rsv_ruimte_key),
                            (24 * (rrr.res_rsv_ruimte_tot - rrr.res_rsv_ruimte_van) * rr.res_ruimte_prijs_dag)) - COALESCE (rrr.res_rsv_ruimte_korting, 0)
                       prijs,
                    fac.safe_to_number (rr.res_ruimte_groep) btw,
                    '83362' ecl_lang,
                    'Ruimte' regel_omschrijving,
                    rr.res_ruimte_nr regel_aanvulling,
                    rel.res_kenmerkreservering_waarde rel,
                    COALESCE (rar1.alg_ruimte_key, rar2.alg_ruimte_key) alg_ruimte_key
               FROM res_v_aanwezigrsv_ruimte rrr,
                    res_ruimte_opstelling rro,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_alg_ruimte
                        WHERE res_alg_ruimte_verwijder IS NULL
                     GROUP BY res_ruimte_key) rar1,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_alg_ruimte
                        WHERE res_alg_ruimte_verwijder IS NOT NULL
                     GROUP BY res_ruimte_key) rar2,
                    res_ruimte rr,
                    (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                            AND k.res_srtkenmerk_key = 181) vht, -- Verhuur tarief
                    (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                            AND k.res_srtkenmerk_key = 182) rel     -- Relatie
              WHERE rrr.res_activiteit_key IN (302) -- BBS Extern (géén 322=BBS Uitleen Extern)!
                    AND rrr.res_rsv_ruimte_tot < SYSDATE  -- Niet in toekomst!
                    AND rrr.res_rsv_ruimte_dirtlevel = 0        -- Niet dirty!
                    AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key -- Alleen Ruimte-reserveringen!
                    AND rro.res_ruimte_key = rar1.res_ruimte_key(+)
                    AND rro.res_ruimte_key = rar2.res_ruimte_key(+)
                    AND COALESCE (rar1.res_ruimte_key, rar2.res_ruimte_key) = rr.res_ruimte_key
                    AND rrr.res_rsv_ruimte_key = vht.res_rsv_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = rel.res_rsv_ruimte_key(+)
             --UNION ALL                                              -- Korting
             --SELECT TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyymmdd') || SUBSTR ('000' || TO_CHAR (res_reservering_key), -9) || 'R1' sortering,
             --       rrr.res_rsv_ruimte_key, NULL res_rsv_artikel_key, NULL res_rsv_deel_key,
             --       rrr.res_reservering_key, rrr.res_rsv_ruimte_volgnr,
             --       rrr.res_rsv_ruimte_van reslev, rrr.res_status_bo_key, rrr.res_rsv_ruimte_ordernr,
             --       -1 * rrr.res_rsv_ruimte_korting verw_prijs,
             --       -1 * rrr.res_rsv_ruimte_korting prijs,
             --       fac.safe_to_number (rr.res_ruimte_groep) btw,
             --       '83362' ecl_lang,
             --       'Ruimte' regel_omschrijving,
             --       'Korting' regel_aanvulling,
             --       rel.res_kenmerkreservering_waarde rel,
             --       COALESCE (rar1.alg_ruimte_key, rar2.alg_ruimte_key) alg_ruimte_key
             --  FROM res_v_aanwezigrsv_ruimte rrr,
             --       res_ruimte_opstelling rro,
             --       (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
             --            FROM res_alg_ruimte
             --           WHERE res_alg_ruimte_verwijder IS NULL
             --        GROUP BY res_ruimte_key) rar1,
             --       (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
             --            FROM res_alg_ruimte
             --           WHERE res_alg_ruimte_verwijder IS NOT NULL
             --        GROUP BY res_ruimte_key) rar2,
             --       res_ruimte rr,
             --       (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
             --          FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
             --         WHERE kw.res_kenmerk_key = k.res_kenmerk_key
             --               AND k.res_srtkenmerk_key = 182) rel     -- Relatie
             -- WHERE rrr.res_activiteit_key IN (302) -- BBS Extern (géén 322=BBS Uitleen Extern)!
             --       AND rrr.res_rsv_ruimte_tot < SYSDATE  -- Niet in toekomst!
             --       AND rrr.res_rsv_ruimte_dirtlevel = 0        -- Niet dirty!
             --       AND COALESCE (rrr.res_rsv_ruimte_korting, 0) != 0
             --       AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key -- Alleen Ruimte-reserveringen!
             --       AND rro.res_ruimte_key = rar1.res_ruimte_key(+)
             --       AND rro.res_ruimte_key = rar2.res_ruimte_key(+)
             --       AND COALESCE (rar1.res_ruimte_key, rar2.res_ruimte_key) = rr.res_ruimte_key
             --       AND rrr.res_rsv_ruimte_key = rel.res_rsv_ruimte_key(+)
             UNION ALL                          -- Verbruik=Verbruiksartikelen
             SELECT TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyymmdd') || SUBSTR ('000' || TO_CHAR (res_reservering_key), -9) || 'V' || TO_CHAR (ra.res_discipline_key) || SUBSTR ('000' || TO_CHAR (COALESCE (ra.res_artikel_volgnummer, 0)), -3) sortering,
                    rrr.res_rsv_ruimte_key, rra.res_rsv_artikel_key, NULL res_rsv_deel_key,
                    rrr.res_reservering_key, rrr.res_rsv_ruimte_volgnr,
                    rra.res_rsv_artikel_levering reslev, rra.res_status_bo_key, rrr.res_rsv_ruimte_ordernr,
                    rra.res_rsv_artikel_prijs verw_prijs,
                    rra.res_rsv_artikel_aantal * ra.res_artikel_prijs prijs,
                    --COALESCE (rra.res_rsv_artikel_btw, ra.res_artikel_btw) btw,
                    DECODE (rra.res_status_bo_key, 2, COALESCE (rra.res_rsv_artikel_btw, ra.res_artikel_btw), rra.res_rsv_artikel_btw) btw,
                    DECODE (ra.res_artikel_key,
                            943, '83362',                  -- Schoonmaakkosten
                            944, '83362',                 -- Annuleringskosten
                            '83402')
                       ecl_lang,
                    DECODE (ra.res_artikel_key,
                            943, 'Ruimte',                 -- Schoonmaakkosten
                            944, 'Ruimte',                -- Annuleringskosten
                            'Verbruik')
                       regel_omschrijving,
                    ra.res_artikel_omschrijving regel_aanvulling,
                    rel.res_kenmerkreservering_waarde rel,
                    COALESCE (rar1.alg_ruimte_key, rar2.alg_ruimte_key, rrr.alg_ruimte_key) alg_ruimte_key
               FROM res_v_aanwezigrsv_ruimte rrr,
                    res_ruimte_opstelling rro,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_alg_ruimte
                        WHERE res_alg_ruimte_verwijder IS NULL
                     GROUP BY res_ruimte_key) rar1,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_alg_ruimte
                        WHERE res_alg_ruimte_verwijder IS NOT NULL
                     GROUP BY res_ruimte_key) rar2,
                    res_ruimte rr,
                    (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                            AND k.res_srtkenmerk_key = 181) vht, -- Verhuur tarief
                    (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                            AND k.res_srtkenmerk_key = 182) rel,    -- Relatie
                    res_v_aanwezigrsv_artikel rra,
                    res_artikel ra
              WHERE rrr.res_activiteit_key IN (302, 322) -- BBS Extern/BBS Uitleen Extern!
                    AND rrr.res_rsv_ruimte_tot < SYSDATE  -- Niet in toekomst!
                    AND rrr.res_rsv_ruimte_dirtlevel = 0        -- Niet dirty!
                    AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+) -- Ruimte- én Uitleen-reserveringen!
                    AND rro.res_ruimte_key = rar1.res_ruimte_key(+)
                    AND rro.res_ruimte_key = rar2.res_ruimte_key(+)
                    AND COALESCE (rar1.res_ruimte_key, rar2.res_ruimte_key) = rr.res_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = vht.res_rsv_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = rel.res_rsv_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                    AND rra.res_rsv_artikel_levering < SYSDATE -- Niet in toekomst!
                    AND rra.res_rsv_artikel_dirtlevel = 0       -- Niet dirty!
                    AND rra.res_artikel_key = ra.res_artikel_key
             UNION ALL                                 -- Overig=Voorzieningen
             SELECT TO_CHAR (rrr.res_rsv_ruimte_van, 'yyyymmdd') || SUBSTR ('000' || TO_CHAR (res_reservering_key), -9) || 'X' || TO_CHAR (rd.res_discipline_key) || SUBSTR (rd.res_deel_omschrijving, 1, 3) sortering,
                    rrr.res_rsv_ruimte_key, NULL res_rsv_artikel_key, rrd.res_rsv_deel_key,
                    rrr.res_reservering_key, rrr.res_rsv_ruimte_volgnr,
                    rrd.res_rsv_deel_van reslev, rrd.res_status_bo_key, rrr.res_rsv_ruimte_ordernr,
                    rrd.res_rsv_deel_prijs verw_prijs,
                    24 * (rrd.res_rsv_deel_tot - rrd.res_rsv_deel_van) * rd.res_deel_prijs prijs,
                    21 btw,                                        -- Hard 21%
                    '82980' ecl_lang,
                    'Overig' || DECODE (rrr.res_activiteit_key, 302, '', '/Uitleen') regel_omschrijving,
                    rd.res_deel_omschrijving regel_aanvulling,
                    rel.res_kenmerkreservering_waarde rel,
                    COALESCE (rar1.alg_ruimte_key, rar2.alg_ruimte_key, rrr.alg_ruimte_key) alg_ruimte_key
               FROM res_v_aanwezigrsv_ruimte rrr,
                    res_ruimte_opstelling rro,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_alg_ruimte
                        WHERE res_alg_ruimte_verwijder IS NULL
                     GROUP BY res_ruimte_key) rar1,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_alg_ruimte
                        WHERE res_alg_ruimte_verwijder IS NOT NULL
                     GROUP BY res_ruimte_key) rar2,
                    res_ruimte rr,
                    (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                            AND k.res_srtkenmerk_key = 181) vht, -- Verhuur tarief
                    (SELECT kw.res_rsv_ruimte_key, kw.res_kenmerkreservering_waarde
                       FROM res_v_aanwezigkenmerkwaarde kw, res_kenmerk k
                      WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                            AND k.res_srtkenmerk_key = 182) rel,    -- Relatie
                    res_v_aanwezigrsv_deel rrd,
                    res_deel rd
              WHERE rrr.res_activiteit_key IN (302, 322) -- BBS Extern/BBS Uitleen Extern!
                    AND rrr.res_rsv_ruimte_tot < SYSDATE  -- Niet in toekomst!
                    AND rrr.res_rsv_ruimte_dirtlevel = 0        -- Niet dirty!
                    AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+) -- Ruimte- én Uitleen-reserveringen!
                    AND rro.res_ruimte_key = rar1.res_ruimte_key(+)
                    AND rro.res_ruimte_key = rar2.res_ruimte_key(+)
                    AND COALESCE (rar1.res_ruimte_key, rar2.res_ruimte_key) = rr.res_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = vht.res_rsv_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = rel.res_rsv_ruimte_key(+)
                    AND rrr.res_rsv_ruimte_key = rrd.res_rsv_ruimte_key
                    AND rrd.res_rsv_deel_tot < SYSDATE    -- Niet in toekomst!
                    AND rrd.res_rsv_deel_dirtlevel = 0          -- Niet dirty!
                    AND rrd.res_deel_key = rd.res_deel_key) x
            LEFT JOIN res_v_aanwezigkenmerkwaarde rel
               ON x.res_rsv_ruimte_key = rel.res_rsv_ruimte_key
                  AND rel.res_kenmerk_key IN (182, 201)             -- Relatie
            LEFT JOIN prs_v_aanwezigkenmerklink deb
               ON rel.res_kenmerkreservering_waarde = TO_CHAR (deb.prs_link_key)
                  AND deb.prs_kenmerk_key = 1020                -- Deb.nr. K2F
            LEFT JOIN prs_v_aanwezigkenmerklink idb
               ON rel.res_kenmerkreservering_waarde = TO_CHAR (idb.prs_link_key)
                  AND idb.prs_kenmerk_key = 1021           -- Interne debiteur=Gemeentelijke afdeling
            LEFT JOIN prs_v_aanwezigkenmerklink ngt
               ON rel.res_kenmerkreservering_waarde = TO_CHAR (ngt.prs_link_key)
                  AND ngt.prs_kenmerk_key = 1040         -- Notagebonden tekst
            LEFT JOIN res_v_aanwezigkenmerkwaarde ref
               ON x.res_rsv_ruimte_key = ref.res_rsv_ruimte_key
                  AND ref.res_kenmerk_key IN (183, 202)      -- Ref. aanvrager
            LEFT JOIN alg_v_allonroerendgoed aog
               ON x.alg_ruimte_key = aog.alg_ruimte_key
            LEFT JOIN alg_locatie l
               ON aog.alg_locatie_key = l.alg_locatie_key
            LEFT JOIN alg_v_aanwezigonrgoedkenmerk fcl
               ON l.alg_locatie_key = fcl.alg_onrgoed_key
                  AND fcl.alg_kenmerk_key = 1020                        -- FCL
      WHERE l.alg_locatie_key IN (49, 56, 70, 71, 441, 442, 443, 444) -- BBS-locaties
;

-- Actueel: BBS-reserveringen lopende maand!
CREATE OR REPLACE VIEW denb_v_rap_actual_bbs_res
(
   hide_f_sortering,
   res_rsv_ruimte_key,
   res_rsv_artikel_key,
   res_rsv_deel_key,
   volgnummer,                                            -- [max. 8] Sequence
   debiteurennummer,     -- [max. 7] Geregistreerd bij huurder in kenmerk 1020
   omschrijving_nota,                           -- [max. 50] Gebruik + Locatie
   notagebonden_tekst, -- [max. 100] Geregistreerd bij huurder in kenmerk 1040
   omschrijving_boekingsregel, -- [max. 32] Res.nr. + Datum + Ruimte/Verbruik/Overig per BTW/ECL
   bedrag,                                -- [max. 13] Nettobedrag (excl. BTW)
   btw_kode, -- [max. 2] 9 of 21; leeg voor interne huurders (vinkje bij huurder in kenmerk 1021)
   fcl_lang,            -- [7 van max. 12] Grootboek per BBS-locatie (64807xx)
   ecl_lang, -- [5 van max. 8] 83362 (Ruimte incl. annulering/schoonmaak)/83402 (Verbruik)/82980 (Overig)
   fclt_3d_locatie_key
)
AS
     SELECT sortering,
            res_rsv_ruimte_key,
            MIN (res_rsv_artikel_key),
            MIN (res_rsv_deel_key),
            NULL volgnummer,
            SUBSTR (debiteurennummer, 1, 7) debiteurennummer,
            SUBSTR ('Gebruik ' || alg_locatie_omschrijving, 1, 50) omschrijving_nota,
            SUBSTR (REPLACE (notagebonden_tekst, '"', ''), 1, 100) notagebonden_tekst,
            --SUBSTR (TO_CHAR (res_reservering_key) || '/' || TO_CHAR (res_rsv_ruimte_volgnr) || ' ' || TO_CHAR (reslev, 'dd-mm-yyyy') || ' ' || regel_omschrijving || ' [' || regel_aanvulling || ']', 1, 50)
            SUBSTR (TO_CHAR (res_reservering_key) || '/' || TO_CHAR (res_rsv_ruimte_volgnr) || ' ' || ref_aanvrager || ' ' || TO_CHAR (reslev, 'dd-mm-yyyy') || ' [' || regel_aanvulling || ']', 1, 100)
               omschrijving_boekingsregel,
            SUM (bedrag),
            DECODE (interne_huurder, '1', 0, btw_kode) btw_kode,
            SUBSTR (fcl_lang, 1, 12) fcl_lang,
            SUBSTR (ecl_lang, 1, 8) ecl_lang,
            alg_locatie_key
       FROM denb_v_bbs_res_all
      WHERE reslev > TRUNC (SYSDATE, 'mm')
            AND res_status_bo_key != 6                             -- Niet AV!
            AND COALESCE (bedrag, 0) != 0
   GROUP BY sortering,
            res_rsv_ruimte_key,
            NULL,
            SUBSTR (debiteurennummer, 1, 7),
            SUBSTR ('Gebruik ' || alg_locatie_omschrijving, 1, 50),
            SUBSTR (REPLACE (notagebonden_tekst, '"', ''), 1, 100),
            SUBSTR (TO_CHAR (res_reservering_key) || '/' || TO_CHAR (res_rsv_ruimte_volgnr) || ' ' || ref_aanvrager || ' ' || TO_CHAR (reslev, 'dd-mm-yyyy') || ' [' || regel_aanvulling || ']', 1, 100),
            DECODE (interne_huurder, '1', 0, btw_kode),
            SUBSTR (regel_aanvulling, 1, 18),
            SUBSTR (fcl_lang, 1, 12),
            SUBSTR (ecl_lang, 1, 8),
            alg_locatie_key;

-- Concept: BBS-reserveringen voorgaande maand!
CREATE OR REPLACE VIEW denb_v_rap_dryrun_bbs_k2f
(
   hide_f_sortering,
   res_rsv_ruimte_key,
   res_rsv_artikel_key,
   res_rsv_deel_key,
   volgnummer,                                            -- [max. 8] Sequence
   debiteurennummer,     -- [max. 7] Geregistreerd bij huurder in kenmerk 1020
   omschrijving_nota,                           -- [max. 50] Gebruik + Locatie
   notagebonden_tekst, -- [max. 100] Geregistreerd bij huurder in kenmerk 1040
   omschrijving_boekingsregel, -- [max. 32] Res.nr. + Datum + Ruimte/Verbruik/Overig per BTW/ECL
   bedrag,                                -- [max. 13] Nettobedrag (excl. BTW)
   btw_kode, -- [max. 2] 9 of 21; leeg voor interne huurders (vinkje bij huurder in kenmerk 1021)
   fcl_lang,            -- [7 van max. 12] Grootboek per BBS-locatie (64807xx)
   ecl_lang, -- [5 van max. 8] 83362 (Ruimte incl. annulering/schoonmaak)/83402 (Verbruik)/82980 (Overig)
   fclt_3d_locatie_key
)
AS
     SELECT sortering,
            res_rsv_ruimte_key,
            MIN (res_rsv_artikel_key),
            MIN (res_rsv_deel_key),
            NULL volgnummer,
            SUBSTR (debiteurennummer, 1, 7) debiteurennummer,
            SUBSTR ('Gebruik ' || alg_locatie_omschrijving, 1, 50) omschrijving_nota,
            SUBSTR (REPLACE (notagebonden_tekst, '"', ''), 1, 100) notagebonden_tekst,
            --SUBSTR (TO_CHAR (res_reservering_key) || '/' || TO_CHAR (res_rsv_ruimte_volgnr) || ' ' || TO_CHAR (reslev, 'dd-mm-yyyy') || ' ' || regel_omschrijving || ' [' || regel_aanvulling || ']', 1, 50)
            SUBSTR (TO_CHAR (res_reservering_key) || '/' || TO_CHAR (res_rsv_ruimte_volgnr) || ' ' || ref_aanvrager || ' ' || TO_CHAR (reslev, 'dd-mm-yyyy') || ' [' || regel_aanvulling || ']', 1, 100)
               omschrijving_boekingsregel,
            SUM (bedrag),
            DECODE (interne_huurder, '1', 0, btw_kode) btw_kode,
            SUBSTR (fcl_lang, 1, 12) fcl_lang,
            SUBSTR (ecl_lang, 1, 8) ecl_lang,
            alg_locatie_key
       FROM denb_v_bbs_res_all
      WHERE reslev > TO_DATE ('01-07-2018' , 'dd-mm-yyyy')
            AND reslev < TRUNC (SYSDATE, 'mm')
            AND res_status_bo_key != 6                          -- Niet AV!
            AND COALESCE (bedrag, 0) != 0
   GROUP BY sortering,
            res_rsv_ruimte_key,
            NULL,
            SUBSTR (debiteurennummer, 1, 7),
            SUBSTR ('Gebruik ' || alg_locatie_omschrijving, 1, 50),
            SUBSTR (REPLACE (notagebonden_tekst, '"', ''), 1, 100),
            SUBSTR (TO_CHAR (res_reservering_key) || '/' || TO_CHAR (res_rsv_ruimte_volgnr) || ' ' || ref_aanvrager || ' ' || TO_CHAR (reslev, 'dd-mm-yyyy') || ' [' || regel_aanvulling || ']', 1, 100),
            DECODE (interne_huurder, '1', 0, btw_kode),
            SUBSTR (regel_aanvulling, 1, 18),
            SUBSTR (fcl_lang, 1, 12),
            SUBSTR (ecl_lang, 1, 8),
            alg_locatie_key;


-- Definitief: BBS-reserveringen voorgaande maanden!
-- TODO: Beter historisch opslaan in fin_verkoopfactuur-tabel?
CREATE OR REPLACE VIEW denb_v_rap_frozen_bbs_k2f
(
   hide_f_sortering,
   fclt_x_maand,
   res_rsv_ruimte_key,
   volgnummer,                                            -- [max. 8] Sequence
   debiteurennummer,     -- [max. 7] Geregistreerd bij huurder in kenmerk 1020
   omschrijving_nota,                           -- [max. 50] Gebruik + Locatie
   notagebonden_tekst, -- [max. 100] Geregistreerd bij huurder in kenmerk 1040
   omschrijving_boekingsregel, -- [max. 32] Res.nr. + Datum + Ruimte/Verbruik/Overig per BTW/ECL
   bedrag,                                -- [max. 13] Nettobedrag (excl. BTW)
   btw_kode, -- [max. 2] 9 of 21; leeg voor interne huurders (vinkje bij huurder in kenmerk 1021)
   fcl_lang,            -- [7 van max. 12] Grootboek per BBS-locatie (64807xx)
   ecl_lang, -- [5 van max. 8] 83362 (Ruimte incl. annulering/schoonmaak)/83402 (Verbruik)/82980 (Overig)
   fclt_3d_locatie_key
)
AS
     SELECT TO_CHAR (TRUNC (resver, 'mm') - 1, 'yyyy-mm') || TO_CHAR (SUBSTR (res_rsv_ruimte_ordernr, 1, INSTR (res_rsv_ruimte_ordernr, '|') - 1), 'FM00000009') || sortering sortering,
            TO_CHAR (TRUNC (resver, 'mm') - 1, 'yyyy-mm') maand,
            res_rsv_ruimte_key,
            SUBSTR (SUBSTR (res_rsv_ruimte_ordernr, 1, INSTR (res_rsv_ruimte_ordernr, '|') - 1), 1, 8)
               volgnummer,                 -- Historisch opgeslagen in ordernr
            SUBSTR (SUBSTR (res_rsv_ruimte_ordernr, INSTR (res_rsv_ruimte_ordernr, '|') + 1, INSTR (res_rsv_ruimte_ordernr, '#', -1) - INSTR (res_rsv_ruimte_ordernr, '|') - 1), 1, 7)
               debiteurennummer,           -- Historisch opgeslagen in ordernr
            SUBSTR ('Gebruik ' || alg_locatie_omschrijving, 1, 50)
               omschrijving_nota,               -- NIET historisch opgeslagen!
            SUBSTR (REPLACE (notagebonden_tekst, '"', ''), 1, 100)
               notagebonden_tekst,              -- NIET historisch opgeslagen!
            --SUBSTR (TO_CHAR (res_reservering_key) || '/' || TO_CHAR (res_rsv_ruimte_volgnr) || ' ' || TO_CHAR (reslev, 'dd-mm-yyyy') || ' ' || regel_omschrijving || ' [' || regel_aanvulling || ']', 1, 50)
            SUBSTR (TO_CHAR (res_reservering_key) || '/' || TO_CHAR (res_rsv_ruimte_volgnr) || ' ' || ref_aanvrager || ' ' || TO_CHAR (reslev, 'dd-mm-yyyy') || ' [' || regel_aanvulling || ']', 1, 100)
               omschrijving_boekingsregel,
            SUM (bedrag),
            --fac.safe_to_number (SUBSTR (res_rsv_ruimte_ordernr, INSTR (res_rsv_ruimte_ordernr, '|', -1) + 1))
            DECODE (SUBSTR (res_rsv_ruimte_ordernr, INSTR (res_rsv_ruimte_ordernr, '#', -1) + 1, 1),
                    'J', TO_NUMBER (NULL),
                    DECODE (SUBSTR (sortering, -1), --regel_omschrijving,
                            'R', fac.safe_to_number (SUBSTR (res_rsv_ruimte_ordernr, INSTR (res_rsv_ruimte_ordernr, '|', -1) + 1)),
                            btw_kode)) -- Alleen verbruiksartikelen historisch bewaard!
               btw_kode,
            SUBSTR (fcl_lang, 1, 12) fcl_lang,  -- NIET historisch opgeslagen!
            SUBSTR (ecl_lang, 1, 8) ecl_lang,   -- NIET historisch opgeslagen!
            alg_locatie_key
       FROM denb_v_bbs_res_all
      WHERE resver > TRUNC (ADD_MONTHS (SYSDATE, -24), 'yyyy') -- Huidige jaar en 2 voorgaande jaren!
            AND res_status_bo_key = 6                                   -- AV!
            AND COALESCE (bedrag, 0) != 0
   GROUP BY TO_CHAR (TRUNC (resver, 'mm') - 1, 'yyyy-mm') || TO_CHAR (SUBSTR (res_rsv_ruimte_ordernr, 1, INSTR (res_rsv_ruimte_ordernr, '|') - 1), 'FM00000009') || sortering,
            TO_CHAR (TRUNC (resver, 'mm') - 1, 'yyyy-mm'),
            res_rsv_ruimte_key,
            SUBSTR (SUBSTR (res_rsv_ruimte_ordernr, 1, INSTR (res_rsv_ruimte_ordernr, '|') - 1), 1, 8),
            SUBSTR (SUBSTR (res_rsv_ruimte_ordernr, INSTR (res_rsv_ruimte_ordernr, '|') + 1, INSTR (res_rsv_ruimte_ordernr, '#', -1) - INSTR (res_rsv_ruimte_ordernr, '|') - 1), 1, 7),
            SUBSTR ('Gebruik ' || alg_locatie_omschrijving, 1, 50),
            SUBSTR (REPLACE (notagebonden_tekst, '"', ''), 1, 100),
            SUBSTR (TO_CHAR (res_reservering_key) || '/' || TO_CHAR (res_rsv_ruimte_volgnr) || ' ' || ref_aanvrager || ' ' || TO_CHAR (reslev, 'dd-mm-yyyy') || ' [' || regel_aanvulling || ']', 1, 100),
            --fac.safe_to_number (SUBSTR (res_rsv_ruimte_ordernr, INSTR (res_rsv_ruimte_ordernr, '|', -1) + 1)),
            DECODE (SUBSTR (res_rsv_ruimte_ordernr, INSTR (res_rsv_ruimte_ordernr, '#', -1) + 1, 1),
                    'J', TO_NUMBER (NULL),
                    DECODE (SUBSTR (sortering, -1), --regel_omschrijving,
                            'R', fac.safe_to_number (SUBSTR (res_rsv_ruimte_ordernr, INSTR (res_rsv_ruimte_ordernr, '|', -1) + 1)),
                            btw_kode)),
            SUBSTR (regel_aanvulling, 1, 18),
            SUBSTR (fcl_lang, 1, 12),
            SUBSTR (ecl_lang, 1, 8),
            alg_locatie_key;

CREATE OR REPLACE VIEW denb_v_export_bbs_k2f
(
   result,
   result_order
)
AS       -- View bevat alleen inhoud op de dag na de 15e werkdag van de maand!
--   SELECT    'volgnummer'
--          || ';debiteurennummer'
--          || ';omschrijving_nota'
--          || ';notagebonden_tekst'
--          || ';omschrijving_boekingsregel'
--          || ';bedrag'
--          || ';btw_kode'
--          || ';fcl_lang'
--          || ';ecl_lang',
--          0
--     FROM DUAL
--    WHERE FAC.count_work_days (TRUNC (SYSDATE, 'mm') - 1, SYSDATE - 1) = 15
--          AND TO_CHAR (SYSDATE - 1, 'd') BETWEEN '2' AND '6'
--          AND NOT EXISTS
--                (SELECT 1
--                   FROM mld_vrije_dagen
--                  WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (SYSDATE - 1))
--   UNION ALL
   SELECT    volgnummer
          || ';'
          || debiteurennummer
          || ';'
          || omschrijving_nota
          || ';"'
          || notagebonden_tekst
          || '";'
          || omschrijving_boekingsregel
          || ';'
          || REPLACE (TO_CHAR (bedrag), '.', ',')
          || ';'
          || REPLACE (TO_CHAR (btw_kode), '.', ',') -- Als BTW niet een geheel percentage, dan >2 posities!
          || ';'
          || fcl_lang
          || ';'
          || ecl_lang,
          ROWNUM
     FROM (  SELECT volgnummer,
                    debiteurennummer,
                    omschrijving_nota,
                    notagebonden_tekst,
                    omschrijving_boekingsregel,
                    bedrag,
                    btw_kode,
                    fcl_lang,
                    ecl_lang
               FROM denb_v_rap_frozen_bbs_k2f
              WHERE fclt_x_maand = TO_CHAR (TRUNC (SYSDATE, 'mm') - 1, 'yyyy-mm')
           ORDER BY volgnummer,
                    hide_f_sortering)
    WHERE FAC.count_work_days (TRUNC (SYSDATE, 'mm') - 1, SYSDATE - 1) = 15
          AND TO_CHAR (SYSDATE - 1, 'd') BETWEEN '2' AND '6'
          AND NOT EXISTS
                (SELECT 1
                   FROM mld_vrije_dagen
                  WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (SYSDATE - 1));

CREATE OR REPLACE PROCEDURE denb_select_bbs_k2f (p_applname   IN VARCHAR2,
                                                 p_applrun    IN VARCHAR2)
AS
   -- Verwerken te exporteren regels!
   CURSOR c1
   IS
      SELECT '[' || v.debiteurennummer || '] ' aanduiding,
             v.sortering,
             v.res_rsv_ruimte_key,
             v.res_rsv_artikel_key,
             v.res_rsv_deel_key,
             v.res_status_bo_key,
             v.debiteurennummer,
             DECODE (v.interne_huurder, '1', 'J', 'N') interne_huurder,
             v.alg_locatie_omschrijving,
             v.bedrag + COALESCE (rrr.res_rsv_ruimte_korting, 0) bedrag,
             v.btw_kode
        FROM denb_v_bbs_res_all v, res_rsv_ruimte rrr
       WHERE v.reslev > TO_DATE ('01-07-2018', 'dd-mm-yyyy')
             AND v.reslev < TRUNC (SYSDATE, 'mm')
             AND v.res_status_bo_key != 6                          -- Niet AV!
             AND v.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
             --AND sortering NOT LIKE '%R1'              -- Skip Korting-regels!
      UNION ALL                     -- Extra R-regel voor losse voorzieningen!
      SELECT DISTINCT '[' || v.debiteurennummer || '] ' aanduiding,
                      SUBSTR (v.sortering, 1, 17) || 'R' sortering,
                      v.res_rsv_ruimte_key,
                      TO_NUMBER (NULL) res_rsv_artikel_key,
                      TO_NUMBER (NULL) res_rsv_deel_key,
                      -1 res_status_bo_key,
                      v.debiteurennummer,
                      DECODE (v.interne_huurder, '1', 'J', 'N') interne_huurder,
                      v.alg_locatie_omschrijving,
                      TO_NUMBER (NULL) bedrag,
                      TO_NUMBER (NULL) btw_kode
        FROM denb_v_bbs_res_all v, res_rsv_ruimte rrr
       WHERE v.reslev > TO_DATE ('01-07-2018', 'dd-mm-yyyy')
             AND v.reslev < TRUNC (SYSDATE, 'mm')
             AND v.res_status_bo_key != 6                          -- Niet AV!
             AND v.res_rsv_deel_key IS NOT NULL
             AND v.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
             AND rrr.res_ruimte_opstel_key IS NULL     -- Losse voorzieningen!
      ORDER BY debiteurennummer, alg_locatie_omschrijving, sortering DESC;

   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_holiday        NUMBER;
   v_factuur_nr     NUMBER;
   v_amount_tot     NUMBER (10, 2);
   v_prev_deb       VARCHAR2 (255);
   v_prev_loc       VARCHAR2 (255);
   v_prijs          NUMBER (9, 2);
BEGIN
   SELECT COUNT ( * )
     INTO v_holiday
     FROM mld_vrije_dagen
    WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (SYSDATE - 1);

   -- LET OP: K2F-export draait dagelijks na middernacht (begin van dag) en de
   -- verkoop wordt maandelijks alleen in de nacht na 15e werkdag van de maand
   -- doorgezet.
   -- IF nacht na 1e werkdag van de maand (én geen weekend én geen vrije dag)!
   -- count_work_days (d1,d2) bepaalt het #werkdagen van d1 tot d2 (als d1=d2,
   -- dan return 0); daarom bepalen tov. laatste dag van vorige maand!
   IF     FAC.count_work_days (TRUNC (SYSDATE, 'mm') - 1, SYSDATE - 1) = 15
      AND TO_CHAR (SYSDATE - 1, 'd') BETWEEN '2' AND '6'
      AND v_holiday = 0
   THEN
      v_factuur_nr := 0;
      v_amount_tot := 0;
      v_prev_deb := 'Quqelequ';
      v_prev_loc := 'Quqelequ';

      FOR rec IN c1
      LOOP
         BEGIN
            -- Per debiteur/locatie één (verzamel)factuur=hetzelfde volgnummer!
            IF rec.debiteurennummer != v_prev_deb OR rec.alg_locatie_omschrijving != v_prev_loc
            THEN
               v_prev_deb := rec.debiteurennummer;
               v_prev_loc := rec.alg_locatie_omschrijving;
               v_factuur_nr := v_factuur_nr + 1;
            END IF;

            IF rec.res_rsv_artikel_key IS NOT NULL
            THEN                                     -- Verbruiksartikel-regel
               IF rec.res_status_bo_key = 2
               THEN
                  v_errormsg := 'Fout bepalen res_rsv_artikel_prijs';

                  SELECT res.getartikelprijs (rec.res_rsv_artikel_key)
                    INTO v_prijs
                    FROM DUAL;

                  v_errormsg := 'Fout afmelden res_rsv_artikel';

                  UPDATE res_rsv_artikel
                     SET res_status_bo_key = 5,
                         res_rsv_artikel_prijs = v_prijs,
                         res_rsv_artikel_btw = rec.btw_kode
                   WHERE res_rsv_artikel_key = rec.res_rsv_artikel_key;

                  v_errormsg := 'Fout tracken afmelding';

                  fac.trackaction ('RESAFM', rec.res_rsv_ruimte_key, NULL, NULL, 'Verbruik afgemeld');
               END IF;

               v_errormsg := 'Fout verwerken res_rsv_artikel';

               UPDATE res_rsv_artikel
                  SET res_status_bo_key = 6      -- AV (en zet ook Verwerkt-date)
                WHERE res_rsv_artikel_key = rec.res_rsv_artikel_key;

               v_errormsg := 'Fout tracken verwerking';

               fac.trackaction ('RESVER', rec.res_rsv_ruimte_key, NULL, NULL, 'Verbruik verwerkt');
            ELSIF rec.res_rsv_deel_key IS NOT NULL
            THEN                                          -- Voorziening-regel
               IF rec.res_status_bo_key = 2
               THEN
                  v_errormsg := 'Fout bepalen res_rsv_artikel_prijs';

                  SELECT res.getdeelprijs (rec.res_rsv_deel_key)
                    INTO v_prijs
                    FROM DUAL;

                  v_errormsg := 'Fout afmelden res_rsv_deel';

                  UPDATE res_rsv_deel
                     SET res_status_bo_key = 5,
                         res_rsv_deel_prijs = v_prijs
                   WHERE res_rsv_deel_key = rec.res_rsv_deel_key;

                  v_errormsg := 'Fout tracken afmelding';

                  fac.trackaction ('RESAFM', rec.res_rsv_ruimte_key, NULL, NULL, 'Overig afgemeld');
               END IF;

               v_errormsg := 'Fout verwerken res_rsv_deel';

               UPDATE res_rsv_deel
                  SET res_status_bo_key = 6      -- AV (en zet ook Verwerkt-date)
                WHERE res_rsv_deel_key = rec.res_rsv_deel_key;

               v_errormsg := 'Fout tracken verwerking';

               fac.trackaction ('RESVER', rec.res_rsv_ruimte_key, NULL, NULL, 'Overig verwerkt');
            ELSE                                               -- Ruimte-regel
               IF rec.res_status_bo_key = 2
               THEN
                  v_errormsg := 'Fout afmelden res_rsv_ruimte';

                  UPDATE res_rsv_ruimte
                     SET res_status_bo_key = 5,
                         res_rsv_ruimte_prijs = rec.bedrag,
                         res_rsv_ruimte_ordernr = TO_CHAR (v_factuur_nr) || '|' || rec.debiteurennummer || '#' || rec.interne_huurder || '|' || TO_CHAR (rec.btw_kode) -- Historisch bewaren: volgnummer + debiteurennummer#interne_huurder (= J/N) + btw_kode
                   WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

                  v_errormsg := 'Fout tracken afmelding';

                  fac.trackaction ('RESAFM', rec.res_rsv_ruimte_key, NULL, NULL, NULL);

                  v_errormsg := 'Fout verwerken res_rsv_ruimte';

                  UPDATE res_rsv_ruimte
                     SET res_status_bo_key = 6                           -- AV
                   WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

                  v_errormsg := 'Fout tracken verwerking';

                  fac.trackaction ('RESVER', rec.res_rsv_ruimte_key, NULL, NULL, NULL);

                  v_amount_tot := v_amount_tot + rec.bedrag;
               ELSIF rec.res_status_bo_key = 5
               THEN
                  v_errormsg := 'Fout bijwerken res_rsv_ruimte';

                  UPDATE res_rsv_ruimte
                     SET res_rsv_ruimte_prijs = rec.bedrag,
                         res_rsv_ruimte_ordernr = TO_CHAR (v_factuur_nr) || '|' || rec.debiteurennummer || '#' || rec.interne_huurder || '|' || TO_CHAR (rec.btw_kode) -- Historisch bewaren: volgnummer + debiteurennummer#interne_huurder (= J/N) + btw_kode
                   WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

                  v_errormsg := 'Fout verwerken res_rsv_ruimte';

                  UPDATE res_rsv_ruimte
                     SET res_status_bo_key = 6                           -- AV
                   WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

                  v_errormsg := 'Fout tracken verwerking';

                  fac.trackaction ('RESVER', rec.res_rsv_ruimte_key, NULL, NULL, NULL);

                  v_amount_tot := v_amount_tot + rec.bedrag;
               ELSE                 -- Extra R-regel voor losse voorzieningen!
                  v_errormsg := 'Fout bijwerken res_rsv_ruimte';

                  UPDATE res_rsv_ruimte
                     SET res_rsv_ruimte_ordernr = TO_CHAR (v_factuur_nr) || '|' || rec.debiteurennummer || '#' || rec.interne_huurder || '|' || TO_CHAR (rec.btw_kode) -- Historisch bewaren: volgnummer + debiteurennummer#interne_huurder (= J/N) + btw_kode
                   WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;
               END IF;
            END IF;
            COMMIT;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
               fac.writelog (p_applname, 'W', rec.aanduiding || v_errormsg, 'BBS_K2F-regels');
               COMMIT;
         END;
      END LOOP;

      fac.writelog (p_applname, 'S', 'K2F export/#facturen: ' || TO_CHAR (v_factuur_nr), TO_CHAR (v_amount_tot));
   END IF;
END;
/


-- DENB#52794: Openstaande facilitaire meldingen per (aanmaak)maand.
CREATE OR REPLACE VIEW denb_v_graph_newmnd_all12m_fac
(
   FCLT_XAS_,
   FCLT_YAS_,
   VOLGORDE
)
AS
     SELECT DECODE (TO_CHAR (mld_melding_datum, 'mm'),
                    '01', 'Januari',
                    '02', 'Februari',
                    '03', 'Maart',
                    '04', 'April',
                    '05', 'Mei',
                    '06', 'Juni',
                    '07', 'Juli',
                    '08', 'Augustus',
                    '09', 'September',
                    '10', 'Oktober',
                    '11', 'November',
                    'December'),
            COUNT ( * ),
            TO_CHAR (mld_melding_datum, 'yyyymm')
       FROM mld_melding m, mld_stdmelding sm, mld_discipline md
      WHERE m.mld_melding_datum BETWEEN ADD_MONTHS (TRUNC (SYSDATE, 'mm'), -11) AND SYSDATE
            AND m.mld_melding_status IN (2, 3, 4, 7, 0, 99) -- 2-Ingevoerd, 3-Ingezien, 4-Geaccepteerd, 7-Uitgegeven, 0-Pending, 99-Niet opgelost
            AND m.mld_stdmelding_key = sm.mld_stdmelding_key
            AND sm.mld_ins_discipline_key = md.ins_discipline_key
            AND md.ins_srtdiscipline_key = 21                       -- Melding
   GROUP BY TO_CHAR (mld_melding_datum, 'mm'),
            TO_CHAR (mld_melding_datum, 'yyyymm');

-- DENB#53711: Rapportage splitsing artikelen per kostenplaats.
CREATE OR REPLACE VIEW denb_v_rap_bes_per_maand
(
   geleverd,
   maand,
   catalogus,
   bestemd_voor,
   reden,
   sector,
   organisatie,
   kostenplaats,
   ecl,
   aanvrager,
   bestelnr,
   besteld_op,
   afgemeld_op,
   artikel,
   aantal,
   prijs,
   prijs_tot,
   status,
   ontv_naam,
   ontv_org,
   ontv_functie,
   gelegenheid
)
AS
   SELECT DECODE (x.bes_bestelling_status, 6, x.afgemeld_op, TRUNC (ADD_MONTHS (SYSDATE, 1), 'mm'))
             geleverd,
          DECODE (x.bes_bestelling_status, 6, TO_CHAR (x.afgemeld_op, 'yyyy-mm'), 'Lopend')
             maand,
          x.ins_discipline_omschrijving catalogus,
          bvoor.fac_usrdata_omschr bestemd_voor,
          reden.fac_usrdata_omschr reden,
          x.sector,
          x.organisatie,
          x.prs_kostenplaats_nr kostenplaats,
          DECODE (bvoor.fac_usrdata_key,
                  1041, DECODE (reden.fac_usrdata_key,              -- Collega
                                1043, DECODE (SIGN (x.prijs_tot - 25), -1, '40164', '40159'), -- Persoonlijke aard
                                '40159'),
                  1042, '40157',                                      -- Derde
                  NULL)
             ecl,
          x.prs_perslid_naam_full aanvrager,
          TO_CHAR (x.bes_bestelling_key) bestelnr,
          x.besteld_op,
          x.afgemeld_op,
          DECODE (x.aantal_bestelregels, 1, x.artikel, 'Diverse artikelen') artikel,
          DECODE (x.aantal_bestelregels, 1, TO_CHAR (x.aantal), 'Diverse aantallen') aantal,
          DECODE (x.aantal_bestelregels, 1, REPLACE (TO_CHAR (x.prijs), '.', ','), 'Diverse prijzen') prijs,
          x.prijs_tot,
          x.bes_bestellingstatuses_omschr status,
          COALESCE (ontv_naam.bes_kenmerkbestell_waarde, ontv.bes_kenmerkbestell_waarde) ontv_naam,
          ontv_org.bes_kenmerkbestell_waarde ontv_org,
          ontv_functie.bes_kenmerkbestell_waarde ontv_functie,
          tgv.bes_kenmerkbestell_waarde tgv
     FROM (  SELECT b.bes_bestelling_key,
                    b.bes_bestelling_status,
                    s.bes_bestellingstatuses_omschr,
                    d.ins_discipline_omschrijving,
                    a1.prs_afdeling_omschrijving sector,
                    a2.prs_afdeling_omschrijving organisatie,
                    k.prs_kostenplaats_nr,
                    pf.prs_perslid_naam_full,
                    b.bes_bestelling_datum besteld_op,
                    COALESCE (fac.gettrackingdate ('BESOTV', b.bes_bestelling_key), bo.bes_bestelopdr_leverdatum) afgemeld_op,
                    MIN (sd.bes_srtdeel_omschrijving) artikel,
                    MIN (bi.bes_bestelling_item_aantal) aantal,
                    MIN (bi.bes_bestelling_item_prijs) prijs,
                    SUM(bi.bes_bestelling_item_aantal * bi.bes_bestelling_item_prijs) prijs_tot,
                    COUNT ( * ) aantal_bestelregels
               FROM bes_bestelling b,
                    bes_bestellingstatuses s,
                    bes_bestelling_item bi,
                    bes_bestelopdr_item boi,
                    bes_bestelopdr bo,
                    bes_srtdeel sd,
                    bes_srtgroep sg,
                    ins_tab_discipline d,
                    prs_perslid p,
                    prs_v_perslid_fullnames_all pf,
                    prs_v_afdeling_boom ab,
                    prs_v_afdeling a1,
                    prs_v_afdeling a2,
                    prs_kostenplaats k
              WHERE b.bes_bestelling_status <> 1
                    AND b.bes_bestelling_status = s.bes_bestellingstatuses_key
                    AND b.bes_bestelling_key = bi.bes_bestelling_key
                    AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key(+)
                    AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key(+)
                    AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
                    AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
                    AND sg.ins_discipline_key = d.ins_discipline_key
                    AND d.ins_discipline_key IN (221, 1521, 1522) -- Gebak STK/Cadeaukaarten STK/Bloemen STK
                    AND b.prs_perslid_key = p.prs_perslid_key
                    AND p.prs_perslid_key = pf.prs_perslid_key
                    AND p.prs_afdeling_key = ab.prs_afdeling_key
                    AND ab.prs_afdeling_key1 = a1.prs_afdeling_key
                    AND ab.prs_afdeling_key = a2.prs_afdeling_key
                    AND a2.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
           GROUP BY b.bes_bestelling_key,
                    b.bes_bestelling_status,
                    s.bes_bestellingstatuses_omschr,
                    d.ins_discipline_omschrijving,
                    a1.prs_afdeling_omschrijving,
                    a2.prs_afdeling_omschrijving,
                    k.prs_kostenplaats_nr,
                    pf.prs_perslid_naam_full,
                    b.bes_bestelling_datum,
                    COALESCE (fac.gettrackingdate ('BESOTV', b.bes_bestelling_key), bo.bes_bestelopdr_leverdatum),
                    sd.bes_srtdeel_omschrijving) x
          LEFT JOIN (SELECT kb.bes_bestelling_key, ud.fac_usrdata_key, ud.fac_usrdata_omschr
                       FROM bes_kenmerkbestell kb, bes_kenmerk k, fac_usrdata ud
                      WHERE kb.bes_kenmerkbestell_verwijder IS NULL
                            AND kb.bes_kenmerk_key = k.bes_kenmerk_key
                            AND k.bes_srtkenmerk_key = 221     -- Bestemd voor
                            AND kb.bes_kenmerkbestell_waarde = TO_CHAR (ud.fac_usrdata_key)) bvoor
             ON x.bes_bestelling_key = bvoor.bes_bestelling_key
          LEFT JOIN (SELECT kb.bes_bestelling_key, ud.fac_usrdata_key, ud.fac_usrdata_omschr
                       FROM bes_kenmerkbestell kb, bes_kenmerk k, fac_usrdata ud
                      WHERE kb.bes_kenmerkbestell_verwijder IS NULL
                            AND kb.bes_kenmerk_key = k.bes_kenmerk_key
                            AND k.bes_srtkenmerk_key = 222            -- Reden
                            AND kb.bes_kenmerkbestell_waarde = TO_CHAR (ud.fac_usrdata_key)) reden
             ON x.bes_bestelling_key = reden.bes_bestelling_key
          LEFT JOIN (SELECT kb.bes_bestelling_key, kb.bes_kenmerkbestell_waarde
                       FROM bes_kenmerkbestell kb, bes_kenmerk k
                      WHERE kb.bes_kenmerkbestell_verwijder IS NULL
                            AND kb.bes_kenmerk_key = k.bes_kenmerk_key
                            AND k.bes_srtkenmerk_key = 103) ontv -- Wie krijgt het (naam+organisatie)
             ON x.bes_bestelling_key = ontv.bes_bestelling_key
          LEFT JOIN (SELECT kb.bes_bestelling_key, kb.bes_kenmerkbestell_waarde
                       FROM bes_kenmerkbestell kb, bes_kenmerk k
                      WHERE kb.bes_kenmerkbestell_verwijder IS NULL
                            AND kb.bes_kenmerk_key = k.bes_kenmerk_key
                            AND k.bes_srtkenmerk_key = 261) ontv_naam -- Naam ontvanger
             ON x.bes_bestelling_key = ontv_naam.bes_bestelling_key
          LEFT JOIN (SELECT kb.bes_bestelling_key, kb.bes_kenmerkbestell_waarde
                       FROM bes_kenmerkbestell kb, bes_kenmerk k
                      WHERE kb.bes_kenmerkbestell_verwijder IS NULL
                            AND kb.bes_kenmerk_key = k.bes_kenmerk_key
                            AND k.bes_srtkenmerk_key = 281) ontv_org -- Organisatie ontvanger
             ON x.bes_bestelling_key = ontv_org.bes_bestelling_key
          LEFT JOIN (SELECT kb.bes_bestelling_key, kb.bes_kenmerkbestell_waarde
                       FROM bes_kenmerkbestell kb, bes_kenmerk k
                      WHERE kb.bes_kenmerkbestell_verwijder IS NULL
                            AND kb.bes_kenmerk_key = k.bes_kenmerk_key
                            AND k.bes_srtkenmerk_key = 262) ontv_functie -- Functie ontvanger
             ON x.bes_bestelling_key = ontv_functie.bes_bestelling_key
          LEFT JOIN (SELECT kb.bes_bestelling_key, kb.bes_kenmerkbestell_waarde
                       FROM bes_kenmerkbestell kb, bes_kenmerk k
                      WHERE kb.bes_kenmerkbestell_verwijder IS NULL
                            AND kb.bes_kenmerk_key = k.bes_kenmerk_key
                            AND k.bes_srtkenmerk_key = 101) tgv -- Ter gelegenheid van
             ON x.bes_bestelling_key = tgv.bes_bestelling_key;

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

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

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