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

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

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

/*  De 'oude' personen import en update vervangen door de standaard
CREATE OR REPLACE PROCEDURE logi_import_persoon (p_import_key IN NUMBER)
AS
   c_max_import_str_len      NUMBER (10) := 1000;

   CURSOR c_cursor
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;

   NEXT_RECORD               c_cursor%ROWTYPE;

   v_newline                 VARCHAR2 (1000);                   -- Import line
   v_fielddelimitor          VARCHAR2 (1);                  -- Field seperator
   v_errormsg                VARCHAR2 (1000) := '-';
   v_errorhint               VARCHAR2 (1000) := '-';
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);

   -- De importvelden
   v_perslid_nr              VARCHAR2 (1000);
   v_perslid_naam            VARCHAR2 (1000);
   v_perslid_voornaam        VARCHAR2 (1000);
   v_perslid_tussenvoegsel   VARCHAR2 (1000);
   v_perslid_oslogin         VARCHAR2 (1000);
   v_perslid_email           VARCHAR2 (1000);
   v_dummy                   VARCHAR2 (1000);
   v_afdeling_naam           VARCHAR2 (1000);
   v_locatie_omschrijving    VARCHAR2 (1000);
   header_found              BOOLEAN;
   v_controle_res            VARCHAR2 (30);

   -- SUBFUNCTION
   FUNCTION get_imp_value (p_value IN VARCHAR2, p_length IN NUMBER)
      RETURN VARCHAR2
   IS
      c_del_in_str    VARCHAR2 (16) := 'NULL';
      c_del_in_str2   VARCHAR2 (16) := '"';

      v_value         VARCHAR2 (1000);
   BEGIN
      SELECT SUBSTR (
                TRIM(COALESCE (
                        REPLACE (REPLACE (p_value, c_del_in_str),
                                 c_del_in_str2,
                                 ''),
                        '')),
                1,
                p_length)
        INTO v_value
        FROM DUAL;

      RETURN v_value;
   EXCEPTION
      WHEN OTHERS
      THEN
         RETURN p_value;
   END;
BEGIN
   -- Init
   v_fielddelimitor := ';';
   v_errormsg := '';

   header_found := FALSE;
   v_controle_res := 'OK';       -- Hier kan een controle ingebouwd worden ...

   IF (v_controle_res IS NULL)
   THEN
      v_errormsg := 'Ongeldig importbestand';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        '');
   ELSE
      -- Clear my previous imported rows
      DELETE FROM logi_imp_persoon;

      COMMIT;

      FOR NEXT_RECORD IN c_cursor
      LOOP
         BEGIN
            v_newline :=
               SUBSTR (NEXT_RECORD.FAC_IMP_FILE_LINE,
                       1,
                       c_max_import_str_len);

            fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_nr);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_naam);
            fac.imp_getfield (v_newline,
                              v_fielddelimitor,
                              v_perslid_voornaam);
            fac.imp_getfield (v_newline,
                              v_fielddelimitor,
                              v_perslid_tussenvoegsel);

            fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_oslogin);
            fac.imp_getfield (v_newline, v_fielddelimitor, v_perslid_email);

            fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);

            fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling_naam);

            fac.imp_getfield (v_newline,
                              v_fielddelimitor,
                              v_locatie_omschrijving);

            -- Skip until the header is found
            header_found := TRUE;                         -- Geen Header check

            IF (header_found)
            THEN
               BEGIN
                  v_errormsg := 'Kan persoonsgegevens niet inlezen ';

                  v_perslid_nr := get_imp_value (v_perslid_nr, 16);
                  v_perslid_naam := get_imp_value (v_perslid_naam, 30);
                  v_perslid_voornaam := get_imp_value (v_perslid_voornaam, 30);
                  v_perslid_tussenvoegsel := get_imp_value (v_perslid_tussenvoegsel, 15);
                  v_perslid_oslogin := get_imp_value (v_perslid_oslogin, 30);
                  v_perslid_email := get_imp_value (v_perslid_email, 200);
                  v_afdeling_naam := get_imp_value (v_afdeling_naam, 10);
                  v_locatie_omschrijving := get_imp_value (v_locatie_omschrijving, 30);

                  -- Velden met een waarde '' zijn leeg ivm privacy overwegingen
                  INSERT INTO logi_imp_persoon (prs_perslid_nr,
                                                prs_perslid_naam,
                                                prs_perslid_voornaam,
                                                prs_perslid_tussenvoegsel,
                                                prs_perslid_voorletters,
                                                prs_perslid_telefoonnr,
                                                prs_perslid_mobiel,
                                                prs_perslid_oslogin,
                                                prs_perslid_email,
                                                prs_srtperslid_omschrijving,
                                                prs_afdeling_naam,
                                                prs_perslid_ingangsdatum,
                                                prs_perslid_einddatum,
                                                prs_locatie_omschrijving,
                                                alg_ruimte_nr,
                                                logi_imp_persoon_aanmaak)
                      VALUES (v_perslid_nr,
                              v_perslid_naam,
                              v_perslid_voornaam,
                              v_perslid_tussenvoegsel,
                              '',
                              '',
                              '',
                              v_perslid_oslogin,
                              v_perslid_email,
                              '',
                              '', -- LOGI#31662, was: v_afdeling_naam,
                              '',
                              '',
                              v_locatie_omschrijving,
                              '',
                              SYSDATE);

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

            COMMIT;
         END;
      END LOOP;
   END IF;
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_errormsg,
                        '');
END;
/


CREATE OR REPLACE PROCEDURE logi_update_persoon (p_import_key IN NUMBER)
AS
   -- Constanten (LET OP: deze waarden moeten letterlijk in de DB aabwezig zijn!)
   c_usrtab_key                  INTEGER                              := 1; -- Tbv LOCATIE
   c_srtgebouw_default           INTEGER                              := 1;
   c_srtruimte_default           INTEGER                              := 1;
   c_afdeling_key                NUMBER := 6761; -- LOGI#31662

   -- Constanten (overig)
   c_prs_werkplek_omschrijving   VARCHAR2 (16)                        := 'Onbekend';
   c_srtperslid_omschr_default   VARCHAR2 (16)                        := 'Onbekend';
   c_werkplek_volgnr_default     INTEGER                              := 1;
   c_verdieping_omschr_default   VARCHAR2 (16)                        := 'BG';
   c_ruimte_omschr_default       VARCHAR2 (16)                        := 'Onbekend';
   c_ruimte_code                 VARCHAR2 (3)                         := '000';
   c_commitbuffer                NUMBER                               := 1000;
   c_perslid_aanmaak             DATE; --                               := TO_DATE('01011980','ddmmyy'); -- ivm privacy overwegingen
   c_perslid_verwijder           DATE; --                               := TO_DATE('01011980','ddmmyy'); -- ivm privacy overwegingen
   c_perslid_ingangsdatum        DATE; --                               := TO_DATE('01011980','ddmmyy'); -- ivm privacy overwegingen
   c_no_key_found                NUMBER                               := 0;
   --c_afdeling_niveau_persoon     NUMBER(1)                            := 3; -- Afdelingsniveau waaraan personen gekoppeld worden

   -- Prefix voor persoonnaam om aan te geven dat de persoon op de nominatie staat om verwijderd te
   -- worden maar dat verwijderen nog niet mogelijk is omdat de persoon verplichtingen heeft.
   c_inactief                    VARCHAR2(16)                         := 'INACTIEF:';

   -- om de zoveel committen
   v_buffercount                 NUMBER                               := 0;

   CURSOR c_prs_del
   IS
      SELECT   p.prs_perslid_key, p.prs_perslid_nr
          FROM PRS_PERSLID p, (select prs_perslid_nr
                                 from logi_imp_persoon
                                where prs_perslid_nr is not null) lp
         WHERE 1=1
           AND p.prs_perslid_nr         IS NOT NULL
           AND p.prs_perslid_verwijder  IS NULL
           AND p.prs_perslid_nr = lp.prs_perslid_nr(+)
           AND lp.prs_perslid_nr is null
      ORDER BY 2, 1;

   CURSOR c_prs_upd
   IS
      SELECT    p.prs_perslid_key
              , lp.prs_locatie_omschrijving
              --, lp.prs_afdeling_naam
              , lp.prs_perslid_naam
              , lp.prs_perslid_tussenvoegsel
              , lp.prs_perslid_voorletters
              , lp.prs_perslid_voornaam
              , lp.prs_perslid_telefoonnr
              , lp.prs_perslid_mobiel
              , lp.prs_perslid_oslogin
              , lp.prs_perslid_email
              , coalesce(lp.prs_srtperslid_omschrijving, c_srtperslid_omschr_default) prs_srtperslid_omschrijving
              , lp.prs_perslid_nr
              , '' prs_perslid_titel
              , p.prs_perslid_verwijder
          FROM logi_imp_persoon lp, prs_perslid p
         WHERE 1=1
         AND   lp.prs_perslid_nr = p.prs_perslid_nr(+)
           -- Dit moet analoog aan UWVA#13061: verwijderde personen moeten kunnen worden gereactiveerd.
           -- AND p.prs_perslid_verwijder IS NULL
      ORDER BY lp.prs_perslid_nr, p.prs_perslid_key DESC;

   v_perslid_key                 NUMBER (10);
   v_prs_key_cnt                 NUMBER (10);
   v_srtperslid_key              NUMBER (10);
   --v_afdeling_key                NUMBER (10);
   v_locatie_key                 NUMBER (10);
   v_gebouw_key                  NUMBER (10);
   v_verdieping_key              NUMBER (10);
   v_ruimte_key                  NUMBER (10);
   v_werkplek_key                NUMBER (10);
   v_gebouw_code                 VARCHAR2 (10);
   v_srtperslid_omschr           VARCHAR (30);
   rec_prs_del                   c_prs_del%ROWTYPE;
   rec_prs_upd                   c_prs_upd%ROWTYPE;
   oracle_err_num                NUMBER;
   oracle_err_mes                VARCHAR2 (200);
   v_errormsg                    VARCHAR2 (1024);
   v_errorhint                   VARCHAR2 (1024);
   v_debug                       VARCHAR2 (1024);
   v_count                       NUMBER (10);
   v_update                      BOOLEAN;
   v_aktie                       VARCHAR (10);
   v_perslid_count_imp           NUMBER;
   v_perslid_count_fclt          NUMBER;
   v_perslid_newcount_fclt       NUMBER;
   currentversion                fac_module.fac_module_version%TYPE;
   l_validatie                   NUMBER;
   v_srtimport                   VARCHAR2 (10);
   l_nrkps                       NUMBER;
   v_nr_werkplek                 NUMBER;
   v_current_locatie_key         NUMBER;
   v_new_locatie_key             NUMBER;

BEGIN

   -- Constanten:
   select   TO_DATE('01011980','ddmmyy'),TO_DATE('01011980','ddmmyy'),TO_DATE('01011980','ddmmyy')
   into     c_perslid_aanmaak, c_perslid_verwijder, c_perslid_ingangsdatum
   from     dual;

   -- verwijder werkplekrelaties met een verwijderdatum. Anders krijgen we straks last van een contraint op perslidwerkplek.
   --delete prs_perslidwerkplek where prs_perslidwerkplek_verwijder is not null;

   -- Delete
   v_errorhint := 'Eventueel te verwijderen personen worden verwijderd ';

       FOR rec_prs_del IN c_prs_del
   LOOP
      BEGIN
         prs.delete_perslid (p_import_key, rec_prs_del.prs_perslid_key);
      END;
   END LOOP;


   COMMIT;
   -- Update
   v_errormsg := 'Persoonsgegevens worden nu angepast (toevoegen/wijzigen) ';

   FOR rec_prs_upd IN c_prs_upd
   LOOP
      BEGIN

         -- Init
         v_update         := TRUE; -- Nog geen fouten gevonden
         --v_afdeling_key   := c_no_key_found;
         v_srtperslid_key := c_no_key_found;
         v_perslid_key    := c_no_key_found;
         v_errormsg := '';

         IF rec_prs_upd.prs_perslid_key IS NULL
         THEN
            v_aktie := 'INSERT';
            v_errorhint := 'Persoonsgegevens kunnen niet toegevoegd worden';
         ELSE
            v_aktie := 'UPDATE';
            v_errorhint := 'Persoonsgegevens kunnen niet gewijzigd worden';
         END IF;

         -- *** Controle verplichte gegevens + ophalen extra informatie ***
         -- Controle: PRS_PERSLID_NR
         IF rec_prs_upd.prs_perslid_nr IS NULL
         THEN
            v_errormsg  := 'Persoon met achternaam ['||rec_prs_upd.prs_perslid_naam||' heeft geen personeelsnummer ';
            fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
            commit; -- logging
            v_update := FALSE;
         END IF;

         -- Controle: PRS_PERSLID_NAAM
         IF v_update AND rec_prs_upd.prs_perslid_naam IS NULL
         THEN
            v_errormsg := 'Persoon met personeelsnummer [' || rec_prs_upd.prs_perslid_nr||'] heeft geen achternaam';
            fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
            v_update := FALSE;
         END IF;

         -- Controle: Kan persoon gereactieveerd worden of is er al een persoon met dezelfde prs_perslid_nr actief
         IF v_update AND rec_prs_upd.prs_perslid_verwijder IS NOT NULL
         THEN
            BEGIN
               -- Is er al een actieve persoon met dezelfde perslid_nr
               SELECT COUNT(p.prs_perslid_key)
                 INTO v_prs_key_cnt
                 FROM prs_perslid p
                WHERE p.prs_perslid_verwijder IS NULL
                  AND p.prs_perslid_nr LIKE rec_prs_upd.prs_perslid_nr
                  AND p.prs_perslid_key != rec_prs_upd.prs_perslid_key;

               IF v_prs_key_cnt > 0
               THEN
                  -- (UWVA#13270)
                  -- Waarde(n) gevonden: Er is al een actieve persoon met dezelfde prs_perslid_nr gevonden: Niet updaten!!!
                  --v_errormsg := 'Persoon hoeft niet gereactiveerd te worden; prs_perslid_nr: ' || rec_prs_upd.prs_perslid_nr;
                  --v_errorhint := 'Er bestaat al een persoon met dezelfde persooneelsnummer die actief is, GEEN ACTIE NODIG; personeelsnummer: ' || rec_prs_upd.prs_perslid_nr;
                  --fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
                  v_update := FALSE;
               ELSE
                  -- Kennelijk is er geen persoon gevonden met dezelfde prs_perslid_nr
                  -- persoon kan gereactieveerd worden (prs_perslid_verwijder op NULL zetten)
                  -- v_update := TRUE;
                  v_errormsg := 'Persoon reactiveren; prs_perslid_nr: ' || rec_prs_upd.prs_perslid_nr;
                  v_errorhint := 'ACTIE wordt ondernomen; personeelsnummer: ' || rec_prs_upd.prs_perslid_nr;
                  fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
               END IF;
            EXCEPTION
               WHEN OTHERS
               THEN
                  v_update := FALSE;
                  v_errorhint := 'Fout in het vinden aantal actieve personen; personeelsnummer: ' || rec_prs_upd.prs_perslid_nr || '?!';
            END;
         END IF;

         -- Controle: PRS_SRTPERSLID_OMSCHRIJVING
         IF v_update
         THEN
            v_srtperslid_omschr := RTRIM (INITCAP (rec_prs_upd.prs_srtperslid_omschrijving));

            BEGIN
               -- Bepaal de key van de functie
               SELECT prs_srtperslid_key
                 INTO v_srtperslid_key
                 FROM prs_srtperslid
                WHERE prs_srtperslid_upper = UPPER (v_srtperslid_omschr) AND prs_srtperslid_verwijder IS NULL;
            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  v_errormsg := 'prs_srtperslid ' || v_srtperslid_omschr || ' bestaat niet';

                  -- Functie bestaat kennelijk niet, maak 'm maar aan
                  INSERT INTO prs_srtperslid
                              (prs_srtperslid_omschrijving
                              )
                       VALUES (v_srtperslid_omschr
                              );

                  -- Wat is de key van deze nieuwe geworden?
                  SELECT prs_srtperslid_key
                    INTO v_srtperslid_key
                    FROM prs_srtperslid
                   WHERE prs_srtperslid_omschrijving = v_srtperslid_omschr AND prs_srtperslid_verwijder IS NULL;
               WHEN OTHERS
               THEN
                  v_errorhint :=
                        'Functie '
                     || v_srtperslid_omschr
                     || '  kan niet bepaald worden; persoonnr: '
                     || rec_prs_upd.prs_perslid_nr;
                  v_update := FALSE;
            END;
         END IF;

         -- *** Daadwerkelijk insert/update prs_perslid ***
         IF v_update
         THEN
            BEGIN
               IF v_aktie = 'INSERT'
               THEN
                  v_errormsg := 'Persoon kan niet worden toegevoegd';

                  INSERT INTO prs_perslid
                              (prs_perslid_naam, prs_perslid_tussenvoegsel, prs_perslid_module,
                               prs_perslid_voorletters, prs_perslid_voornaam,
                               prs_perslid_telefoonnr, prs_perslid_mobiel, prs_perslid_oslogin, prs_perslid_email, prs_perslid_nr,
                               prs_perslid_titel, prs_srtperslid_key, prs_afdeling_key, prs_perslid_aanmaak
                              )
                       VALUES (rec_prs_upd.prs_perslid_naam, rec_prs_upd.prs_perslid_tussenvoegsel, 'PRS',
                               rec_prs_upd.prs_perslid_voorletters, rec_prs_upd.prs_perslid_voornaam,
                               rec_prs_upd.prs_perslid_telefoonnr, rec_prs_upd.prs_perslid_mobiel, rec_prs_upd.prs_perslid_oslogin, rec_prs_upd.prs_perslid_email, rec_prs_upd.prs_perslid_nr,
                               rec_prs_upd.prs_perslid_titel, v_srtperslid_key, c_afdeling_key, c_perslid_aanmaak
                              );

                  fac.imp_writelog (p_import_key,
                                    'C',
                                    'Nieuw persoon toegevoegd',
                                       'Naam/persoonsnr: '
                                    || rec_prs_upd.prs_perslid_naam
                                    || '/'
                                    || rec_prs_upd.prs_perslid_nr
                                   );
                  commit;

               ELSE

                  v_errormsg := 'Persoon kan niet worden gewijzigd';

                  UPDATE prs_perslid
                     SET prs_perslid_naam = rec_prs_upd.prs_perslid_naam,
                         prs_perslid_tussenvoegsel = rec_prs_upd.prs_perslid_tussenvoegsel,
                         prs_perslid_voorletters = rec_prs_upd.prs_perslid_voorletters,
                         prs_perslid_voornaam = NVL (rec_prs_upd.prs_perslid_voornaam, prs_perslid_voornaam),
                         prs_perslid_telefoonnr = NVL (rec_prs_upd.prs_perslid_telefoonnr, prs_perslid_telefoonnr),
                         prs_perslid_titel = rec_prs_upd.prs_perslid_titel,
                         prs_srtperslid_key = v_srtperslid_key,
                         prs_afdeling_key = c_afdeling_key,
                         prs_perslid_verwijder = NULL,
                         prs_perslid_oslogin = rec_prs_upd.prs_perslid_oslogin,
                         prs_perslid_email = rec_prs_upd.prs_perslid_email
                   WHERE prs_perslid_nr = rec_prs_upd.prs_perslid_nr
                     AND prs_perslid_key = rec_prs_upd.prs_perslid_key
                     AND (   prs_perslid_naam <> rec_prs_upd.prs_perslid_naam
                          OR NVL (prs_perslid_tussenvoegsel, '-') <> NVL (rec_prs_upd.prs_perslid_tussenvoegsel, '-')
                          OR prs_perslid_voorletters <> rec_prs_upd.prs_perslid_voorletters
                          OR NVL (prs_perslid_voornaam, '-') <> NVL (rec_prs_upd.prs_perslid_voornaam, '-')
                          OR NVL (prs_perslid_telefoonnr, '-') <> NVL (rec_prs_upd.prs_perslid_telefoonnr, '-')
                          OR prs_perslid_titel <> rec_prs_upd.prs_perslid_titel
                          OR prs_srtperslid_key <> v_srtperslid_key
                          OR prs_afdeling_key <> c_afdeling_key
                          OR prs_perslid_oslogin <> rec_prs_upd.prs_perslid_oslogin
                          OR prs_perslid_email <> rec_prs_upd.prs_perslid_email
                          OR rec_prs_upd.prs_perslid_verwijder IS NOT NULL
                         );
                    commit;

               END IF;
            EXCEPTION
               WHEN OTHERS
               THEN
                  oracle_err_num := SQLCODE;
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                  --v_errorhint := 'perslid_nr:' || rec_prs_upd.prs_perslid_nr || ' afdeling:' || rec_prs_upd.prs_afdeling_naam || ' {' || v_errormsg || '}';
                  v_errorhint := 'perslid_nr:' || rec_prs_upd.prs_perslid_nr || ' {' || v_errormsg || '}';
                  v_errormsg := '(ORACLE error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                  v_update := FALSE;
                  fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
            END;
         END IF;

         -- *** Werkplek ***
         v_errorhint := 'Kan geen werkplek toevoegen';

         IF v_update AND (v_aktie = 'UPDATE')
         THEN
            -- bepaal aantal werkplekken
            BEGIN
               SELECT COUNT(*)
                 INTO v_nr_werkplek
                 FROM prs_perslidwerkplek
                WHERE prs_perslid_key = rec_prs_upd.prs_perslid_key;
            EXCEPTION
               WHEN OTHERS
               THEN
                  fac.imp_writelog (p_import_key,
                                    'I',
                                    v_errormsg,
                                       'Het aantal werkplekken kan niet bepaald worden?! personeelsnummer: '
                                    || rec_prs_upd.prs_perslid_nr
                                   );
                  v_update := FALSE;
            END;
            IF v_update AND v_nr_werkplek = 1
            THEN
               BEGIN

                  -- bepaal huidige alg_locatie_key
                  SELECT alg_locatie_key
                    INTO v_current_locatie_key
                    FROM prs_v_werkplekperslid_gegevens
                   WHERE prs_perslid_key = rec_prs_upd.prs_perslid_key;

                  -- bepaal nieuwe alg_locatie_key
                  SELECT lo.alg_locatie_key
                    INTO v_new_locatie_key
                    FROM fac_usrdata ud,
                         alg_locatie lo
                   WHERE ud.fac_usrtab_key = c_usrtab_key
                     AND ud.fac_usrdata_code = lo.alg_locatie_code
                     AND ud.fac_usrdata_omschr = rec_prs_upd.prs_locatie_omschrijving
                     AND lo.alg_locatie_verwijder IS NULL;
                  -- indien gelijk dan werkplek niet updaten.
                  v_update := (v_current_locatie_key <> v_new_locatie_key);

               EXCEPTION
                  WHEN OTHERS
                  THEN
                     fac.imp_writelog (p_import_key,
                                       'I',
                                       v_errormsg,
                                          'huidige of nieuwe alg_locatie_key kan niet bepaald worden?! personeelsnummer: '
                                       || rec_prs_upd.prs_perslid_nr
                                      );
                     v_update := FALSE;
               END;
            END IF;
         END IF;

         IF v_update AND (rec_prs_upd.prs_locatie_omschrijving IS NOT NULL)
                     AND ((v_aktie = 'INSERT') OR (v_aktie = 'UPDATE') AND (v_nr_werkplek<=1))
         THEN

            IF v_aktie = 'INSERT'
            THEN
               v_errormsg := 'Fout bij toewijzen werkplek bij zojuist toegevoegde persoon ';
            ELSE -- v_aktie = 'UPDATE'
               v_errormsg := 'Fout bij het wijzigen van de werkplek';
            END IF;

            BEGIN
               SELECT prs_perslid_key
                 INTO v_perslid_key
                 FROM prs_perslid
                WHERE prs_perslid_nr = rec_prs_upd.prs_perslid_nr AND prs_perslid_verwijder IS NULL;
            EXCEPTION
               WHEN TOO_MANY_ROWS
               THEN
                  fac.imp_writelog (p_import_key,
                                    'I',
                                    v_errormsg,
                                    'Het personeelsnummer is niet uniek: ' || rec_prs_upd.prs_perslid_nr
                                   );

                  v_update := FALSE;
               WHEN OTHERS
               THEN
                  fac.imp_writelog (p_import_key,
                                    'I',
                                    v_errormsg,
                                       'De persoon kan niet bepaald worden?! personeelsnummer: '
                                    || rec_prs_upd.prs_perslid_nr
                                   );

                  v_update := FALSE;
            END;

            BEGIN

               SELECT lo.alg_locatie_key
                 INTO v_locatie_key
                 FROM FAC_USRDATA ud, ALG_LOCATIE lo
                WHERE ud.fac_usrtab_key     = c_usrtab_key
                  AND ud.fac_usrdata_code = lo.alg_locatie_code
                  AND ud.fac_usrdata_omschr = rec_prs_upd.prs_locatie_omschrijving
                  AND lo.alg_locatie_verwijder IS NULL;

            EXCEPTION
               WHEN OTHERS
               THEN
                  v_update := FALSE;

            END;

            IF NOT v_update
            THEN
               v_errorhint :=
                     'Onbekende Locatie-omschrijving '
                  || rec_prs_upd.prs_locatie_omschrijving
                  || ';  personeelsnummer: '
                  || rec_prs_upd.prs_perslid_nr;
               fac.imp_writelog (p_import_key, 'I', v_errormsg, v_errorhint);
            ELSE
               BEGIN
                  SELECT MIN (alg_gebouw_code)
                    INTO v_gebouw_code
                    FROM alg_gebouw
                   WHERE alg_locatie_key = v_locatie_key AND alg_gebouw_verwijder IS NULL;

                  SELECT alg_gebouw_key
                    INTO v_gebouw_key
                    FROM alg_gebouw
                   WHERE alg_locatie_key = v_locatie_key
                     AND alg_gebouw_code = v_gebouw_code
                     AND alg_gebouw_verwijder IS NULL;
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     INSERT INTO alg_gebouw
                                 (alg_locatie_key, alg_srtgebouw_key, alg_gebouw_code, alg_gebouw_naam
                                 )
                          VALUES (v_locatie_key, c_srtgebouw_default, '0', 'Onbekend'
                                 );

                     v_errormsg := 'Bepalen alg_gebouw_key adhv v_locatie_key=['||to_char(v_locatie_key)||'] en v_gebouw_code=['||v_gebouw_code||']';

                     SELECT alg_gebouw_key
                       INTO v_gebouw_key
                       FROM alg_gebouw
                      WHERE alg_locatie_key = v_locatie_key
                        AND alg_gebouw_code = v_gebouw_code
                        AND alg_gebouw_verwijder IS NULL;
               END;

               BEGIN
                  v_errormsg := 'Bepalen alg_verdieping_key';

                  SELECT alg_verdieping_key
                    INTO v_verdieping_key
                    FROM alg_verdieping
                   WHERE alg_gebouw_key = v_gebouw_key AND alg_verdieping_verwijder IS NULL
                         AND alg_verdieping_volgnr = 0;   -- Begane grond!
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     v_errorhint :=
                        'Persoon met persoonnummer ' || rec_prs_upd.prs_perslid_nr || ': toevoegen verdieping Onbekend';

                     INSERT INTO alg_verdieping
                                 (alg_gebouw_key, alg_verdieping_omschrijving, alg_verdieping_volgnr,
                                  alg_verdieping_code
                                 )
                          VALUES (v_gebouw_key, c_verdieping_omschr_default, 0,
                                  '0'
                                 );

                     -- Alsnog bepalen v_verdieping_key
                     SELECT alg_verdieping_key
                       INTO v_verdieping_key
                       FROM alg_verdieping
                      WHERE alg_gebouw_key = v_gebouw_key
                        AND alg_verdieping_verwijder IS NULL
                        AND alg_verdieping_volgnr = 0;   -- Begane grond!
               END;

               BEGIN
                  v_errorhint :=
                        'Persoon met persoonnummer '
                     || rec_prs_upd.prs_perslid_nr
                     || ': bepalen ruimte (ruimte zou bekend moeten zijn)';

                  SELECT alg_ruimte_key
                    INTO v_ruimte_key
                    FROM alg_ruimte
                   WHERE alg_verdieping_key = v_verdieping_key
                     AND alg_ruimte_verwijder IS NULL
                     AND alg_ruimte_nr = c_ruimte_code;
               -- Altijd ruimte met deze notatie!
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     INSERT INTO alg_ruimte
                                 (alg_verdieping_key, alg_srtruimte_key, alg_ruimte_nr, alg_ruimte_omschrijving
                                 )
                          VALUES (v_verdieping_key, c_srtruimte_default, c_ruimte_code, c_ruimte_omschr_default
                                 );

                     -- Alsnog bepalen v_ruimte_key
                     SELECT alg_ruimte_key
                       INTO v_ruimte_key
                       FROM alg_ruimte
                      WHERE alg_verdieping_key = v_verdieping_key
                        AND alg_ruimte_verwijder IS NULL
                        AND alg_ruimte_nr = c_ruimte_code;
               -- Altijd ruimte met deze notatie!
               END;

               BEGIN
                  v_errorhint :=
                        'Persoon met persoonnummer '
                     || rec_prs_upd.prs_perslid_nr
                     || ': bepalen werkplek (werkplek zou bekend moeten zijn)';

                  SELECT prs_werkplek_key
                    INTO v_werkplek_key
                    FROM prs_werkplek
                   WHERE prs_alg_ruimte_key = v_ruimte_key
                     AND prs_werkplek_volgnr = c_werkplek_volgnr_default;
               -- Altijd werkplek met deze notatie!
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     INSERT INTO prs_werkplek
                                 (prs_werkplek_volgnr, prs_werkplek_omschrijving, prs_alg_ruimte_key,
                                  prs_werkplek_virtueel
                                 )
                          VALUES (c_werkplek_volgnr_default, c_prs_werkplek_omschrijving, v_ruimte_key,
                                  1
                                 );

                     -- Alsnog bepalen v_werkplek_key
                     SELECT prs_werkplek_key
                       INTO v_werkplek_key
                       FROM prs_werkplek
                      WHERE prs_alg_ruimte_key = v_ruimte_key
                        AND prs_werkplek_volgnr = c_werkplek_volgnr_default;
               -- Altijd werkplek met deze notatie!
               END;

               IF v_aktie = 'INSERT' OR (v_nr_werkplek = 0 AND v_aktie = 'UPDATE')
               THEN
                  INSERT INTO prs_perslidwerkplek
                              (prs_perslid_key, prs_werkplek_key, prs_perslidwerkplek_bezetting
                              )
                       VALUES (v_perslid_key, v_werkplek_key, 0
                              );
               ELSE -- v_aktie = 'UPDATE' AND v_nr_werkplek = 1
                  UPDATE prs_perslidwerkplek
                     SET prs_werkplek_key = v_werkplek_key
                   WHERE prs_perslid_key = v_perslid_key;
               END IF;
            END IF;
         END IF;

         v_buffercount := v_buffercount + 1;

         IF v_buffercount >= c_commitbuffer
         THEN
            COMMIT;
            v_buffercount := 0;
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errorhint := 'perslid_nr:' || rec_prs_upd.prs_perslid_nr || ' locatie:' || rec_prs_upd.prs_locatie_omschrijving || ' ' || v_errorhint || ' {' || v_errormsg || '}';
            v_errormsg := '(ORACLE error ' || oracle_err_num || '/' || oracle_err_mes || ')';
            fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint);
      END;
   END LOOP;

   SELECT COUNT (*)
     INTO v_perslid_newcount_fclt
     FROM prs_perslid
    WHERE prs_perslid_nr IS NOT NULL AND prs_perslid_verwijder IS NULL;

   fac.imp_writelog (p_import_key,
                     'S',
                        'Aantal actieve personen (met personeelsnr) vooraf: '
                     || TO_CHAR (v_perslid_count_fclt)
                     || '  nu: '
                     || TO_CHAR (v_perslid_newcount_fclt),
                     ''
                    );

   SELECT COUNT (*)
     INTO v_perslid_newcount_fclt   -- misbruik
     FROM prs_perslid
    WHERE prs_perslid_nr IS NULL AND prs_perslid_verwijder IS NULL;

   fac.imp_writelog (p_import_key,
                     'S',
                     'Aantal actieve personen zonder personeelsnr: ' || TO_CHAR (v_perslid_newcount_fclt),
                     ''
                    );

  -- plaats medewerkers die nog niet in de default groep zitten in de default groep.
  INSERT INTO fac_gebruikersgroep
              (fac_groep_key, prs_perslid_key)
     (SELECT 1, prs_perslid_key
        FROM prs_perslid p
       WHERE prs_perslid_oslogin IS NOT NULL
         AND prs_perslid_verwijder IS NULL
         AND NOT EXISTS (
                SELECT prs_perslid_key
                  FROM fac_gebruikersgroep gg
                 WHERE fac_groep_key = 1
                   AND p.prs_perslid_key = gg.prs_perslid_key));

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

*/

CREATE OR REPLACE PROCEDURE logi_import_persoon (p_import_key IN NUMBER)
AS
    oracle_err_num     NUMBER;
    oracle_err_mes     VARCHAR2 (200);
    v_errormsg         VARCHAR2 (400);
    v_errorhint        VARCHAR2 (400);
    v_aantal_in_FCLT   NUMBER;
BEGIN
    v_errorhint := 'Generieke update';
    -- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid proc
    prs.import_perslid (
        p_import_key,
           '0;0;0;0;0;0;8;2;4;3;'
        || '0;0;0;0;0;0;0;6;0;1;'
        || '1;5;0;0;0;0;9;0;0;0;'
        || '0;0;0;0;0;0;0;0;0;0;'
        || '0;0;0;0;0;0',
        'employeeID;sn;givenName;infix;uid;mail;orglevel7;orgleve7id;a1physicalDeliveryOfficeName%');

    UPDATE fac_imp_perslid
       SET prs_srtperslid_omschrijving = 'Onbekend';

    UPDATE fac_imp_perslid
       SET prs_afdeling_naam = 'CGI';

    UPDATE fac_imp_perslid p
       SET p.alg_locatie_code =
               (SELECT lo.alg_locatie_code
                  FROM fac_usrdata ud, alg_locatie lo
                 WHERE     ud.fac_usrtab_key = 1
                       AND ud.fac_usrdata_code = lo.alg_locatie_code
                       AND ud.fac_usrdata_omschr = p.prs_kenmerk1
                       AND lo.alg_locatie_verwijder IS NULL);

    UPDATE fac_imp_perslid p
       SET p.alg_gebouw_code =
               (SELECT g.alg_gebouw_code
                  FROM alg_locatie l, alg_gebouw g
                 WHERE     p.alg_locatie_code = l.alg_locatie_code
                       AND l.alg_locatie_key = g.alg_locatie_key
                       AND g.alg_gebouw_verwijder IS NULL
                       AND g.alg_srtgebouw_key <> 61 -- parkeer garages doen niet mee
                       AND l.alg_locatie_verwijder IS NULL);

    UPDATE fac_imp_perslid p
       SET p.alg_verdieping_volgnr =
               (SELECT v.alg_verdieping_volgnr
                  FROM alg_locatie l, alg_gebouw g, alg_verdieping v
                 WHERE     p.alg_locatie_code = l.alg_locatie_code
                       AND p.alg_gebouw_code = g.alg_gebouw_code
                       AND l.alg_locatie_key = g.alg_locatie_key
                       AND g.alg_gebouw_verwijder IS NULL
                       AND g.alg_srtgebouw_key <> 61 -- parkeer garages doen niet mee
                       AND l.alg_locatie_verwijder IS NULL
                       AND v.alg_gebouw_key = g.alg_gebouw_key
                       AND v.alg_verdieping_code = '0'
                       AND v.alg_verdieping_verwijder IS NULL);

    UPDATE fac_imp_perslid p
       SET p.alg_ruimte_nr =
               (SELECT r.alg_ruimte_nr
                  FROM alg_locatie     l,
                       alg_gebouw      g,
                       alg_verdieping  v,
                       alg_ruimte      r
                 WHERE     p.alg_locatie_code = l.alg_locatie_code
                       AND l.alg_locatie_key = g.alg_locatie_key
                       AND p.alg_gebouw_code = g.alg_gebouw_code
                       AND p.alg_verdieping_volgnr = v.alg_verdieping_volgnr
                       AND g.alg_gebouw_verwijder IS NULL
                       AND g.alg_srtgebouw_key <> 61 -- parkeer garages doen niet mee
                       AND l.alg_locatie_verwijder IS NULL
                       AND v.alg_gebouw_key = g.alg_gebouw_key
                       AND v.alg_verdieping_code = '0'
                       AND v.alg_verdieping_verwijder IS NULL
                       AND r.alg_verdieping_key = v.alg_verdieping_key
                       AND r.alg_ruimte_nr = '000'
                       AND r.alg_ruimte_verwijder IS NULL);

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

CREATE OR REPLACE PROCEDURE logi_werkplek_persoon (p_import_key IN NUMBER)
AS
    -- Constanten (LET OP: deze waarden moeten letterlijk in de DB aabwezig zijn!)
    c_srtgebouw_default           INTEGER := 1;
    c_srtruimte_default           INTEGER := 1;
    c_afdeling_key                NUMBER := 6761;                -- LOGI#31662

    -- Constanten (overig)
    c_prs_werkplek_omschrijving   VARCHAR2 (16) := 'Onbekend';
    c_srtperslid_omschr_default   VARCHAR2 (16) := 'Onbekend';
    c_werkplek_volgnr_default     INTEGER := 1;
    c_verdieping_omschr_default   VARCHAR2 (16) := 'BG';
    c_ruimte_omschr_default       VARCHAR2 (16) := 'Onbekend';
    c_ruimte_code                 VARCHAR2 (3) := '000';
    c_usrtab_key                  INTEGER := 1;                 -- Tbv LOCATIE

    --- dan de werkplekken aanvullen
    CURSOR c_prs_upd IS
          SELECT p.prs_perslid_key,
                 lp.prs_kenmerk1
                     prs_locatie_omschrijving,
                 lp.prs_perslid_naam,
                 lp.prs_perslid_tussenvoegsel,
                 lp.prs_perslid_voorletters,
                 lp.prs_perslid_voornaam,
                 lp.prs_perslid_telefoonnr,
                 lp.prs_perslid_mobiel,
                 lp.prs_perslid_oslogin,
                 lp.prs_perslid_email,
                 COALESCE (lp.prs_srtperslid_omschrijving,
                           c_srtperslid_omschr_default)
                     prs_srtperslid_omschrijving,
                 lp.prs_perslid_nr,
                 ''
                     prs_perslid_titel,
                 p.prs_perslid_verwijder
            FROM fac_imp_perslid lp, prs_perslid p
           WHERE 1 = 1 AND lp.prs_perslid_email = p.prs_perslid_email
        ORDER BY lp.prs_perslid_nr, p.prs_perslid_key DESC;

    v_perslid_key                 NUMBER (10);
    v_srtperslid_key              NUMBER (10);
    --v_afdeling_key                NUMBER (10);
    v_locatie_key                 NUMBER (10);
    v_gebouw_key                  NUMBER (10);
    v_verdieping_key              NUMBER (10);
    v_ruimte_key                  NUMBER (10);
    v_werkplek_key                NUMBER (10);
    v_gebouw_code                 VARCHAR2 (10);
    v_srtperslid_omschr           VARCHAR (30);
    rec_prs_upd                   c_prs_upd%ROWTYPE;
    oracle_err_num                NUMBER;
    oracle_err_mes                VARCHAR2 (200);
    v_errormsg                    VARCHAR2 (1024);
    v_errorhint                   VARCHAR2 (1024);
    v_debug                       VARCHAR2 (1024);
    v_count                       NUMBER (10);
    v_update                      BOOLEAN;
    v_aktie                       VARCHAR (10);
    v_perslid_count_imp           NUMBER;
    v_perslid_count_fclt          NUMBER;
    v_perslid_newcount_fclt       NUMBER;
    currentversion                fac_module.fac_module_version%TYPE;
    l_validatie                   NUMBER;
    v_srtimport                   VARCHAR2 (10);
    l_nrkps                       NUMBER;
    v_nr_werkplek                 NUMBER;
    v_current_locatie_key         NUMBER;
    v_new_locatie_key             NUMBER;
BEGIN
    FOR rec_prs_upd IN c_prs_upd
    LOOP
        -- bepaal aantal werkplekken
        BEGIN
            SELECT COUNT (*)
              INTO v_nr_werkplek
              FROM prs_perslidwerkplek
             WHERE prs_perslid_key = rec_prs_upd.prs_perslid_key;
        EXCEPTION
            WHEN OTHERS
            THEN
                fac.imp_writelog (
                    p_import_key,
                    'I',
                    v_errormsg,
                       'Het aantal werkplekken kan niet bepaald worden?! personeelsnummer: '
                    || rec_prs_upd.prs_perslid_nr);
                v_update := FALSE;
        END;

        IF v_nr_werkplek = 1
        THEN
            BEGIN
                -- bepaal huidige alg_locatie_key
                SELECT alg_locatie_key
                  INTO v_current_locatie_key
                  FROM prs_v_werkplekperslid_gegevens
                 WHERE prs_perslid_key = rec_prs_upd.prs_perslid_key;

                -- bepaal nieuwe alg_locatie_key
                SELECT lo.alg_locatie_key
                  INTO v_new_locatie_key
                  FROM fac_usrdata ud, alg_locatie lo
                 WHERE     ud.fac_usrtab_key = c_usrtab_key
                       AND ud.fac_usrdata_code = lo.alg_locatie_code
                       AND ud.fac_usrdata_omschr =
                           rec_prs_upd.prs_locatie_omschrijving
                       AND lo.alg_locatie_verwijder IS NULL;

                -- indien gelijk dan werkplek niet updaten.
                v_update := (v_current_locatie_key <> v_new_locatie_key);
            EXCEPTION
                WHEN OTHERS
                THEN
                    fac.imp_writelog (
                        p_import_key,
                        'I',
                        v_errormsg,
                           'huidige of nieuwe alg_locatie_key kan niet bepaald worden?! personeelsnummer: '
                        || rec_prs_upd.prs_perslid_nr);
                    v_update := FALSE;
            END;
        END IF;

        -- Er is geen werkplek bekend in Facilitor of de werkplek uit de import wijkt af van de werkplek in Facilitor dan gaan we bijwerken
        -- Als er meer dan 1 werkplek is, dan laten we het zoals het is
        IF v_update AND v_nr_werkplek <= 1
        THEN
            v_errormsg :=
                'Fout bij toewijzen werkplek bij zojuist toegevoegde persoon ';


            BEGIN
                SELECT lo.alg_locatie_key
                  INTO v_locatie_key
                  FROM FAC_USRDATA ud, ALG_LOCATIE lo
                 WHERE     ud.fac_usrtab_key = c_usrtab_key
                       AND ud.fac_usrdata_code = lo.alg_locatie_code
                       AND ud.fac_usrdata_omschr =
                           rec_prs_upd.prs_locatie_omschrijving
                       AND lo.alg_locatie_verwijder IS NULL;
            EXCEPTION
                WHEN OTHERS
                THEN
                    v_update := FALSE;
            END;

            IF NOT v_update
            THEN
                v_errorhint :=
                       'Onbekende Locatie-omschrijving '
                    || rec_prs_upd.prs_locatie_omschrijving
                    || ';  personeelsnummer: '
                    || rec_prs_upd.prs_perslid_nr;
                fac.imp_writelog (p_import_key,
                                  'I',
                                  v_errormsg,
                                  v_errorhint);
            ELSE
                BEGIN
                    SELECT MIN (alg_gebouw_code)
                      INTO v_gebouw_code
                      FROM alg_gebouw
                     WHERE     alg_locatie_key = v_locatie_key
                           AND alg_gebouw_verwijder IS NULL;

                    SELECT alg_gebouw_key
                      INTO v_gebouw_key
                      FROM alg_gebouw
                     WHERE     alg_locatie_key = v_locatie_key
                           AND alg_gebouw_code = v_gebouw_code
                           AND alg_gebouw_verwijder IS NULL;
                EXCEPTION
                    WHEN NO_DATA_FOUND
                    THEN
                        INSERT INTO alg_gebouw (alg_locatie_key,
                                                alg_srtgebouw_key,
                                                alg_gebouw_code,
                                                alg_gebouw_naam)
                             VALUES (v_locatie_key,
                                     c_srtgebouw_default,
                                     '0',
                                     'Onbekend');

                        v_errormsg :=
                               'Bepalen alg_gebouw_key adhv v_locatie_key=['
                            || TO_CHAR (v_locatie_key)
                            || '] en v_gebouw_code=['
                            || v_gebouw_code
                            || ']';

                        SELECT alg_gebouw_key
                          INTO v_gebouw_key
                          FROM alg_gebouw
                         WHERE     alg_locatie_key = v_locatie_key
                               AND alg_gebouw_code = v_gebouw_code
                               AND alg_gebouw_verwijder IS NULL;
                END;

                BEGIN
                    v_errormsg := 'Bepalen alg_verdieping_key';

                    SELECT alg_verdieping_key
                      INTO v_verdieping_key
                      FROM alg_verdieping
                     WHERE     alg_gebouw_key = v_gebouw_key
                           AND alg_verdieping_verwijder IS NULL
                           AND alg_verdieping_code = '0';     -- Begane grond! Niet via volgnummer!
                        
                EXCEPTION
                    WHEN NO_DATA_FOUND
                    THEN
                        v_errorhint :=
                               'Persoon met persoonnummer '
                            || rec_prs_upd.prs_perslid_nr
                            || ': toevoegen verdieping Onbekend';

                        INSERT INTO alg_verdieping (
                                        alg_gebouw_key,
                                        alg_verdieping_omschrijving,
                                        alg_verdieping_volgnr,
                                        alg_verdieping_code)
                             VALUES (v_gebouw_key,
                                     c_verdieping_omschr_default,
                                     0,
                                     '0');

                        -- Alsnog bepalen v_verdieping_key
                        SELECT alg_verdieping_key
                          INTO v_verdieping_key
                          FROM alg_verdieping
                         WHERE     alg_gebouw_key = v_gebouw_key
                               AND alg_verdieping_verwijder IS NULL
                               AND alg_verdieping_code = '0'; -- Begane grond!
                END;

                BEGIN
                    v_errorhint :=
                           'Persoon met persoonnummer '
                        || rec_prs_upd.prs_perslid_nr
                        || ': bepalen ruimte (ruimte zou bekend moeten zijn)';

                    SELECT alg_ruimte_key
                      INTO v_ruimte_key
                      FROM alg_ruimte
                     WHERE     alg_verdieping_key = v_verdieping_key
                           AND alg_ruimte_verwijder IS NULL
                           AND alg_ruimte_nr = c_ruimte_code;
                -- Altijd ruimte met deze notatie!
                EXCEPTION
                    WHEN NO_DATA_FOUND
                    THEN
                        INSERT INTO alg_ruimte (alg_verdieping_key,
                                                alg_srtruimte_key,
                                                alg_ruimte_nr,
                                                alg_ruimte_omschrijving)
                             VALUES (v_verdieping_key,
                                     c_srtruimte_default,
                                     c_ruimte_code,
                                     c_ruimte_omschr_default);

                        -- Alsnog bepalen v_ruimte_key
                        SELECT alg_ruimte_key
                          INTO v_ruimte_key
                          FROM alg_ruimte
                         WHERE     alg_verdieping_key = v_verdieping_key
                               AND alg_ruimte_verwijder IS NULL
                               AND alg_ruimte_nr = c_ruimte_code;
                -- Altijd ruimte met deze notatie!
                END;

                BEGIN
                    v_errorhint :=
                           'Persoon met persoonnummer '
                        || rec_prs_upd.prs_perslid_nr
                        || ': bepalen werkplek (werkplek zou bekend moeten zijn)';

                    SELECT prs_werkplek_key
                      INTO v_werkplek_key
                      FROM prs_werkplek
                     WHERE     prs_alg_ruimte_key = v_ruimte_key
                           AND prs_werkplek_volgnr =
                               c_werkplek_volgnr_default;
                -- Altijd werkplek met deze notatie!
                EXCEPTION
                    WHEN NO_DATA_FOUND
                    THEN
                        INSERT INTO prs_werkplek (prs_werkplek_volgnr,
                                                  prs_werkplek_omschrijving,
                                                  prs_alg_ruimte_key,
                                                  prs_werkplek_virtueel)
                             VALUES (c_werkplek_volgnr_default,
                                     c_prs_werkplek_omschrijving,
                                     v_ruimte_key,
                                     1);

                        -- Alsnog bepalen v_werkplek_key
                        SELECT prs_werkplek_key
                          INTO v_werkplek_key
                          FROM prs_werkplek
                         WHERE     prs_alg_ruimte_key = v_ruimte_key
                               AND prs_werkplek_volgnr =
                                   c_werkplek_volgnr_default;
                -- Altijd werkplek met deze notatie!
                END;

                IF v_nr_werkplek = 0
                THEN
                    INSERT INTO prs_perslidwerkplek (
                                    prs_perslid_key,
                                    prs_werkplek_key,
                                    prs_perslidwerkplek_bezetting)
                         VALUES (v_perslid_key, v_werkplek_key, 0);
                ELSE               -- v_aktie = 'UPDATE' AND v_nr_werkplek = 1
                    UPDATE prs_perslidwerkplek
                       SET prs_werkplek_key = v_werkplek_key
                     WHERE prs_perslid_key = v_perslid_key;
                END IF;
            END IF;
        END IF;
    END LOOP;
END;
/

CREATE OR REPLACE PROCEDURE logi_update_persoon (p_import_key IN NUMBER)
AS
    -- Verwijderen op basis van oslogin #56094
    CURSOR c_prs_del IS
          SELECT p.prs_perslid_key, p.prs_perslid_nr, p.prs_perslid_oslogin
            FROM PRS_PERSLID p,
                 (SELECT prs_perslid_oslogin
                    FROM logi_imp_persoon
                   WHERE prs_perslid_oslogin IS NOT NULL) lp
           WHERE     1 = 1
                 AND p.prs_perslid_nr IS NOT NULL
                 AND p.prs_perslid_oslogin IS NOT NULL
                 AND p.prs_perslid_verwijder IS NULL
                 AND p.prs_perslid_oslogin NOT LIKE '%\_%' ESCAPE '\'
                 AND UPPER (p.prs_perslid_oslogin) =
                     UPPER (lp.prs_perslid_oslogin(+))
                 AND lp.prs_perslid_oslogin IS NULL
        ORDER BY 2, 1;
        
BEGIN
    
    FOR rec IN c_prs_del
    LOOP
        BEGIN
            prs.delete_perslid (p_import_key, rec.prs_perslid_key);
        END;
    END LOOP;   

    
    -- 'Email' betekent dat op basis van Email wordt gematched.
    prs.update_perslid (p_import_key, 'EMAIL', NULL);
    
    -- Dan worden de werkplekken beoordeeld, evt aangemaakt en bijgewerkt
    logi_werkplek_persoon (p_import_key);

    COMMIT;
END;
/


CREATE OR REPLACE PROCEDURE logi_import_organisatie (p_import_key IN NUMBER)
AS

   c_max_import_str_len   NUMBER(10)  := 1000;

   CURSOR c_cursor IS
       SELECT *
         FROM fac_imp_file
        WHERE fac_import_key = p_import_key
     ORDER BY fac_imp_file_index;
   next_record                   c_cursor%ROWTYPE;

   v_newline                    VARCHAR2 (1000);        -- Import line
   v_field                      VARCHAR2 (100);         -- Import field
   v_fielddelimitor             VARCHAR2 (1);           -- Field seperator
   v_errormsg                   VARCHAR (1000);
   v_errorhint                  VARCHAR (200);
   oracle_err_num               NUMBER;
   oracle_err_mes               VARCHAR2 (200);

   -- De importvelden
   v_afdeling_naam              VARCHAR2 (1000);
   v_afdeling_omschrijving      VARCHAR2 (1000);
   v_afdeling_naam2             VARCHAR2 (1000);
   v_afdeling_omschrijving2     VARCHAR2 (1000);
   v_afdeling_naam3             VARCHAR2 (1000);
   v_afdeling_omschrijving3     VARCHAR2 (1000);

   header_found                 BOOLEAN;
   v_controle                   VARCHAR2(30);

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

   v_controle := 'OK'; -- Hier kan een controle ingebouwd worden ...

   IF (v_controle IS NULL) THEN

     v_errormsg := 'Ongeldig importbestand';
     fac.imp_writelog (p_import_key, 'E', v_errormsg, '');

   ELSE

      -- Clear my previous imported rows
     DELETE FROM logi_imp_organisatie;
     commit;

     FOR next_record IN c_cursor LOOP
     BEGIN

        v_newline := SUBSTR(next_record.FAC_IMP_FILE_LINE,1,c_max_import_str_len);

        fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling_naam);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling_omschrijving);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling_naam2);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling_omschrijving2);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling_naam3);
        fac.imp_getfield (v_newline, v_fielddelimitor, v_afdeling_omschrijving3);

        -- Skip until the header is found
        header_found := TRUE; -- Geen Header check
        IF ( 1=2
           )
        THEN

           header_found := TRUE;
        ELSIF (header_found)
        THEN

          BEGIN

             v_errormsg := 'Kan organisatiegegevens niet inlezen ';

             v_afdeling_naam              := SUBSTR(TRIM(coalesce(v_afdeling_naam,'')),1,10);
             v_afdeling_omschrijving      := SUBSTR(TRIM(coalesce(v_afdeling_omschrijving,'')),1,60);
             v_afdeling_naam2             := SUBSTR(TRIM(coalesce(v_afdeling_naam2,'')),1,10);
             v_afdeling_omschrijving2     := SUBSTR(TRIM(coalesce(v_afdeling_omschrijving2,'')),1,60);
             v_afdeling_naam3             := SUBSTR(TRIM(coalesce(v_afdeling_naam3,'')),1,10);
             v_afdeling_omschrijving3     := SUBSTR(TRIM(coalesce(v_afdeling_omschrijving3,'')),1,60);

             INSERT INTO logi_imp_organisatie
              (prs_afdeling_naam
              ,prs_afdeling_omschrijving
              ,prs_afdeling_naam2
              ,prs_afdeling_omschrijving2
              ,prs_afdeling_naam3
              ,prs_afdeling_omschrijving3
              ,logi_imp_organisatie_aanmaak
              )
              VALUES(v_afdeling_naam
                    ,v_afdeling_omschrijving
                    ,v_afdeling_naam2
                    ,v_afdeling_omschrijving2
                    ,v_afdeling_naam3
                    ,v_afdeling_omschrijving3
                    ,SYSDATE
              );

              commit;

           EXCEPTION
           WHEN OTHERS
           THEN

              oracle_err_num := SQLCODE;
              oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
              v_errormsg := v_errormsg || 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
              fac.imp_writelog (p_import_key, 'E', v_errormsg, '');
              commit; -- logging

          END;

        END IF;

        COMMIT;
     END;
     END LOOP;

   END IF;
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_errormsg, '');

END;
/


CREATE OR REPLACE PROCEDURE logi_update_organisatie (p_import_key IN NUMBER)
AS

   c_bedrijf_key          NUMBER(10)  := 2;
   c_fielddelimitor       VARCHAR2(1)  := ';';

   CURSOR c_afd1 IS
       SELECT prs_afdeling_naam, prs_afdeling_omschrijving, '['||prs_afdeling_naam||'|'||prs_afdeling_omschrijving||']' imp_row
         FROM logi_imp_organisatie
        WHERE 1=1
     GROUP BY prs_afdeling_naam, prs_afdeling_omschrijving;

   next_afd1                    c_afd1%ROWTYPE;

   CURSOR c_afd1_del IS
    SELECT a.prs_afdeling_key, a.prs_afdeling_naam, a.niveau
      FROM prs_v_afdeling_fullnames a
     WHERE a.niveau = 1
       AND NOT EXISTS (
            SELECT 'dummy'
              FROM LOGI_IMP_ORGANISATIE o
             WHERE o.prs_afdeling_naam = a.prs_afdeling_naam);

   next_afd1_del                c_afd1_del%ROWTYPE;

   CURSOR c_afd2 IS
       SELECT prs_afdeling_naam, prs_afdeling_naam2, prs_afdeling_omschrijving2,
              '['||prs_afdeling_naam||'|'||prs_afdeling_naam2||'|'||prs_afdeling_omschrijving2||']' imp_row
         FROM logi_imp_organisatie
        WHERE 1=1
     GROUP BY prs_afdeling_naam, prs_afdeling_naam2, prs_afdeling_omschrijving2;

   CURSOR c_afd2_del IS
    SELECT a.prs_afdeling_key, a.prs_afdeling_naam, a.niveau
      FROM prs_v_afdeling_fullnames a
     WHERE  a.niveau = 2
       AND NOT EXISTS (
            SELECT 'dummy'
              FROM LOGI_IMP_ORGANISATIE o
             WHERE o.prs_afdeling_naam2 = a.prs_afdeling_naam3);

   next_afd2_del                c_afd2_del%ROWTYPE;

   CURSOR c_afd3 IS
       SELECT prs_afdeling_naam, prs_afdeling_naam2, prs_afdeling_naam3, prs_afdeling_omschrijving3,
              '['||prs_afdeling_naam||'|'||prs_afdeling_naam2||'|'||prs_afdeling_naam3||'|'||prs_afdeling_omschrijving3||']' imp_row
         FROM logi_imp_organisatie
        WHERE 1=1
     GROUP BY prs_afdeling_naam, prs_afdeling_naam2, prs_afdeling_naam3, prs_afdeling_omschrijving3;

   CURSOR c_afd3_del IS
    SELECT a.prs_afdeling_key, a.prs_afdeling_naam, a.niveau
      FROM prs_v_afdeling_fullnames a
     WHERE  a.niveau = 3
       AND NOT EXISTS (
            SELECT 'dummy'
              FROM LOGI_IMP_ORGANISATIE o
             WHERE o.prs_afdeling_naam3 = a.prs_afdeling_naam3);

   next_afd3_del                c_afd3_del%ROWTYPE;
   next_afd2_del                c_afd2_del%ROWTYPE;
   next_afd1_del                c_afd1_del%ROWTYPE;

   next_afd1                    c_afd1%ROWTYPE;
   next_afd2                    c_afd2%ROWTYPE;
   next_afd3                    c_afd3%ROWTYPE;

   v_errormsg                   VARCHAR (1000);
   v_errorhint                  VARCHAR (200);
   v_imp                        VARCHAR(1000);
   oracle_err_num               NUMBER;
   oracle_err_mes               VARCHAR2 (200);

   -- Overige variabelen
   v_afdeling_key         NUMBER(10);
   v_afdeling_parentkey   NUMBER(10);
   v_afdeling_parentkey2  NUMBER(10);
   v_imp_row              VARCHAR2(1000);

   FUNCTION afdeling_delete (p_afdeling_key IN NUMBER, p_afdeling_naam IN VARCHAR2, p_niveau IN NUMBER) RETURN BOOLEAN IS
        c_inactief                    VARCHAR2(16)                         := 'INACTIEF:';
    BEGIN


        UPDATE prs_afdeling
           SET prs_afdeling_verwijder = SYSDATE
         WHERE prs_afdeling_key       = p_afdeling_key
           AND prs_afdeling_verwijder IS NULL;


        RETURN TRUE;
    EXCEPTION
        WHEN OTHERS
        THEN

           fac.imp_writelog (p_import_key,
                             'E',
                             'Afdeling kan niet inactief worden gemaakt (heeft nog personen)',
                             'Niveau=['||to_char(p_niveau)||'] Afdelingnaam=['||p_afdeling_naam||']'||' Afdelingskey=[' || p_afdeling_key || ']'
                            );

           UPDATE prs_afdeling
              SET prs_afdeling_omschrijving = SUBSTR (c_inactief || prs_afdeling_omschrijving, 1, 60)
            WHERE prs_afdeling_key = p_afdeling_key
              AND prs_afdeling_omschrijving NOT LIKE c_inactief ||'%'
              AND prs_afdeling_verwijder IS NULL;

          RETURN FALSE;
    END;

BEGIN

  -- Uiteraard verwijderen vaan hoog naar laag afdelingsniveau ivm referenties
  FOR next_afd3_del IN c_afd3_del LOOP
  BEGIN
    IF afdeling_delete(next_afd3_del.prs_afdeling_key, next_afd3_del.prs_afdeling_naam, next_afd3_del.niveau) THEN
      commit; -- update
    ELSE
      commit; -- logging
    END IF;
  END;
  END LOOP;
  --
  FOR next_afd2_del IN c_afd2_del LOOP
  BEGIN
    IF afdeling_delete(next_afd2_del.prs_afdeling_key, next_afd2_del.prs_afdeling_naam, next_afd2_del.niveau) THEN
      commit; -- update
    ELSE
      commit; -- logging
    END IF;
  END;
  END LOOP;
  --
  FOR next_afd1_del IN c_afd1_del LOOP
  BEGIN
    IF afdeling_delete(next_afd1_del.prs_afdeling_key, next_afd1_del.prs_afdeling_naam, next_afd1_del.niveau) THEN
      commit; -- update
    ELSE
      commit; -- logging
    END IF;
  END;
  END LOOP;

  COMMIT;

  -- Hoogste afdelingsniveau (direct onder bedrijf)
  FOR next_afd1 IN c_afd1 LOOP
  BEGIN
    v_errorhint := 'Volgende afdeling op niveau1';

    v_imp_row := next_afd1.imp_row;

    SELECT  COALESCE(MAX(prs_afdeling_key),-1)
    INTO    v_afdeling_key
    FROM    prs_afdeling
    WHERE   UPPER(prs_afdeling_upper) = UPPER(next_afd1.prs_afdeling_naam)
    AND     prs_afdeling_verwijder is null
    AND     prs_bedrijf_key = c_bedrijf_key;

    IF (v_afdeling_key = -1) THEN

      v_errorhint := 'Fout bij toevoegen afdeling op niveau 1';
      insert into PRS_AFDELING
      (prs_afdeling_naam
      ,prs_afdeling_omschrijving
      ,prs_bedrijf_key
      ,prs_afdeling_parentkey
      ,prs_kostenplaats_key
      )
       values
      (next_afd1.prs_afdeling_naam
      ,next_afd1.prs_afdeling_omschrijving
      ,c_bedrijf_key
      ,TO_NUMBER(NULL)
      ,TO_NUMBER(NULL)
      );

    ELSE

      v_errorhint := 'Fout bij wijzigen afdeling op niveau 1';
      update  PRS_AFDELING
      set     prs_afdeling_omschrijving = next_afd1.prs_afdeling_omschrijving
      where   prs_afdeling_key = v_afdeling_key;

    END IF;

    commit;

    EXCEPTION
    WHEN OTHERS
    THEN

       oracle_err_num := SQLCODE;
       oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
       v_errormsg := v_errormsg || 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
       fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint||v_imp_row);
       commit; -- logging


  END;
  END LOOP;


  -- Tweede afdelingsniveau
  FOR next_afd2 IN c_afd2 LOOP
  BEGIN
    v_errorhint := 'Volgende afdeling op niveau2';

    v_imp_row := next_afd2.imp_row;

    SELECT  prs_afdeling_key
    INTO    v_afdeling_parentkey
    FROM    prs_afdeling
    WHERE   UPPER(prs_afdeling_upper) = UPPER(next_afd2.prs_afdeling_naam)
    AND     prs_afdeling_verwijder is null
    AND     prs_bedrijf_key = c_bedrijf_key;

    SELECT  COALESCE(MAX(prs_afdeling_key),-1)
    INTO    v_afdeling_key
    FROM    prs_afdeling
    WHERE   UPPER(prs_afdeling_upper) = UPPER(next_afd2.prs_afdeling_naam2)
    AND     prs_afdeling_verwijder is null
    AND     prs_afdeling_parentkey = v_afdeling_parentkey;

    IF (v_afdeling_key = -1) THEN

      v_errorhint := 'Fout bij toevoegen afdeling op niveau 2';
      insert into PRS_AFDELING
      (prs_afdeling_naam
      ,prs_afdeling_omschrijving
      ,prs_bedrijf_key
      ,prs_afdeling_parentkey
      ,prs_kostenplaats_key
      )
       values
      (next_afd2.prs_afdeling_naam2
      ,next_afd2.prs_afdeling_omschrijving2
      ,TO_NUMBER(NULL)
      ,v_afdeling_parentkey
      ,TO_NUMBER(NULL)
      );

    ELSE

      v_errorhint := 'Fout bij wijzigen afdeling op niveau 2';
      update  PRS_AFDELING
      set     prs_afdeling_omschrijving = next_afd2.prs_afdeling_omschrijving2
      where   prs_afdeling_key = v_afdeling_key;

    END IF;

    commit;

    EXCEPTION
    WHEN OTHERS
    THEN

       oracle_err_num := SQLCODE;
       oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
       v_errormsg := v_errormsg || 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
       fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint||v_imp_row);
       commit; -- logging


  END;
  END LOOP;

  -- Derde afdelingsniveau
  FOR next_afd3 IN c_afd3 LOOP
  BEGIN
    v_errorhint := 'Volgende afdeling op niveau3';

    v_imp_row := next_afd3.imp_row;

    v_errorhint := 'Fout bij bepalen afdeling op niveau1';
    SELECT  prs_afdeling_key
    INTO    v_afdeling_parentkey
    FROM    prs_afdeling
    WHERE   UPPER(prs_afdeling_upper) = UPPER(next_afd3.prs_afdeling_naam)
    AND     prs_afdeling_verwijder is null
    AND     prs_bedrijf_key = c_bedrijf_key;

    v_errorhint := 'Fout bij bepalen afdeling op niveau2';
    SELECT  prs_afdeling_key
    INTO    v_afdeling_parentkey2
    FROM    prs_afdeling
    WHERE   UPPER(prs_afdeling_upper) = UPPER(next_afd3.prs_afdeling_naam2)
    AND     prs_afdeling_verwijder is null
    AND     prs_afdeling_parentkey = v_afdeling_parentkey;

    v_errorhint := 'Fout bij bepalen afdeling op niveau3';
    SELECT  COALESCE(MAX(prs_afdeling_key),-1)
    INTO    v_afdeling_key
    FROM    prs_afdeling
    WHERE   UPPER(prs_afdeling_upper) = UPPER(next_afd3.prs_afdeling_naam3)
    AND     prs_afdeling_verwijder is null
    AND     prs_afdeling_parentkey = v_afdeling_parentkey2;

    IF (v_afdeling_key = -1) THEN

      v_errorhint := 'Fout bij toevoegen afdeling op niveau 3';
      insert into PRS_AFDELING
      (prs_afdeling_naam
      ,prs_afdeling_omschrijving
      ,prs_bedrijf_key
      ,prs_afdeling_parentkey
      ,prs_kostenplaats_key
      )
       values
      (next_afd3.prs_afdeling_naam3
      ,next_afd3.prs_afdeling_omschrijving3
      ,TO_NUMBER(NULL)
      ,v_afdeling_parentkey2
      ,1
      );

    ELSE

      v_errorhint := 'Fout bij wijzigen afdeling op niveau 2';
      update  PRS_AFDELING
      set     prs_afdeling_omschrijving = next_afd3.prs_afdeling_omschrijving3
      where   prs_afdeling_key = v_afdeling_key;

    END IF;

    commit;

    EXCEPTION
    WHEN OTHERS
    THEN

       oracle_err_num := SQLCODE;
       oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
       v_errormsg := v_errormsg || 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
       fac.imp_writelog (p_import_key, 'E', v_errormsg, v_errorhint||v_imp_row);
       commit; -- logging


  END;
  END LOOP;

END;
/

-- Dummy export AUTO_STUFF!
CREATE OR REPLACE VIEW logi_v_export_auto_stuff (RESULT, result_order)
AS
   SELECT '', 0
     FROM DUAL
    WHERE 1 = 0
/

/* Formatted on 28-3-2012 17:14:45 (QP5 v5.115.810.9015) */
CREATE OR REPLACE PROCEDURE logi_select_auto_stuff (p_applname   IN VARCHAR2,
                                                    p_applrun    IN VARCHAR2)
AS
   CURSOR cresbots -- Botsing tussen WP-RES door dezelfde aanvrager -> delete!
   IS
      SELECT   '[' || rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr || '] '
                  aanduiding,
               rrr.res_rsv_ruimte_key
        FROM   res_v_aanwezigrsv_ruimte rrr, res_ruimte_opstelling rro, res_ruimte rr
       WHERE   rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
               AND rro.res_ruimte_key = rr.res_ruimte_key
               AND rr.res_discipline_key IN (621, 622, 623, 624, 625, 641)
               AND EXISTS
                     (SELECT   1
                        FROM   res_v_aanwezigrsv_ruimte rrr2, res_ruimte_opstelling rro2, res_ruimte rr2
                       WHERE   rrr2.res_ruimte_opstel_key = rro2.res_ruimte_opstel_key
                               AND rro2.res_ruimte_key = rr2.res_ruimte_key
                               AND rr2.res_discipline_key IN (621, 622, 623, 624, 625, 641)
                               AND rrr2.res_rsv_ruimte_key > rrr.res_rsv_ruimte_key
                               AND rrr2.res_rsv_ruimte_contact_key = rrr.res_rsv_ruimte_contact_key
                               AND rrr2.res_rsv_ruimte_van < rrr.res_rsv_ruimte_tot
                               AND rrr2.res_rsv_ruimte_tot > rrr.res_rsv_ruimte_van);

   CURSOR creshori                  -- WP-RES te ver in de toekomst -> delete!
   IS
      SELECT   '[' || rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr || '] '
                  aanduiding,
               rrr.res_rsv_ruimte_key
        FROM   res_v_aanwezigrsv_ruimte rrr, res_ruimte_opstelling rro, res_ruimte rr
       WHERE   rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
               AND rro.res_ruimte_key = rr.res_ruimte_key
               AND rr.res_discipline_key IN (621, 622, 623, 624, 625, 641)
               AND TRUNC (rrr.res_rsv_ruimte_van) > TRUNC (SYSDATE) + 15;

   CURSOR cresduur     -- WP-RES langer dan toegestane duur (1 uur) -> update!
   IS
      SELECT   '[' || rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr || '] '
                  aanduiding,
               rrr.res_rsv_ruimte_key
        FROM   res_v_aanwezigrsv_ruimte rrr, res_ruimte_opstelling rro, res_ruimte rr
       WHERE   rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
               AND rro.res_ruimte_key = rr.res_ruimte_key
               AND rr.res_discipline_key IN (621, 623)
               AND (rrr.res_rsv_ruimte_tot - rrr.res_rsv_ruimte_van) * 24 > 1;

   CURSOR cart
   IS
      SELECT   '[' || TO_CHAR (ra.res_rsv_ruimte_key) || '/' || TO_CHAR (ra.res_rsv_artikel_key) || '] '
                  aanduiding,
               ra.res_rsv_ruimte_key,
               ra.res_rsv_artikel_key,
               ra.res_artikel_key
        FROM   res_rsv_artikel ra
       WHERE   ra.res_status_bo_key = 2
               AND ra.res_rsv_artikel_dirtlevel = 0
               AND ra.res_rsv_artikel_verwijder IS NULL
               AND TRUNC (ra.res_rsv_artikel_levering + 1) < SYSDATE;

   CURSOR cobj
   IS
      SELECT   '[' || TO_CHAR (rd.res_rsv_ruimte_key) || '/' || TO_CHAR (rd.res_rsv_deel_key) || '] '
                  aanduiding,
               rd.res_rsv_ruimte_key,
               rd.res_rsv_deel_key
        FROM   res_rsv_deel rd
       WHERE   rd.res_status_bo_key = 2
               AND rd.res_rsv_ruimte_key IS NOT NULL   -- Geen parkeerplaatsen
               AND rd.res_rsv_deel_dirtlevel = 0
               AND rd.res_rsv_deel_verwijder IS NULL
               AND TRUNC (rd.res_rsv_deel_tot + 1) < SYSDATE;

   CURSOR cres
   IS
      SELECT   '[' || TO_CHAR (rrr.res_rsv_ruimte_key) || '] '
                  aanduiding,
               rrr.res_rsv_ruimte_key
        FROM   res_rsv_ruimte rrr
       WHERE   rrr.res_status_bo_key = 2
               AND rrr.res_ruimte_opstel_key IS NOT NULL -- Geen "roomservice"
               AND rrr.res_rsv_ruimte_dirtlevel = 0
               AND rrr.res_rsv_ruimte_verwijder IS NULL
               AND TRUNC (rrr.res_rsv_ruimte_tot + 1) < SYSDATE;

   -- LOGI#42327: Verwijderen bezoekers bij afspraken >6 maanden oud!
   CURSOR cafspraak
   IS
      SELECT a.bez_afspraak_key
        FROM bez_afspraak a
       WHERE ADD_MONTHS (a.bez_afspraak_datum, 6) < SYSDATE
             AND EXISTS (SELECT 1 FROM bez_bezoekers WHERE bez_afspraak_key = a.bez_afspraak_key);

   c_nu             DATE := SYSDATE;
   c_txt_anoniem    VARCHAR2 (200) := 'Geanonimiseerd';
   v_errorhint      VARCHAR2 (1000);
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_count          NUMBER;
   v_prijs          NUMBER (9, 2);
BEGIN
   v_count := 0;

   FOR r IN cresbots
   LOOP
      BEGIN
         v_errormsg := 'Fout bij verwijderen reservering';

         UPDATE   res_rsv_ruimte
            SET   res_rsv_ruimte_verwijder = SYSDATE
          WHERE   res_rsv_ruimte_key = r.res_rsv_ruimte_key;

         fac.trackaction ('RESDEL',
                          r.res_rsv_ruimte_key,
                          NULL,
                          NULL,
                          NULL);
         COMMIT;
         v_count := v_count + 1;
      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, 'E', r.aanduiding || v_errormsg, 'RES_WP-botsing');
            COMMIT;
      END;
   END LOOP;

   fac.writelog (p_applname, 'S', '#RES_WP-botsing deletes: ' || TO_CHAR (v_count), '');

   COMMIT;

   v_count := 0;

   FOR r IN creshori
   LOOP
      BEGIN
         v_errormsg := 'Fout bij verwijderen reservering';

         UPDATE   res_rsv_ruimte
            SET   res_rsv_ruimte_verwijder = SYSDATE
          WHERE   res_rsv_ruimte_key = r.res_rsv_ruimte_key;

         fac.trackaction ('RESDEL',
                          r.res_rsv_ruimte_key,
                          NULL,
                          NULL,
                          NULL);
         COMMIT;
         v_count := v_count + 1;
      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, 'E', r.aanduiding || v_errormsg, 'RES_WP-horizon');
            COMMIT;
      END;
   END LOOP;

   fac.writelog (p_applname, 'S', '#RES_WP-horizon deletes: ' || TO_CHAR (v_count), '');

   COMMIT;

   v_count := 0;

   FOR r IN cresduur
   LOOP
      BEGIN
         v_errormsg := 'Fout bij bijwerken reservering';

         UPDATE   res_rsv_ruimte
            SET   res_rsv_ruimte_tot = res_rsv_ruimte_van + (1 / 24)
          WHERE   res_rsv_ruimte_key = r.res_rsv_ruimte_key;

         fac.trackaction ('RESUPD',
                          r.res_rsv_ruimte_key,
                          NULL,
                          NULL,
                          NULL);
         COMMIT;
         v_count := v_count + 1;
      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, 'E', r.aanduiding || v_errormsg, 'RES_WP-tottijd');
            COMMIT;
      END;
   END LOOP;

   fac.writelog (p_applname, 'S', '#RES_WP-tottijd updates: ' || TO_CHAR (v_count), '');

   COMMIT;

   -- LOGI#23445: Automatisch afmelden reserveringen.
   FOR rc IN cart
   LOOP
      BEGIN
         v_errorhint := 'Fout bij bepalen res_rsv_artikel_prijs.';

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

         v_errorhint := 'Fout bij bijwerken res_rsv_artikel_prijs.';

         UPDATE   res_rsv_artikel
            SET   res_status_bo_key = 5,
                  res_rsv_artikel_prijs = v_prijs,
                  res_rsv_artikel_inkoopprijs =
                     (SELECT   res_artikel_inkoopprijs
                        FROM   res_artikel
                       WHERE   res_artikel_key = rc.res_artikel_key),
                  res_rsv_artikel_btw =
                     (SELECT   res_artikel_btw
                        FROM   res_artikel
                       WHERE   res_artikel_key = rc.res_artikel_key)
          WHERE   res_rsv_artikel_key = rc.res_rsv_artikel_key;

         fac.trackaction ('RESAFM',
                          rc.res_rsv_ruimte_key,
                          NULL,
                          NULL,
                          'Catering afgemeld');
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
            fac.writelog (p_applname, 'W', rc.aanduiding || v_errormsg, v_errorhint);
            COMMIT;
      END;
   END LOOP;

   COMMIT;

   FOR rc IN cobj
   LOOP
      BEGIN
         v_errorhint := 'Fout bij bepalen res_rsv_deel_prijs.';

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

         v_errorhint := 'Fout bij bijwerken res_rsv_deel_prijs.';

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

         fac.trackaction ('RESAFM',
                          rc.res_rsv_ruimte_key,
                          NULL,
                          NULL,
                          'Voorziening(en) afgemeld');
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
            fac.writelog (p_applname, 'W', rc.aanduiding || v_errormsg, v_errorhint);
            COMMIT;
      END;
   END LOOP;

   COMMIT;

   FOR rc IN cres
   LOOP
      BEGIN
         v_errorhint := 'Fout bij bepalen res_rsv_ruimte_prijs.';

         SELECT   res.getruimteprijs (rc.res_rsv_ruimte_key)
           INTO   v_prijs
           FROM   DUAL;

         v_errorhint := 'Fout bij bijwerken res_rsv_ruimte_prijs.';

         UPDATE   res_rsv_ruimte
            SET   res_status_bo_key = 5, res_rsv_ruimte_prijs = v_prijs
          WHERE   res_rsv_ruimte_key = rc.res_rsv_ruimte_key;

         fac.trackaction ('RESAFM',
                          rc.res_rsv_ruimte_key,
                          NULL,
                          NULL,
                          NULL);
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
            fac.writelog (p_applname, 'W', rc.aanduiding || v_errormsg, v_errorhint);
            COMMIT;
      END;
   END LOOP;

   COMMIT;

   FOR rc IN cafspraak
   LOOP
      DELETE FROM fac_tracking
            WHERE fac_srtnotificatie_key IN (44, 361)         -- BEZMAI/BEZUPD
                  AND fac_tracking_refkey = rc.bez_afspraak_key;

      DELETE FROM fac_tracking t
            WHERE t.fac_srtnotificatie_key IN (15, 16, 17, 18, 181, 581) -- BEZDON/BEZDO2/BEZOUT/BEZOU2/BEZBAD/BEZUNI
                  AND EXISTS
                        (SELECT 1
                           FROM bez_bezoekers
                          WHERE bez_afspraak_key = rc.bez_afspraak_key
                                AND bez_bezoekers_key = t.fac_tracking_refkey);

      DELETE FROM bez_bezoekers
            WHERE bez_afspraak_key = rc.bez_afspraak_key;

      fac.trackaction ('#BEZUPD',
                       rc.bez_afspraak_key,
                       NULL,
                       c_nu,
                       c_txt_anoniem);
   END LOOP;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.writelog (p_applname, 'E', 'Proces AUTO_STUFF afgebroken!', v_errormsg);
      COMMIT;
END;
/

-- LOGI#23445: Alleen spreekkamers (dus geen WP) en alleen met FO-status
-- Optie/Definitief (dus niet Blokkade en Vervallen)!
/* Formatted on 28-6-2012 14:24:48 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW LOGI_V_RAP_RES_INFOBORD
(
   AKTIEF,
   OFFSET,
   DAG,
   TIJD_VAN,
   TIJD_TOT,
   RUIMTE,
   CATALOGUS,
   AANVRAGER,
   GASTHEER,
   OMSCHRIJVING,
   STATUS,
   LOCATIE_CODE,
   GEBOUW_CODE,
   VERDIEPING_CODE,
   LOCATIE_OMSCHRIJVING,
   GEBOUW_OMSCHRIJVING,
   VERDIEPING_OMSCHRIJVING,
   ALG_LOCATIE_KEY,
   ALG_GEBOUW_KEY,
   ALG_VERDIEPING_KEY
)
AS
   SELECT   (CASE
                WHEN rrr.res_rsv_ruimte_van > SYSDATE THEN 'expected'
                WHEN rrr.res_rsv_ruimte_tot < SYSDATE THEN 'passed'
                ELSE 'active'
             END)
               aktief,
            TRUNC ( (SYSDATE - rrr.res_rsv_ruimte_van) * 24 * 60) offset,
            TO_CHAR (rrr.res_rsv_ruimte_van, 'dd-mm-yyyy') dag,
            TO_CHAR (rrr.res_rsv_ruimte_van, 'hh24:mi') tijd_van,
            TO_CHAR (rrr.res_rsv_ruimte_tot, 'hh24:mi') tijd_tot,
            rrg.res_ruimte_nr ruimte,
            rd.ins_discipline_omschrijving catalogus,
            aanvrager.prs_perslid_naam_full aanvrager,
            gastheer.prs_perslid_naam_full gastheer,
            rrr.res_rsv_ruimte_omschrijving omschrijving,
            sf.res_status_fo_omschrijving status,
            l.alg_locatie_code locatie_code,
            g.alg_gebouw_code gebouw_code,
            v.alg_verdieping_code verdieping_code,
            l.alg_locatie_omschrijving locatie_omschrijving,
            g.alg_gebouw_omschrijving gebouw_omschrijving,
            v.alg_verdieping_omschrijving verdieping_omschrijving,
            l.alg_locatie_key,
            g.alg_gebouw_key,
            v.alg_verdieping_key
     FROM   res_v_aanwezigrsv_ruimte rrr,
            res_ruimte_opstelling rro,
            res_v_res_ruimte_gegevens rrg,
            prs_v_perslid_fullnames aanvrager,
            prs_v_perslid_fullnames gastheer,
            alg_locatie l,
            alg_gebouw g,
            alg_verdieping v,
            res_status_fo sf,
            res_activiteit a,
            res_discipline rd
    WHERE       rrr.res_status_fo_key IN (1, 2)  -- Alleen Optie + Definitief!
            AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
            AND rro.res_ruimte_key = rrg.res_ruimte_key
            AND rrr.res_rsv_ruimte_host_key = gastheer.prs_perslid_key
            AND rrr.res_rsv_ruimte_contact_key = aanvrager.prs_perslid_key
            AND TRUNC (rrr.res_rsv_ruimte_van) = TRUNC (SYSDATE)
            AND rrg.alg_locatie_key = l.alg_locatie_key
            AND rrg.alg_gebouw_key = g.alg_gebouw_key
            AND rrg.alg_verdieping_key = v.alg_verdieping_key
            AND rrr.res_status_fo_key = sf.res_status_fo_key
            AND rrr.res_activiteit_key = a.res_activiteit_key
            AND a.res_srtactiviteit_key = 1      -- Ruimte (géén Voorz. + WP)!
            AND rrg.res_discipline_key = rd.ins_discipline_key;

-- LOGI#34117 notijob tbv optionele reserveringen
CREATE OR REPLACE VIEW LOGI_V_NOTI_RES_OPTIE
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   XKEY
)
AS
   SELECT   DISTINCT
            'RESNEW',
            NULL,
            res_rsv_ruimte_contact_key,
               'Let op: reservering '
            || rrr.res_reservering_key
            || '/'
            || rrr.res_rsv_ruimte_volgnr
            || ' ('
            || res_rsv_ruimte_van
            || ' - '
            || res_ruimte_nr
            || ') is optioneel'
               text,
            res_reservering_key,
            res_rsv_ruimte_key
     FROM   res_rsv_ruimte rrr,
            fac_tracking tr,
            fac_srtnotificatie srt,
            res_ruimte_opstelling rro,
            res_ruimte rr
    WHERE       res_rsv_ruimte_verwijder IS NULL
            AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
            AND rro.res_ruimte_key = rr.res_ruimte_key
            AND rrr.res_status_fo_key = 1
            AND tr.fac_srtnotificatie_key = srt.fac_srtnotificatie_key
            AND ( (tr.fac_tracking_refkey = rrr.res_rsv_ruimte_key
                   AND srt.fac_srtnotificatie_xmlnode IN
                            ('reservering', 'xreservering')))
            AND srt.fac_srtnotificatie_code = 'RESNEW'
            AND tr.fac_tracking_datum >
                  (SELECT   fac_notificatie_job_nextrun
                            - fac_notificatie_job_interval / 24
                     FROM   fac_notificatie_job
                    WHERE   fac_notificatie_job_view =
                               'LOGI_V_NOTI_RES_OPTIE');

-- Bevat CUST01- en CUST02-reminders naar verantwoordelijken voor inspectie
-- van betreffende objecten.
-- LET OP: Notificatiejob via xemail!!!
-- CUST01: wekelijks mbt. over 1 tot 2 weken te keuren objecten!
-- CUST02: wekelijks mbt. objecten waarvan keuringsdatum is verstreken!
/* Formatted on 7-1-2016 17:28:32 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW LOGI_V_NOTI_INSPECTIEREMINDER
(
   code,
   sender,
   receiver,
   text,
   KEY,
   par1,
   par2,
   xkey,
   xemail,
   xmobile
)
AS
   SELECT sn.fac_srtnotificatie_code code,
          NULL sender,
          NULL receiver,
          REPLACE (
             REPLACE (
                sn.fac_srtnotificatie_oms,
                '##SRTGROEP##',
                DECODE (
                   x.min_srtgroep_oms,
                   x.max_srtgroep_oms,
                   x.min_srtgroep_oms
                   || DECODE (x.aantal, 1, '/' || min_controle_oms, ''),
                   x.min_srtgroep_oms || ', ...')),
             '##AANTAL##',
             x.aantal)
             subject,
          x.dummy_deel_key,                                    -- Dummy key!!!
          NULL,
          NULL,
          NULL,
          x.alg_locatie_email,
          NULL
     FROM (  SELECT l.alg_locatie_email,
                    MIN (din.ins_srtcontrole_omschrijving) min_controle_oms,
                    MIN (sg.ins_srtgroep_omschrijving) min_srtgroep_oms,
                    MAX (sg.ins_srtgroep_omschrijving) max_srtgroep_oms,
                    MIN (d.ins_deel_key) dummy_deel_key,
                    COUNT (DISTINCT d.ins_deel_key) aantal
               FROM ins_deel d,
                    ins_srtdeel sd,
                    ins_srtgroep sg,
                    alg_locatie l,
                    (SELECT ins_deel_key, inspectie_next, ins_srtcontrole_omschrijving
                       FROM (WITH defined_inspect
                                     AS (SELECT *
                                           FROM ins_deel d, ins_srtdeel sd, ins_srtcontrole sc
                                          WHERE d.ins_srtdeel_key = sd.ins_srtdeel_key
                                                AND (sc.ins_srtcontrole_niveau ='S'
                                                     AND sc.ins_srtinstallatie_key = d.ins_srtdeel_key
                                                     OR sc.ins_srtcontrole_niveau = 'G'
                                                       AND sc.ins_srtinstallatie_key = sd.ins_srtgroep_key
                                                     OR sc.ins_srtcontrole_niveau = 'D'
                                                       AND sc.ins_srtinstallatie_key = d.ins_discipline_key))
                             SELECT 1 rn,      -- NOG GEEN INSPECTIES GEWEEST!
                                    di.ins_deel_key,
                                    fac.nextcyclusdate (
                                       di.ins_deel_aanmaak,
                                       di.ins_srtcontrole_mode,
                                       COALESCE (xcp.ins_srtcontroledl_xcp_eenheid, di.ins_srtcontrole_eenheid),
                                       COALESCE (xcp.ins_srtcontroledl_xcp_periode, di.ins_srtcontrole_periode),
                                       COALESCE (xcp.ins_srtcontroledl_xcp_bits, di.ins_srtcontrole_bits),
                                       1)
                                       inspectie_next,
                                    di.ins_srtcontrole_omschrijving
                               FROM defined_inspect di, ins_srtcontroledl_xcp xcp
                              WHERE (di.ins_deel_key, di.ins_srtcontrole_key) NOT IN
                                          (SELECT ins_deel_key,  ins_srtcontrole_key
                                             FROM ins_deelsrtcontrole
                                            WHERE ins_deelsrtcontrole_status IN (5, 6))
                                    AND di.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)
                                    AND di.ins_deel_key = xcp.ins_deel_key(+)
                                    AND (xcp.ins_srtcontroledl_xcp_eind(+) IS NULL
                                         OR xcp.ins_srtcontroledl_xcp_eind(+) > TRUNC (SYSDATE, 'DD'))
                             UNION ALL
                             SELECT RANK ()
                                       OVER (
                                          PARTITION BY di.ins_deel_key, dsc.ins_srtcontrole_key
                                          ORDER BY ins_deelsrtcontrole_datum DESC)
                                       rn,
                                    di.ins_deel_key,
                                    fac.nextcyclusdate (
                                       CASE
                                          WHEN di.ins_srtcontrole_mode = 0
                                          THEN dsc.ins_deelsrtcontrole_datum_org
                                          ELSE dsc.ins_deelsrtcontrole_datum
                                       END,
                                       di.ins_srtcontrole_mode,
                                       COALESCE (xcp.ins_srtcontroledl_xcp_eenheid, di.ins_srtcontrole_eenheid),
                                       COALESCE (xcp.ins_srtcontroledl_xcp_periode, di.ins_srtcontrole_periode),
                                       COALESCE (xcp.ins_srtcontroledl_xcp_bits, di.ins_srtcontrole_bits),
                                       1)
                                       inspectie_next,
                                    di.ins_srtcontrole_omschrijving
                               FROM ins_deelsrtcontrole dsc, defined_inspect di, ins_srtcontroledl_xcp xcp
                              WHERE dsc.ins_deelsrtcontrole_status IN (5, 6)
                                    AND di.ins_deel_key = dsc.ins_deel_key
                                    AND di.ins_srtcontrole_key = dsc.ins_srtcontrole_key
                                    AND di.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)
                                    AND di.ins_deel_key = xcp.ins_deel_key(+)
                                    AND (xcp.ins_srtcontroledl_xcp_eind(+) IS NULL
                                         OR xcp.ins_srtcontroledl_xcp_eind(+) > TRUNC (SYSDATE, 'DD'))
                             ORDER BY inspectie_next)
                      WHERE rn = 1) din
              WHERE     d.ins_deel_module = 'INS'
                    AND d.ins_deel_verwijder IS NULL
                    AND d.ins_deel_parent_key IS NULL
                    AND (d.ins_deel_vervaldatum IS NULL OR d.ins_deel_vervaldatum > TRUNC (SYSDATE))
                    AND d.ins_srtdeel_key = sd.ins_srtdeel_key
                    AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
                    AND d.ins_alg_locatie_key = l.alg_locatie_key
                    AND d.ins_deel_key = din.ins_deel_key
                    AND din.inspectie_next BETWEEN TRUNC (SYSDATE + 7) AND TRUNC (SYSDATE + 14)
           GROUP BY l.alg_locatie_email) x,
          fac_srtnotificatie sn
    WHERE sn.fac_srtnotificatie_code = 'CUST01'
   UNION ALL
   SELECT sn.fac_srtnotificatie_code code,
          NULL sender,
          NULL receiver,
          REPLACE (
             REPLACE (
                sn.fac_srtnotificatie_oms,
                '##SRTGROEP##',
                DECODE (
                   x.min_srtgroep_oms,
                   x.max_srtgroep_oms,
                   x.min_srtgroep_oms
                   || DECODE (x.aantal, 1, '/' || min_controle_oms, ''),
                   x.min_srtgroep_oms || ', ...')),
             '##AANTAL##',
             x.aantal)
             subject,
          x.dummy_deel_key,                                    -- Dummy key!!!
          NULL,
          NULL,
          NULL,
          x.alg_locatie_email,
          NULL
     FROM (  SELECT l.alg_locatie_email,
                    MIN (din.ins_srtcontrole_omschrijving) min_controle_oms,
                    MIN (sg.ins_srtgroep_omschrijving) min_srtgroep_oms,
                    MAX (sg.ins_srtgroep_omschrijving) max_srtgroep_oms,
                    MIN (d.ins_deel_key) dummy_deel_key,
                    COUNT (DISTINCT d.ins_deel_key) aantal
               FROM ins_deel d,
                    ins_srtdeel sd,
                    ins_srtgroep sg,
                    alg_locatie l,
                    (SELECT ins_deel_key, inspectie_next, ins_srtcontrole_omschrijving
                       FROM (WITH defined_inspect
                                     AS (SELECT *
                                           FROM ins_deel d, ins_srtdeel sd, ins_srtcontrole sc
                                          WHERE d.ins_srtdeel_key = sd.ins_srtdeel_key
                                                AND (sc.ins_srtcontrole_niveau = 'S'
                                                     AND sc.ins_srtinstallatie_key = d.ins_srtdeel_key
                                                     OR sc.ins_srtcontrole_niveau = 'G'
                                                       AND sc.ins_srtinstallatie_key = sd.ins_srtgroep_key
                                                     OR sc.ins_srtcontrole_niveau = 'D'
                                                       AND sc.ins_srtinstallatie_key = d.ins_discipline_key))
                             SELECT 1 rn,      -- NOG GEEN INSPECTIES GEWEEST!
                                    di.ins_deel_key,
                                    --COALESCE (
                                    --   xcp.ins_srtcontroledl_xcp_respijt,
                                    --   fac.nextcyclusdate (
                                    --      di.ins_deel_aanmaak,
                                    --      di.ins_srtcontrole_mode,
                                    --      COALESCE (
                                    --         xcp.ins_srtcontroledl_xcp_eenheid,
                                    --         di.ins_srtcontrole_eenheid),
                                    --      COALESCE (
                                    --         xcp.ins_srtcontroledl_xcp_periode,
                                    --         di.ins_srtcontrole_periode),
                                    --      COALESCE (
                                    --         xcp.ins_srtcontroledl_xcp_bits,
                                    --         di.ins_srtcontrole_bits),
                                    --      1))
                                    fac.nextcyclusdate (
                                       di.ins_deel_aanmaak,
                                       di.ins_srtcontrole_mode,
                                       COALESCE (xcp.ins_srtcontroledl_xcp_eenheid, di.ins_srtcontrole_eenheid),
                                       COALESCE (xcp.ins_srtcontroledl_xcp_periode, di.ins_srtcontrole_periode),
                                       COALESCE (xcp.ins_srtcontroledl_xcp_bits, di.ins_srtcontrole_bits),
                                       1)
                                       inspectie_next,
                                    di.ins_srtcontrole_omschrijving
                               FROM defined_inspect di, ins_srtcontroledl_xcp xcp
                              WHERE (di.ins_deel_key, di.ins_srtcontrole_key) NOT IN
                                          (SELECT ins_deel_key, ins_srtcontrole_key
                                             FROM ins_deelsrtcontrole
                                            WHERE ins_deelsrtcontrole_status IN (5, 6))
                                    AND di.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)
                                    AND di.ins_deel_key = xcp.ins_deel_key(+)
                                    AND (xcp.ins_srtcontroledl_xcp_eind(+) IS NULL
                                         OR xcp.ins_srtcontroledl_xcp_eind(+) > TRUNC (SYSDATE, 'DD'))
                             UNION ALL
                             SELECT RANK ()
                                       OVER (
                                          PARTITION BY di.ins_deel_key, dsc.ins_srtcontrole_key
                                          ORDER BY ins_deelsrtcontrole_datum DESC)
                                       rn,
                                    di.ins_deel_key,
                                    fac.nextcyclusdate (
                                       CASE
                                          WHEN di.ins_srtcontrole_mode = 0
                                          THEN dsc.ins_deelsrtcontrole_datum_org
                                          ELSE dsc.ins_deelsrtcontrole_datum
                                       END,
                                       di.ins_srtcontrole_mode,
                                       COALESCE (xcp.ins_srtcontroledl_xcp_eenheid, di.ins_srtcontrole_eenheid),
                                       COALESCE (xcp.ins_srtcontroledl_xcp_periode, di.ins_srtcontrole_periode),
                                       COALESCE (xcp.ins_srtcontroledl_xcp_bits, di.ins_srtcontrole_bits),
                                       1)
                                       inspectie_next,
                                    di.ins_srtcontrole_omschrijving
                               FROM ins_deelsrtcontrole dsc, defined_inspect di, ins_srtcontroledl_xcp xcp
                              WHERE dsc.ins_deelsrtcontrole_status IN (5, 6)
                                    AND di.ins_deel_key = dsc.ins_deel_key
                                    AND di.ins_srtcontrole_key = dsc.ins_srtcontrole_key
                                    AND di.ins_srtcontrole_key = xcp.ins_srtcontrole_key(+)
                                    AND di.ins_deel_key = xcp.ins_deel_key(+)
                                    AND (xcp.ins_srtcontroledl_xcp_eind(+) IS NULL
                                         OR xcp.ins_srtcontroledl_xcp_eind(+) > TRUNC (SYSDATE, 'DD'))
                             ORDER BY inspectie_next)
                      WHERE rn = 1) din
              WHERE     d.ins_deel_module = 'INS'
                    AND d.ins_deel_verwijder IS NULL
                    AND d.ins_deel_parent_key IS NULL
                    AND (d.ins_deel_vervaldatum IS NULL OR d.ins_deel_vervaldatum > TRUNC (SYSDATE))
                    AND d.ins_srtdeel_key = sd.ins_srtdeel_key
                    AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
                    AND d.ins_alg_locatie_key = l.alg_locatie_key
                    AND d.ins_deel_key = din.ins_deel_key
                    AND din.inspectie_next < TRUNC (SYSDATE)
           GROUP BY l.alg_locatie_email) x,
          fac_srtnotificatie sn
    WHERE sn.fac_srtnotificatie_code = 'CUST02';

CREATE OR REPLACE VIEW LOGI_V_RAP_MLDINSRES_QRC
(
   FCLT_F_DISCIPLINE,
   FCLT_F_SOORTMELDING,
   FCLT_F_LOCATIE,
   FCLT_F_GEBOUW,
   FCLT_F_VERDIEPING,
   PLAATS,
   RUIMTE_KEY,
   RUIMTEFUNCTIE,
   FCLT_F_OBJECTDISCIPLINE,
   FCLT_F_OBJECTGROEP,
   OBJECTSOORT_KEY,
   FCLT_F_OBJECTSOORT,
   OBJECTSOORT_CODE,
   DEEL_KEY,
   DEEL_OMSCHRIJVING,
   DEEL_UPPER,
   HIDE_F_BOOKMARK_ID,
   VARIABELE
)
AS
   SELECT    md.ins_discipline_omschrijving,
          msd.mld_stdmelding_omschrijving,
          l.alg_locatie_omschrijving,
          o.alg_gebouw_omschrijving,
          o.alg_verdieping_omschrijving,
          o.alg_plaatsaanduiding plaats,
          d.ins_alg_ruimte_key ruimte_key,
          sr.alg_srtruimte_omschrijving,
          disc.ins_discipline_omschrijving,
          sg.ins_srtgroep_omschrijving,
          sd.ins_srtdeel_key,
          sd.ins_srtdeel_omschrijving,
          sd.ins_srtdeel_code,
          d.ins_deel_key,
          d.ins_deel_omschrijving,
          d.ins_deel_upper,
          b.fac_bookmark_id,
          'INS_KEY'
     FROM (SELECT DECODE (
                     INSTR (
                        SUBSTR (
                           UPPER (fac_bookmark_query),
                           INSTR (UPPER (fac_bookmark_query), 'STDM_KEY=')),
                        '&'),
                     0,
                     SUBSTR (
                        SUBSTR (
                           UPPER (fac_bookmark_query),
                           INSTR (UPPER (fac_bookmark_query), 'STDM_KEY=')),
                        10),
                     SUBSTR (
                        SUBSTR (
                           UPPER (fac_bookmark_query),
                           INSTR (UPPER (fac_bookmark_query), 'STDM_KEY=')),
                        10,
                        INSTR (
                           SUBSTR (
                              UPPER (fac_bookmark_query),
                              INSTR (UPPER (fac_bookmark_query), 'STDM_KEY=')),
                           '&')
                        - 10))
                     stdm_key,
                  fac_bookmark_id
             FROM fac_bookmark
            WHERE TRUNC (fac_bookmark_aanmaak) >=
                     TO_DATE ('10062013', 'ddmmyyyy')
                  AND UPPER (fac_bookmark_path) = 'APPL/PDA/MELDING.ASP'
                  AND INSTR (UPPER (fac_bookmark_query), 'STDM_KEY') > 0) b, -- stdm_key-bookmarks
          (SELECT   sm.mld_ins_discipline_key,
                    sm.mld_stdmelding_key,
                    sm.mld_stdmelding_omschrijving,
                    si.ins_srtinstallatie_key ins_srtdeel_key
             FROM   mld_stdmelding sm,
                    mld_stdmelding_srtinst si
            WHERE       sm.mld_stdmelding_key = si.mld_stdmelding_key
                    AND sm.mld_stdmelding_verwijder IS NULL
                    AND si.ins_srtinstallatie_niveau = 'S'
           UNION ALL
           SELECT   sm.mld_ins_discipline_key,
                    sm.mld_stdmelding_key,
                    sm.mld_stdmelding_omschrijving,
                    sd.ins_srtdeel_key
             FROM   mld_stdmelding sm,
                    mld_stdmelding_srtinst si,
                    ins_srtdeel sd
            WHERE       sm.mld_stdmelding_key = si.mld_stdmelding_key
                    AND sm.mld_stdmelding_verwijder IS NULL
                    AND si.ins_srtinstallatie_niveau = 'G'
                    AND si.ins_srtinstallatie_key = sd.ins_srtgroep_key
           UNION ALL
           SELECT   sm.mld_ins_discipline_key,
                    sm.mld_stdmelding_key,
                    sm.mld_stdmelding_omschrijving,
                    sd.ins_srtdeel_key
             FROM   mld_stdmelding sm,
                    mld_stdmelding_srtinst si,
                    ins_srtgroep sg,
                    ins_srtdeel sd
            WHERE       sm.mld_stdmelding_key = si.mld_stdmelding_key
                    AND sm.mld_stdmelding_verwijder IS NULL
                    AND si.ins_srtinstallatie_niveau = 'D'
                    AND si.ins_srtinstallatie_key = sg.ins_discipline_key
                    AND sg.ins_srtgroep_key = sd.ins_srtgroep_key) msd, -- object-meldingen
          mld_discipline md,
          ins_v_aanwezigdeel d,
          ins_srtdeel sd,
          ins_srtgroep sg,
          ins_discipline disc,
          ins_v_alg_overzicht o,
          alg_locatie l,
          alg_ruimte r,
          alg_srtruimte sr
    WHERE     fac.safe_to_number (b.stdm_key) = msd.mld_stdmelding_key
          AND msd.mld_ins_discipline_key = md.ins_discipline_key
          AND msd.ins_srtdeel_key = d.ins_srtdeel_key
          AND d.ins_alg_ruimte_type IN ('T', 'R', 'W')
          AND d.ins_deel_parent_key IS NULL
          AND d.ins_srtdeel_key = sd.ins_srtdeel_key
          AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
          AND sg.ins_discipline_key = disc.ins_discipline_key
          AND d.ins_alg_ruimte_key = o.alg_onroerendgoed_keys
          AND d.ins_alg_ruimte_type = o.alg_onroerendgoed_type
          AND d.ins_alg_locatie_key = o.alg_locatie_key          -- redundant?
          AND o.alg_locatie_key = l.alg_locatie_key
          AND d.ins_alg_ruimte_key = r.alg_ruimte_key
          AND r.alg_srtruimte_key = sr.alg_srtruimte_key(+);

  CREATE OR REPLACE VIEW LOGI_V_RAP_RUIMINSRES_QRC
(
   FCLT_F_LOCATIE,
   FCLT_F_GEBOUW,
   FCLT_F_VERDIEPING,
   FCLT_F_RUIMTEFUNCTIE,
   PLAATS,
   RUIMTE_KEY,
   HIDE_F_BOOKMARK_ID,
   VARIABELE
)
  AS
  SELECT
          l.alg_locatie_omschrijving,
          o.alg_gebouw_omschrijving,
          o.alg_verdieping_omschrijving,
          sr.alg_srtruimte_omschrijving,
          o.alg_plaatsaanduiding plaats,
          r.alg_ruimte_key ruimte_key,
          b.fac_bookmark_id,
          'RUIMTE_KEY'
     FROM fac_bookmark b,
          alg_v_aanwezigruimte r,
          alg_srtruimte sr,
          ins_v_alg_overzicht o,
          alg_locatie l
    WHERE
          UPPER (b.fac_bookmark_naam) LIKE '%SANI%'
          AND UPPER (b.fac_bookmark_path) = 'APPL/PDA/MELDING.ASP'
          AND r.alg_srtruimte_key = sr.alg_srtruimte_key(+)
          AND r.alg_ruimte_key = o.alg_onroerendgoed_keys
          AND o.alg_onroerendgoed_type = 'R'
          AND o.alg_locatie_key = l.alg_locatie_key
          AND sr.alg_srtruimte_key IN ('47', '48', '49', '84', '85', '101', '105');

 CREATE OR REPLACE VIEW LOGI_V_RAP_MEETING_QRC
(
   FCLT_F_LOCATIE,
   FCLT_F_GEBOUW,
   FCLT_F_VERDIEPING,
   FCLT_F_RUIMTEFUNCTIE,
   PLAATS,
   RUIMTE_KEY,
   HIDE_F_BOOKMARK_ID,
   VARIABELE
)
  AS
  SELECT
          l.alg_locatie_omschrijving,
          o.alg_gebouw_omschrijving,
          o.alg_verdieping_omschrijving,
          sr.alg_srtruimte_omschrijving,
          o.alg_plaatsaanduiding plaats,
          r.alg_ruimte_key ruimte_key,
          b.fac_bookmark_id,
          'RUIMTE_KEY'
     FROM fac_bookmark b,
          alg_v_aanwezigruimte r,
          alg_srtruimte sr,
          ins_v_alg_overzicht o,
          alg_locatie l
    WHERE
          UPPER (b.fac_bookmark_naam) LIKE '%MEETING%'
          AND UPPER (b.fac_bookmark_path) = 'APPL/RES/MELDING.ASP'
          AND r.alg_srtruimte_key = sr.alg_srtruimte_key(+)
          AND r.alg_ruimte_key = o.alg_onroerendgoed_keys
          AND o.alg_onroerendgoed_type = 'R'
          AND o.alg_locatie_key = l.alg_locatie_key
          AND sr.alg_srtruimte_key = '44';

CREATE OR REPLACE VIEW LOGI_V_RAP_MEETING_RES_QRC
(
   fclt_f_locatie,
   fclt_f_gebouw,
   fclt_f_verdieping,
   plaats,
   ruimte_key,
   ruimtefunctie,
   hide_f_bookmark_id,
   variabele
)
  AS
   SELECT l.alg_locatie_omschrijving,
          o.alg_gebouw_omschrijving,
          o.alg_verdieping_omschrijving,
          rr.res_ruimte_nr plaats,
          rar.res_ruimte_key ruimte_key,
          sr.alg_srtruimte_omschrijving,
          b.fac_bookmark_id,
          'RES_RUIMTE_KEY'
     FROM fac_bookmark b,
          res_ruimte rr,
          (  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) rar,
          alg_ruimte r,
          alg_srtruimte sr,
          ins_v_alg_overzicht o,
          alg_locatie l
    WHERE UPPER (b.fac_bookmark_naam) LIKE '%MEETING%'
          AND UPPER (b.fac_bookmark_path) = 'APPL/PDA/RESERVERINGEN.ASP'
          AND rr.res_ruimte_key = rar.res_ruimte_key
          AND rar.alg_ruimte_key = r.alg_ruimte_key
          AND r.alg_srtruimte_key = sr.alg_srtruimte_key(+)
          AND r.alg_ruimte_key = o.alg_onroerendgoed_keys
          AND o.alg_onroerendgoed_type = 'R'
          AND o.alg_locatie_key = l.alg_locatie_key
          AND sr.alg_srtruimte_key = '44';

/*
   UNION ALL
   SELECT 'Melding op object',
          l.alg_locatie_omschrijving,
          o.alg_gebouw_omschrijving,
          o.alg_verdieping_omschrijving,
          o.alg_plaatsaanduiding plaats,
          NULL ruimte_key,
          sr.alg_srtruimte_omschrijving,
          disc.ins_discipline_omschrijving,
          sg.ins_srtgroep_omschrijving,
          sd.ins_srtdeel_key,
          sd.ins_srtdeel_omschrijving,
          sd.ins_srtdeel_code,
          d.ins_deel_key,
          d.ins_deel_omschrijving,
          d.ins_deel_upper,
          b.fac_bookmark_id,
          'INS_KEY'
     FROM fac_bookmark b,
          ins_v_aanwezigdeel d,
          ins_srtdeel sd,
          ins_srtgroep sg,
          ins_discipline disc,
          ins_v_alg_overzicht o,
          alg_locatie l,
          alg_ruimte r,
          alg_srtruimte sr
    WHERE TRUNC (b.fac_bookmark_aanmaak) = TO_DATE ('10062013', 'ddmmyyyy')
          AND UPPER (b.fac_bookmark_naam) LIKE '%GENERIEK%'
          AND UPPER (b.fac_bookmark_path) = 'APPL/PDA/INS_DEEL.ASP'
          AND d.ins_alg_ruimte_type IN ('T', 'R', 'W')
          AND d.ins_deel_parent_key IS NULL
          AND d.ins_srtdeel_key = sd.ins_srtdeel_key
          AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
          AND sg.ins_discipline_key = disc.ins_discipline_key
          AND d.ins_alg_ruimte_key = o.alg_onroerendgoed_keys
          AND d.ins_alg_ruimte_type = o.alg_onroerendgoed_type
          AND d.ins_alg_locatie_key = o.alg_locatie_key          -- redundant?
          AND o.alg_locatie_key = l.alg_locatie_key
          AND d.ins_alg_ruimte_key = r.alg_ruimte_key
          AND r.alg_srtruimte_key = sr.alg_srtruimte_key(+);
   UNION ALL
   SELECT 'Melding op ruimte',
          l.alg_locatie_omschrijving,
          o.alg_gebouw_omschrijving,
          o.alg_verdieping_omschrijving,
          o.alg_plaatsaanduiding plaats,
          r.alg_ruimte_key ruimte_key,
          sr.alg_srtruimte_omschrijving,
          NULL ins_discipline_omschrijving,
          NULL ins_srtgroep_omschrijving,
          NULL ins_srtdeel_key,
          NULL ins_srtdeel_omschrijving,
          NULL ins_srtdeel_code,
          NULL ins_deel_key,
          NULL ins_deel_omschrijving,
          NULL ins_deel_upper,
          b.fac_bookmark_id,
          'RUIMTE_KEY'
     FROM fac_bookmark b,
          alg_v_aanwezigruimte r,
          alg_srtruimte sr,
          ins_v_alg_overzicht o,
          alg_locatie l
    WHERE TRUNC (b.fac_bookmark_aanmaak) = TO_DATE ('10062013', 'ddmmyyyy')
          AND UPPER (b.fac_bookmark_naam) LIKE '%GENERIEK%'
          AND UPPER (b.fac_bookmark_path) = 'APPL/PDA/MELDING.ASP'
          AND INSTR (UPPER (fac_bookmark_query), 'STDM_KEY') = 0
          AND r.alg_srtruimte_key = sr.alg_srtruimte_key(+)
          AND r.alg_ruimte_key = o.alg_onroerendgoed_keys
          AND o.alg_onroerendgoed_type = 'R'
          AND o.alg_locatie_key = l.alg_locatie_key
   UNION ALL
   SELECT 'Melding op gebouw',
          l.alg_locatie_omschrijving,
          g.alg_gebouw_omschrijving,
          NULL alg_verdieping_omschrijving,
          l.alg_locatie_code || '-' || g.alg_gebouw_code plaats,
          g.alg_gebouw_key ruimte_key,
          sg.alg_srtgebouw_omschrijving,
          NULL ins_discipline_omschrijving,
          NULL ins_srtgroep_omschrijving,
          NULL ins_srtdeel_key,
          NULL ins_srtdeel_omschrijving,
          NULL ins_srtdeel_code,
          NULL ins_deel_key,
          NULL ins_deel_omschrijving,
          NULL ins_deel_upper,
          b.fac_bookmark_id,
          'GEBOUW_KEY'
     FROM fac_bookmark b,
          alg_v_aanweziggebouw g,
          alg_v_aanwezigsrtgebouw sg,
          alg_locatie l
    WHERE TRUNC (b.fac_bookmark_aanmaak) = TO_DATE ('30012014', 'ddmmyyyy')
          AND UPPER (b.fac_bookmark_naam) LIKE '%GENERIEK%'
          AND UPPER (b.fac_bookmark_path) = 'APPL/PDA/MELDING.ASP'
          AND INSTR (UPPER (fac_bookmark_query), 'STDM_KEY') = 0
          AND g.alg_srtgebouw_key = sg.alg_srtgebouw_key(+)
          AND g.alg_locatie_key = l.alg_locatie_key
   UNION ALL                          -- Reserveerbare ruimtes 50=Gemeentehuis
   SELECT 'Reserveer ruimte',
          l.alg_locatie_omschrijving,
          o.alg_gebouw_omschrijving,
          o.alg_verdieping_omschrijving,
          rr.res_ruimte_nr plaats,
          rar.res_ruimte_key ruimte_key,
          sr.alg_srtruimte_omschrijving,
          NULL ins_discipline_omschrijving,
          NULL ins_srtgroep_omschrijving,
          NULL ins_srtdeel_key,
          NULL ins_srtdeel_omschrijving,
          NULL ins_srtdeel_code,
          NULL ins_deel_key,
          NULL ins_deel_omschrijving,
          NULL ins_deel_upper,
          b.fac_bookmark_id,
          'RES_RUIMTE_KEY'
     FROM fac_bookmark b,
          res_ruimte rr,
          (  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) rar,
          alg_ruimte r,
          alg_srtruimte sr,
          ins_v_alg_overzicht o,
          alg_locatie l
    WHERE TRUNC (b.fac_bookmark_aanmaak) = TO_DATE ('10062013', 'ddmmyyyy')
          AND UPPER (b.fac_bookmark_naam) LIKE '%GENERIEK%'
          AND UPPER (b.fac_bookmark_path) = 'APPL/PDA/RESERVERINGEN.ASP'
          AND rr.res_discipline_key != 62                          -- OV kaart
          AND rr.res_ruimte_key = rar.res_ruimte_key
          AND rar.alg_ruimte_key = r.alg_ruimte_key
          AND r.alg_srtruimte_key = sr.alg_srtruimte_key(+)
          AND r.alg_ruimte_key = o.alg_onroerendgoed_keys
          AND o.alg_onroerendgoed_type = 'R'
          AND o.alg_locatie_key = l.alg_locatie_key
          AND l.alg_locatie_key = 50;
*/

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