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

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

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
WHENEVER SQLERROR EXIT;

SELECT adm.scriptspoolfile ('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL;

WHENEVER SQLERROR CONTINUE;
SPOOL &fcltlogfile
SET DEFINE OFF

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

CREATE OR REPLACE PACKAGE nybu
AS
   TYPE t_cursor IS REF CURSOR;

   FUNCTION getPeriodeNaam (p_periode IN VARCHAR2, p_lang IN VARCHAR2)
      RETURN VARCHAR2;

   FUNCTION getAantalDagenInPeriode (p_van           IN DATE,
                                     p_tot           IN DATE,
                                     p_periode_van   IN DATE,
                                     p_periode_tot   IN DATE:= NULL)
      RETURN NUMBER;

   PROCEDURE nybu_rap_vrije_kamers (user_key      IN     NUMBER,
                                    p_datum_van   IN     VARCHAR2, -- Let wel: formaat '16-01-2006'
                                    p_datum_tot   IN     VARCHAR2,
                                    p_cursor         OUT t_cursor);

   PROCEDURE upsertkenmerk_res (p_kenmerk_key      IN NUMBER,
                                p_rsv_ruimte_key   IN NUMBER,
                                p_waarde           IN VARCHAR2);
END nybu;
/

CREATE OR REPLACE PACKAGE BODY nybu
AS
   FUNCTION getPeriodeNaam (p_periode IN VARCHAR2, p_lang IN VARCHAR2)
      RETURN VARCHAR2
   IS
      v_naam   VARCHAR2 (20);
   BEGIN
      SELECT DECODE (
                p_lang,
                'NL',
                DECODE (SUBSTR (p_periode, 5, 2),
                        '01', 'jan',
                        '02', 'feb',
                        '03', 'mrt',
                        '04', 'apr',
                        '05', 'mei',
                        '06', 'juni',
                        '07', 'juli',
                        '08', 'aug',
                        '09', 'sept',
                        '10', 'okt',
                        '11', 'nov',
                        '12', 'dec'),
                DECODE (SUBSTR (p_periode, 5, 2),
                        '01', 'Jan',
                        '02', 'Feb',
                        '03', 'Mar',
                        '04', 'Apr',
                        '05', 'May',
                        '06', 'June',
                        '07', 'July',
                        '08', 'Aug',
                        '09', 'Sept',
                        '10', 'Oct',
                        '11', 'Nov',
                        '12', 'Dec'))
             || ' '
             || SUBSTR (p_periode, 1, 4)
        INTO v_naam
        FROM DUAL;

      RETURN v_naam;
   END getPeriodeNaam;

   -- Bepaal aantal dagen in begin- of eindperiode waarvoor huur betaald moet worden
   -- Periode moet binnen dezelfde kalendermaand liggen.
   -- Als p_periode_tot leeg is, gaan we uit van het einde van de maand
   -- Als p_van en/of p_tot leeg zijn, dan zetten we die op begin resp. eind van de periode
   FUNCTION getAantalDagenInPeriode (p_van           IN DATE,
                                     p_tot           IN DATE,
                                     p_periode_van   IN DATE,
                                     p_periode_tot   IN DATE:= NULL)
      RETURN NUMBER
   IS
      o_aantal_dagen   NUMBER (4);
      v_periode_tot    DATE;
      v_van            DATE;
      v_tot            DATE;
   BEGIN
      -- Einddatum van de periode die we beschouwen.
      -- Als geen einddatum, dan einde van de maand (startdatum zou dan eerste dag van de maand moeten zijn)
      v_periode_tot := COALESCE (p_periode_tot, LAST_DAY (p_periode_van));

      -- Valt periode (p_van - p_tot) geheel buiten (p_periode_van - p_periode_tot)? Dan nul dagen overlap!
      IF (p_tot < p_periode_van OR p_van > p_periode_tot)
      THEN
         RETURN 0;
      END IF;

      -- Aantal dagen is maximaal de hele periode
      o_aantal_dagen :=
           CAST (TO_CHAR (v_periode_tot, 'DD') AS INT)
         - CAST (TO_CHAR (p_periode_van, 'DD') AS INT)
         + 1;

      v_van := p_van;
      v_tot := p_tot;

      -- Als geen van/tot datum opgegeven, of als van/tot datum buiten periode valt,
      -- dan zet op begin-/einddatum van de periode (periode)
      IF (v_van IS NULL OR v_van < p_periode_van)
      THEN
         v_van := p_periode_van;
      END IF;

      IF (v_tot IS NULL OR v_tot > v_periode_tot)
      THEN
         v_tot := v_periode_tot;
      END IF;

      -- Beslaat het contract de volledige periode, of beginnen/eindigen we halverwege?
      -- DAN:
      --  - ingangsmaand is hetzelfde als van huidige periode
      --  - ingangsdag is later dan de eerste dag van de periode
      -- EN/OF:
      --  - eindmaand is hetzelfde als van huidige periode
      --  - einddag is eerder dan de laatste dag van de periode
      IF ( (TRUNC (v_van, 'MM') = TRUNC (p_periode_van, 'MM')
            AND TRUNC (v_van, 'DD') > p_periode_van)
          OR (TRUNC (v_tot, 'MM') = TRUNC (v_periode_tot, 'MM')
              AND TRUNC (v_tot, 'DD') < v_periode_tot))
      THEN
         -- prijsfactor = aantal_dagen_gehuurd / aantal_dagen_in_deze_periode
         --             = einddag - begindag + 1 / aantal_dagen_in_deze_periode
         o_aantal_dagen :=
            (  CAST (TO_CHAR (v_tot, 'DD') AS INT)
             - CAST (TO_CHAR (v_van, 'DD') AS INT)
             + 1);
      END IF;

      RETURN o_aantal_dagen;
   END;

   -- Overzicht van beschikbare studentenkamers (zonder huidig/toekomstig contract)
   -- Toont (indien aanwezig) ook wanneer het eerstvolgende contract begint en het vorige eindigde.
   -- (Aangepast van view naar procedure voor NYBU#28846)
   -- contractsoort "Student room"             55
   -- cnt_kenmerk "Student room"                1
   -- alg_ruimtekenmerk "Zijde campus"       1080
   -- alg_ruimtekenmerk "Out of order tot"   1100
   -- fac_usrtab "Zijde campus"               281
   PROCEDURE nybu_rap_vrije_kamers (user_key      IN     NUMBER,
                                    p_datum_van   IN     VARCHAR2, -- Let wel: formaat '16-01-2006'
                                    p_datum_tot   IN     VARCHAR2,
                                    p_cursor         OUT t_cursor)
   AS
      v_datum_van   DATE;
      v_datum_tot   DATE;
   BEGIN
      v_datum_van := fac.safe_to_date (p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := fac.safe_to_date (p_datum_tot, 'dd-mm-yyyy');

      OPEN p_cursor FOR
           SELECT rg.alg_ruimte_nr hide_f_sort,
                  g.alg_gebouw_naam fclt_f_gebouw,
                  rg.alg_verdieping_code fclt_f_verdieping,
                  rg.alg_ruimte_nr fclt_x_kamer,
                     '<a class="details" onclick=''FcltMgr.openDetail("'
                  || 'appl/ALG/alg_ruimte.asp?key='
                  || rg.alg_ruimte_key
                  || '")''>'
                  || HTF.escape_sc (rg.alg_ruimte_nr)
                  || '</a>'
                     html_kamer,
                  rg.alg_srtruimte_omschrijving fclt_f_type,
                  rg.alg_ruimte_bruto_vloeropp opp,
                  ud.fac_usrdata_omschr fclt_f_zijde,
                  sloped_ceiling.fac_usrdata_omschr sloped_ceiling,
                  (SELECT TO_CHAR (MAX (cnt_contract_looptijd_tot),
                                   'YYYY-MM-DD')
                     FROM cnt_contract c, cnt_kenmerkcontract kc
                    WHERE     c.ins_discipline_key = 55
                          AND c.cnt_contract_looptijd_tot <= v_datum_van
                          AND kc.cnt_contract_key = c.cnt_contract_key
                          AND kc.cnt_kenmerk_key = 1
                          AND fac.safe_to_number (
                                kc.cnt_kenmerkcontract_waarde) =
                                rg.alg_ruimte_key)
                     vrij_sinds,
                  (SELECT TO_CHAR (MIN (cnt_contract_looptijd_van),
                                   'YYYY-MM-DD')
                     FROM cnt_contract c, cnt_kenmerkcontract kc
                    WHERE     c.ins_discipline_key = 55
                          AND c.cnt_contract_looptijd_van >= v_datum_tot
                          AND kc.cnt_contract_key = c.cnt_contract_key
                          AND kc.cnt_kenmerk_key = 1
                          AND fac.safe_to_number (
                                kc.cnt_kenmerkcontract_waarde) =
                                rg.alg_ruimte_key)
                     bezet_vanaf,
                  fac.safe_to_date (ooo.alg_onrgoedkenmerk_waarde,
                                    'DD-MM-YYYY')
                     out_of_order_tot
             FROM nybu_v_studentenkamers sk,
                  alg_v_ruimte_gegevens rg,
                  alg_gebouw g,
                  (SELECT *
                     FROM alg_onrgoedkenmerk
                    WHERE alg_kenmerk_key = 1080
                          AND alg_onrgoedkenmerk_verwijder IS NULL) zijde,
                  (SELECT *
                     FROM alg_onrgoedkenmerk
                    WHERE alg_kenmerk_key = 1100
                          AND alg_onrgoedkenmerk_verwijder IS NULL) ooo,
                  (SELECT *
                     FROM fac_usrdata
                    WHERE fac_usrtab_key = 281) ud,
                  (SELECT ok.*, fac_usrdata_omschr
                     FROM alg_onrgoedkenmerk ok, alg_kenmerk km, fac_usrdata ud
                    WHERE     km.alg_kenmerk_key = 1020
                          AND ok.alg_kenmerk_key = km.alg_kenmerk_key
                          AND fac_usrdata_key = alg_onrgoedkenmerk_waarde
                          AND alg_onrgoedkenmerk_verwijder IS NULL)
                  sloped_ceiling
            WHERE     sk.alg_ruimte_key = rg.alg_ruimte_key
                  AND g.alg_gebouw_key = rg.alg_gebouw_key
                  AND zijde.alg_onrgoed_key(+) = rg.alg_ruimte_key
                  AND ooo.alg_onrgoed_key(+) = rg.alg_ruimte_key
                  AND sloped_ceiling.alg_onrgoed_key(+) = rg.alg_ruimte_key
                  AND ud.fac_usrdata_key(+) =
                        fac.safe_to_number (zijde.alg_onrgoedkenmerk_waarde)
                  AND NOT EXISTS
                        (SELECT 1
                           FROM cnt_contract c, cnt_kenmerkcontract kc
                          WHERE     c.ins_discipline_key = 55
                                AND c.cnt_contract_looptijd_tot >= v_datum_van
                                AND c.cnt_contract_looptijd_van <= v_datum_tot
                                AND kc.cnt_contract_key = c.cnt_contract_key
                                AND kc.cnt_kenmerk_key = 1
                                AND c.cnt_contract_verwijder IS NULL
                                AND fac.safe_to_number (
                                      kc.cnt_kenmerkcontract_waarde) =
                                      rg.alg_ruimte_key)
         ORDER BY rg.alg_ruimte_nr;
   END;

   PROCEDURE upsertkenmerk_res (p_kenmerk_key      IN NUMBER,
                                p_rsv_ruimte_key   IN NUMBER,
                                p_waarde           IN VARCHAR2)
   IS
      v_count   NUMBER;
   BEGIN
      SELECT COUNT ( * )
        INTO v_count
        FROM res_kenmerkwaarde
       WHERE     res_rsv_ruimte_key = p_rsv_ruimte_key
             AND res_kenmerk_key = p_kenmerk_key
             AND res_kenmerkwaarde_verwijder IS NULL;

      IF v_count = 1
      THEN
         IF p_waarde IS NULL
         THEN
            DELETE res_kenmerkwaarde
             WHERE     res_rsv_ruimte_key = p_rsv_ruimte_key
                   AND res_kenmerk_key = p_kenmerk_key
                   AND res_kenmerkwaarde_verwijder IS NULL;
         ELSE
            UPDATE res_kenmerkwaarde
               SET res_kenmerkreservering_waarde = p_waarde
             WHERE     res_rsv_ruimte_key = p_rsv_ruimte_key
                   AND res_kenmerk_key = p_kenmerk_key
                   AND res_kenmerkwaarde_verwijder IS NULL;
         END IF;
      ELSE
         IF p_kenmerk_key IS NOT NULL AND p_waarde IS NOT NULL
         THEN
            INSERT INTO res_kenmerkwaarde (res_kenmerk_key,
                                           res_rsv_ruimte_key,
                                           res_kenmerkreservering_waarde)
                VALUES (p_kenmerk_key, p_rsv_ruimte_key, p_waarde);
         END IF;
      END IF;
   END;
END nybu;
/

------- PERSONENIMPORT ACTIVE DIRECTORY -----------------------------------------

CREATE OR REPLACE PROCEDURE nybu_import_prs (p_import_key IN NUMBER)
IS
   c_fielddelimitor                VARCHAR2 (1) := ';';
   v_newline                       VARCHAR2 (1000);              -- Input line
   v_header                        VARCHAR2 (1000);
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;
   -- De importvelden:
   v_prs_perslid_naam              VARCHAR2 (256);
   v_prs_perslid_voornaam          VARCHAR2 (256);
   v_prs_perslid_oslogin           VARCHAR2 (256);
   v_prs_perslid_nr                VARCHAR2 (256);
   v_prs_projkpn_nr                VARCHAR2 (256);
   v_prs_afdeling_omschrijving     VARCHAR2 (256);
   v_prs_srtperslid_omschrijving   VARCHAR2 (256);
   v_prs_perslid_email             VARCHAR2 (256);
   v_prs_perslid_telefoonnr        VARCHAR2 (256);
   v_prs_perslid_mobiel            VARCHAR2 (256);
   v_werkplek_oms                  VARCHAR2 (256);
   v_prs_perslid_tussenvoegsel     prs_perslid.prs_perslid_tussenvoegsel%TYPE;
   -- Dummy
   v_dummy                         VARCHAR2 (256);

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

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_header := v_newline;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         v_prs_perslid_tussenvoegsel := NULL;

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_voornaam);               -- givenname
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_naam); -- surname
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_email); -- mail
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_afdeling_omschrijving);         -- department
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_mobiel); -- mobile
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_telefoonnr);       -- telephonenumber
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_srtperslid_omschrijving);            -- title
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_nr); -- EmployeeNumber
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_projkpn_nr); -- departmentNumber
         fac.imp_getfield (v_newline, c_fielddelimitor, v_werkplek_oms); -- physicalDeliveryOfficeName
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_oslogin);           -- samAccountName
         --         fac.imp_getfield (v_newline, c_fielddelimitor, v_dummy);

         v_aanduiding :=
               '['
            || v_prs_perslid_oslogin
            || '|'
            || v_prs_perslid_naam
            || '|'
            || v_prs_perslid_voornaam
            || '|'
            || v_prs_perslid_email
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER (v_header) LIKE
                  UPPER('"givenname";"surname";"mail";"department";"mobile";"telephonenumber";"title";"EmployeeNumber";"departmentNumber";"physicalDeliveryOfficeName";"samAccountName"'
                        || '%')
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;

            -- Controleer alle veldwaarden
            v_errorhint := 'Ongeldig personeelsnummer';
            v_prs_perslid_nr := TRIM (v_prs_perslid_nr);

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

            v_errorhint := 'Ongeldige achternaam';
            v_prs_perslid_naam := TRIM (v_prs_perslid_naam);

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

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

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

            v_errorhint := 'Ongeldige accountnaam';
            v_prs_perslid_oslogin := TRIM (v_prs_perslid_oslogin);

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

            v_errorhint := 'Ongeldige projectkostenplaats';
            v_prs_projkpn_nr := TRIM (v_prs_projkpn_nr);

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

            v_errorhint := 'Ongeldige afdeling';
            v_prs_afdeling_omschrijving := TRIM (v_prs_afdeling_omschrijving);

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

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

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

            v_errorhint := 'Telefoonnummer te lang';
            v_prs_perslid_telefoonnr := TRIM (v_prs_perslid_telefoonnr);

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

            v_errorhint := 'E-mailadres te lang';
            v_prs_perslid_email := TRIM (v_prs_perslid_email);

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

            v_errorhint := 'Mobiel nummer te lang';
            v_prs_perslid_mobiel := TRIM (v_prs_perslid_mobiel);

            IF LENGTH (v_prs_perslid_mobiel) > 15
            THEN
               v_prs_perslid_mobiel := SUBSTR (v_prs_perslid_mobiel, 1, 15);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Nummer wordt afgebroken tot ['
                  || v_prs_perslid_mobiel
                  || ']');
            END IF;

            v_errorhint := 'Tussenvoegsel';

            SELECT MAX (fac_usrdata_omschr)
              INTO v_prs_perslid_tussenvoegsel
              FROM fac_usrdata u
             WHERE UPPER (v_prs_perslid_naam) LIKE
                      UPPER (u.fac_usrdata_omschr) || ' ' || '%'
                   AND fac_usrtab_key = 1;

            IF (v_prs_perslid_tussenvoegsel IS NOT NULL)
            THEN
               v_prs_perslid_naam :=
                  TRIM(SUBSTR (v_prs_perslid_naam,
                               LENGTH (v_prs_perslid_tussenvoegsel) + 1));
            --               fac.imp_writelog (
            --                  p_import_key,
            --                  'I',
            --                  v_aanduiding || 'Tussenvoegsel: '||v_prs_perslid_tussenvoegsel,
            --                  'Achternaam: '||v_prs_perslid_naam);
            END IF;

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

                  INSERT INTO nybu_imp_prs (imp_datum,
                                            prs_perslid_naam,
                                            prs_perslid_voornaam,
                                            prs_perslid_tussenvoegsel,
                                            prs_perslid_oslogin,
                                            prs_perslid_nr,
                                            prs_projkpn_nr,
                                            prs_afdeling_omschrijving,
                                            prs_srtperslid_omschrijving,
                                            prs_perslid_email,
                                            prs_perslid_telefoonnr,
                                            prs_perslid_mobiel,
                                            werkplek_oms)
                      VALUES (SYSDATE,
                              v_prs_perslid_naam,
                              v_prs_perslid_voornaam,
                              v_prs_perslid_tussenvoegsel,
                              v_prs_perslid_oslogin,
                              v_prs_perslid_nr,
                              v_prs_projkpn_nr,
                              v_prs_afdeling_omschrijving,
                              v_prs_srtperslid_omschrijving,
                              v_prs_perslid_email,
                              v_prs_perslid_telefoonnr,
                              v_prs_perslid_mobiel,
                              v_werkplek_oms);

                  COMMIT;

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

   fac.imp_writelog (
      p_import_key,
      'S',
      'Persoon: aantal ingelezen regels: ' || TO_CHAR (v_count_tot),
      '');
   fac.imp_writelog (
      p_import_key,
      'S',
      'Persoon: aantal ongeldige importregels: '
      || TO_CHAR (v_count_tot - v_count_import),
      '');
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
         'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        v_errorhint);
      COMMIT;
END nybu_import_prs;
/

CREATE OR REPLACE PROCEDURE nybu_update_prs (p_import_key IN NUMBER)
IS
   -- LET OP: moet idem zijn als declaratie bij nybu_IMPORT_PRS
   c_persoon_inactief        VARCHAR2 (30) := 'INACTIEF: ';
   -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers met een nummer
   c_max_delta_percentage    NUMBER (10) := 20;
   c_min_persons             NUMBER := 350;
   -- Ruimte waar personen in geplaatst worden (indien nog geen ruimte in opgegeven gebouw)
   c_gebouw_code             VARCHAR2 (10) := '';
   c_ruimte_nr               VARCHAR2 (10) := '999';
   c_gebouw_key              NUMBER (10);
   c_ruimte_key              NUMBER (10);
   -- Groep waar personen in geplaatst worden (indien nog geen groep)
   c_groep_upper             VARCHAR2 (30);
   v_aanduiding              VARCHAR2 (200);
   v_errorhint               VARCHAR2 (1000);
   v_errormsg                VARCHAR2 (1000);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_count_prs_import        NUMBER (10);    -- #actieve personen  na  import!
   v_count_prs_actual        NUMBER (10);    -- #actieve personen vóór import!
   v_count_tot               NUMBER (10);
   v_count_error             NUMBER (10);
   v_count                   NUMBER (10);
   --
   v_perslid_key             NUMBER (10);
   v_perslid_naam            VARCHAR2 (30);
   v_perslid_tussenvoegsel   VARCHAR2 (15);
   v_kpn_key                 NUMBER (10);
   v_afdeling_key            NUMBER (10);
   v_srtperslid_key          NUMBER (10);
   --v_oslogin                VARCHAR2 (30);
   --v_locatie_key            NUMBER (10);
   v_gebouw_key              NUMBER (10);
   v_verdieping_key          NUMBER (10);
   v_ruimte_key              NUMBER (10);
   v_ruimte_nr               VARCHAR2 (10);
   v_wp_key                  NUMBER (10);
   v_wp_volgnr               NUMBER (3);
   v_wp_oms                  VARCHAR2 (30);
   v_groep_key               NUMBER (10);
   v_kenmerklink_key         NUMBER (10);
   v_dbg_gebouw_code         VARCHAR2 (10);
   v_dbg_ruimte_nr           VARCHAR2 (10);

   -- Alle personen met primaire login in Facilitor, die in de import niet voorkomen.
   -- Dubbele nummers? Dan wordt iemand mogelijk niet verwijderd/INACTIEF!
   CURSOR cdelprs
   IS
      SELECT p.prs_perslid_key,
             p.prs_perslid_oslogin,
             p.prs_perslid_naam,
             p.prs_perslid_voornaam
        FROM prs_v_aanwezigperslid p, prs_srtperslid sp
       WHERE     p.prs_perslid_oslogin IS NOT NULL
             AND p.prs_perslid_oslogin NOT LIKE '\_%' ESCAPE '\'
             AND p.prs_srtperslid_key = sp.prs_srtperslid_key
             AND UPPER (sp.prs_srtperslid_omschrijving) NOT LIKE '%STUDENT%'
             AND NOT EXISTS
                   (SELECT 1
                      FROM nybu_imp_prs ip
                     WHERE UPPER (ip.prs_perslid_oslogin) =
                              p.prs_perslid_oslogin);

   -- Werkplekken van te verwijderen persoon
   -- Als een persoon (logisch) verwijderd wordt, worden zijn/haar (perslid-)werkplekken dat ook
   CURSOR cdelwp (
      p_perslid_key NUMBER)
   IS
      SELECT pw.prs_perslidwerkplek_key, w.prs_werkplek_key
        FROM prs_perslidwerkplek pw, prs_werkplek w
       WHERE pw.prs_perslid_key = p_perslid_key
             AND w.prs_werkplek_key = pw.prs_werkplek_key;

   -- Dubbele nummers? Dan worden gewoon 2 (of meer) personen toegevoegd!
   -- Alle gegevens uit importtabel geformatteerd volgens specificatie
   CURSOR cperslid
   IS
      SELECT prs_perslid_naam,
             prs_perslid_tussenvoegsel,
             prs_perslid_voornaam,
             prs_perslid_oslogin,
             prs_perslid_nr,
             prs_projkpn_nr,
             prs_afdeling_omschrijving,
             prs_srtperslid_omschrijving,
             prs_perslid_email,
             prs_perslid_telefoonnr,
             prs_perslid_mobiel
        FROM nybu_imp_prs
       WHERE prs_perslid_oslogin IS NOT NULL;

   -- Soort perslid/functie
   CURSOR csrtperslid
   IS
        SELECT MIN (prs_perslid_oslogin) prs_perslid_oslogin,
               MIN (prs_perslid_naam) prs_perslid_naam,
               MIN (prs_perslid_voornaam) prs_perslid_voornaam,
               MIN (prs_srtperslid_omschrijving) prs_srtperslid_omschrijving
          FROM nybu_imp_prs
      GROUP BY UPPER (prs_srtperslid_omschrijving);

   -- Dubbele nummers? Dan krijgt iemand mogelijk de verkeerde plaats!
   -- Personen in importsheet + hun werkplekken
   -- (voor maken nieuwe/verhuizen naar (virtuele) werkplek)
   CURSOR cwp
   IS
      SELECT p.*
        FROM nybu_imp_prs ip, prs_v_aanwezigperslid p
       WHERE UPPER (ip.prs_perslid_oslogin) = UPPER (p.prs_perslid_oslogin);

   -- Alle actieve personen met primaire login (ie. de import-doelgroep) zonder een werkplek
   -- Voor logging: lijst van mensen zonder werkplek
   CURSOR cnowp
   IS
      SELECT p.prs_perslid_key,
             p.prs_perslid_oslogin,
             p.prs_perslid_naam,
             p.prs_perslid_voornaam
        FROM prs_v_aanwezigperslid p
       WHERE     p.prs_perslid_oslogin IS NOT NULL
             AND p.prs_perslid_naam NOT LIKE c_persoon_inactief || '%'
             AND NOT EXISTS (SELECT pw.prs_perslid_key
                               FROM prs_perslidwerkplek pw
                              WHERE pw.prs_perslid_key = p.prs_perslid_key);

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

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

   --   IF ( (TRUNC ( (v_count_prs_import / v_count_prs_actual) * 100) >=
   --              (100 - c_max_delta_percentage))
   --        OR
   --        v_count_prs_actual < 20
   --      )
   IF (v_count_prs_import >= c_min_persons)
   THEN
      -- Geldig importbestand wat betreft aantal personen
      FOR recdelprs IN cdelprs
      LOOP
         BEGIN
            -- Heeft persoon actuele/toekomstige verplichtingen?
            SELECT COUNT ( * )
              INTO v_count
              FROM prs_perslid p, prs_v_verplichting_keys r
             WHERE p.prs_perslid_key = r.prs_perslid_key
                   AND p.prs_perslid_key = recdelprs.prs_perslid_key;

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

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

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

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

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

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

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

                  fac.imp_writelog (
                     p_import_key,
                     'I',
                        'Persoon met login ['
                     || recdelprs.prs_perslid_oslogin
                     || '] en naam ['
                     || recdelprs.prs_perslid_naam
                     || ', '
                     || recdelprs.prs_perslid_voornaam
                     || '] is INACTIEF gemaakt',
                     'Persoon met verplichtingen is INACTIEF gemaakt (en account is verwijderd)');
               END IF;

               COMMIT;
            END IF;

            -- NYBU heeft impliciete werkplekken; werkplekken verwijderen om gedoe te voorkomen.
            -- Dit moet ook als iemand inactief gemaakt/gezet wordt.
            v_errorhint := 'Fout bij verwijderen werkplek(ken)';

            FOR rdwp IN cdelwp (recdelprs.prs_perslid_key)
            LOOP
               -- Per 5.3.2/FSN#26947 verdwijnt via trigger vanzelf de bezetting!
               v_errorhint := 'Fout bij verwijderen werkplek';

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

      v_count_tot := 0;
      v_count_error := 0;

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

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

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

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

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

      COMMIT;

      v_count_tot := 0;
      v_count_error := 0;

      FOR recperslid IN cperslid
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  '['
               || recperslid.prs_perslid_oslogin
               || '|'
               || recperslid.prs_perslid_naam
               || '|'
               || recperslid.prs_perslid_voornaam
               || '] - ';

            v_errorhint :=
                  'Fout bij bepalen functie ['
               || recperslid.prs_srtperslid_omschrijving
               || ']';

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

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

            SELECT prs_afdeling_key
              INTO v_afdeling_key
              FROM prs_afdeling
             WHERE prs_afdeling_verwijder IS NULL
                   AND UPPER (prs_afdeling_omschrijving) =
                         UPPER (recperslid.prs_afdeling_omschrijving);

            v_errorhint :=
                  'Fout bij bepalen naam ['
               || recperslid.prs_perslid_naam
               || ']';

            --TODO: Is die lengte-check wel nodig? Doet import_prs ook al!
            --      (Let op: v_perslid_naam wordt hieronder gebruikt!)
            IF LENGTH (recperslid.prs_perslid_naam) > 30
            THEN
               v_perslid_naam := SUBSTR (recperslid.prs_perslid_naam, 1, 30);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Achternaam te lang',
                     'Achternaam wordt afgebroken tot ['
                  || v_perslid_naam
                  || ']');
            ELSE
               v_perslid_naam := recperslid.prs_perslid_naam;
            END IF;

            v_errorhint := 'Fout bij bepalen persoon';

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

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

               INSERT INTO prs_perslid (prs_perslid_module,
                                        prs_perslid_naam,
                                        prs_perslid_tussenvoegsel,
                                        prs_perslid_voornaam,
                                        prs_perslid_oslogin,
                                        prs_perslid_nr,
                                        prs_afdeling_key,
                                        prs_srtperslid_key,
                                        prs_perslid_email,
                                        prs_perslid_telefoonnr,
                                        prs_perslid_mobiel)
                   VALUES ('PRS',
                           v_perslid_naam,
                           recperslid.prs_perslid_tussenvoegsel,
                           recperslid.prs_perslid_voornaam,
                           recperslid.prs_perslid_oslogin,
                           recperslid.prs_perslid_nr,
                           v_afdeling_key,
                           v_srtperslid_key,
                           recperslid.prs_perslid_email,
                           recperslid.prs_perslid_telefoonnr,
                           recperslid.prs_perslid_mobiel)
                RETURNING prs_perslid_key
                     INTO v_perslid_key;
            --TODO: voeg persoon toe op standaardwerkplek (xxx-0-999)
            ELSE
               IF (v_count > 1)
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     v_aanduiding || ' kan persoon niet eenduidig bepalen',
                     v_errorhint);
               END IF;

               v_errorhint := 'Fout bij wijzigen persoon';

               -- TODO: coalesce's voor velden die nog niet overschreven moeten worden.
               -- NYBU#30064: perslid_nr niet leegmaken
               UPDATE prs_perslid
                  SET prs_perslid_naam = v_perslid_naam,
                      prs_perslid_tussenvoegsel =
                         recperslid.prs_perslid_tussenvoegsel,
                      prs_perslid_voornaam = recperslid.prs_perslid_voornaam,
                      prs_perslid_oslogin = recperslid.prs_perslid_oslogin,
                      prs_perslid_nr =
                         COALESCE (recperslid.prs_perslid_nr, prs_perslid_nr),
                      prs_afdeling_key = v_afdeling_key,
                      prs_srtperslid_key = v_srtperslid_key,
                      prs_perslid_email = recperslid.prs_perslid_email,
                      prs_perslid_telefoonnr =
                         recperslid.prs_perslid_telefoonnr,
                      prs_perslid_mobiel = recperslid.prs_perslid_mobiel
                WHERE prs_perslid_key = v_perslid_key;
            --TODO: als nog geen werkplek, dan standaardwerkplek?
            END IF;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_count_error := v_count_error + 1;
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || 'Geen data gevonden',
                                 v_errorhint);
            WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint);
               COMMIT;
         END;
      END LOOP;

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

      v_count_tot := 0;
      v_count_error := 0;

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

            SELECT DECODE (UPPER (prs_afdeling_omschrijving),
                           'NEW BUSINESS SCHOOL AMSTERDAM',
                           '_DEFAULT AMSTERDAM',
                           '_DEFAULT')
              INTO c_groep_upper
              FROM nybu_imp_prs p;

            SELECT fac_groep_key
              INTO v_groep_key
              FROM fac_groep
             WHERE fac_groep_upper = c_groep_upper;

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

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

      COMMIT;

      -- Verwijder ongebruikte functies; deze import bepaalt de functies!
      DELETE FROM prs_srtperslid sp
            WHERE NOT EXISTS
                     (SELECT 1
                        FROM prs_perslid P
                       WHERE p.prs_srtperslid_key = sp.prs_srtperslid_key);
   ELSE
      IF (v_count_prs_import = 0)
      THEN
         fac.imp_writelog (
            p_import_key,
            'S',
            'Geen nieuw/recent bestand met te importeren personen aangetroffen!',
            '');
      ELSE
         fac.imp_writelog (
            p_import_key,
            'E',
            'Verschil tussen het actuele aantal en het te importeren aantal personen te groot; zie specificatie!',
               '- max. verschilpercentage = ['
            || TO_CHAR (c_max_delta_percentage)
            || '%] <br> '
            || '- matchend #personen importbestand = ['
            || TO_CHAR (v_count_prs_import)
            || '] <br> '
            || '- #personen Facilitor = ['
            || TO_CHAR (v_count_prs_actual)
            || ']');
      END IF;
   END IF;

   COMMIT;
END nybu_update_prs;
/

-- NYBU#29356: export die optionele ruimterserveringen die plaatsvinden binnen 14 dagen en
-- optionele voorzieningen reserveringen die plaats vinden binnen 7 dagen automatisch op definitief zet.
-- de activiteiten residence (=key 130) en staff (=key 110) vanllen hier buiten.

CREATE OR REPLACE PROCEDURE nybu_export_res_statusupd (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2,
   p_filedir    IN VARCHAR2,
   p_filename   IN VARCHAR2)
AS
   CURSOR copt
   IS
      SELECT res_rsv_ruimte_key, r.*
        FROM res_rsv_ruimte ra, res_v_udr_reservering r
       WHERE     ra.res_status_fo_key = 1
             AND res_rsv_ruimte_verwijder IS NULL
             AND res_rsv_ruimte_van < SYSDATE + 28
             AND res_rsv_ruimte_van > SYSDATE
             AND res_activiteit_key NOT IN (110, 130)
             AND ra.res_rsv_ruimte_dirtlevel = 0
             AND ra.res_rsv_ruimte_key = r.key
             AND UPPER (r.locatie_plaats) = 'BREUKELEN'
             AND res_activiteit_key NOT IN
                      (SELECT res_activiteit_key
                         FROM res_activiteit
                        WHERE res_srtactiviteit_key IN
                                    (SELECT res_srtactiviteit_key
                                       FROM res_srtactiviteit
                                      WHERE res_srtactiviteit_soort = 1))
      UNION ALL
      SELECT res_rsv_ruimte_key, r.*
        FROM res_rsv_ruimte ra, res_v_udr_reservering r
       WHERE     ra.res_status_fo_key = 1
             AND res_rsv_ruimte_verwijder IS NULL
             AND ra.res_rsv_ruimte_key = r.key
             AND res_rsv_ruimte_van < SYSDATE + 7
             AND res_rsv_ruimte_van > SYSDATE
             AND ra.res_rsv_ruimte_dirtlevel = 0
             AND UPPER (r.locatie_plaats) = 'BREUKELEN'
             AND res_activiteit_key NOT IN
                      (SELECT res_activiteit_key
                         FROM res_activiteit
                        WHERE res_srtactiviteit_key NOT IN
                                    (SELECT res_srtactiviteit_key
                                       FROM res_srtactiviteit
                                      WHERE res_srtactiviteit_soort = 1));

   v_errorhint      VARCHAR2 (1000);
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
   FOR rc IN copt
   LOOP
      BEGIN
         v_errorhint := 'Fout bij bijwerken reserveringsstatus';

         UPDATE res_rsv_ruimte
            SET res_status_fo_key = 2
          WHERE res_rsv_ruimte_key = rc.res_rsv_ruimte_key;

         fac.trackaction ('RESBEV',
                          rc.res_rsv_ruimte_key,
                          NULL,
                          NULL,
                          'Reservering automatisch definitief');
      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.res_rsv_ruimte_key || ' ' || v_errormsg,
                          v_errorhint);
            COMMIT;
      END;
   END LOOP;

   --
   --  TIJDELIJK: Bij het herhalen van reserveringen worden ook kenmerken meegekopieerd die te maken hebben met de
   --  export. Deze kenmerken worden hier verwijderd. (NYBU#35318). Er is ook een logcenter melding aangemaakt om
   --  dit structureel op te lossen FSN#35335.
   --
   DELETE res_kenmerkwaarde kw
    WHERE res_kenmerkwaarde_key IN
                (SELECT kw2.res_kenmerkwaarde_key
                   FROM res_kenmerkwaarde kw2,
                        res_kenmerk k,
                        res_rsv_ruimte rr
                  WHERE kw2.res_kenmerk_key = k.res_kenmerk_key
                        AND k.res_srtkenmerk_key IN
                                 (201, 202, 203, 221, 222, 241, 261) -- kenmerken die door de export gezet worden.
                        AND kw2.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                        AND TO_CHAR (kw2.res_kenmerkwaarde_aanmaak,
                                     'yyyymmddhh24mi') =
                              TO_CHAR (rr.res_rsv_ruimte_aanmaak,
                                       'yyyymmddhh24mi')
                        AND kw2.res_kenmerkwaarde_aanmaak > SYSDATE - 1);

   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 status update afgebroken!',
                    v_errormsg);
      COMMIT;
END nybu_export_res_statusupd;
/


-- Export om notificatie naar contactpersonen van een reservering
-- te sturen op het moment dat de reservering totaal afgemeld is
-- en de contactpersoon de resevering moet goedkeuren.

CREATE OR REPLACE PROCEDURE nybu_export_res_noti_goedk (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2,
   p_filedir    IN VARCHAR2,
   p_filename   IN VARCHAR2)
AS
   CURSOR c
   IS
      SELECT rrr.res_rsv_ruimte_key,
                'Goedkeuring voor reservering '
             || rrr.res_reservering_key
             || '/'
             || rrr.res_rsv_ruimte_volgnr
             || ' ('
             || rrr.res_rsv_ruimte_omschrijving
             || ') is vereist'
                omschrijving
        FROM res_rsv_ruimte rrr,
             (  SELECT MIN (res_status_bo_key) res_status_bo_key,
                       res_rsv_ruimte_key
                  FROM (SELECT res_status_bo_key, rr1.res_rsv_ruimte_key
                          FROM res_rsv_ruimte rr1
                         WHERE rr1.res_rsv_ruimte_verwijder IS NULL
                        UNION ALL
                        SELECT res_status_bo_key, rd1.res_rsv_ruimte_key
                          FROM res_rsv_deel rd1
                         WHERE rd1.res_rsv_deel_verwijder IS NULL
                        UNION ALL
                        SELECT res_status_bo_key, ra1.res_rsv_ruimte_key
                          FROM res_rsv_artikel ra1
                         WHERE ra1.res_rsv_artikel_verwijder IS NULL)
              GROUP BY res_rsv_ruimte_key) bo_stat
       WHERE NOT EXISTS
                -- die nog niet genotificeerd zijn
             (SELECT fac_tracking_refkey
                FROM fac_tracking t, fac_srtnotificatie sn
               WHERE     t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                     AND sn.fac_srtnotificatie_code = 'CUST01'
                     AND fac_tracking_refkey = rrr.res_rsv_ruimte_key)
             -- met cateringkosten
             AND (SELECT SUM (res.getartikelprijs (res_rsv_artikel_key))
                    FROM res_rsv_artikel rra, res_artikel ra
                   WHERE     res_rsv_artikel_verwijder IS NULL
                         AND rra.res_artikel_key = ra.res_artikel_key
                         AND ra.res_discipline_key NOT IN (462, 581, 741) -- hotelkamers, inhuur voorzieningen, linnen
                         AND rra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key) <>
                   0
             AND rrr.res_rsv_ruimte_key = bo_stat.res_rsv_ruimte_key
             AND bo_stat.res_status_bo_key = 5
             AND rrr.res_rsv_ruimte_van > SYSDATE - 365;
BEGIN
   FOR rec IN c
   LOOP
      fac.trackaction ('CUST01',
                       rec.res_rsv_ruimte_key,
                       NULL,
                       NULL,
                       rec.omschrijving);
   END LOOP;
END nybu_export_res_noti_goedk;
/

-- Verschilrapportage werkplek FACILITOR vs AD

CREATE OR REPLACE VIEW nybu_v_rap_wp_verschil
AS
   SELECT pf.prs_perslid_naam_full name,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/prs/prs_perslid.asp?key='
          || p.prs_perslid_key
          || '")''>'
          || HTF.escape_sc (p.prs_perslid_oslogin)
          || '</a>'
             html_account,
          g.alg_gebouw_naam || ' ' || ar.alg_ruimte_nr room_facilitor,
          ip.werkplek_oms room_ad
     FROM alg_v_aanwezigruimte ar,
          alg_verdieping v,
          alg_gebouw g,
          prs_werkplek w,
          prs_perslidwerkplek pw,
          prs_v_aanwezigperslid p,
          prs_v_perslid_fullnames pf,
          nybu_imp_prs ip
    WHERE     UPPER (ip.prs_perslid_oslogin) = p.prs_perslid_oslogin
          AND p.prs_perslid_key = pf.prs_perslid_key
          AND p.prs_perslid_key = pw.prs_perslid_key(+)
          AND pw.prs_werkplek_key = w.prs_werkplek_key(+)
          AND w.prs_alg_ruimte_key = ar.alg_ruimte_key(+)
          AND ar.alg_verdieping_key = v.alg_verdieping_key(+)
          AND v.alg_gebouw_key = g.alg_gebouw_key(+)
          AND (ip.werkplek_oms !=
                  g.alg_gebouw_naam || ' ' || ar.alg_ruimte_nr
               OR (ip.werkplek_oms IS NULL AND ar.alg_ruimte_key IS NOT NULL)
               OR (ip.werkplek_oms IS NOT NULL AND ar.alg_ruimte_key IS NULL));

-- Verschilrapportage afdeling Planon vs AD/Raedt

CREATE OR REPLACE VIEW nybu_v_rap_afd_verschil
AS
   SELECT pf.prs_perslid_naam_full naam,
          a.prs_afdeling_naam code,
          a.prs_afdeling_omschrijving afdeling_ad,
          km.prs_kenmerklink_waarde afdeling_planon
     FROM prs_v_perslid_fullnames pf,
          prs_v_aanwezigperslid p,
          prs_afdeling a,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1040) km
    WHERE     pf.prs_perslid_key = p.prs_perslid_key
          AND km.prs_link_key(+) = p.prs_perslid_key
          AND a.prs_afdeling_key = p.prs_afdeling_key
          AND a.prs_afdeling_naam != km.prs_kenmerklink_waarde;

------- IMPORT STUDENTENGEGEVENS CRM --------------------------------------------

CREATE OR REPLACE PROCEDURE nybu_import_crm (p_import_key IN NUMBER)
IS
   c_fielddelimitor              VARCHAR2 (1) := ';';
   c_headerline VARCHAR (1000)
         := '(Do Not Modify) Enrollment Id;(Do Not Modify) Row Checksum;(Do Not Modify) Modified On;OSIRIS Number (Contact) (Contact);Contact Number (Contact) (Contact);Last Name (Contact) (Contact);First Name (Contact) (Contact);Initials (Contact) (Contact);Infix (Do Not Use) (Contact) (Contact);Gender (Contact) (Contact);Email Private (Contact) (Contact);Private Mobile Phone (Contact) (Contact);Private Phone (Contact) (Contact);Participant Number (Contact) (Contact);SAN Number (Contact) (Contact);Birthday (Contact) (Contact);Program;Applicant For (Group);My.Nyenrode Email (Contact) (Contact)';

   v_newline                     VARCHAR2 (1000);                -- Input line
   v_header                      VARCHAR2 (1000);
   v_aanduiding                  VARCHAR2 (200);
   v_errorhint                   VARCHAR2 (1000);
   v_errormsg                    VARCHAR2 (1000);
   oracle_err_num                NUMBER;
   oracle_err_mes                VARCHAR2 (200);
   header_is_valid               NUMBER := 0;
   v_ongeldig                    NUMBER (1);
   v_count_tot                   NUMBER (10);
   v_count_import                NUMBER (10);
   v_count                       NUMBER;
   -- De importvelden:
   v_contact_nr                  VARCHAR2 (256);
   v_prs_perslid_naam            VARCHAR2 (256);
   v_prs_perslid_tussenvoegsel   VARCHAR2 (256);
   v_prs_perslid_voornaam        VARCHAR2 (256);
   v_prs_perslid_initialen       VARCHAR2 (256);
   v_prs_perslid_geslacht        VARCHAR2 (256);
   v_prs_perslid_email           VARCHAR2 (256);
   v_prs_perslid_mobiel          VARCHAR2 (256);
   v_prs_perslid_telnr           VARCHAR2 (256);
   v_prs_perslid_nr              VARCHAR2 (256);
   v_san_nr                      VARCHAR2 (256);
   v_osiris_nr                   VARCHAR2 (256);
   v_geboortedatum               VARCHAR2 (256);
   v_prs_afdeling_omschrijving   VARCHAR2 (256);
   v_prs_email_nybu              VARCHAR2 (256);
   v_dummy                       VARCHAR2 (256);

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

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_header := v_newline;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';
         v_ongeldig := 0;
         v_prs_perslid_tussenvoegsel := NULL;

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dummy); -- Enrollment ID
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dummy); -- Row Checksum
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dummy); -- Modified on
         fac.imp_getfield (v_newline, c_fielddelimitor, v_osiris_nr); -- OSIRIS Number;
         fac.imp_getfield (v_newline, c_fielddelimitor, v_contact_nr); -- Contact number
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_naam); -- Last Name
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_voornaam);              -- First Name
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_initialen);               -- Initials
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_tussenvoegsel);              -- Infix
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_geslacht);                  -- Gender
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_email); -- E-mail Private
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_mobiel); -- Private Mobile Phone
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_telnr); -- Private Phone
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_nr); -- Participant Number
         fac.imp_getfield (v_newline, c_fielddelimitor, v_san_nr); -- SAN Number
         fac.imp_getfield (v_newline, c_fielddelimitor, v_geboortedatum); -- Birthday
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dummy); -- Applicant For (Program)
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_afdeling_omschrijving); -- Applicant For (Group)
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_email_nybu); -- NYBU mailadres

         v_aanduiding :=
               '['
            || v_prs_perslid_naam
            || '|'
            || v_prs_perslid_voornaam
            || '|'
            || v_contact_nr
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER (v_header) LIKE UPPER (c_headerline || '%')
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;

            -- Controleer alle veldwaarden
            v_errorhint := 'Ongeldig studentnummer';
            v_prs_perslid_nr := TRIM (v_prs_perslid_nr);

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

            v_errorhint := 'Ongeldig SAN-nummer';
            v_san_nr := TRIM (v_san_nr);

            IF LENGTH (v_san_nr) > 20
            THEN
               v_san_nr := SUBSTR (v_san_nr, 1, 20);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'SAN-nummer te lang',
                  'SAN-nummer wordt afgebroken tot [' || v_san_nr || ']');
            END IF;

            v_errorhint := 'Ongeldig OSIRIS nummer';
            v_osiris_nr := TRIM (v_osiris_nr);

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

            v_errorhint := 'Ongeldige achternaam';
            v_prs_perslid_naam := TRIM (v_prs_perslid_naam);

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

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

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

            v_errorhint := 'Ongeldige opleiding/afdeling';
            v_prs_afdeling_omschrijving := TRIM (v_prs_afdeling_omschrijving);

            IF LENGTH (v_prs_afdeling_omschrijving) > 60
            THEN
               v_prs_afdeling_omschrijving :=
                  SUBSTR (v_prs_afdeling_omschrijving, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Opleiding/Afdeling te lang',
                     'Opleiding/Afdeling wordt afgebroken tot ['
                  || v_prs_afdeling_omschrijving
                  || ']');
            ELSE
               IF (v_prs_afdeling_omschrijving IS NULL)
               THEN
                  v_prs_afdeling_omschrijving := 'Unknown';
               --TODO: verplicht maken?
               --v_ongeldig := 1;
               --fac.imp_writelog (
               --   p_import_key,
               --   'E',
               --   v_aanduiding || 'Afdeling onbekend',
               --   'Afdeling is verplicht; regel wordt overgeslagen!');
               END IF;
            END IF;

            v_errorhint := 'E-mailadres te lang';
            v_prs_perslid_email := TRIM (v_prs_perslid_email);

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

            v_errorhint := 'Tussenvoegsel';
            v_prs_perslid_tussenvoegsel := TRIM (v_prs_perslid_tussenvoegsel);

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

            v_errorhint := 'Mobiel nr';
            v_prs_perslid_mobiel :=
               TRIM (REPLACE (v_prs_perslid_mobiel, ' ', ''));

            IF LENGTH (v_prs_perslid_mobiel) > 15
            THEN
               v_prs_perslid_mobiel := SUBSTR (v_prs_perslid_mobiel, 1, 15);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Mobiel nr wordt afgebroken tot ['
                  || v_prs_perslid_mobiel
                  || ']');
            END IF;

            v_errorhint := 'Telefoonnr';
            v_prs_perslid_telnr :=
               TRIM (REPLACE (v_prs_perslid_telnr, ' ', ''));

            IF LENGTH (v_prs_perslid_telnr) > 15
            THEN
               v_prs_perslid_telnr := SUBSTR (v_prs_perslid_telnr, 1, 15);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Telefoonnr wordt afgebroken tot ['
                  || v_prs_perslid_telnr
                  || ']');
            END IF;

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

                  INSERT INTO nybu_imp_crm (imp_datum,
                                            contact_nr,
                                            prs_perslid_naam,
                                            prs_perslid_tussenvoegsel,
                                            prs_perslid_voornaam,
                                            prs_perslid_initialen,
                                            prs_perslid_geslacht,
                                            --   adres_prive_straat1,
                                            --   adres_prive_straat2,
                                            --   adres_prive_postcode,
                                            --   adres_prive_plaats,
                                            --   adres_prive_land,
                                            prs_perslid_email,
                                            prs_perslid_mobiel,
                                            prs_perslid_telefoonnr,
                                            prs_perslid_nr,
                                            san_nr,
                                            osiris_nr,
                                            geboortedatum,
                                            prs_afdeling_omschrijving,
                                            --   housenumber,
                                            --   prs_iban,
                                            prs_email_nybu)
                      VALUES (SYSDATE,
                              v_contact_nr,
                              v_prs_perslid_naam,
                              v_prs_perslid_tussenvoegsel,
                              v_prs_perslid_voornaam,
                              v_prs_perslid_initialen,
                              v_prs_perslid_geslacht,
                              --    v_adres_prive_straat1,
                              --    v_adres_prive_straat2,
                              --    v_adres_prive_postcode,
                              --    v_adres_prive_plaats,
                              --    v_adres_prive_land,
                              v_prs_perslid_email,
                              v_prs_perslid_mobiel,
                              v_prs_perslid_telnr,
                              v_prs_perslid_nr,
                              v_san_nr,
                              v_osiris_nr,
                              v_geboortedatum,
                              v_prs_afdeling_omschrijving,
                              --    v_housenumber,
                              --    v_prs_iban,
                              v_prs_email_nybu);

                  COMMIT;

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

   IF (header_is_valid = 1)
   THEN
      fac.imp_writelog (
         p_import_key,
         'S',
         'Persoon: aantal ingelezen regels: ' || TO_CHAR (v_count_tot),
         '');
      fac.imp_writelog (
         p_import_key,
         'S',
         'Persoon: aantal ongeldige importregels: '
         || TO_CHAR (v_count_tot - v_count_import),
         '');
   ELSE
      fac.imp_writelog (
         p_import_key,
         'E',
         'Ongeldige headerregel!',
         SUBSTR ('Moet zijn: "' || c_headerline || '"', 1, 1000));
   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_aanduiding || v_errormsg,
                        v_errorhint);
      COMMIT;
END nybu_import_crm;
/

CREATE OR REPLACE PROCEDURE nybu_update_crm (p_import_key IN NUMBER)
IS
   c_persoon_inactief        VARCHAR2 (30) := 'INACTIEF: ';
   -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers met een nummer
   c_max_delta_percentage    NUMBER (10) := 20;
   -- Ruimte waar studenten in geplaatst worden (indien nog geen ruimte in opgegeven gebouw)
   c_gebouw_code             VARCHAR2 (10) := '';
   c_ruimte_nr               VARCHAR2 (10) := '999';
   c_gebouw_key              NUMBER (10);
   c_ruimte_key              NUMBER (10);
   -- Flexkenmerken
   c_contact_nr_key          NUMBER (10) := 1000;
   c_address_street1_key     NUMBER (10) := 1022;
   c_address_street2_key     NUMBER (10) := 1023;
   c_address_zip_key         NUMBER (10) := 1024;
   c_address_city_key        NUMBER (10) := 1025;
   c_address_country_key     NUMBER (10) := 1026;
   c_birthday_key            NUMBER (10) := 1027;
   c_email_key               NUMBER (10) := 1180;
   c_san_nr_key              NUMBER (10) := 1200;
   c_osiris_nr_key           NUMBER (10) := 1302;
   c_prs_iban                NUMBER (10) := 1280;
   -- Groep waar studenten in geplaatst worden (indien nog geen groep)
   c_groep_upper             VARCHAR2 (30) := '_STUDENTEN';
   v_aanduiding              VARCHAR2 (200);
   v_errorhint               VARCHAR2 (1000);
   v_errormsg                VARCHAR2 (1000);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_count_tot               NUMBER (10);
   v_count_error             NUMBER (10);
   v_count                   NUMBER (10);
   --
   v_perslid_key             NUMBER (10);
   v_perslid_naam            VARCHAR2 (30);
   v_perslid_tussenvoegsel   VARCHAR2 (15);
   v_afdeling_key            NUMBER (10);
   v_srtperslid_key          NUMBER (10);
   --v_oslogin                VARCHAR2 (30);
   --v_locatie_key            NUMBER (10);
   v_gebouw_key              NUMBER (10);
   v_verdieping_key          NUMBER (10);
   v_ruimte_key              NUMBER (10);
   v_ruimte_nr               VARCHAR2 (10);
   v_wp_key                  NUMBER (10);
   v_wp_volgnr               NUMBER (3);
   v_wp_oms                  VARCHAR2 (30);
   v_groep_key               NUMBER (10);
   v_kenmerklink_key         NUMBER (10);
   v_dbg_gebouw_code         VARCHAR2 (10);
   v_dbg_ruimte_nr           VARCHAR2 (10);

   -- Dubbele nummers? Dan worden gewoon 2 (of meer) personen toegevoegd!
   -- Alle gegevens uit importtabel geformatteerd volgens specificatie
   CURSOR cstudent
   IS
      SELECT contact_nr,
             TO_DATE (enrollment_date, 'DD-MM-YYYY'),
             prs_perslid_naam,
             prs_perslid_tussenvoegsel,
             prs_perslid_voornaam,
             prs_perslid_initialen,
             DECODE (UPPER (prs_perslid_geslacht),
                     'MALE', 1,
                     'FEMALE', 0,
                     NULL)
                prs_perslid_geslacht,
             -- adres_prive_straat1 || ' ' || housenumber AS adres_prive_straat1,
             -- adres_prive_straat2,
             -- adres_prive_postcode,
             -- adres_prive_plaats,
             -- adres_prive_land,
             prs_perslid_email,
             prs_perslid_mobiel,
             prs_perslid_telefoonnr,
             prs_perslid_nr,
             san_nr,
             osiris_nr,
             TO_DATE (geboortedatum, 'DD-MM-YYYY') geboortedatum,
             prs_afdeling_omschrijving,
             -- prs_iban,
             prs_email_nybu
        FROM nybu_imp_crm
       WHERE contact_nr IS NOT NULL;

   FUNCTION hasKenmerk (p_perslid_key IN NUMBER, p_kenmerk_key IN NUMBER)
      RETURN BOOLEAN
   IS
      v_result   NUMBER;
   BEGIN
      SELECT COUNT ( * )
        INTO v_result
        FROM prs_kenmerklink
       WHERE     prs_link_key = p_perslid_key
             AND prs_kenmerk_key = p_kenmerk_key
             AND prs_kenmerklink_niveau = 'P'
             AND prs_kenmerklink_verwijder IS NULL;

      RETURN v_result > 0;
   END;
BEGIN
   v_errorhint := 'Fout bij bepalen functie';

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

   v_count_tot := 0;
   v_count_error := 0;

   FOR recstudent IN cstudent
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_aanduiding :=
               '['
            || recstudent.prs_perslid_naam
            || '|'
            || recstudent.prs_perslid_voornaam
            || '|'
            || recstudent.contact_nr
            || '] - ';

         v_errorhint :=
               'Fout bij bepalen afdeling ['
            || recstudent.prs_afdeling_omschrijving
            || ']';

         SELECT prs_afdeling_key
           INTO v_afdeling_key
           FROM prs_afdeling
          WHERE prs_afdeling_verwijder IS NULL
                AND UPPER (prs_afdeling_omschrijving) =
                      UPPER (recstudent.prs_afdeling_omschrijving);

         v_errorhint :=
            'Fout bij bepalen naam [' || recstudent.prs_perslid_naam || ']';

         --TODO: Is die lengte-check wel nodig? Doet import_prs ook al!
         --      (Let op: v_perslid_naam wordt hieronder gebruikt!)
         IF LENGTH (recstudent.prs_perslid_naam) > 30
         THEN
            v_perslid_naam := SUBSTR (recstudent.prs_perslid_naam, 1, 30);
            fac.imp_writelog (
               p_import_key,
               'W',
               v_aanduiding || 'Achternaam te lang',
               'Achternaam wordt afgebroken tot [' || v_perslid_naam || ']');
         ELSE
            v_perslid_naam := recstudent.prs_perslid_naam;
         END IF;

         v_errorhint := 'Fout bij bepalen student';

         --- NYBU#37370 en #37367 en #54060
         --- con_nr vervangen door san_nr en san wordt weer vervangen door osiris
         -- Studenten met een datum verwijder moeten evengoed opnieuw worden ingevoerd
         SELECT COUNT ( * ), MAX (prs_perslid_key)
           INTO v_count, v_perslid_key
           FROM prs_perslid p
          WHERE p.prs_perslid_verwijder IS NULL
                AND (EXISTS
                        (SELECT kps.prs_kenmerklink_key
                           FROM prs_kenmerklink kps
                          WHERE kps.prs_kenmerk_key = c_san_nr_key
                                AND p.prs_perslid_key = kps.prs_link_key
                                AND UPPER (kps.prs_kenmerklink_waarde) =
                                      UPPER (recstudent.san_nr))
                     OR EXISTS
                          (SELECT kpo.prs_kenmerklink_key
                             FROM prs_kenmerklink kpo
                            WHERE kpo.prs_kenmerk_key = c_osiris_nr_key
                                  AND p.prs_perslid_key = kpo.prs_link_key
                                  AND UPPER (kpo.prs_kenmerklink_waarde) =
                                        UPPER (recstudent.osiris_nr)));

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

            INSERT INTO prs_perslid (prs_perslid_module,
                                     prs_perslid_naam,
                                     prs_perslid_tussenvoegsel,
                                     prs_perslid_voornaam,
                                     prs_perslid_voorletters,
                                     prs_perslid_geslacht,
                                     prs_perslid_email,
                                     prs_perslid_mobiel,
                                     prs_perslid_telefoonnr,
                                     prs_perslid_nr,
                                     prs_afdeling_key,
                                     prs_srtperslid_key,
                                     prs_perslid_oslogin)
                VALUES ('PRS',
                        v_perslid_naam,
                        recstudent.prs_perslid_tussenvoegsel,
                        recstudent.prs_perslid_voornaam,
                        recstudent.prs_perslid_initialen,
                        recstudent.prs_perslid_geslacht,
                        recstudent.prs_email_nybu,
                        recstudent.prs_perslid_mobiel,
                        recstudent.prs_perslid_telefoonnr,
                        recstudent.prs_perslid_nr,
                        v_afdeling_key,
                        v_srtperslid_key,
                        COALESCE (recstudent.osiris_nr, recstudent.san_nr))
             RETURNING prs_perslid_key
                  INTO v_perslid_key;

            -- Kenmerk: contact_nr
            v_errorhint := 'Fout zetten contact_nr';
            prs.upsertkenmerk (c_contact_nr_key,
                               v_perslid_key,
                               recstudent.contact_nr);

            -- Kenmerk: geboortedatum
            v_errorhint := 'Fout zetten geboortedatum';
            prs.upsertkenmerk (
               c_birthday_key,
               v_perslid_key,
               TO_CHAR (recstudent.geboortedatum, 'DD-MM-YYYY'));

            -- Kenmerk: e-mailadres
            v_errorhint := 'Fout zetten e-mailadres';
            prs.upsertkenmerk (c_email_key,
                               v_perslid_key,
                               recstudent.prs_perslid_email);

            -- Kenmerk: SAN-nr
            v_errorhint := 'Fout zetten SAN-nr';
            prs.upsertkenmerk (c_san_nr_key,
                               v_perslid_key,
                               recstudent.san_nr);

            -- Kenmerk: OSIRIS-nr
            v_errorhint := 'Fout zetten OSIRIS-nr';
            prs.upsertkenmerk (c_osiris_nr_key,
                               v_perslid_key,
                               recstudent.osiris_nr);

            fac.imp_writelog (p_import_key,
                              'I',
                              'Persoon toegevoegd',
                              v_aanduiding);
         --TODO: voeg persoon toe op standaardwerkplek (xxx-0-999)
         ELSE
            IF (v_count > 1)
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  v_aanduiding || ' kan persoon niet eenduidig bepalen',
                  v_errorhint);
            END IF;

            v_errorhint := 'Fout bij wijzigen persoon';

            UPDATE prs_perslid
               SET prs_perslid_naam =
                      COALESCE (v_perslid_naam, prs_perslid_naam),
                   prs_perslid_tussenvoegsel =
                      COALESCE (recstudent.prs_perslid_tussenvoegsel,
                                prs_perslid_tussenvoegsel),
                   prs_perslid_voornaam =
                      COALESCE (recstudent.prs_perslid_voornaam,
                                prs_perslid_voornaam),
                   prs_perslid_initialen =
                      COALESCE (recstudent.prs_perslid_initialen,
                                prs_perslid_initialen),
                   prs_perslid_geslacht =
                      COALESCE (recstudent.prs_perslid_geslacht,
                                prs_perslid_geslacht),
                   prs_perslid_email =
                      COALESCE (recstudent.prs_email_nybu, prs_perslid_email),
                   prs_perslid_telefoonnr =
                      COALESCE (recstudent.prs_perslid_telefoonnr,
                                prs_perslid_telefoonnr),
                   prs_perslid_mobiel =
                      COALESCE (recstudent.prs_perslid_mobiel,
                                prs_perslid_mobiel),
                   prs_perslid_nr =
                      COALESCE (recstudent.prs_perslid_nr, prs_perslid_nr),
                   prs_perslid_oslogin =
                      COALESCE (recstudent.osiris_nr, recstudent.san_nr),
                   prs_afdeling_key =
                      COALESCE (v_afdeling_key, prs_afdeling_key),
                   prs_srtperslid_key =
                      COALESCE (v_srtperslid_key, prs_srtperslid_key)
             WHERE prs_perslid_key = v_perslid_key;

            -- Kenmerk: geboortedatum
            v_errorhint := 'Fout zetten geboortedatum';

            IF (NOT hasKenmerk (v_perslid_key, c_birthday_key))
            THEN
               prs.upsertkenmerk (
                  c_birthday_key,
                  v_perslid_key,
                  TO_CHAR (recstudent.geboortedatum, 'DD-MM-YYYY'));
            END IF;

            -- Kenmerk: e-mailadres
            v_errorhint := 'Fout zetten e-mailadres';

            IF (NOT hasKenmerk (v_perslid_key, c_email_key))
            THEN
               prs.upsertkenmerk (c_email_key,
                                  v_perslid_key,
                                  recstudent.prs_perslid_email);
            END IF;

            -- Kenmerk: SAN-nr
            v_errorhint := 'Fout zetten SAN-nr';

            IF (NOT hasKenmerk (v_perslid_key, c_san_nr_key))
            THEN
               prs.upsertkenmerk (c_san_nr_key,
                                  v_perslid_key,
                                  recstudent.san_nr);
            END IF;

            -- Kenmerk: OSIRIS-nr
            v_errorhint := 'Fout zetten OSIRIS-nr';

            IF (NOT hasKenmerk (v_perslid_key, c_osiris_nr_key))
            THEN
               prs.upsertkenmerk (c_osiris_nr_key,
                                  v_perslid_key,
                                  recstudent.osiris_nr);
            END IF;


            fac.imp_writelog (p_import_key,
                              'I',
                              'Persoonsgegevens aangevuld',
                              v_aanduiding);
         --TODO: als nog geen werkplek, dan standaardwerkplek?
         END IF;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            v_count_error := v_count_error + 1;
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || 'Geen data gevonden',
                              v_errorhint);
         WHEN OTHERS
         THEN
            v_count_error := v_count_error + 1;
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg :=
                  'OTHERS (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              v_errorhint);
            COMMIT;
      END;
   END LOOP;

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

   COMMIT;
END nybu_update_crm;
/

------- OVERIG ------------------------------------------------------------------

-- Ruimtes waar mensen vandaan/naartoe kunnen verhuizen

CREATE OR REPLACE VIEW nybu_v_werkplekruimtes
AS
   SELECT rg.*
     FROM alg_v_ruimte_gegevens rg, alg_srtruimte sr
    WHERE     rg.alg_srtruimte_key = sr.alg_srtruimte_key
          AND sr.alg_srtruimte_verwijder IS NULL
          AND sr.prs_bevat_werkplek IS NOT NULL;


------- HUURCONTRACTEN ----------------------------------------------------------

-- Kenmerkdomein projectkostenplaats

CREATE OR REPLACE VIEW nybu_v_projectkostenplaats
AS
   SELECT prs_kostenplaats_key,
          prs_kostenplaats_nr,
          prs_kostenplaats_omschrijving,
          prs_kostenplaats_nr || ' - ' || prs_kostenplaats_omschrijving
             prs_kostenplaats_aanduiding
     FROM prs_kostenplaats
    WHERE prs_kostenplaats_verwijder IS NULL
          AND prs_kostenplaats_module = 'PRJ';

-- Kenmerkdomein huurders (van studentenkamers)
-- Toont alle studenten plus allen niet-studenten aangemerkt als 'is huurder'
-- Voormalige studenten worden met een verwijderdatum in het verleden opgehaald (i.e. niet kiesbaar, alleen toonbaar)
-- functie 'Student' = 1537
-- kenmerk 'Former tenant' = 1220
-- kenmerk 'Is huurder' = 1080

CREATE OR REPLACE VIEW nybu_v_huurders_student
AS
   SELECT pf.prs_perslid_key,
          pf.prs_perslid_naam_full || ' [' || p.prs_perslid_nr || ']'
             huurder_naam,
          DECODE (
             p.prs_perslid_key,
             (SELECT prs_link_key
                FROM prs_kenmerklink pk
               WHERE     p.prs_perslid_key = pk.prs_link_key
                     AND prs_kenmerklink_waarde = 1
                     AND prs_kenmerk_key = 1220),
             SYSDATE - 1,
             p.prs_perslid_verwijder)
             prs_perslid_verwijder
     FROM prs_v_perslid_fullnames_all pf, prs_perslid p
    WHERE pf.prs_perslid_key = p.prs_perslid_key
          AND p.prs_srtperslid_key = 1537
   UNION ALL
   SELECT pf.prs_perslid_key,
          pf.prs_perslid_naam_full || ' [' || p.prs_perslid_nr || ']'
             huurder_naam,
          p.prs_perslid_verwijder
     FROM prs_v_perslid_fullnames_all pf, prs_perslid p, prs_kenmerklink km
    WHERE     pf.prs_perslid_key = p.prs_perslid_key
          AND p.prs_srtperslid_key NOT IN (1537)
          AND km.prs_link_key = p.prs_perslid_key
          AND km.prs_kenmerk_key = 1080
          AND km.prs_kenmerklink_waarde = '1'
          AND km.prs_kenmerklink_verwijder IS NULL;

-- Kenmerkdomein studentenkamers

CREATE OR REPLACE VIEW nybu_v_studentenkamers
AS
   SELECT r.alg_ruimte_key,
             g.alg_gebouw_code
          || '-'
          || v.alg_verdieping_volgnr
          || '-'
          || r.alg_ruimte_nr
          || ' ('
          || r.alg_ruimte_omschrijving
          || ', '
          || sr.alg_srtruimte_omschrijving
          || ')'
             ruimte_oms
     FROM alg_v_aanwezigruimte r,
          alg_verdieping v,
          alg_gebouw g,
          alg_srtruimte sr
    WHERE     v.alg_gebouw_key = g.alg_gebouw_key
          AND r.alg_verdieping_key = v.alg_verdieping_key
          AND r.alg_srtruimte_key IN (56, 43, 58, 39, 121, 141, 101, 201)
          AND sr.alg_srtruimte_key = r.alg_srtruimte_key;

-- Kenmerkdomein studentenpartner
-- functie 'Student partner' = 1644

CREATE OR REPLACE VIEW nybu_v_studentenpartners
AS
   SELECT pf.prs_perslid_key, pf.prs_perslid_naam_full
     FROM prs_v_perslid_fullnames pf, prs_v_aanwezigperslid p
    WHERE pf.prs_perslid_key = p.prs_perslid_key
          AND p.prs_srtperslid_key = 1644;

-- Kenmerkdomein kamercontrolemeldingen
-- (stdmelding Request roomcheck (workflow) = 941, zie #36480, stdmld key is nu 2381 )

CREATE OR REPLACE VIEW nybu_v_huur_kamercontroles
AS
   SELECT mld_melding_key, TO_CHAR (mld_melding_key) oms
     FROM mld_melding
    WHERE mld_stdmelding_key in ( 941, 2381);

-- NYBU#30687: Kenmerkdomein "Arrival on campus"-meldingen
-- (stdmelding 'Arrival on Campus (workflow)' = 1021)

CREATE OR REPLACE VIEW nybu_v_huur_arrival
AS
   SELECT mld_melding_key, TO_CHAR (mld_melding_key) oms
     FROM mld_melding
    WHERE mld_stdmelding_key = 1021;

-- Kenmerkdomein huurders overige ruimtes en residenties
-- kenmerk 'Is huurder' = 1080

CREATE OR REPLACE VIEW nybu_v_huurders
AS
   SELECT pf.*
     FROM prs_v_perslid_fullnames_all pf, prs_kenmerklink kl
    WHERE     kl.prs_link_key = pf.prs_perslid_key
          AND kl.prs_kenmerk_key = 1080
          AND kl.prs_kenmerklink_verwijder IS NULL
          AND kl.prs_kenmerklink_waarde = '1';

-- Gebruikt door huurcontracten-view en bereken-export; lijstje van huurcontracten
-- waarmee bepaald kan worden of een huurder een roommate (i.e. iemand met een contract
-- op dezelfde kamer) heeft.

CREATE OR REPLACE VIEW nybu_v_potential_roommates
AS
   SELECT kamer.cnt_contract_key,
          fac.safe_to_number (kamer.cnt_kenmerkcontract_waarde)
             alg_ruimte_key,
          pf.prs_perslid_key,
          pf.prs_perslid_naam_full,
          contr.cnt_contract_looptijd_van,
          contr.cnt_contract_looptijd_tot
     FROM cnt_kenmerkcontract kamer,
          cnt_contract contr,
          prs_v_perslid_fullnames pf
    WHERE     kamer.cnt_kenmerk_key = 1
          AND kamer.cnt_kenmerkcontract_verwijder IS NULL
          AND pf.prs_perslid_key = contr.cnt_prs_perslid_key
          AND contr.cnt_contract_key = kamer.cnt_contract_key
          AND contr.cnt_contract_verwijder IS NULL
          AND contr.cnt_contract_status = 0
          -- Poging om alleen recente contracten te vinden (voor allonges hoeven contracten niet per se actueel te zijn)
          AND contr.cnt_contract_looptijd_tot >=
                TRUNC (ADD_MONTHS (SYSDATE, -1), 'MM');

-- Basisview voor berekening, rapportage en facturatie huurcontracten studentenkamers.
-- contractsoort Student room            55
-- kenmerk Tenant                        81
-- kenmerk Codanr                      1000
-- kenmerk SANnr                       1200
-- kenmerk OSIRISnr                    1302
-- kenmerk Studentenkamer                 1
-- kenmerk Borgbedrag                     2
-- kenmerk Borg_betaald                  43
-- kenmerk Schades                       41 NYBU#51606 schade niet meer van toepassing
-- kenmerk Telefoonaansluiting           42
-- kenmerk Partner                       21
-- kenmerk Budgetnr                      63
-- kenmerk Rent to budget nr             64
-- kenmerk Service costs to nr           65
-- kenmerk Telephone to nr               66 NYBU#51606 telnr niet meer van toepassing
-- kenmerk Partnercharge to nr          681
-- kenmerk Vooruit betalen              122 NYBU#51606 vooruit betalen niet meer van toepassing
-- kenmerk Betaald tot                  124
-- kenmerk Refund                       123 NYBU#51606 refund niet meer van toepassing
-- kenmerk Schoonmaak verhuizing        941
-- srtkenmerk Maak allonge(s)           681
-- usrdata telefoonkosten                61
-- usrdata Tenant                       441
-- usrdata Budget nr                    442
-- usrdata Salary                       443
-- Sleutel verhuizing A1121							1181
-- Sleutel vertrek  A1122								1222
-- fact. omschrijving vertrek A1141			1201
-- bedrag vertrek A1143									1202


-- NYBU#30133: SAN-nummer overruled nu het CODA-nummer (CON-nummer)
-- NYBU#30899: voor allonges alleen nog contracten met "Maak allonge(s)" beschouwen
-- NYBU#33330: huurcontract partner kan halverwege de maand eindigen; die looptijd ook meegeven
-- NYBU#33043: contracten in voorbereiding hoeven niet aan een ruimte gekoppeld te zijn
-- NYBU#54060: OSIRIS-nummer overruled nu het SAN-nummer

CREATE OR REPLACE VIEW NYBU_V_HUURCONTRACTEN_STUDENT
(
   CNT_CONTRACT_KEY,
   CNT_CONTRACT_NUMMER_INTERN,
   CNT_CONTRACT_VERSIE,
   CNT_CONTRACT_NR_VERSIE,
   CNT_CONTRACT_LOOPTIJD_VAN,
   CNT_CONTRACT_LOOPTIJD_TOT,
   PRS_BEDRIJF_KEY,
   KPN,
   KPNGRP,
   KOSTENSOORT,
   ALG_RUIMTE_KEY,
   GEBOUW,
   VERDIEPING,
   KAMER,
   PRS_PERSLID_KEY,
   ACHTERNAAM,
   NAAM,
   CODANR,
   LICHTING,
   PARTNER_KEY,
   PARTNER_NAAM,
   ALG_SRTRUIMTE_OMSCHRIJVING,
   HUUR,
   BUDGET_HUUR,
   SERVICEKOSTEN,
   BUDGET_SERVICE,
   PARTNERCHARGE,
   BUDGET_PARTNERCHARGE,
   TELEFOONCHARGE,
   BUDGET_TELEFOON,
   BORG_TEBETALEN,
   BORG_BETAALD,
   SLEUTEL_VERH,
   SLEUTEL_VERTR,
   AANTAL_PERIODES,
   BETAALD_TOT,
   FACT_OMSCHR,
   FACT_BEDRAG,
   SCHOONMAAK_VERH,
   SCHOONMAAK_VERTR,
   MAAK_ALLONGE
)
AS
   SELECT c.cnt_contract_key,
          c.cnt_contract_nummer_intern,
          c.cnt_contract_versie,
          DECODE (
             c.cnt_contract_versie,
             NULL,
             c.cnt_contract_nummer_intern,
             c.cnt_contract_nummer_intern || '.' || c.cnt_contract_versie)
             cnt_contract_nr_versie,
          c.cnt_contract_looptijd_van,
          c.cnt_contract_looptijd_tot,                                -- eind,
          b.prs_bedrijf_key,
          kp.prs_kostenplaats_nr kpn,
          SUBSTR (kg.prs_kostenplaatsgrp_oms, 1, 7) kpngrp,
          ks.prs_kostensoort_oms AS kostensoort,
          r.alg_ruimte_key,
          g.alg_gebouw_naam gebouw,
          v.alg_verdieping_code verdieping,
          r.alg_ruimte_nr kamer,
          p.prs_perslid_key,
          p.prs_perslid_naam achternaam,
          pf.prs_perslid_naam_full naam,
          COALESCE (
             osirisnr.prs_kenmerklink_waarde,
             COALESCE (sannr.prs_kenmerklink_waarde,
                       codanr.prs_kenmerklink_waarde))
             codanr,
          a.prs_afdeling_naam lichting,
          partner.prs_perslid_key partner_key,
          partner.prs_perslid_naam_full partner_naam,
          sr.alg_srtruimte_omschrijving,
          COALESCE (sr.alg_srtruimte_prijs, 0) huur,
          DECODE (rentto.cnt_kenmerkcontract_waarde,
                  '442', ak.prs_kostenplaats_nr,
                  '443', 'salaris',
                  NULL)
             budget_huur,
          COALESCE (sr.alg_srtruimte_prijs2, 0) servicekosten,
          DECODE (servto.cnt_kenmerkcontract_waarde,
                  '442', ak.prs_kostenplaats_nr,
                  '443', 'salaris',
                  NULL)
             budget_service,
          COALESCE (sr.alg_srtruimte_prijs3, 0) partnercharge,
          DECODE (partnerto.cnt_kenmerkcontract_waarde,
                  '442', ak.prs_kostenplaats_nr,
                  '443', 'salaris',
                  NULL)
             budget_partnercharge,
          DECODE (telaansl.cnt_kenmerkcontract_waarde,
                  '1', (SELECT fac_usrdata_prijs
                          FROM fac_usrdata
                         WHERE fac_usrdata_key = 61),
                  0)
             telefooncharge,
          -- DECODE (telto.cnt_kenmerkcontract_waarde,
          --         '442', ak.prs_kostenplaats_nr,
          --         '443', 'salaris',
          --         NULL)
          '' budget_telefoon,
          DECODE (borgbet.cnt_kenmerkcontract_waarde,
                  '1', 0,
                  fac.safe_to_number (borgbedr.cnt_kenmerkcontract_waarde))
             borg_tebetalen,
          DECODE (borgbet.cnt_kenmerkcontract_waarde,
                  '1',
                  fac.safe_to_number (borgbedr.cnt_kenmerkcontract_waarde),
                  0)
             borg_betaald,
          fac.safe_to_number (sleutel_verh.cnt_kenmerkcontract_waarde) sleutel_verh,
          fac.safe_to_number (sleutel_vertr.cnt_kenmerkcontract_waarde)sleutel_vertr,
          -- DECODE (fac.safe_to_number (vooruit.cnt_kenmerkcontract_waarde),
          --         NULL, 1,
          --         fac.safe_to_number (vooruit.cnt_kenmerkcontract_waarde))
          1 aantal_periodes,
          bettot.cnt_kenmerkcontract_waarde betaald_tot,
          fact_omschr.cnt_kenmerkcontract_waarde fact_omschr,
          fac.safe_to_number (fact_bedrag.cnt_kenmerkcontract_waarde)
             fact_bedrag,
          fac.safe_to_number (schoonm_verh.cnt_kenmerkcontract_waarde) schoonmaak_verh,
          fac.safe_to_number (schoonm_vertr.cnt_kenmerkcontract_waarde)schoonmaak_vertr,
          fac.safe_to_number (allonge.cnt_kenmerkcontract_waarde)
             maak_allonge
     FROM cnt_contract c,
          prs_perslid p,
          prs_v_afdeling b,
          prs_v_perslid_fullnames pf,
          prs_v_aanwezigkostenplaats ak,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1000
                  AND prs_kenmerklink_verwijder IS NULL) codanr,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1200
                  AND prs_kenmerklink_verwijder IS NULL) sannr,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1302
                  AND prs_kenmerklink_verwijder IS NULL) osirisnr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1
                  AND cnt_kenmerkcontract_verwijder IS NULL) studkam,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 2
                  AND cnt_kenmerkcontract_verwijder IS NULL) borgbedr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 43
                  AND cnt_kenmerkcontract_verwijder IS NULL) borgbet,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 42
                  AND cnt_kenmerkcontract_verwijder IS NULL) telaansl,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1222
                  AND cnt_kenmerkcontract_verwijder IS NULL) sleutel_vertr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1181
                  AND cnt_kenmerkcontract_verwijder IS NULL) sleutel_verh,
          (SELECT kc.cnt_contract_key, pf.*
             FROM cnt_kenmerkcontract kc, prs_v_perslid_fullnames pf
            WHERE kc.cnt_kenmerk_key = 21
                  AND cnt_kenmerkcontract_verwijder IS NULL
                  AND fac.safe_to_number (kc.cnt_kenmerkcontract_waarde) =
                        pf.prs_perslid_key) partner,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 63
                  AND cnt_kenmerkcontract_verwijder IS NULL) budgnr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 64
                  AND cnt_kenmerkcontract_verwijder IS NULL) rentto,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 65
                  AND cnt_kenmerkcontract_verwijder IS NULL) servto,
          -- (SELECT *
          --    FROM cnt_kenmerkcontract
          --   WHERE cnt_kenmerk_key = 66
          --         AND cnt_kenmerkcontract_verwijder IS NULL) telto,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 681
                  AND cnt_kenmerkcontract_verwijder IS NULL) partnerto,
          -- (SELECT *
          --    FROM cnt_kenmerkcontract
          --   WHERE cnt_kenmerk_key = 122
          --         AND cnt_kenmerkcontract_verwijder IS NULL) vooruit,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 124
                  AND cnt_kenmerkcontract_verwijder IS NULL) bettot,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1202
                  AND cnt_kenmerkcontract_verwijder IS NULL) fact_bedrag,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1201
                  AND cnt_kenmerkcontract_verwijder IS NULL) fact_omschr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 941
                  AND cnt_kenmerkcontract_verwijder IS NULL) schoonm_verh,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 942
                  AND cnt_kenmerkcontract_verwijder IS NULL) schoonm_vertr,
          (SELECT kc.*
             FROM cnt_kenmerkcontract kc, cnt_kenmerk k
            WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                  AND k.cnt_srtkenmerk_key = 681
                  AND kc.cnt_kenmerkcontract_verwijder IS NULL) allonge,
          alg_ruimte r,
          alg_verdieping v,
          alg_gebouw g,
          alg_srtruimte sr,
          prs_afdeling a,
          prs_kostenplaats kp,
          prs_kostenplaatsgrp kg,
          ins_tab_discipline d,
          prs_kostensoort ks
    WHERE     c.ins_discipline_key = 55
          AND c.ins_discipline_key = d.ins_discipline_key
          AND d.prs_kostensoort_key = ks.prs_kostensoort_key
          AND c.cnt_contract_verwijder IS NULL
          AND c.cnt_contract_status = 0
          AND p.prs_afdeling_key = b.prs_afdeling_key
          AND p.prs_perslid_key = c.cnt_prs_perslid_key
          AND pf.prs_perslid_key = p.prs_perslid_key
          AND codanr.prs_link_key(+) = p.prs_perslid_key
          AND sannr.prs_link_key(+) = p.prs_perslid_key
          AND osirisnr.prs_link_key(+) = p.prs_perslid_key
          AND studkam.cnt_contract_key(+) = c.cnt_contract_key
          AND r.alg_ruimte_key(+) =
                fac.safe_to_number (studkam.cnt_kenmerkcontract_waarde)
          AND v.alg_verdieping_key(+) = r.alg_verdieping_key
          AND g.alg_gebouw_key(+) = v.alg_gebouw_key
          AND sr.alg_srtruimte_key(+) = r.alg_srtruimte_key
          AND borgbedr.cnt_contract_key(+) = c.cnt_contract_key
          AND borgbet.cnt_contract_key(+) = c.cnt_contract_key
          AND telaansl.cnt_contract_key(+) = c.cnt_contract_key
          AND sleutel_verh.cnt_contract_key(+) = c.cnt_contract_key
          AND sleutel_vertr.cnt_contract_key(+) = c.cnt_contract_key
          AND partner.cnt_contract_key(+) = c.cnt_contract_key
          AND budgnr.cnt_contract_key(+) = c.cnt_contract_key
          AND ak.prs_kostenplaats_key(+) =
                fac.safe_to_number (budgnr.cnt_kenmerkcontract_waarde)
          AND rentto.cnt_contract_key(+) = c.cnt_contract_key
          AND servto.cnt_contract_key(+) = c.cnt_contract_key
          -- AND telto.cnt_contract_key(+) = c.cnt_contract_key
          AND partnerto.cnt_contract_key(+) = c.cnt_contract_key
          -- AND vooruit.cnt_contract_key(+) = c.cnt_contract_key
          AND bettot.cnt_contract_key(+) = c.cnt_contract_key
          AND fact_omschr.cnt_contract_key(+) = c.cnt_contract_key
          AND fact_bedrag.cnt_contract_key(+) = c.cnt_contract_key
          AND schoonm_verh.cnt_contract_key(+) = c.cnt_contract_key
          AND schoonm_vertr.cnt_contract_key(+) = c.cnt_contract_key
          AND allonge.cnt_contract_key(+) = c.cnt_contract_key
          AND a.prs_afdeling_key = p.prs_afdeling_key
          AND kp.prs_kostenplaats_key = c.prs_kostenplaats_key
          AND kg.prs_kostenplaatsgrp_key(+) = kp.prs_kostenplaatsgrp_key
          AND COALESCE (
                osirisnr.prs_kenmerklink_waarde,
                COALESCE (sannr.prs_kenmerklink_waarde,
                          codanr.prs_kenmerklink_waarde)) IS NOT NULL;


----- Exports ------------------------------------

-- Bepaalt factuurregels op basis van huidige contractgegevens.
-- Deze gegevens kunnen op twee manieren gebruikt worden: reguliere export en mutatie.
-- Bij reguliere export worden de gegenereerde factuurregels voor een periode naar een exportbestand geschreven
-- Bij mutatie worden de resulterende regels tegen al bestaande regels voor dezelfde periode gehouden en
-- worden verschilregels gegenereerd. Die verschilregels zijn voor de volgende periode en worden in de
-- export voor die periode meegenomen.
-- Parameter p_mode:
--   0: testexport         (gebruik alleen buffer, kenmerken niet bijwerken)
--   1: definitieve export (kopieer buffer naar archief, kenmerken bijwerken)
--   2: allonges           (gebruik alleen buffer, alleen contracten met "Maak allonge(s)" gezet,
--                          kenmerken niet bijwerken)
-- NYBU#30133: SAN-nummer overruled CODA-nummer (CON-nummer)
-- NYBU#30899: kenmerk "Maak allonge(s)" meenemen
-- NYBU#33043: alleen campuscontracten overwegen die aan een ruimte gekoppeld te zijn
-- NYBU#54060: OSIRIS-nummer overruled nu het SAN-nummer
-- cnt_srtcontract   Campus                                55
-- cnt_srtcontract   Staff Residence                      221
-- cnt_srtcontract   Office                               561
-- prs_kenmerk       CON-number                          1000
-- prs_kenmerk       SAN number                          1200
-- prs_kenmerk       OSIRIS number                       1302
-- cnt_kenmerk       Student room                           1
-- cnt_kenmerk       Budget nr                             63
-- cnt_kenmerk       Tenant (student)                      81
-- cnt_kenmerk       Bill in advance                      122 NYBU#51606 bill in advance komt te vervallen
-- cnt_kenmerk       Contract paid until                  124
-- cnt_srtkenmerk    Huurder                              101
-- cnt_srtkenmerk    Verhuurbare ruimte                   102
-- cnt_srtkenmerk    P-number                             341
-- cnt_srtkenmerk    Maak allonge(s)                      681
-- cnt_srtkenmerk    Refund omschrijving (BTW hoog)       722
-- cnt_srtkenmerk    Refund bedrag (incl BTW hoog)        723
-- cnt_srtkenmerk    Refund omschrijving (BTW laag)       724
-- cnt_srtkenmerk    Refund bedrag (incl BTW laag)        725
-- cnt_srtkenmerk    Refund omschrijving (geen BTW)       726
-- cnt_srtkenmerk    Refund bedrag (geen BTW)             727
-- fac_usrtab        CODA_BTW                              42
-- fac_usrtab        CODA_OMS                              43


CREATE OR REPLACE PROCEDURE nybu_bereken_factuurregels (
   p_applname   IN VARCHAR2,
   p_run        IN DATE,
   p_periode    IN VARCHAR2,
   p_mode       IN NUMBER)
AS
   v_aanduiding        VARCHAR2 (200);
   v_errorhint         VARCHAR2 (1000);
   v_errormsg          VARCHAR2 (1000);
   oracle_err_num      NUMBER;
   oracle_err_mes      VARCHAR2 (200);
   v_count             NUMBER;

   --- alle allonge regels die meegenomen zijn in de facturatie ronde
   CURSOR ar
   IS
      SELECT DISTINCT cnt_contract_key
        FROM nybu_huur_archief a
       WHERE     a.periode = p_periode
             AND a.IsMutatie = 1
             AND a.naar_coda IS NULL;

   -- Student room
   -- Alle verhuurcontracten waarbij de huidige periode (deels) binnen de looptijd valt
   -- TRUNC op maand, omdat contracten halverwege de maand kunnen beginnen/eindigen
   CURSOR sr
   IS
      SELECT c.*
        FROM nybu_v_huurcontracten_student c
       WHERE (c.betaald_tot IS NULL OR c.betaald_tot < p_periode)
             AND TO_DATE (p_periode, 'YYYYMM') BETWEEN TRUNC (
                                                          c.cnt_contract_looptijd_van,
                                                          'MM')
                                                   AND  TRUNC (
                                                           c.cnt_contract_looptijd_tot,
                                                           'MM')
             AND alg_ruimte_key IS NOT NULL;

   -- Residence/office
   CURSOR ro
   IS
      SELECT c.cnt_contract_key,
             c.cnt_contract_looptijd_van,
             c.cnt_contract_looptijd_tot,
             DECODE (c.ins_discipline_key,
                     221, 'Staff residence',
                     561, 'Office')
                betreft,
             c.cnt_contract_nummer_intern,
             c.cnt_contract_versie,
             DECODE (
                c.cnt_contract_versie,
                NULL,
                c.cnt_contract_nummer_intern,
                c.cnt_contract_nummer_intern || '.' || c.cnt_contract_versie)
                cnt_contract_nr_versie,
             c.cnt_contract_omschrijving,
             kp.prs_kostenplaats_nr kpn,
             TRIM (SUBSTR (kg.prs_kostenplaatsgrp_oms, 1, 7)) kpngrp,
             ks.prs_kostensoort_oms kostensoort,
             p.prs_perslid_key,
             p.prs_perslid_naam,
             pf.prs_perslid_naam_full,
             COALESCE (osirisnr.prs_kenmerklink_waarde,
                       sannr.prs_kenmerklink_waarde,
                       codanr.prs_kenmerklink_waarde,
                       'Geen nr. bekend')
                codanr,
             k.prs_kostenplaats_nr,
             rg.alg_ruimte_key,
             rg.alg_ruimte_aanduiding,
             allonge.cnt_kenmerkcontract_waarde maak_allonge
        FROM (SELECT *
                FROM cnt_contract
               WHERE ins_discipline_key IN (221, 561)) c,
             (SELECT kc.*
                FROM cnt_kenmerkcontract kc, cnt_kenmerk k
               WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                     AND k.cnt_srtkenmerk_key = 101
                     AND kc.cnt_kenmerkcontract_verwijder IS NULL) huurder,
             (SELECT kc.*
                FROM cnt_kenmerkcontract kc, cnt_kenmerk k
               WHERE kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                     AND cnt_srtkenmerk_key = 341) pnummer,
             (SELECT kc.*
                FROM cnt_kenmerkcontract kc, cnt_kenmerk k
               WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                     AND k.cnt_srtkenmerk_key = 102
                     AND kc.cnt_kenmerkcontract_verwijder IS NULL) ruimte,
             (SELECT kc.*
                FROM cnt_kenmerkcontract kc, cnt_kenmerk k
               WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                     AND k.cnt_srtkenmerk_key = 681
                     AND kc.cnt_kenmerkcontract_verwijder IS NULL) allonge,
             prs_perslid p,
             prs_v_perslid_fullnames pf,
             (SELECT *
                FROM prs_kenmerklink
               WHERE prs_kenmerk_key = 1000
                     AND prs_kenmerklink_verwijder IS NULL) codanr,
             (SELECT *
                FROM prs_kenmerklink
               WHERE prs_kenmerk_key = 1200
                     AND prs_kenmerklink_verwijder IS NULL) sannr,
             (SELECT *
                FROM prs_kenmerklink
               WHERE prs_kenmerk_key = 1302
                     AND prs_kenmerklink_verwijder IS NULL) osirisnr,
             prs_kostenplaats k,
             prs_kostenplaats kp,
             prs_kostenplaatsgrp kg,
             alg_v_ruimte_gegevens rg,
             ins_tab_discipline d,
             prs_kostensoort ks
       WHERE     c.ins_discipline_key = d.ins_discipline_key
             AND d.prs_kostensoort_key = ks.prs_kostensoort_key
             AND huurder.cnt_contract_key(+) = c.cnt_contract_key
             AND pnummer.cnt_contract_key(+) = c.cnt_contract_key
             AND ruimte.cnt_contract_key(+) = c.cnt_contract_key
             AND allonge.cnt_contract_key(+) = c.cnt_contract_key
             AND kp.prs_kostenplaats_key = c.prs_kostenplaats_key
             AND kg.prs_kostenplaatsgrp_key(+) = kp.prs_kostenplaatsgrp_key
             AND p.prs_perslid_key(+) =
                   fac.safe_to_number (huurder.cnt_kenmerkcontract_waarde)
             AND pf.prs_perslid_key(+) = p.prs_perslid_key
             AND codanr.prs_link_key(+) = p.prs_perslid_key
             AND sannr.prs_link_key(+) = p.prs_perslid_key
             AND osirisnr.prs_link_key(+) = p.prs_perslid_key
             AND k.prs_kostenplaats_key(+) =
                   fac.safe_to_number (pnummer.cnt_kenmerkcontract_waarde)
             AND rg.alg_ruimte_key(+) =
                   fac.safe_to_number (ruimte.cnt_kenmerkcontract_waarde)
             AND c.cnt_contract_verwijder IS NULL
             AND TO_DATE (p_periode, 'YYYYMM') BETWEEN TRUNC (
                                                          c.cnt_contract_looptijd_van,
                                                          'MM')
                                                   AND  TRUNC (
                                                           c.cnt_contract_looptijd_tot,
                                                           'MM');

   -- Refunds
   -- Voor zowel campus- als residence/office-contracten. Aparte cursor, omdat hiervoor
   -- ook gesloten contracten moeten worden beschouwd.
   CURSOR refunds
   IS
      WITH refunds
              AS (SELECT c.cnt_contract_key,
                         kco.cnt_kenmerkcontract_waarde omschrijving,
                         fac.safe_to_number (kcb.cnt_kenmerkcontract_waarde)
                            bedrag,
                         'VH21' btw,
                         ko.cnt_kenmerk_volgnummer volgnr,
                         ko.cnt_srtkenmerk_key,
                         ko.cnt_kenmerk_key omschr_key,
                         kb.cnt_kenmerk_key bedrag_key
                    FROM cnt_contract c,
                         cnt_kenmerk ko,
                         cnt_kenmerk kb,
                         cnt_kenmerkcontract kco,
                         cnt_kenmerkcontract kcb
                   WHERE     c.cnt_contract_verwijder IS NULL
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_contract_key = c.cnt_contract_key
                         AND kcb.cnt_contract_key = c.cnt_contract_key
                         AND kco.cnt_kenmerk_key = ko.cnt_kenmerk_key
                         AND kcb.cnt_kenmerk_key = kb.cnt_kenmerk_key
                         AND ko.cnt_kenmerk_key IN
                                  (SELECT cnt_kenmerk_key
                                     FROM cnt_kenmerk
                                    WHERE cnt_srtkenmerk_key = 722)
                         AND kb.cnt_kenmerk_key IN
                                  (SELECT cnt_kenmerk_key
                                     FROM cnt_kenmerk
                                    WHERE cnt_srtkenmerk_key = 723)
                  UNION ALL
                  SELECT c.cnt_contract_key,
                         kco.cnt_kenmerkcontract_waarde omschrijving,
                         fac.safe_to_number (kcb.cnt_kenmerkcontract_waarde)
                            bedrag,
                         'VL9' btw,
                         ko.cnt_kenmerk_volgnummer volgnr,
                         ko.cnt_srtkenmerk_key,
                         ko.cnt_kenmerk_key omschr_key,
                         kb.cnt_kenmerk_key bedrag_key
                    FROM cnt_contract c,
                         cnt_kenmerk ko,
                         cnt_kenmerk kb,
                         cnt_kenmerkcontract kco,
                         cnt_kenmerkcontract kcb
                   WHERE     c.cnt_contract_verwijder IS NULL
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_contract_key = c.cnt_contract_key
                         AND kcb.cnt_contract_key = c.cnt_contract_key
                         AND kco.cnt_kenmerk_key = ko.cnt_kenmerk_key
                         AND kcb.cnt_kenmerk_key = kb.cnt_kenmerk_key
                         AND ko.cnt_kenmerk_key IN
                                  (SELECT cnt_kenmerk_key
                                     FROM cnt_kenmerk
                                    WHERE cnt_srtkenmerk_key = 724)
                         AND kb.cnt_kenmerk_key IN
                                  (SELECT cnt_kenmerk_key
                                     FROM cnt_kenmerk
                                    WHERE cnt_srtkenmerk_key = 725)
                  UNION ALL
                  SELECT c.cnt_contract_key,
                         kco.cnt_kenmerkcontract_waarde omschrijving,
                         fac.safe_to_number (kcb.cnt_kenmerkcontract_waarde)
                            bedrag,
                         'VV' btw,
                         ko.cnt_kenmerk_volgnummer volgnr,
                         ko.cnt_srtkenmerk_key,
                         ko.cnt_kenmerk_key omschr_key,
                         kb.cnt_kenmerk_key bedrag_key
                    FROM cnt_contract c,
                         cnt_kenmerk ko,
                         cnt_kenmerk kb,
                         cnt_kenmerkcontract kco,
                         cnt_kenmerkcontract kcb
                   WHERE     c.cnt_contract_verwijder IS NULL
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_contract_key = c.cnt_contract_key
                         AND kcb.cnt_contract_key = c.cnt_contract_key
                         AND kco.cnt_kenmerk_key = ko.cnt_kenmerk_key
                         AND kcb.cnt_kenmerk_key = kb.cnt_kenmerk_key
                         AND ko.cnt_kenmerk_key IN
                                  (SELECT cnt_kenmerk_key
                                     FROM cnt_kenmerk
                                    WHERE cnt_srtkenmerk_key = 726)
                         AND kb.cnt_kenmerk_key IN
                                  (SELECT cnt_kenmerk_key
                                     FROM cnt_kenmerk
                                    WHERE cnt_srtkenmerk_key = 727)),
           contracten
              AS (SELECT c.cnt_contract_key,
                         c.ins_discipline_key,
                         DECODE (c.ins_discipline_key,
                                 221, 'Staff residence',
                                 561, 'Office')
                            betreft,
                         c.cnt_contract_nummer_intern,
                         c.cnt_contract_versie,
                         DECODE (
                            c.cnt_contract_versie,
                            NULL,
                            c.cnt_contract_nummer_intern,
                               c.cnt_contract_nummer_intern
                            || '.'
                            || c.cnt_contract_versie)
                            cnt_contract_nr_versie,
                         kp.prs_kostenplaats_nr kpn,
                         TRIM (SUBSTR (kg.prs_kostenplaatsgrp_oms, 1, 7))
                            kpngrp,
                         ks.prs_kostensoort_oms kostensoort,
                         p.prs_perslid_key,
                         p.prs_perslid_naam,
                         pf.prs_perslid_naam_full,
                         COALESCE (osirisnr.prs_kenmerklink_waarde,
                                   sannr.prs_kenmerklink_waarde,
                                   codanr.prs_kenmerklink_waarde,
                                   'Geen nr. bekend')
                            codanr,
                         k.prs_kostenplaats_nr budgetnr,
                         rg.alg_ruimte_key,
                         rg.alg_ruimte_aanduiding alg_ruimte_nr,
                         allonge.cnt_kenmerkcontract_waarde maak_allonge
                    FROM (SELECT *
                            FROM cnt_contract
                           WHERE ins_discipline_key IN (221, 561)) c,
                         (SELECT kc.*
                            FROM cnt_kenmerkcontract kc, cnt_kenmerk k
                           WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                                 AND k.cnt_srtkenmerk_key = 101
                                 AND kc.cnt_kenmerkcontract_verwijder IS NULL)
                         huurder,
                         (SELECT kc.*
                            FROM cnt_kenmerkcontract kc, cnt_kenmerk k
                           WHERE kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                                 AND cnt_srtkenmerk_key = 341) pnummer,
                         (SELECT kc.*
                            FROM cnt_kenmerkcontract kc, cnt_kenmerk k
                           WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                                 AND k.cnt_srtkenmerk_key = 102
                                 AND kc.cnt_kenmerkcontract_verwijder IS NULL)
                         ruimte,
                         (SELECT kc.*
                            FROM cnt_kenmerkcontract kc, cnt_kenmerk k
                           WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                                 AND k.cnt_srtkenmerk_key = 681
                                 AND kc.cnt_kenmerkcontract_verwijder IS NULL)
                         allonge,
                         prs_perslid p,
                         prs_v_perslid_fullnames pf,
                         (SELECT *
                            FROM prs_kenmerklink
                           WHERE prs_kenmerk_key = 1000
                                 AND prs_kenmerklink_verwijder IS NULL)
                         codanr,
                         (SELECT *
                            FROM prs_kenmerklink
                           WHERE prs_kenmerk_key = 1200
                                 AND prs_kenmerklink_verwijder IS NULL) sannr,
                         (SELECT *
                            FROM prs_kenmerklink
                           WHERE prs_kenmerk_key = 1302
                                 AND prs_kenmerklink_verwijder IS NULL)
                         osirisnr,
                         prs_kostenplaats k,
                         prs_kostenplaats kp,
                         prs_kostenplaatsgrp kg,
                         alg_v_ruimte_gegevens rg,
                         ins_tab_discipline d,
                         prs_kostensoort ks
                   WHERE     c.ins_discipline_key = d.ins_discipline_key
                         AND c.ins_discipline_key IN (221, 561)
                         AND d.prs_kostensoort_key = ks.prs_kostensoort_key
                         AND huurder.cnt_contract_key(+) = c.cnt_contract_key
                         AND pnummer.cnt_contract_key(+) = c.cnt_contract_key
                         AND ruimte.cnt_contract_key(+) = c.cnt_contract_key
                         AND allonge.cnt_contract_key(+) = c.cnt_contract_key
                         AND kp.prs_kostenplaats_key = c.prs_kostenplaats_key
                         AND kg.prs_kostenplaatsgrp_key(+) =
                               kp.prs_kostenplaatsgrp_key
                         AND p.prs_perslid_key(+) =
                               fac.safe_to_number (
                                  huurder.cnt_kenmerkcontract_waarde)
                         AND pf.prs_perslid_key(+) = p.prs_perslid_key
                         AND codanr.prs_link_key(+) = p.prs_perslid_key
                         AND sannr.prs_link_key(+) = p.prs_perslid_key
                         AND osirisnr.prs_link_key(+) = p.prs_perslid_key
                         AND k.prs_kostenplaats_key(+) =
                               fac.safe_to_number (
                                  pnummer.cnt_kenmerkcontract_waarde)
                         AND rg.alg_ruimte_key(+) =
                               fac.safe_to_number (
                                  ruimte.cnt_kenmerkcontract_waarde)
                         AND c.cnt_contract_verwijder IS NULL)
      SELECT betreft,
             DECODE (c.ins_discipline_key,
                     561, COALESCE (c.budgetnr, c.codanr),
                     CASE
                        WHEN r.volgnr BETWEEN 500 AND 599 THEN c.codanr
                        WHEN r.volgnr BETWEEN 600 AND 699 THEN c.budgetnr
                        WHEN r.volgnr BETWEEN 700 AND 799 THEN 'salaris'
                     END)
                bill_to,
             prs_perslid_naam,
             prs_perslid_naam_full,
             prs_perslid_key,
             cnt_contract_nummer_intern,
             cnt_contract_versie,
             DECODE (
                c.cnt_contract_versie,
                NULL,
                c.cnt_contract_nummer_intern,
                c.cnt_contract_nummer_intern || '.' || c.cnt_contract_versie)
                cnt_contract_nr_versie,
             r.cnt_contract_key,
             alg_ruimte_nr,
             alg_ruimte_key,
             omschrijving,
             kpngrp,
             kpn,
             kostensoort,
             btw.fac_usrdata_omschr btw,
             fac.safe_to_number (btw.fac_usrdata_code) perc,
             -bedrag bedrag,
             omschr_key,
             bedrag_key,
             maak_allonge
        FROM refunds r,
             contracten c,
             fac_usrdata btw,
             ins_tab_discipline d,
             prs_kostensoort ks
       WHERE     r.cnt_contract_key = c.cnt_contract_key
             AND c.ins_discipline_key = d.ins_discipline_key
             AND d.prs_kostensoort_key = ks.prs_kostensoort_key
             AND btw.fac_usrdata_omschr = r.btw
             AND btw.fac_usrtab_key = 42;

   -- NYBU#35517 Payments toevoegen conform refunds
   -- Voor zowel campus- als residence/office-contracten. Aparte cursor, omdat hiervoor
   -- ook gesloten contracten moeten worden beschouwd.
   CURSOR payments
   IS
      WITH payments
              AS (SELECT c.cnt_contract_key,
                         kco.cnt_kenmerkcontract_waarde omschrijving,
                         fac.safe_to_number (kcb.cnt_kenmerkcontract_waarde)
                            bedrag,
                         'VH21' btw,
                         ko.cnt_kenmerk_volgnummer volgnr,
                         ko.cnt_srtkenmerk_key,
                         ko.cnt_kenmerk_key omschr_key,
                         kb.cnt_kenmerk_key bedrag_key
                    FROM cnt_contract c,
                         cnt_kenmerk ko,
                         cnt_kenmerk kb,
                         cnt_kenmerkcontract kco,
                         cnt_kenmerkcontract kcb
                   WHERE     c.cnt_contract_verwijder IS NULL
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_contract_key = c.cnt_contract_key
                         AND kcb.cnt_contract_key = c.cnt_contract_key
                         AND kco.cnt_kenmerk_key = ko.cnt_kenmerk_key
                         AND kcb.cnt_kenmerk_key = kb.cnt_kenmerk_key
                         AND ko.cnt_kenmerk_key IN
                                  (SELECT cnt_kenmerk_key
                                     FROM cnt_kenmerk
                                    WHERE cnt_srtkenmerk_key = 841) --- payment omschrijving BTW hoog
                         AND kb.cnt_kenmerk_key IN
                                  (SELECT cnt_kenmerk_key
                                     FROM cnt_kenmerk
                                    WHERE cnt_srtkenmerk_key = 842) --- payment bedrag incl BTW hoog
                  UNION ALL
                  SELECT c.cnt_contract_key,
                         kco.cnt_kenmerkcontract_waarde omschrijving,
                         fac.safe_to_number (kcb.cnt_kenmerkcontract_waarde)
                            bedrag,
                         'VL9' btw,
                         ko.cnt_kenmerk_volgnummer volgnr,
                         ko.cnt_srtkenmerk_key,
                         ko.cnt_kenmerk_key omschr_key,
                         kb.cnt_kenmerk_key bedrag_key
                    FROM cnt_contract c,
                         cnt_kenmerk ko,
                         cnt_kenmerk kb,
                         cnt_kenmerkcontract kco,
                         cnt_kenmerkcontract kcb
                   WHERE     c.cnt_contract_verwijder IS NULL
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_contract_key = c.cnt_contract_key
                         AND kcb.cnt_contract_key = c.cnt_contract_key
                         AND kco.cnt_kenmerk_key = ko.cnt_kenmerk_key
                         AND kcb.cnt_kenmerk_key = kb.cnt_kenmerk_key
                         AND ko.cnt_kenmerk_key IN
                                  (SELECT cnt_kenmerk_key
                                     FROM cnt_kenmerk
                                    WHERE cnt_srtkenmerk_key = 843) --- payment omschrijving BTW laag
                         AND kb.cnt_kenmerk_key IN
                                  (SELECT cnt_kenmerk_key
                                     FROM cnt_kenmerk
                                    WHERE cnt_srtkenmerk_key = 844) --- payment bedrag incl BTW laag
                  UNION ALL
                  SELECT c.cnt_contract_key,
                         kco.cnt_kenmerkcontract_waarde omschrijving,
                         fac.safe_to_number (kcb.cnt_kenmerkcontract_waarde)
                            bedrag,
                         'VV' btw,
                         ko.cnt_kenmerk_volgnummer volgnr,
                         ko.cnt_srtkenmerk_key,
                         ko.cnt_kenmerk_key omschr_key,
                         kb.cnt_kenmerk_key bedrag_key
                    FROM cnt_contract c,
                         cnt_kenmerk ko,
                         cnt_kenmerk kb,
                         cnt_kenmerkcontract kco,
                         cnt_kenmerkcontract kcb
                   WHERE     c.cnt_contract_verwijder IS NULL
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_contract_key = c.cnt_contract_key
                         AND kcb.cnt_contract_key = c.cnt_contract_key
                         AND kco.cnt_kenmerk_key = ko.cnt_kenmerk_key
                         AND kcb.cnt_kenmerk_key = kb.cnt_kenmerk_key
                         AND ko.cnt_kenmerk_key IN
                                  (SELECT cnt_kenmerk_key
                                     FROM cnt_kenmerk
                                    WHERE cnt_srtkenmerk_key = 845) --- payment omschrijving geen BTW
                         AND kb.cnt_kenmerk_key IN
                                  (SELECT cnt_kenmerk_key
                                     FROM cnt_kenmerk
                                    WHERE cnt_srtkenmerk_key = 846) --- payment bedrag geen BTW
                                                                   ),
           contracten
              AS (SELECT c.cnt_contract_key,
                         c.ins_discipline_key,
                         DECODE (c.ins_discipline_key,
                                 221, 'Staff residence',
                                 561, 'Office')
                            betreft,
                         c.cnt_contract_nummer_intern,
                         c.cnt_contract_versie,
                         DECODE (
                            c.cnt_contract_versie,
                            NULL,
                            c.cnt_contract_nummer_intern,
                               c.cnt_contract_nummer_intern
                            || '.'
                            || c.cnt_contract_versie)
                            cnt_contract_nr_versie,
                         kp.prs_kostenplaats_nr kpn,
                         TRIM (SUBSTR (kg.prs_kostenplaatsgrp_oms, 1, 7))
                            kpngrp,
                         ks.prs_kostensoort_oms kostensoort,
                         p.prs_perslid_key,
                         p.prs_perslid_naam,
                         pf.prs_perslid_naam_full,
                         COALESCE (osirisnr.prs_kenmerklink_waarde,
                                   sannr.prs_kenmerklink_waarde,
                                   codanr.prs_kenmerklink_waarde,
                                   'Geen nr. bekend')
                            codanr,
                         k.prs_kostenplaats_nr budgetnr,
                         rg.alg_ruimte_key,
                         rg.alg_ruimte_aanduiding alg_ruimte_nr,
                         allonge.cnt_kenmerkcontract_waarde maak_allonge
                    FROM (SELECT *
                            FROM cnt_contract
                           WHERE ins_discipline_key IN (221, 561)) c,
                         (SELECT kc.*
                            FROM cnt_kenmerkcontract kc, cnt_kenmerk k
                           WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                                 AND k.cnt_srtkenmerk_key = 101
                                 AND kc.cnt_kenmerkcontract_verwijder IS NULL)
                         huurder,
                         (SELECT kc.*
                            FROM cnt_kenmerkcontract kc, cnt_kenmerk k
                           WHERE kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                                 AND cnt_srtkenmerk_key = 341) pnummer,
                         (SELECT kc.*
                            FROM cnt_kenmerkcontract kc, cnt_kenmerk k
                           WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                                 AND k.cnt_srtkenmerk_key = 102
                                 AND kc.cnt_kenmerkcontract_verwijder IS NULL)
                         ruimte,
                         (SELECT kc.*
                            FROM cnt_kenmerkcontract kc, cnt_kenmerk k
                           WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                                 AND k.cnt_srtkenmerk_key = 681
                                 AND kc.cnt_kenmerkcontract_verwijder IS NULL)
                         allonge,
                         prs_perslid p,
                         prs_v_perslid_fullnames pf,
                         (SELECT *
                            FROM prs_kenmerklink
                           WHERE prs_kenmerk_key = 1000
                                 AND prs_kenmerklink_verwijder IS NULL)
                         codanr,
                         (SELECT *
                            FROM prs_kenmerklink
                           WHERE prs_kenmerk_key = 1200
                                 AND prs_kenmerklink_verwijder IS NULL) sannr,
                         (SELECT *
                            FROM prs_kenmerklink
                           WHERE prs_kenmerk_key = 1302
                                 AND prs_kenmerklink_verwijder IS NULL)
                         osirisnr,
                         prs_kostenplaats k,
                         prs_kostenplaats kp,
                         prs_kostenplaatsgrp kg,
                         alg_v_ruimte_gegevens rg,
                         ins_tab_discipline d,
                         prs_kostensoort ks
                   WHERE     c.ins_discipline_key = d.ins_discipline_key
                         AND c.ins_discipline_key IN (221, 561)
                         AND d.prs_kostensoort_key = ks.prs_kostensoort_key
                         AND huurder.cnt_contract_key(+) = c.cnt_contract_key
                         AND pnummer.cnt_contract_key(+) = c.cnt_contract_key
                         AND ruimte.cnt_contract_key(+) = c.cnt_contract_key
                         AND allonge.cnt_contract_key(+) = c.cnt_contract_key
                         AND kp.prs_kostenplaats_key = c.prs_kostenplaats_key
                         AND kg.prs_kostenplaatsgrp_key(+) =
                               kp.prs_kostenplaatsgrp_key
                         AND p.prs_perslid_key(+) =
                               fac.safe_to_number (
                                  huurder.cnt_kenmerkcontract_waarde)
                         AND pf.prs_perslid_key(+) = p.prs_perslid_key
                         AND codanr.prs_link_key(+) = p.prs_perslid_key
                         AND sannr.prs_link_key(+) = p.prs_perslid_key
                         AND osirisnr.prs_link_key(+) = p.prs_perslid_key
                         AND k.prs_kostenplaats_key(+) =
                               fac.safe_to_number (
                                  pnummer.cnt_kenmerkcontract_waarde)
                         AND rg.alg_ruimte_key(+) =
                               fac.safe_to_number (
                                  ruimte.cnt_kenmerkcontract_waarde)
                         AND c.cnt_contract_verwijder IS NULL)
      SELECT betreft,
             DECODE (c.ins_discipline_key,
                     561, COALESCE (c.budgetnr, c.codanr),
                     c.codanr)
                bill_to,
             prs_perslid_naam,
             prs_perslid_naam_full,
             prs_perslid_key,
             cnt_contract_nummer_intern,
             cnt_contract_versie,
             DECODE (
                c.cnt_contract_versie,
                NULL,
                c.cnt_contract_nummer_intern,
                c.cnt_contract_nummer_intern || '.' || c.cnt_contract_versie)
                cnt_contract_nr_versie,
             p.cnt_contract_key,
             alg_ruimte_nr,
             alg_ruimte_key,
             omschrijving,
             kpngrp,
             kpn,
             kostensoort,
             btw.fac_usrdata_omschr btw,
             fac.safe_to_number (btw.fac_usrdata_code) perc,
             bedrag bedrag,
             omschr_key,
             bedrag_key,
             maak_allonge
        FROM payments p,
             contracten c,
             fac_usrdata btw,
             ins_tab_discipline d,
             prs_kostensoort ks
       WHERE     p.cnt_contract_key = c.cnt_contract_key
             AND c.ins_discipline_key = d.ins_discipline_key
             AND d.prs_kostensoort_key = ks.prs_kostensoort_key
             AND btw.fac_usrdata_omschr = p.btw
             AND btw.fac_usrtab_key = 42;

   -- NYBU#51606 aanpassen facturatie mbt payments en refunds vwb campuscontracten
   CURSOR extra_regels
   IS
      WITH fact_regels            --- er zijn max. 4 correctie regels mogelijk
              AS (SELECT kco.cnt_contract_key,
                         kco.cnt_kenmerkcontract_waarde omschrijving,
                         kco.cnt_kenmerk_key omschr_key,
                         kcb.cnt_kenmerkcontract_waarde bedrag,
                         kcb.cnt_kenmerk_key bedrag_key,
                         udvat.fac_usrdata_omschr BTW,
                         udvat.fac_usrdata_prijs perc,
                         kcvat.cnt_kenmerk_key btw_key,
                         udto.fac_usrdata_omschr naar,
                         kcto.cnt_kenmerk_key to_key,
                         udgb.fac_usrdata_omschr gb_omschr,
                         udgb.fac_usrdata_prijs gb,
                         kcgb.cnt_kenmerk_key gb_key
                    FROM cnt_kenmerk ko,
                         cnt_kenmerkcontract kco,
                         cnt_kenmerk kb,
                         cnt_kenmerkcontract kcb,
                         cnt_kenmerk kvat,
                         cnt_kenmerkcontract kcvat,
                         fac_usrdata udvat,
                         cnt_kenmerk kto,
                         cnt_kenmerkcontract kcto,
                         fac_usrdata udto,
                         cnt_kenmerk kgb,
                         cnt_kenmerkcontract kcgb,
                         fac_usrdata udgb
                   WHERE     ko.cnt_kenmerk_key = kco.cnt_kenmerk_key
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_kenmerk_key = 1223
                         AND kb.cnt_kenmerk_key = kcb.cnt_kenmerk_key
                         AND kcb.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcb.cnt_kenmerk_key = 1224
                         AND kvat.cnt_kenmerk_key = kcvat.cnt_kenmerk_key
                         AND kcvat.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcvat.cnt_kenmerkcontract_waarde =
                               udvat.fac_usrdata_key
                         AND udvat.fac_usrtab_key = 1021
                         AND kcvat.cnt_kenmerk_key = 1225
                         AND kto.cnt_kenmerk_key = kcto.cnt_kenmerk_key
                         AND kcto.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcto.cnt_kenmerkcontract_waarde =
                               udto.fac_usrdata_key
                         AND kcto.cnt_kenmerk_key = 1241
                         AND kgb.cnt_kenmerk_key = kcgb.cnt_kenmerk_key
                         AND kcgb.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcgb.cnt_kenmerkcontract_waarde =
                               udgb.fac_usrdata_key
                         AND kcgb.cnt_kenmerk_key = 1242
                         AND kco.cnt_contract_key = kcb.cnt_contract_key
                         AND kco.cnt_contract_key = kcvat.cnt_contract_key
                         AND kco.cnt_contract_key = kcto.cnt_contract_key
                         AND kco.cnt_contract_key = kcgb.cnt_contract_key
                  UNION
                  SELECT kco.cnt_contract_key,
                         kco.cnt_kenmerkcontract_waarde omschrijving,
                         kco.cnt_kenmerk_key omschr_key,
                         kcb.cnt_kenmerkcontract_waarde bedrag,
                         kcb.cnt_kenmerk_key bedrag_key,
                         udvat.fac_usrdata_omschr BTW,
                         udvat.fac_usrdata_prijs perc,
                         kcvat.cnt_kenmerk_key btw_key,
                         udto.fac_usrdata_omschr naar,
                         kcto.cnt_kenmerk_key to_key,
                         udgb.fac_usrdata_omschr gb_omschr,
                         udgb.fac_usrdata_prijs gb,
                         kcgb.cnt_kenmerk_key gb_key
                    FROM cnt_kenmerk ko,
                         cnt_kenmerkcontract kco,
                         cnt_kenmerk kb,
                         cnt_kenmerkcontract kcb,
                         cnt_kenmerk kvat,
                         cnt_kenmerkcontract kcvat,
                         fac_usrdata udvat,
                         cnt_kenmerk kto,
                         cnt_kenmerkcontract kcto,
                         fac_usrdata udto,
                         cnt_kenmerk kgb,
                         cnt_kenmerkcontract kcgb,
                         fac_usrdata udgb
                   WHERE     ko.cnt_kenmerk_key = kco.cnt_kenmerk_key
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_kenmerk_key = 1244
                         AND kb.cnt_kenmerk_key = kcb.cnt_kenmerk_key
                         AND kcb.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcb.cnt_kenmerk_key = 1245
                         AND kvat.cnt_kenmerk_key = kcvat.cnt_kenmerk_key
                         AND kcvat.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcvat.cnt_kenmerkcontract_waarde =
                               udvat.fac_usrdata_key
                         AND udvat.fac_usrtab_key = 1021
                         AND kcvat.cnt_kenmerk_key = 1246
                         AND kto.cnt_kenmerk_key = kcto.cnt_kenmerk_key
                         AND kcto.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcto.cnt_kenmerkcontract_waarde =
                               udto.fac_usrdata_key
                         AND kcto.cnt_kenmerk_key = 1247
                         AND kgb.cnt_kenmerk_key = kcgb.cnt_kenmerk_key
                         AND kcgb.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcgb.cnt_kenmerkcontract_waarde =
                               udgb.fac_usrdata_key
                         AND kcgb.cnt_kenmerk_key = 1248
                         AND kco.cnt_contract_key = kcb.cnt_contract_key
                         AND kco.cnt_contract_key = kcvat.cnt_contract_key
                         AND kco.cnt_contract_key = kcto.cnt_contract_key
                         AND kco.cnt_contract_key = kcgb.cnt_contract_key
                  UNION
                  SELECT kco.cnt_contract_key,
                         kco.cnt_kenmerkcontract_waarde omschrijving,
                         kco.cnt_kenmerk_key omschr_key,
                         kcb.cnt_kenmerkcontract_waarde bedrag,
                         kcb.cnt_kenmerk_key bedrag_key,
                         udvat.fac_usrdata_omschr BTW,
                         udvat.fac_usrdata_prijs perc,
                         kcvat.cnt_kenmerk_key btw_key,
                         udto.fac_usrdata_omschr naar,
                         kcto.cnt_kenmerk_key to_key,
                         udgb.fac_usrdata_omschr gb_omschr,
                         udgb.fac_usrdata_prijs gb,
                         kcgb.cnt_kenmerk_key gb_key
                    FROM cnt_kenmerk ko,
                         cnt_kenmerkcontract kco,
                         cnt_kenmerk kb,
                         cnt_kenmerkcontract kcb,
                         cnt_kenmerk kvat,
                         cnt_kenmerkcontract kcvat,
                         fac_usrdata udvat,
                         cnt_kenmerk kto,
                         cnt_kenmerkcontract kcto,
                         fac_usrdata udto,
                         cnt_kenmerk kgb,
                         cnt_kenmerkcontract kcgb,
                         fac_usrdata udgb
                   WHERE     ko.cnt_kenmerk_key = kco.cnt_kenmerk_key
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_kenmerk_key = 1250
                         AND kb.cnt_kenmerk_key = kcb.cnt_kenmerk_key
                         AND kcb.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcb.cnt_kenmerk_key = 1251
                         AND kvat.cnt_kenmerk_key = kcvat.cnt_kenmerk_key
                         AND kcvat.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcvat.cnt_kenmerkcontract_waarde =
                               udvat.fac_usrdata_key
                         AND udvat.fac_usrtab_key = 1021
                         AND kcvat.cnt_kenmerk_key = 1252
                         AND kto.cnt_kenmerk_key = kcto.cnt_kenmerk_key
                         AND kcto.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcto.cnt_kenmerkcontract_waarde =
                               udto.fac_usrdata_key
                         AND kcto.cnt_kenmerk_key = 1253
                         AND kgb.cnt_kenmerk_key = kcgb.cnt_kenmerk_key
                         AND kcgb.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcgb.cnt_kenmerkcontract_waarde =
                               udgb.fac_usrdata_key
                         AND kcgb.cnt_kenmerk_key = 1254
                         AND kco.cnt_contract_key = kcb.cnt_contract_key
                         AND kco.cnt_contract_key = kcvat.cnt_contract_key
                         AND kco.cnt_contract_key = kcto.cnt_contract_key
                         AND kco.cnt_contract_key = kcgb.cnt_contract_key
                  UNION
                  SELECT kco.cnt_contract_key,
                         kco.cnt_kenmerkcontract_waarde omschrijving,
                         kco.cnt_kenmerk_key omschr_key,
                         kcb.cnt_kenmerkcontract_waarde bedrag,
                         kcb.cnt_kenmerk_key bedrag_key,
                         udvat.fac_usrdata_omschr BTW,
                         udvat.fac_usrdata_prijs perc,
                         kcvat.cnt_kenmerk_key btw_key,
                         udto.fac_usrdata_omschr naar,
                         kcto.cnt_kenmerk_key to_key,
                         udgb.fac_usrdata_omschr gb_omschr,
                         udgb.fac_usrdata_prijs gb,
                         kcgb.cnt_kenmerk_key gb_key
                    FROM cnt_kenmerk ko,
                         cnt_kenmerkcontract kco,
                         cnt_kenmerk kb,
                         cnt_kenmerkcontract kcb,
                         cnt_kenmerk kvat,
                         cnt_kenmerkcontract kcvat,
                         fac_usrdata udvat,
                         cnt_kenmerk kto,
                         cnt_kenmerkcontract kcto,
                         fac_usrdata udto,
                         cnt_kenmerk kgb,
                         cnt_kenmerkcontract kcgb,
                         fac_usrdata udgb
                   WHERE     ko.cnt_kenmerk_key = kco.cnt_kenmerk_key
                         AND kco.cnt_kenmerkcontract_verwijder IS NULL
                         AND kco.cnt_kenmerk_key = 1256
                         AND kb.cnt_kenmerk_key = kcb.cnt_kenmerk_key
                         AND kcb.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcb.cnt_kenmerk_key = 1257
                         AND kvat.cnt_kenmerk_key = kcvat.cnt_kenmerk_key
                         AND kcvat.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcvat.cnt_kenmerkcontract_waarde =
                               udvat.fac_usrdata_key
                         AND udvat.fac_usrtab_key = 1021
                         AND kcvat.cnt_kenmerk_key = 1258
                         AND kto.cnt_kenmerk_key = kcto.cnt_kenmerk_key
                         AND kcto.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcto.cnt_kenmerkcontract_waarde =
                               udto.fac_usrdata_key
                         AND kcto.cnt_kenmerk_key = 1259
                         AND kgb.cnt_kenmerk_key = kcgb.cnt_kenmerk_key
                         AND kcgb.cnt_kenmerkcontract_verwijder IS NULL
                         AND kcgb.cnt_kenmerkcontract_waarde =
                               udgb.fac_usrdata_key
                         AND kcgb.cnt_kenmerk_key = 1260
                         AND kco.cnt_contract_key = kcb.cnt_contract_key
                         AND kco.cnt_contract_key = kcvat.cnt_contract_key
                         AND kco.cnt_contract_key = kcto.cnt_contract_key
                         AND kco.cnt_contract_key = kcgb.cnt_contract_key),
           contracten            --- hier (voorlopig) alleen campus contracten
              AS (SELECT c.cnt_contract_key,
                         c.ins_discipline_key,
                         'Campus' betreft,
                         c.cnt_contract_nummer_intern,
                         c.cnt_contract_versie,
                         DECODE (
                            c.cnt_contract_versie,
                            NULL,
                            c.cnt_contract_nummer_intern,
                               c.cnt_contract_nummer_intern
                            || '.'
                            || c.cnt_contract_versie)
                            cnt_contract_nr_versie,
                         kp.prs_kostenplaats_nr kpn,
                         SUBSTR (kg.prs_kostenplaatsgrp_oms, 1, 7) kpngrp,
                         ks.prs_kostensoort_oms kostensoort,
                         p.prs_perslid_key,
                         p.prs_perslid_naam,
                         pf.prs_perslid_naam_full,
                         COALESCE (
                            osirisnr.prs_kenmerklink_waarde,
                            COALESCE (sannr.prs_kenmerklink_waarde,
                                      codanr.prs_kenmerklink_waarde))
                            codanr,
                         ak.prs_kostenplaats_nr budgetnr,
                         r.alg_ruimte_key,
                         r.alg_ruimte_nr
                    FROM cnt_contract c,
                         prs_perslid p,
                         prs_v_perslid_fullnames pf,
                         prs_v_aanwezigkostenplaats ak,
                         (SELECT *
                            FROM prs_kenmerklink
                           WHERE prs_kenmerk_key = 1000
                                 AND prs_kenmerklink_verwijder IS NULL)
                         codanr,
                         (SELECT *
                            FROM prs_kenmerklink
                           WHERE prs_kenmerk_key = 1200
                                 AND prs_kenmerklink_verwijder IS NULL) sannr,
                         (SELECT *
                            FROM prs_kenmerklink
                           WHERE prs_kenmerk_key = 1302
                                 AND prs_kenmerklink_verwijder IS NULL)
                         osirisnr,
                         (SELECT *
                            FROM cnt_kenmerkcontract
                           WHERE cnt_kenmerk_key = 1
                                 AND cnt_kenmerkcontract_verwijder IS NULL)
                         studkam,
                         (SELECT *
                            FROM cnt_kenmerkcontract
                           WHERE cnt_kenmerk_key = 63
                                 AND cnt_kenmerkcontract_verwijder IS NULL)
                         budgnr,
                         alg_ruimte r,
                         prs_afdeling a,
                         prs_kostenplaats kp,
                         prs_kostenplaatsgrp kg,
                         ins_tab_discipline d,
                         prs_kostensoort ks
                   WHERE     c.ins_discipline_key = 55
                         AND c.ins_discipline_key = d.ins_discipline_key
                         AND d.prs_kostensoort_key = ks.prs_kostensoort_key
                         AND c.cnt_contract_verwijder IS NULL
                         AND p.prs_perslid_key = c.cnt_prs_perslid_key
                         AND pf.prs_perslid_key = p.prs_perslid_key
                         AND codanr.prs_link_key(+) = p.prs_perslid_key
                         AND sannr.prs_link_key(+) = p.prs_perslid_key
                         AND osirisnr.prs_link_key(+) = p.prs_perslid_key
                         AND studkam.cnt_contract_key = c.cnt_contract_key
                         AND r.alg_ruimte_key(+) =
                               fac.safe_to_number (
                                  studkam.cnt_kenmerkcontract_waarde)
                         AND budgnr.cnt_contract_key(+) = c.cnt_contract_key
                         AND ak.prs_kostenplaats_key(+) =
                               fac.safe_to_number (
                                  budgnr.cnt_kenmerkcontract_waarde)
                         AND a.prs_afdeling_key = p.prs_afdeling_key
                         AND kp.prs_kostenplaats_key = c.prs_kostenplaats_key
                         AND kg.prs_kostenplaatsgrp_key(+) =
                               kp.prs_kostenplaatsgrp_key)
      SELECT c.betreft,                                     -- altijd 'Campus'
             CASE
                WHEN UPPER (fr.naar) = 'TENANT' THEN c.codanr
                WHEN UPPER (fr.naar) = 'BUDGET NR' THEN c.budgetnr
                WHEN UPPER (fr.naar) = 'SALARY' THEN 'Salaris'
             END
                bill_to,
             c.prs_perslid_naam,
             c.prs_perslid_naam_full,
             c.prs_perslid_key,
             c.cnt_contract_nummer_intern,
             c.cnt_contract_versie,
             DECODE (
                c.cnt_contract_versie,
                NULL,
                c.cnt_contract_nummer_intern,
                c.cnt_contract_nummer_intern || '.' || c.cnt_contract_versie)
                cnt_contract_nr_versie,
             fr.cnt_contract_key,
             c.alg_ruimte_nr,
             c.alg_ruimte_key,
             c.kpngrp,
             c.kpn,
             --kostensoort,
             fr.gb,
             fr.btw btw,
             fac.safe_to_number (fr.perc) perc,
             fr.bedrag,
             fr.omschrijving,
             fr.omschr_key,
             fr.bedrag_key,
             fr.btw_key,
             fr.to_key,
             fr.gb_key
        FROM fact_regels fr,
             contracten c,
             ins_tab_discipline d,
             prs_kostensoort ks
       WHERE     fr.cnt_contract_key = c.cnt_contract_key
             AND c.ins_discipline_key = d.ins_discipline_key
             AND d.prs_kostensoort_key = ks.prs_kostensoort_key;

   v_periodeDate       DATE;
   v_periodeNaam       VARCHAR2 (20);
   v_aantalPeriodes    NUMBER;
   v_curPeriodeDate    DATE;
   v_curPeriode        VARCHAR2 (10);
   v_curPeriodeNaam    VARCHAR2 (20);
   v_curPeriodeDagen   NUMBER (4);
   v_oms               fac_usrdata.fac_usrdata_omschr%TYPE;
   v_btw_code          fac_usrdata.fac_usrdata_omschr%TYPE;
   v_btw_perc          fac_usrdata.fac_usrdata_code%TYPE;
   v_grtbk             prs_kostensoort.prs_kostensoort_refcode%TYPE;
   v_kpl               prs_kostenplaats.prs_kostenplaats_nr%TYPE;
   v_proj              prs_kostenplaats.prs_kostenplaats_nr%TYPE;
   v_aantal_dagen      NUMBER (4);
   v_dagen_roommate    NUMBER (4);
   v_dagen_partner     NUMBER (4);
   v_per_van           DATE;
   v_per_tot           DATE;
   v_betreft           VARCHAR (20);
   v_refnr             VARCHAR (20);
   v_kostensoort       prs_kostensoort.prs_kostensoort_oms%TYPE;
BEGIN
   -- Buffer en log leegmaken
   DELETE nybu_huur_buffer;

   DELETE imp_log
    WHERE imp_log_applicatie = p_applname;

   v_periodeDate := TO_DATE (p_periode, 'YYYYMM');
   v_periodeNaam := nybu.getPeriodeNaam (p_periode, 'EN');

   -- NYBU35788 kostensoorten moeten bepaald worden vanuit de contractsoorten
   -- Kostensoort voor exportbestand bepalen
   -- SELECT prs_kostensoort_oms
   --  INTO v_kostensoort
   --  FROM prs_kostensoort
   -- WHERE prs_kostensoort_key = 1;

   v_betreft := 'Campus';

   FOR rec IN sr
   LOOP
      v_aanduiding := rec.cnt_contract_nr_versie || '/' || rec.naam;

      -- Als we allongeregels aan het maken zijn (p_mode=2), sla dan alle contracten zonder "Maak allonge(s)" over
      IF NOT (p_mode = 2 AND rec.maak_allonge IS NULL)
      THEN
         -- Huur, servicekosten en toeslagen kunnen een X aantal maanden vooruit betaald worden
         IF (rec.aantal_periodes > 1)
         THEN
            fac.writelog (
               p_applname,
               'I',
               v_aanduiding || ': meerdere maanden in één keer factureren',
               'Aantal maanden: ' || rec.aantal_periodes);
         END IF;

         FOR cntr IN 1 .. rec.aantal_periodes
         LOOP
            -- Bepaal gegevens van door-te-belasten periode (bij meerdere periodes in één keer
            -- doorbelasten is dit steeds een maand verder)
            v_curPeriodeDate := ADD_MONTHS (v_periodeDate, cntr - 1);
            v_curPeriode := TO_CHAR (v_curPeriodeDate, 'YYYYMM');
            v_curPeriodeNaam := nybu.getPeriodeNaam (v_curPeriode, 'EN');
            v_curPeriodeDagen :=
                 CAST (TO_CHAR (LAST_DAY (v_curPeriodeDate), 'DD') AS INT)
               - CAST (TO_CHAR (v_curPeriodeDate, 'DD') AS INT)
               + 1;

            -- Voor de eerste en laatste maand wordt voor de huurprijs etc mogelijk maar
            -- een deel doorbelast, als het contract halverwege de maand begint/eindigt.
            -- Daarvoor het aantal dagen uitrekenen (max is aantal dagen in huidige maand)
            v_aantal_dagen := v_curPeriodeDagen;

            -- Lopend contract? --> huur etc factureren
            IF (TRUNC (v_curPeriodeDate, 'MM') BETWEEN TRUNC (
                                                          rec.cnt_contract_looptijd_van,
                                                          'MM')
                                                   AND  TRUNC (
                                                           rec.cnt_contract_looptijd_tot,
                                                           'MM'))
            THEN
               -- Is de ingangsmaand van het contract volledig, of beginnen we halverwege?
               -- (alleen checken bij ingangsmaand contract)
               IF (TRUNC (rec.cnt_contract_looptijd_van, 'MM') =
                      v_curPeriodeDate)
               THEN
                  v_aantal_dagen :=
                     nybu.getAantalDagenInPeriode (
                        rec.cnt_contract_looptijd_van,
                        rec.cnt_contract_looptijd_tot,
                        v_curPeriodeDate);

                  IF (v_aantal_dagen != v_curPeriodeDagen)
                  THEN
                     fac.writelog (
                        p_applname,
                        'I',
                           v_aanduiding
                        || ': contract start halverwege '
                        || v_curPeriodeNaam,
                        'Aantal dagen = ' || v_aantal_dagen);
                  END IF;
               END IF;

               -- Is de eindmaand van het contract volledig, of eindigen we halverwege?
               -- (alleen checken in slotmaand contract)
               -- NB: ingangs- en slotmaand kunnen dezelfde zijn! (contract loopt dan minder dan een maand)
               IF (TRUNC (rec.cnt_contract_looptijd_tot, 'MM') =
                      v_curPeriodeDate)
               THEN
                  v_aantal_dagen :=
                     nybu.getAantalDagenInPeriode (
                        rec.cnt_contract_looptijd_van,
                        rec.cnt_contract_looptijd_tot,
                        v_curPeriodeDate);

                  IF (v_aantal_dagen != v_curPeriodeDagen)
                  THEN
                     fac.writelog (
                        p_applname,
                        'I',
                           v_aanduiding
                        || ': contract eindigt halverwege '
                        || v_curPeriodeNaam,
                        'Aantal dagen = ' || v_aantal_dagen);
                  END IF;
               END IF;

               -- NYBU#33330: als twee personen dezelfde kamer huren (huurder en roommate),
               -- dan kan het contract van de roommate ook halverwege de maand starten/eindigen.
               -- De rest van de maand moeten de gehele huur, service- en telefoonkosten (maar geen
               -- partnercharge) worden doorberekend aan de huurder.
               -- NB: een partner (flexkenmerk in contract huurder) zit er altijd even lang als de huurder zelf
               -- NYBU#35948: voorheen gingen we ervan uit dat je maximaal één roommate kon hebben. In maanden
               -- waarin een huurder halverwege een andere roommate krijgt is dat niet waar.
               -- Daarom per dag van de periode bepalen of er een partner is

               -- Overlap tussen looptijd contract en te factureren maand
               v_per_van :=
                  GREATEST (v_curPeriodeDate, rec.cnt_contract_looptijd_van);
               v_per_tot :=
                  LEAST (LAST_DAY (v_curPeriodeDate),
                         rec.cnt_contract_looptijd_tot);

               -- Deze query lijst alle dagen uit in de periode v_per_van-v_per_tot (middels CONNECT BY)
               -- en bepaalt voor iedere dag of er die dag een-of-meer roommate-contracten lopen op de ruimte.
               -- Telt vervolgens het aantal dagen waarop er minstens één roommate-contract was (en dus een roommate)
               SELECT COUNT ( * )
                 INTO v_count
                 FROM (  SELECT DISTINCT dag, COUNT ( * ) aantal
                           FROM nybu_v_potential_roommates roommate,
                                (    SELECT v_per_van + LEVEL - 1 dag
                                       FROM DUAL
                                 CONNECT BY LEVEL <= v_per_tot - v_per_van + 1)
                                d
                          WHERE rec.alg_ruimte_key IS NOT NULL
                                AND roommate.cnt_contract_key !=
                                      rec.cnt_contract_key
                                AND roommate.alg_ruimte_key =
                                      rec.alg_ruimte_key
                                AND roommate.cnt_contract_looptijd_van <
                                      rec.cnt_contract_looptijd_tot
                                AND roommate.cnt_contract_looptijd_tot >
                                      rec.cnt_contract_looptijd_van
                                AND d.dag BETWEEN roommate.cnt_contract_looptijd_van
                                              AND  roommate.cnt_contract_looptijd_tot
                       GROUP BY dag);

               v_dagen_roommate := v_count;

               IF (v_dagen_roommate != v_aantal_dagen
                   AND v_dagen_roommate > 0)
               THEN
                  fac.writelog (
                     p_applname,
                     'I',
                     v_aanduiding
                     || ': contract roommate begint/eindigt tijdens looptijd contract huurder',
                     'Aantal dagen overlap = ' || v_dagen_roommate);
               END IF;

               --- HUURPRIJS ---
               v_errormsg := 'Archiefregel huurprijs aanmaken';

               -- Plaats in archief
               -- met juiste kostenplaatsen en -soorten, omschrijving
               INSERT INTO nybu_huur_buffer (betreft,
                                             datum_export,
                                             periode,
                                             isMutatie,
                                             deb_nr,
                                             achternaam,
                                             naam_full,
                                             prs_perslid_key,
                                             cnt_contract_nr,
                                             cnt_contract_key,
                                             kamer,
                                             alg_ruimte_key,
                                             omschrijving,
                                             kpn_code_afd,
                                             kpn_code_proj,
                                             prs_kostensoort_refcode,
                                             btw_code,
                                             btw_perc,
                                             bedrag)
                  SELECT v_betreft,
                         p_run,
                         p_periode,
                         0,
                         COALESCE (rec.budget_huur, rec.codanr),
                         rec.achternaam,
                         rec.naam,
                         rec.prs_perslid_key,
                         rec.cnt_contract_nr_versie,
                         rec.cnt_contract_key,
                         rec.kamer,
                         rec.alg_ruimte_key,
                         oms.fac_usrdata_omschr || ' ' || v_curPeriodeNaam,
                         rec.kpngrp,
                         rec.kpn,
                         rec.kostensoort,
                         --v_kostensoort,
                         btw.fac_usrdata_omschr,
                         fac.safe_to_number (btw.fac_usrdata_code),
                         -- Te betalen huur =   aantal dagen samen met roommate * gedeelde huurprijs
                         --                   + aantal dagen alleen/met partner gehuurd * volle huurprijs
                         TRUNC (
                              v_dagen_roommate
                            / v_curPeriodeDagen
                            * rec.huur
                            / 2
                            +   (v_aantal_dagen - v_dagen_roommate)
                              / v_curPeriodeDagen
                              * rec.huur,
                            2)
                    FROM fac_usrdata oms, fac_usrdata btw
                   WHERE     oms.fac_usrtab_key = 43
                         AND btw.fac_usrdata_key = oms.fac_usrdata_parentkey
                         AND oms.fac_usrdata_code = 'Rent';

               --- SERVICEKOSTEN ---
               v_errormsg := 'Archiefregel servicekosten aanmaken';

               -- Plaats in archief
               -- met juiste kostenplaatsen en -soorten, omschrijving
               INSERT INTO nybu_huur_buffer (betreft,
                                             datum_export,
                                             periode,
                                             isMutatie,
                                             deb_nr,
                                             achternaam,
                                             naam_full,
                                             prs_perslid_key,
                                             cnt_contract_nr,
                                             cnt_contract_key,
                                             kamer,
                                             alg_ruimte_key,
                                             omschrijving,
                                             kpn_code_afd,
                                             kpn_code_proj,
                                             prs_kostensoort_refcode,
                                             btw_code,
                                             btw_perc,
                                             bedrag)
                  SELECT v_betreft,
                         p_run,
                         p_periode,
                         0,
                         COALESCE (rec.budget_service, rec.codanr),
                         rec.achternaam,
                         rec.naam,
                         rec.prs_perslid_key,
                         rec.cnt_contract_nr_versie,
                         rec.cnt_contract_key,
                         rec.kamer,
                         rec.alg_ruimte_key,
                         oms.fac_usrdata_omschr || ' ' || v_curPeriodeNaam,
                         rec.kpngrp,
                         rec.kpn,
                         rec.kostensoort,
                         --v_kostensoort,
                         btw.fac_usrdata_omschr,
                         fac.safe_to_number (btw.fac_usrdata_code),
                         -- Te betalen kosten =   aantal dagen samen met roommate * gedeelde servicekosten
                         --                     + aantal dagen alleen/met partner gehuurd * volle servicekosten
                         TRUNC (
                              v_dagen_roommate
                            / v_curPeriodeDagen
                            * rec.servicekosten
                            / 2
                            +   (v_aantal_dagen - v_dagen_roommate)
                              / v_curPeriodeDagen
                              * rec.servicekosten,
                            2)
                    FROM fac_usrdata oms, fac_usrdata btw
                   WHERE     oms.fac_usrtab_key = 43
                         AND btw.fac_usrdata_key = oms.fac_usrdata_parentkey
                         AND oms.fac_usrdata_code = 'ServCost';

               --- PARTNERCHARGE ---
               IF (v_dagen_roommate > 0 OR rec.partner_naam IS NOT NULL)
               THEN
                  v_errormsg := 'Archiefregel partnercharge aanmaken';

                  -- Plaats in archief
                  -- met juiste kostenplaatsen en -soorten, omschrijving
                  INSERT INTO nybu_huur_buffer (betreft,
                                                datum_export,
                                                periode,
                                                isMutatie,
                                                deb_nr,
                                                achternaam,
                                                naam_full,
                                                prs_perslid_key,
                                                cnt_contract_nr,
                                                cnt_contract_key,
                                                kamer,
                                                alg_ruimte_key,
                                                omschrijving,
                                                kpn_code_afd,
                                                kpn_code_proj,
                                                prs_kostensoort_refcode,
                                                btw_code,
                                                btw_perc,
                                                bedrag)
                     SELECT v_betreft,
                            p_run,
                            p_periode,
                            0,
                            COALESCE (rec.budget_partnercharge, rec.codanr),
                            rec.achternaam,
                            rec.naam,
                            rec.prs_perslid_key,
                            rec.cnt_contract_nr_versie,
                            rec.cnt_contract_key,
                            rec.kamer,
                            rec.alg_ruimte_key,
                            oms.fac_usrdata_omschr || ' ' || v_curPeriodeNaam,
                            rec.kpngrp,
                            rec.kpn,
                            rec.kostensoort,
                            -- v_kostensoort,
                            btw.fac_usrdata_omschr,
                            fac.safe_to_number (btw.fac_usrdata_code),
                            -- Te betalen partnercharge =   aantal dagen samen met roommate * gedeelde partnercharge
                            --                            + aantal dagen met partner gehuurd * volle partnercharge
                            TRUNC (
                                 v_dagen_roommate
                               / v_curPeriodeDagen
                               * rec.partnercharge
                               / 2
                               + DECODE (
                                    rec.partner_naam,
                                    NULL,
                                    0,
                                    (v_aantal_dagen - v_dagen_roommate)
                                    / v_curPeriodeDagen)
                                 * rec.partnercharge,
                               2)
                       FROM fac_usrdata oms, fac_usrdata btw
                      WHERE oms.fac_usrtab_key = 43
                            AND btw.fac_usrdata_key =
                                  oms.fac_usrdata_parentkey
                            AND oms.fac_usrdata_code = 'PartnerCh';
               END IF;

               --- TELEFOONAANSLUITING ---
               IF (rec.telefooncharge IS NOT NULL AND rec.telefooncharge != 0)
               THEN
                  v_errormsg := 'Archiefregel telefoonaansluiting aanmaken';

                  -- Plaats in archief
                  -- met juiste kostenplaatsen en -soorten, omschrijving
                  INSERT INTO nybu_huur_buffer (betreft,
                                                datum_export,
                                                periode,
                                                isMutatie,
                                                deb_nr,
                                                achternaam,
                                                naam_full,
                                                prs_perslid_key,
                                                cnt_contract_nr,
                                                cnt_contract_key,
                                                kamer,
                                                alg_ruimte_key,
                                                omschrijving,
                                                kpn_code_afd,
                                                kpn_code_proj,
                                                prs_kostensoort_refcode,
                                                btw_code,
                                                btw_perc,
                                                bedrag)
                     SELECT v_betreft,
                            p_run,
                            p_periode,
                            0,
                            COALESCE (rec.budget_telefoon, rec.codanr),
                            rec.achternaam,
                            rec.naam,
                            rec.prs_perslid_key,
                            rec.cnt_contract_nr_versie,
                            rec.cnt_contract_key,
                            rec.kamer,
                            rec.alg_ruimte_key,
                            oms.fac_usrdata_omschr || ' ' || v_curPeriodeNaam,
                            rec.kpngrp,
                            rec.kpn,
                            rec.kostensoort,
                            -- v_kostensoort,
                            btw.fac_usrdata_omschr,
                            fac.safe_to_number (btw.fac_usrdata_code),
                            -- Te betalen kosten =   aantal dagen samen met roommate * gedeelde prijs
                            --                     + aantal dagen alleen/met partner gehuurd * volle prijs
                            TRUNC (
                                 v_dagen_roommate
                               / v_curPeriodeDagen
                               * rec.telefooncharge
                               / 2
                               +   (v_aantal_dagen - v_dagen_roommate)
                                 / v_curPeriodeDagen
                                 * rec.telefooncharge,
                               2)
                       FROM fac_usrdata oms, fac_usrdata btw
                      WHERE oms.fac_usrtab_key = 43
                            AND btw.fac_usrdata_key =
                                  oms.fac_usrdata_parentkey
                            AND oms.fac_usrdata_code = 'PhoneConn';
               END IF;

               --- SCHOONMAAKKOSTEN (eenmalig) dus niet mee nemen bij allonges---
               -- NYBU#32684
               IF (rec.schoonmaak_verh IS NOT NULL AND p_mode <> 2)
               THEN
                  v_errormsg := 'Archiefregel schoonmaak verhuizing aanmaken';

                  -- Plaats in archief
                  -- met juiste kostenplaatsen en -soorten, omschrijving
                  -- NYBU#53064 schoonmaak komt altijd op GB 48026 Schoonmaakkosten
                  INSERT INTO nybu_huur_buffer (betreft,
                                                datum_export,
                                                periode,
                                                isMutatie,
                                                deb_nr,
                                                achternaam,
                                                naam_full,
                                                prs_perslid_key,
                                                cnt_contract_nr,
                                                cnt_contract_key,
                                                kamer,
                                                alg_ruimte_key,
                                                omschrijving,
                                                kpn_code_afd,
                                                kpn_code_proj,
                                                prs_kostensoort_refcode,
                                                btw_code,
                                                btw_perc,
                                                bedrag)
                      VALUES (v_betreft,
                              p_run,
                              p_periode,
                              0,
                              rec.codanr,
                              rec.achternaam,
                              rec.naam,
                              rec.prs_perslid_key,
                              rec.cnt_contract_nr_versie,
                              rec.cnt_contract_key,
                              rec.kamer,
                              rec.alg_ruimte_key,
                              'Cleaning due to relocation/leave '
                              || v_curPeriodeNaam,
                              rec.kpngrp,
                              rec.kpn,
                              '48026',
                              -- v_kostensoort,
                              'VH21',
                              21,
                              rec.schoonmaak_verh);

                  -- Als definitieve export, dan kenmerk leegmaken en loggen.
                  IF (p_mode = 1)
                  THEN
                     -- "Schoonmaak verhuizing" leegmaken
                     UPDATE cnt_kenmerkcontract
                        SET cnt_kenmerkcontract_verwijder = SYSDATE
                      WHERE     cnt_kenmerk_key = 941
                            AND cnt_contract_key = rec.cnt_contract_key
                            AND cnt_kenmerkcontract_verwijder IS NULL;

                     -- Tracking
                     fac.trackaction (
                        'CNTUPD',
                        rec.cnt_contract_key,
                        NULL,
                        NULL,
                           'Contract updated'
                        || CHR (10)
                        || '€'
                        || rec.schoonmaak_verh
                        || ' cleaning costs invoiced');
                  END IF;
               END IF;

               --- KOSTEN SLEUTEL BIJ VERHUIZING (eenmalig, dus niet mee bij allonges) ---
               -- NYBU#51606, NYBU#55564
               IF (rec.sleutel_verh IS NOT NULL AND p_mode <> 2)
               THEN
                  v_errormsg :=
                     'Archiefregel sleutel verhuizing/vertrek aanmaken';

                  -- Plaats in archief
                  -- met juiste kostenplaatsen en -soorten, omschrijving
                  -- NYBU#53064 verlies van sleutel komt altijd op GB 42490 reparaties, schades en gebouw en inventaris
                  INSERT INTO nybu_huur_buffer (betreft,
                                                datum_export,
                                                periode,
                                                isMutatie,
                                                deb_nr,
                                                achternaam,
                                                naam_full,
                                                prs_perslid_key,
                                                cnt_contract_nr,
                                                cnt_contract_key,
                                                kamer,
                                                alg_ruimte_key,
                                                omschrijving,
                                                kpn_code_afd,
                                                kpn_code_proj,
                                                prs_kostensoort_refcode,
                                                btw_code,
                                                btw_perc,
                                                bedrag)
                      VALUES (v_betreft,
                              p_run,
                              p_periode,
                              0,
                              rec.codanr,
                              rec.achternaam,
                              rec.naam,
                              rec.prs_perslid_key,
                              rec.cnt_contract_nr_versie,
                              rec.cnt_contract_key,
                              rec.kamer,
                              rec.alg_ruimte_key,
                              'Lost key ' || v_curPeriodeNaam,
                              rec.kpngrp,
                              rec.kpn,
                              '42490',
                              -- v_kostensoort,
                              'VH21',
                              21,
                              rec.sleutel_verh);

                  -- Als definitieve export, dan kenmerk leegmaken en loggen.
                  IF (p_mode = 1)
                  THEN
                     -- "Sleutel" leegmaken
                     UPDATE cnt_kenmerkcontract
                        SET cnt_kenmerkcontract_verwijder = SYSDATE
                      WHERE     cnt_kenmerk_key =1181
                            AND cnt_contract_key = rec.cnt_contract_key
                            AND cnt_kenmerkcontract_verwijder IS NULL;

                     -- Tracking
                     fac.trackaction (
                        'CNTUPD',
                        rec.cnt_contract_key,
                        NULL,
                        NULL,
                           'Contract updated'
                        || CHR (10)
                        || '€'
                        || rec.sleutel_verh
                        || ' lost key invoiced');
                  END IF;
               END IF;
            ELSE
               fac.writelog (
                  p_applname,
                  'W',
                  v_aanduiding || ': contract loopt niet in gegeven periode!',
                  'Periode: ' || v_curPeriodeNaam);
            END IF;                                                 -- Lopend?
         END LOOP;
         

         -- Als huur vooruit betaald, dan aangeven t/m welke periode
         -- (kenmerken alleen bijwerken als we ook doorvoeren)
         -- NYBU#51606 in principe is standaard periode nu altijd 1 en daarmee zou deze loop overbodig zijn
         IF (p_mode = 1 AND rec.aantal_periodes > 1)
         THEN
            -- We hebben nu vooruit gefactureerd; "Bill in advance" leegmaken

            UPDATE cnt_kenmerkcontract
               SET cnt_kenmerkcontract_verwijder = SYSDATE
             WHERE     cnt_kenmerk_key = 122
                   AND cnt_contract_key = rec.cnt_contract_key
                   AND cnt_kenmerkcontract_verwijder IS NULL;

            -- Voorlopig geen facturering; "Contract paid until" vullen
            INSERT INTO cnt_kenmerkcontract (cnt_contract_key,
                                             cnt_kenmerk_key,
                                             cnt_kenmerkcontract_waarde)
                VALUES (rec.cnt_contract_key, 124, v_curPeriode);

            -- Tracking
            fac.trackaction (
               'CNTUPD',
               rec.cnt_contract_key,
               NULL,
               NULL,
                  'Contract updated'
               || CHR (10)
               || rec.aantal_periodes
               || ' months billed in advance, until '
               || v_curPeriode);
         ELSE
            -- (weer) normale facturering; "Contract paid until" leegmaken als gevuld

            UPDATE cnt_kenmerkcontract
               SET cnt_kenmerkcontract_verwijder = SYSDATE
             WHERE     cnt_kenmerk_key = 124
                   AND cnt_contract_key = rec.cnt_contract_key
                   AND cnt_kenmerkcontract_verwijder IS NULL;
         END IF;
      END IF;
   END LOOP;

   COMMIT;
   -- Aantal dagen in de huidige maand (voor berekening kosten als contract halverwege
   -- de maand begint/afloopt
   v_curPeriodeDagen :=
        CAST (TO_CHAR (LAST_DAY (v_periodeDate), 'DD') AS INT)
      - CAST (TO_CHAR (v_periodeDate, 'DD') AS INT)
      + 1;

   -- Residences & offices
   FOR rec IN ro
   LOOP
      v_aanduiding :=
            rec.cnt_contract_nr_versie
         || '/'
         || rec.prs_perslid_naam
         || '/'
         || rec.alg_ruimte_aanduiding;

      -- Als we allongeregels aan het maken zijn (p_mode=2), sla dan alle contracten zonder "Maak allonge(s)" over
      IF NOT (p_mode = 2 AND rec.maak_allonge IS NULL)
      THEN
         v_betreft := rec.betreft;
         v_refnr := COALESCE (rec.prs_kostenplaats_nr, rec.codanr);

         v_errormsg := 'Archiefregels huur aanmaken';

         -- Plaats in archief
         -- met juiste kostenplaatsen en -soorten, omschrijving
         -- Voor één contract kunnen in één keer meerdere regels worden toegevoegd

         INSERT INTO nybu_huur_buffer (betreft,
                                       datum_export,
                                       periode,
                                       isMutatie,
                                       deb_nr,
                                       achternaam,
                                       naam_full,
                                       prs_perslid_key,
                                       cnt_contract_nr,
                                       cnt_contract_key,
                                       kamer,
                                       alg_ruimte_key,
                                       omschrijving,
                                       kpn_code_afd,
                                       kpn_code_proj,
                                       prs_kostensoort_refcode,
                                       btw_code,
                                       btw_perc,
                                       bedrag)
            SELECT v_betreft,
                   p_run,
                   p_periode,
                   0,
                   DECODE (
                      rec.betreft,
                      'Office',
                      v_refnr,
                      CASE
                         WHEN k.cnt_kenmerk_volgnummer BETWEEN 100 AND 200
                         THEN
                            rec.codanr
                         WHEN k.cnt_kenmerk_volgnummer BETWEEN 200 AND 300
                         THEN
                            rec.prs_kostenplaats_nr
                         WHEN k.cnt_kenmerk_volgnummer > 300
                         THEN
                            'salaris'
                      END)
                      refnr,
                   rec.prs_perslid_naam,
                   rec.prs_perslid_naam_full,
                   rec.prs_perslid_key,
                   rec.cnt_contract_nr_versie,
                   rec.cnt_contract_key,
                   rec.alg_ruimte_aanduiding,
                   rec.alg_ruimte_key,
                   sk.cnt_srtkenmerk_omschrijving || ' ' || v_periodeNaam,
                   rec.kpngrp,
                   rec.kpn,
                   rec.kostensoort,
                   -- v_kostensoort,
                   sk.cnt_srtkenmerk_dimensie,
                   fac.safe_to_number (ud.fac_usrdata_code),
                   nybu.getAantalDagenInPeriode (
                      rec.cnt_contract_looptijd_van,
                      rec.cnt_contract_looptijd_tot,
                      v_periodeDate)
                   / v_curPeriodeDagen
                   * fac.safe_to_number (kc.cnt_kenmerkcontract_waarde)
              --fac.safe_to_number(kc.cnt_kenmerkcontract_waarde) / (1+fac.safe_to_number(ud.fac_usrdata_code)/100)
              FROM cnt_kenmerkcontract kc,
                   cnt_kenmerk k,
                   cnt_srtkenmerk sk,
                   fac_usrdata ud
             WHERE     kc.cnt_contract_key = rec.cnt_contract_key
                   AND kc.cnt_kenmerkcontract_verwijder IS NULL
                   AND k.cnt_kenmerk_key = kc.cnt_kenmerk_key
                   AND k.cnt_kenmerk_verwijder IS NULL
                   AND k.cnt_kenmerk_volgnummer > 100
                   AND fac.safe_to_number (kc.cnt_kenmerkcontract_waarde) IS NOT NULL
                   AND fac.safe_to_number (kc.cnt_kenmerkcontract_waarde) > 0
                   AND sk.cnt_srtkenmerk_key = k.cnt_srtkenmerk_key
                   AND sk.cnt_srtkenmerk_verwijder IS NULL
                   AND sk.cnt_srtkenmerk_kenmerktype = 'N'
                   AND UPPER (ud.fac_usrdata_omschr) =
                         UPPER (sk.cnt_srtkenmerk_dimensie)
                   AND ud.fac_usrtab_key = 42;

         -- Er zijn voor dit contract allonges aangemaakt; zet het vinkje weer uit voor een schone lei
         IF (p_mode = 1)
         THEN
            -- "Maak allonge(s)" leegmaken

            UPDATE cnt_kenmerkcontract
               SET cnt_kenmerkcontract_verwijder = SYSDATE
             WHERE cnt_kenmerk_key IN
                         (SELECT cnt_kenmerk_key
                            FROM cnt_kenmerk
                           WHERE cnt_srtkenmerk_key = 681
                                 AND cnt_kenmerk_verwijder IS NULL)
                   AND cnt_contract_key = rec.cnt_contract_key
                   AND cnt_kenmerkcontract_verwijder IS NULL;

            -- Tracking
            fac.trackaction (
               'CNTUPD',
               '',
               NULL,
               NULL,
                  'Contract updated'
               || CHR (10)
               || 'Maak allonge(s): 1 --> (clear)');
         END IF;
      END IF;
   END LOOP;

   COMMIT;

   FOR rec IN refunds
   LOOP
      v_aanduiding :=
            rec.cnt_contract_nr_versie
         || '/'
         || rec.prs_perslid_naam
         || '/'
         || rec.alg_ruimte_nr;

      -- NYBU#34759: Voorheen werden refunds niet meegenomen bij het maken van allongeregels,
      -- maar dan kun je refunds niet ongedaan maken
      -- NYBU#35710: Alleen allonges voor refunds aanmaken als "Maak allonges" gezet is
      -- NYBU#52130; extra regels nooit meenemen bij "maak huurcoorectie"

      -- Als we allongeregels aan het maken zijn (p_mode=2), sla dan alle refunds over
      IF NOT (p_mode <> 2)
      THEN
         v_betreft := rec.betreft;
         v_errormsg := 'Refundregels huur aanmaken';

         -- Plaats in huurbuffer
         -- met juiste kostenplaatsen en -soorten, omschrijving

         INSERT INTO nybu_huur_buffer (betreft,
                                       datum_export,
                                       periode,
                                       isMutatie,
                                       deb_nr,
                                       achternaam,
                                       naam_full,
                                       prs_perslid_key,
                                       cnt_contract_nr,
                                       cnt_contract_key,
                                       kamer,
                                       alg_ruimte_key,
                                       omschrijving,
                                       kpn_code_afd,
                                       kpn_code_proj,
                                       prs_kostensoort_refcode,
                                       btw_code,
                                       btw_perc,
                                       bedrag)
             VALUES (v_betreft,
                     p_run,
                     p_periode,
                     0,
                     rec.bill_to,
                     rec.prs_perslid_naam,
                     rec.prs_perslid_naam_full,
                     rec.prs_perslid_key,
                     rec.cnt_contract_nr_versie,
                     rec.cnt_contract_key,
                     rec.alg_ruimte_nr,
                     rec.alg_ruimte_key,
                     rec.omschrijving,
                     rec.kpngrp,
                     rec.kpn,
                     rec.kostensoort,
                     -- v_kostensoort,
                     rec.btw,
                     rec.perc,
                     rec.bedrag);

         -- Als we met de definitieve export bezig zijn (p_mode=1),
         -- maak dan de refundkenmerken bij deze refundregel leeg, voor een schone lei
         IF (p_mode = 1)
         THEN
            -- Refundvelden leegmaken

            UPDATE cnt_kenmerkcontract
               SET cnt_kenmerkcontract_verwijder = SYSDATE
             WHERE     cnt_kenmerk_key IN (rec.omschr_key, rec.bedrag_key)
                   AND cnt_contract_key = rec.cnt_contract_key
                   AND cnt_kenmerkcontract_verwijder IS NULL;

            -- Tracking
            fac.trackaction (
               'CNTUPD',
               rec.cnt_contract_key,
               NULL,
               NULL,
                  'Contract updated'
               || CHR (10)
               || 'Refunded €'
               || rec.bedrag
               || ' as '
               || rec.omschrijving
               || ' ('
               || rec.btw
               || ') ');
         END IF;
      END IF;
   END LOOP;

   --- NYBU#35517 payments toevoegen conform refunds
   FOR rec IN payments
   LOOP
      v_aanduiding :=
            rec.cnt_contract_nr_versie
         || '/'
         || rec.prs_perslid_naam
         || '/'
         || rec.alg_ruimte_nr;

      -- NYBU#34759: Voorheen werden refunds niet meegenomen bij het maken van allongeregels,
      -- maar dan kun je refunds niet ongedaan maken
      -- NYBU#35710: Alleen allonges voor refunds aanmaken als "Maak allonges" gezet is
      -- NYBU#52130: extra regels nooit meenemen bij huurcorrectie ("Maak hurrcorectie")

      -- Als we allongeregels aan het maken zijn (p_mode=2), sla dan alle payments over
      IF (p_mode <> 2)
      THEN
         v_betreft := rec.betreft;
         v_errormsg := 'Paymentregels huur aanmaken';

         -- Plaats in huurbuffer
         -- met juiste kostenplaatsen en -soorten, omschrijving

         INSERT INTO nybu_huur_buffer (betreft,
                                       datum_export,
                                       periode,
                                       isMutatie,
                                       deb_nr,
                                       achternaam,
                                       naam_full,
                                       prs_perslid_key,
                                       cnt_contract_nr,
                                       cnt_contract_key,
                                       kamer,
                                       alg_ruimte_key,
                                       omschrijving,
                                       kpn_code_afd,
                                       kpn_code_proj,
                                       prs_kostensoort_refcode,
                                       btw_code,
                                       btw_perc,
                                       bedrag)
             VALUES (v_betreft,
                     p_run,
                     p_periode,
                     0,
                     rec.bill_to,
                     rec.prs_perslid_naam,
                     rec.prs_perslid_naam_full,
                     rec.prs_perslid_key,
                     rec.cnt_contract_nr_versie,
                     rec.cnt_contract_key,
                     rec.alg_ruimte_nr,
                     rec.alg_ruimte_key,
                     rec.omschrijving,
                     rec.kpngrp,
                     rec.kpn,
                     rec.kostensoort,
                     -- v_kostensoort,
                     rec.btw,
                     rec.perc,
                     rec.bedrag);

         -- Als we met de definitieve export bezig zijn (p_mode=1),
         -- maak dan de paymentkenmerken bij deze paymentregel leeg, voor een schone lei
         IF (p_mode = 1)
         THEN
            -- Refundvelden leegmaken

            UPDATE cnt_kenmerkcontract
               SET cnt_kenmerkcontract_verwijder = SYSDATE
             WHERE     cnt_kenmerk_key IN (rec.omschr_key, rec.bedrag_key)
                   AND cnt_contract_key = rec.cnt_contract_key
                   AND cnt_kenmerkcontract_verwijder IS NULL;

            -- Tracking
            fac.trackaction (
               'CNTUPD',
               rec.cnt_contract_key,
               NULL,
               NULL,
                  'Contract updated'
               || CHR (10)
               || 'Payment €'
               || rec.bedrag
               || ' as '
               || rec.omschrijving
               || ' ('
               || rec.btw
               || ') ');
         END IF;
      END IF;
   END LOOP;

   FOR rec IN extra_regels
   LOOP
      v_aanduiding :=
            rec.cnt_contract_nr_versie
         || '/'
         || rec.prs_perslid_naam
         || '/'
         || rec.alg_ruimte_nr;

      -- NYBU#34759: Voorheen werden refunds niet meegenomen bij het maken van allongeregels,
      -- maar dan kun je refunds niet ongedaan maken
      -- NYBU#35710: Alleen allonges voor refunds aanmaken als "Maak allonges" gezet is >> IF NOT (p_mode = 2 AND rec.maak_allonge IS NULL)
      -- NYBU#52130: extra regels nooit meenemen bij huurcorrectie ("Maak allonge (huurcorrectie)")

      -- Als we allongeregels aan het maken zijn (p_mode=2), sla dan het aanmaken van extra factuurregels over
      IF (p_mode <> 2)
      THEN
         v_betreft := rec.betreft;
         v_errormsg := 'Paymen/refund regels huur aanmaken';

         -- Plaats in huurbuffer
         -- met juiste kostenplaatsen en -soorten, omschrijving

         INSERT INTO nybu_huur_buffer (betreft,
                                       datum_export,
                                       periode,
                                       isMutatie,
                                       deb_nr,
                                       achternaam,
                                       naam_full,
                                       prs_perslid_key,
                                       cnt_contract_nr,
                                       cnt_contract_key,
                                       kamer,
                                       alg_ruimte_key,
                                       omschrijving,
                                       kpn_code_afd,
                                       kpn_code_proj,
                                       prs_kostensoort_refcode,
                                       btw_code,
                                       btw_perc,
                                       bedrag)
             VALUES (v_betreft,
                     p_run,
                     p_periode,
                     0,
                     rec.bill_to,
                     rec.prs_perslid_naam,
                     rec.prs_perslid_naam_full,
                     rec.prs_perslid_key,
                     rec.cnt_contract_nr_versie,
                     rec.cnt_contract_key,
                     rec.alg_ruimte_nr,
                     rec.alg_ruimte_key,
                     rec.omschrijving,
                     rec.kpngrp,
                     rec.kpn,
                     rec.gb,
                     -- v_kostensoort,
                     rec.btw,
                     rec.perc,
                     rec.bedrag);

         -- Als we met de definitieve export bezig zijn (p_mode=1),
         -- maak dan de paymentkenmerken bij deze paymentregel leeg, voor een schone lei
         IF (p_mode = 1)
         THEN
            -- Correctie velden leegmaken
            UPDATE cnt_kenmerkcontract
               SET cnt_kenmerkcontract_verwijder = SYSDATE
             WHERE cnt_kenmerk_key IN
                         (rec.omschr_key,
                          rec.bedrag_key,
                          rec.btw_key,
                          rec.to_key,
                          rec.gb_key)
                   AND cnt_contract_key = rec.cnt_contract_key
                   AND cnt_kenmerkcontract_verwijder IS NULL;

            -- Tracking
            fac.trackaction (
               'CNTUPD',
               rec.cnt_contract_key,
               NULL,
               NULL,
                  'Contract updated'
               || CHR (10)
               || 'payment/refund €'
               || rec.bedrag
               || ' as '
               || rec.omschrijving
               || ' ('
               || rec.btw
               || ') ');
         END IF;
      END IF;
   END LOOP;

   COMMIT;

   FOR rec IN ar
   LOOP
      -- NYBU#39837 Als er allonges zijn aangemaakt dat moet na het definitef verwerken de vinkjes weer uitgezet worden
      IF (p_mode = 1)
      THEN
         UPDATE cnt_kenmerkcontract
            SET cnt_kenmerkcontract_verwijder = SYSDATE
          WHERE cnt_kenmerk_key IN
                      (SELECT cnt_kenmerk_key
                         FROM cnt_kenmerk
                        WHERE cnt_srtkenmerk_key = 681
                              AND cnt_kenmerk_verwijder IS NULL)
                AND cnt_contract_key IN
                         (SELECT cnt_contract_key
                            FROM nybu_huur_archief
                           WHERE     periode = p_periode
                                 AND IsMutatie = 1
                                 AND naar_coda IS NULL)
                AND cnt_kenmerkcontract_verwijder IS NULL;

         -- Tracking
         fac.trackaction (
            'CNTUPD',
            rec.cnt_contract_key,
            NULL,
            NULL,
               'Contract updated'
            || CHR (10)
            || 'Maak allonge(s): 1 --> (clear)');
      END IF;
   END LOOP;

   COMMIT;
   COMMIT;

   -- Als definitief, dan buffer naar archief kopiëren
   IF (p_mode = 1)
   THEN
      INSERT INTO nybu_huur_archief
         SELECT *
           FROM nybu_huur_buffer
          WHERE periode = p_periode;

      COMMIT;
   -- Als test, dan eventuele nog niet-geëxporteerde allongeregels in de buffer zetten
   ELSE
      INSERT INTO nybu_huur_buffer
         SELECT *
           FROM nybu_huur_archief
          WHERE periode = p_periode AND ismutatie = 1 AND naar_coda IS NULL;
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
            v_errorhint
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog (p_applname,
                    'E',
                    v_aanduiding || v_errormsg,
                    'Onbekende fout!');
      COMMIT;
END nybu_bereken_factuurregels;
/

-- Test-export; bepaalt factuurregels om te kunnen beoordelen of alles klopt

CREATE OR REPLACE PROCEDURE nybu_select_t_huur_coda (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
   v_aanduiding     VARCHAR2 (200);
   v_errorhint      VARCHAR2 (1000);
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);

   -- Individuele facturen voor debiteuren; ook voor sommatieregel met totaalbedrag
   -- Bedragen zijn incl BTW
   CURSOR c_deb
   IS
        SELECT deb_nr,
               achternaam,
               SUM (bedrag) bedrag,
               betreft
          FROM nybu_huur_buffer
         WHERE     naar_coda IS NULL
               AND deb_nr NOT LIKE 'P%'
               AND deb_nr != 'salaris'
      GROUP BY deb_nr, achternaam, betreft
      ORDER BY deb_nr;

   -- Factuurregels voor deze factuur
   CURSOR regels (in_deb_nr VARCHAR2)
   IS
        SELECT *
          FROM nybu_huur_buffer
         WHERE deb_nr = in_deb_nr AND naar_coda IS NULL
      ORDER BY datum_export, omschrijving, bedrag;

   -- Individuele facturen voor interne kostenplaatsen; ook voor sommatieregel met totaalbedrag
   -- Bedragen zijn INCLUSIEF BTW (NYBU#31139)
   CURSOR c_kpn
   IS
        SELECT deb_nr,
               achternaam,
               COALESCE (TRIM (SUBSTR (kg.prs_kostenplaatsgrp_oms, 1, 7)),
                         'ONB')
                  kpn_grp,
               kpn_code_afd,
               kpn_code_proj,
               SUM (bedrag) bedrag,
               betreft
          FROM nybu_huur_buffer ha,
               prs_v_aanwezigkostenplaats ak,
               prs_kostenplaatsgrp kg
         WHERE     naar_coda IS NULL
               AND deb_nr LIKE 'P%'
               AND ak.prs_kostenplaats_nr = deb_nr
               AND kg.prs_kostenplaatsgrp_key(+) = ak.prs_kostenplaatsgrp_key
      GROUP BY deb_nr,
               achternaam,
               prs_kostenplaatsgrp_oms,
               kpn_code_afd,
               kpn_code_proj,
               betreft
      ORDER BY deb_nr, betreft;

   CURSOR c_salaris
   IS
        SELECT COALESCE (prs_perslid_nr, prs_perslid_email) personeelsnr,
               achternaam,
               kpn_code_afd,
               kpn_code_proj,
               bedrag,
               btw_perc,
               omschrijving
          FROM nybu_huur_buffer b, prs_perslid p
         WHERE     naar_coda IS NULL
               AND deb_nr = 'salaris'
               AND p.prs_perslid_key = b.prs_perslid_key
      ORDER BY achternaam, omschrijving;

   v_teller         NUMBER;
   v_rap_count      NUMBER;
   v_run            DATE;
   v_lastPeriode    VARCHAR (6);
   v_periode        VARCHAR (6);
   v_periodeNaam    VARCHAR2 (20);
   v_last_period    VARCHAR (6);
BEGIN
   v_teller := 0;
   v_rap_count := 0;

   v_aanduiding := 'Init';
   v_errormsg := 'Periode bepalen';

   -- Deze export gaat over de huur voor volgende maand (periode = laatste export + 1)
   -- TODO: wat als nog niets geëxporteerd? Dat zal een NO_DATA_FOUND opleveren...
   v_run := TO_DATE (p_applrun, 'YYYY-MM-DD HH24:MI:SS');

   SELECT MAX (periode)
     INTO v_lastPeriode
     FROM nybu_huur_archief
    WHERE ismutatie = 0;

   v_periode :=
      TO_CHAR (ADD_MONTHS (TO_DATE (v_lastPeriode, 'YYYYMM'), 1), 'YYYYMM');
   v_periodeNaam := nybu.getPeriodeNaam (v_periode, 'EN');

   -- Is deze periode al geëxporteerd?
   -- TODO: Niks doen, of wissen en nog een keer draaien?
   -- TODO: welke periode geëxporteerd moet worden, werd voorheen bepaald adhv SYSDATE. Nu is dit
   --       altijd de laatste periode in het archief + 1, waardoor onderstaande check overbodig is.
   SELECT COALESCE (MAX (periode), 'NogNix')
     INTO v_last_period
     FROM nybu_huur_archief
    WHERE ismutatie = 0;

   IF (v_last_period = v_periode)
   THEN
      fac.writelog (
         p_applname,
         'E',
            'Definitieve export is al gedraaid voor periode '
         || v_periode
         || '!',
         'Test-export wordt afgebroken');
   ELSE
      DELETE imp_log
       WHERE imp_log_applicatie = p_applname;

      DELETE fac_rapport
       WHERE fac_rapport_node = p_applname;

      -- Genereer factuurregels voor komende maand
      nybu_bereken_factuurregels (p_applname,
                                  v_run,
                                  v_periode,
                                  0);

      -- Genereer sommatie- en specificatieregels voor debiteuren
      FOR rec IN c_deb
      LOOP
         v_aanduiding :=
            v_teller || ': ' || rec.deb_nr || '/' || rec.achternaam;
         v_errormsg := 'Sommatieregel aanmaken';
         v_teller := v_teller + 1;
         v_rap_count := v_rap_count + 1;

         -- Sommatieregel
         INSERT INTO fac_rapport (fac_rapport_node,
                                  fac_rapport_volgnr,
                                  fac_rapport_regel,
                                  fac_rapport_soort)
             VALUES (p_applname,
                     v_rap_count,
                        v_teller
                     || ';'
                     || '10;'
                     || '13000;'
                     || REPLACE (rec.deb_nr, 'CON', 'DC')
                     || ';'
                     || ';'
                     || TRIM(TO_CHAR (ABS (rec.bedrag),
                                      '99999999D99',
                                      'NLS_NUMERIC_CHARACTERS=,.'))
                     || ';'
                     || CASE
                           WHEN rec.bedrag < 0 THEN 'C;'
                           WHEN rec.bedrag >= 0 THEN 'D;'
                        END
                     || ';'
                     || rec.betreft
                     || ' '
                     || v_periodeNaam
                     || ' '
                     || rec.achternaam
                     || ';'
                     || 'Summary;'
                     || 'K91200;'
                     || 'P991210',
                     0);

         -- Specificatieregels
         FOR reg IN regels (rec.deb_nr)
         LOOP
            v_errormsg := 'Specificatieregel aanmaken';
            v_rap_count := v_rap_count + 1;

            INSERT INTO fac_rapport (fac_rapport_node,
                                     fac_rapport_volgnr,
                                     fac_rapport_regel,
                                     fac_rapport_soort)
                VALUES (p_applname,
                        v_rap_count,
                           v_teller
                        || ';'
                        || '12;'
                        || reg.prs_kostensoort_refcode
                        || ';'
                        || reg.kpn_code_afd
                        || ';'
                        || reg.kpn_code_proj
                        || ';'
                        || TRIM(TO_CHAR (ABS (reg.bedrag),
                                         '99999999D99',
                                         'NLS_NUMERIC_CHARACTERS=,.'))
                        || ';'
                        || CASE
                              WHEN reg.bedrag < 0 THEN 'D;'
                              WHEN reg.bedrag >= 0 THEN 'C;'
                           END
                        || reg.btw_code
                        || ';'
                        || reg.omschrijving
                        || ' #'
                        || reg.kamer
                        || ';'
                        || 'Analysis;'
                        || ';'
                        || '',
                        0);
         END LOOP;
      END LOOP;

      -- Scheidingsregel
      v_errormsg := 'Scheidingsregel aanmaken';
      v_rap_count := v_rap_count + 1;

      INSERT INTO fac_rapport (fac_rapport_node,
                               fac_rapport_volgnr,
                               fac_rapport_regel,
                               fac_rapport_soort)
          VALUES (p_applname,
                  v_rap_count,
                  'INTERNE KOSTENPLAATSEN;;;;;;;;;;;',
                  0);

      v_teller := 0;

      -- Genereer sommatie- en specificatieregels voor interne kostenplaatsen
      FOR rec IN c_kpn
      LOOP
         v_aanduiding :=
            v_teller || ': ' || rec.deb_nr || '/' || rec.achternaam;
         v_errormsg := 'Sommatieregel KPN aanmaken';
         v_teller := v_teller + 1;
         v_rap_count := v_rap_count + 1;

         -- Sommatieregel
         INSERT INTO fac_rapport (fac_rapport_node,
                                  fac_rapport_volgnr,
                                  fac_rapport_regel,
                                  fac_rapport_soort)
             VALUES (p_applname,
                     v_rap_count,
                        v_teller
                     || ';'
                     || ';'
                     || '56000;'
                     || rec.kpn_grp
                     || ';'
                     || rec.deb_nr
                     || ';'
                     || TRIM(TO_CHAR (ABS (rec.bedrag),
                                      '99999999D99',
                                      'NLS_NUMERIC_CHARACTERS=,.'))
                     || ';'
                     || CASE
                           WHEN rec.bedrag < 0 THEN 'C;'
                           WHEN rec.bedrag >= 0 THEN 'D;'
                        END
                     || ';'
                     || rec.betreft
                     || ' '
                     || v_periodeNaam
                     || ' '
                     || rec.achternaam
                     || ';'
                     || ';'
                     || ';'
                     || '',
                     0);

         -- Tegenboeking
         v_errormsg := 'Tegenboeking aanmaken';
         v_rap_count := v_rap_count + 1;

         INSERT INTO fac_rapport (fac_rapport_node,
                                  fac_rapport_volgnr,
                                  fac_rapport_regel,
                                  fac_rapport_soort)
             VALUES (p_applname,
                     v_rap_count,
                        v_teller
                     || ';'
                     || ';'
                     || '76000;'
                     || rec.kpn_code_afd
                     || ';'
                     || rec.kpn_code_proj
                     || ';'
                     || TRIM(TO_CHAR (ABS (rec.bedrag),
                                      '99999999D99',
                                      'NLS_NUMERIC_CHARACTERS=,.'))
                     || ';'
                     || CASE
                           WHEN rec.bedrag < 0 THEN 'D;'
                           WHEN rec.bedrag >= 0 THEN 'C;'
                        END
                     || ';'
                     || rec.betreft
                     || ' '
                     || v_periodeNaam
                     || ' '
                     || rec.achternaam
                     || ';'
                     || ';'
                     || ';'
                     || '',
                     0);
      END LOOP;

      -- Scheidingsregel
      v_errormsg := 'Scheidingsregel aanmaken';
      v_rap_count := v_rap_count + 1;

      INSERT INTO fac_rapport (fac_rapport_node,
                               fac_rapport_volgnr,
                               fac_rapport_regel,
                               fac_rapport_soort)
          VALUES (p_applname,
                  v_rap_count,
                  'SALARISADMINISTRATIE;;;;;;;;;;;',
                  0);

      v_teller := 0;

      -- Genereer specificatieregels voor salarisadministratie
      FOR rec IN c_salaris
      LOOP
         v_aanduiding :=
            v_teller || ': ' || rec.personeelsnr || '/' || rec.achternaam;
         v_errormsg := 'Sommatieregel salarisadministratie aanmaken';
         v_teller := v_teller + 1;
         v_rap_count := v_rap_count + 1;

         -- Sommatieregel
         INSERT INTO fac_rapport (fac_rapport_node,
                                  fac_rapport_volgnr,
                                  fac_rapport_regel,
                                  fac_rapport_soort)
             VALUES (p_applname,
                     v_rap_count,
                        v_teller
                     || ';'
                     || rec.personeelsnr
                     || ';'
                     || rec.achternaam
                     || ';'
                     || rec.kpn_code_afd
                     || ';'
                     || rec.kpn_code_proj
                     || ';'
                     || TRIM(TO_CHAR (ABS (rec.bedrag),
                                      '99999999D99',
                                      'NLS_NUMERIC_CHARACTERS=,.'))
                     || ';'
                     || rec.btw_perc
                     || ';'
                     || rec.omschrijving
                     || ';'
                     || ';'
                     || ';'
                     || ';'
                     || '',
                     0);
      END LOOP;
   END IF;

   fac.writelog (p_applname,
                 'S',
                 'Controleregels facturen gegenereerd',
                 'Periode ' || v_periode);

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
            v_errorhint
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog (p_applname,
                    'E',
                    v_aanduiding || v_errormsg,
                    'Onbekende fout!');
      COMMIT;
END nybu_select_t_huur_coda;
/

CREATE OR REPLACE VIEW nybu_v_export_t_huur_coda
AS
     SELECT fac_rapport_regel result, fac_rapport_volgnr result_order
       FROM fac_rapport
      WHERE fac_rapport_node = 'T_HUUR_CODA'
   ORDER BY fac_rapport_volgnr;

-- Levert alle factuurregels die naar CODA moeten.
-- Per factuur:
--    - een sommatieregel met totaalbedrag
--    - een regel per item (huurprijs, servicekosten, ...)

CREATE OR REPLACE PROCEDURE nybu_select_huur_coda (p_applname   IN VARCHAR2,
                                                   p_applrun    IN VARCHAR2)
AS
   v_aanduiding     VARCHAR2 (200);
   v_errorhint      VARCHAR2 (1000);
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);

   -- Individuele facturen voor debiteuren; ook voor sommatieregel met totaalbedrag
   -- Bedragen zijn incl BTW
   CURSOR c_deb
   IS
        SELECT deb_nr,
               achternaam,
               SUM (bedrag) bedrag,
               betreft,
               periode
          FROM nybu_huur_archief
         WHERE     naar_coda IS NULL
               AND deb_nr NOT LIKE 'P%'
               AND deb_nr != 'salaris'
      GROUP BY deb_nr,
               achternaam,
               betreft,
               periode
      ORDER BY deb_nr;

   -- Individuele facturen per contract voor fin_verkoopfactuur
   -- Bedragen zijn incl BTW
   CURSOR c_deb_cnt
   IS
        SELECT deb_nr,
               achternaam,
               SUM (bedrag) bedrag,
               betreft,
               cnt_contract_nr,
               periode
          FROM nybu_huur_archief
         WHERE     naar_coda IS NULL
               AND deb_nr NOT LIKE 'P%'
               AND deb_nr != 'salaris'
      GROUP BY deb_nr,
               achternaam,
               betreft,
               cnt_contract_nr,
               periode
      ORDER BY deb_nr;

   -- Factuurregels voor deze factuur
   CURSOR regels (in_deb_nr VARCHAR2)
   IS
        SELECT *
          FROM nybu_huur_archief
         WHERE deb_nr = in_deb_nr AND naar_coda IS NULL
      ORDER BY datum_export, omschrijving, bedrag;

   -- Individuele facturen voor interne kostenplaatsen; ook voor sommatieregel met totaalbedrag
   -- Bedragen zijn INCLUSIEF BTW (NYBU#31139)
   CURSOR c_kpn
   IS
        SELECT deb_nr,
               achternaam,
               COALESCE (TRIM (SUBSTR (kg.prs_kostenplaatsgrp_oms, 1, 7)),
                         'ONB')
                  kpn_grp,
               kpn_code_afd,
               kpn_code_proj,
               SUM (bedrag) bedrag,
               betreft
          FROM nybu_huur_archief ha,
               prs_v_aanwezigkostenplaats ak,
               prs_kostenplaatsgrp kg
         WHERE     naar_coda IS NULL
               AND deb_nr LIKE 'P%'
               AND ak.prs_kostenplaats_nr = deb_nr
               AND kg.prs_kostenplaatsgrp_key(+) = ak.prs_kostenplaatsgrp_key
      GROUP BY deb_nr,
               achternaam,
               prs_kostenplaatsgrp_oms,
               kpn_code_afd,
               kpn_code_proj,
               betreft
      ORDER BY deb_nr, betreft;

   CURSOR c_salaris
   IS
        SELECT COALESCE (prs_perslid_nr, prs_perslid_email) personeelsnr,
               achternaam,
               kpn_code_afd,
               kpn_code_proj,
               bedrag,
               btw_perc,
               omschrijving
          FROM nybu_huur_archief b, prs_perslid p
         WHERE     naar_coda IS NULL
               AND deb_nr = 'salaris'
               AND p.prs_perslid_key = b.prs_perslid_key
      ORDER BY achternaam, omschrijving;

   v_teller         NUMBER;
   v_rap_count      NUMBER;
   v_run            DATE;
   v_lastPeriode    VARCHAR (6);
   v_periode        VARCHAR (6);
   v_periodeNaam    VARCHAR2 (20);
   v_last_period    VARCHAR (6);
BEGIN
   v_teller := 0;
   v_rap_count := 0;

   v_aanduiding := 'Init';
   v_errormsg := 'Periode bepalen';

   -- Deze export gaat over de huur voor volgende maand (periode = laatste export + 1)
   v_run := TO_DATE (p_applrun, 'YYYY-MM-DD HH24:MI:SS');

   SELECT MAX (periode)
     INTO v_lastPeriode
     FROM nybu_huur_archief
    WHERE ismutatie = 0;

   v_periode :=
      TO_CHAR (ADD_MONTHS (TO_DATE (v_lastPeriode, 'YYYYMM'), 1), 'YYYYMM');
   v_periodeNaam := nybu.getPeriodeNaam (v_periode, 'EN');

   -- Is deze periode al geëxporteerd?
   -- TODO: Niks doen, of wissen en nog een keer draaien?
   SELECT COALESCE (MAX (periode), 'NogNix')
     INTO v_last_period
     FROM nybu_huur_archief
    WHERE ismutatie = 0;

   IF (v_last_period = v_periode)
   THEN
      fac.writelog (
         p_applname,
         'E',
         'Export is al gedraaid voor periode ' || v_periode || '!',
         'Export wordt afgebroken');
   ELSE
      DELETE imp_log
       WHERE imp_log_applicatie = p_applname;

      DELETE fac_rapport
       WHERE fac_rapport_node = p_applname;

      -- Genereer factuurregels voor komende maand
      nybu_bereken_factuurregels (p_applname,
                                  v_run,
                                  v_periode,
                                  1);

      -- FSN#40043
      -- De sommatie regel is feitelijk de factuurkop
      -- Dus deze nu direct maar aanmaken
      FOR rec IN c_deb_cnt
      LOOP
         v_aanduiding := rec.deb_nr || '/' || rec.achternaam;
         v_errormsg := 'Factuurkop aanmaken';

         INSERT INTO fin_verkoopfactuurkop (fin_verkoopfactuurkop_id)
             VALUES (rec.cnt_contract_nr || ' / ' || rec.periode);
      END LOOP;

      -- Genereer sommatie- en specificatieregels voor debiteuren tbv CODA export
      FOR rec IN c_deb
      LOOP
         v_aanduiding :=
            v_teller || ': ' || rec.deb_nr || '/' || rec.achternaam;
         v_errormsg := 'Sommatieregel aanmaken';
         v_teller := v_teller + 1;
         v_rap_count := v_rap_count + 1;

         -- Sommatieregel
         INSERT INTO fac_rapport (fac_rapport_node,
                                  fac_rapport_volgnr,
                                  fac_rapport_regel,
                                  fac_rapport_soort)
             VALUES (p_applname,
                     v_rap_count,
                        v_teller
                     || ';'
                     || '10;'
                     || '13000;'
                     || REPLACE (rec.deb_nr, 'CON', 'DC')
                     || ';'
                     || ';'
                     || TRIM(TO_CHAR (ABS (rec.bedrag),
                                      '99999999D99',
                                      'NLS_NUMERIC_CHARACTERS=,.'))
                     || ';'
                     || CASE
                           WHEN rec.bedrag < 0 THEN 'C;'
                           WHEN rec.bedrag >= 0 THEN 'D;'
                        END
                     || ';'
                     || rec.betreft
                     || ' '
                     || v_periodeNaam
                     || ' '
                     || rec.achternaam
                     || ';'
                     || 'Summary;'
                     || 'K91200;'
                     || 'P991210',
                     0);


         -- Specificatieregels
         FOR reg IN regels (rec.deb_nr)
         LOOP
            v_errormsg := 'Specificatieregel aanmaken';
            v_rap_count := v_rap_count + 1;

            INSERT INTO fac_rapport (fac_rapport_node,
                                     fac_rapport_volgnr,
                                     fac_rapport_regel,
                                     fac_rapport_soort)
                VALUES (p_applname,
                        v_rap_count,
                           v_teller
                        || ';'
                        || '12;'
                        || reg.prs_kostensoort_refcode
                        || ';'
                        || reg.kpn_code_afd
                        || ';'
                        || reg.kpn_code_proj
                        || ';'
                        || TRIM(TO_CHAR (ABS (reg.bedrag),
                                         '99999999D99',
                                         'NLS_NUMERIC_CHARACTERS=,.'))
                        || ';'
                        || CASE
                              WHEN reg.bedrag < 0 THEN 'D;'
                              WHEN reg.bedrag >= 0 THEN 'C;'
                           END
                        || reg.btw_code
                        || ';'
                        || reg.omschrijving
                        || ' #'
                        || reg.kamer
                        || ';'
                        || 'Analysis;'
                        || ';'
                        || '',
                        0);

            -- FSN#40043 En dit zijn natuurlijk de factuurregels
            -- Dus die maken we nu ook direct aan
            INSERT INTO fin_verkoopfactuur (fin_verkoopfactuur_id,
                                            fin_verkoopfactuur_datum,
                                            fin_verkoopfactuur_omschr,
                                            fin_verkoopfactuur_xmlnode,
                                            fin_verkoopfactuur_refkey,
                                            prs_kostenplaats_nr,
                                            prs_kostenplaats_omschrijving,
                                            prs_kostensoort_refcode,
                                            prs_debiteur_naam,
                                            fin_verkoopfactuur_bedrag,
                                            fin_verkoopfactuur_btw,
                                            fin_btwtabelwaarde_code,
                                            fin_btwtabelwaarde_oms,
                                            fin_btwtabelwaarde_perc,
                                            fin_verkoopfactuur_maand,
                                            fin_verkoopfactuur_c1,
                                            fin_verkoopfactuur_c2,
                                            fin_verkoopfactuurkop_key)
                VALUES ('Campus periode ' || reg.periode,
                        reg.datum_export,
                        reg.omschrijving,
                        'contract',
                        reg.cnt_contract_key,
                        reg.kpn_code_afd || '/ ' || reg.kpn_code_proj,
                        reg.kpn_code_afd || '/ ' || reg.kpn_code_proj,
                        reg.prs_kostensoort_refcode,
                        reg.naam_full,
                        reg.bedrag,
                        (ROUND (
                            reg.bedrag * (1 + (reg.btw_perc / 100))
                            - reg.bedrag,
                            2)),
                        reg.btw_code,
                        reg.btw_code,
                        reg.btw_perc,
                        reg.periode,
                        reg.ismutatie,
                        TO_CHAR (reg.naar_coda),
                        (SELECT fin_verkoopfactuurkop_key
                           FROM fin_verkoopfactuurkop
                          WHERE fin_verkoopfactuurkop.fin_verkoopfactuurkop_id =
                                   (   reg.cnt_contract_nr
                                    || ' / '
                                    || reg.periode)));
         END LOOP;
      END LOOP;

      -- Scheidingsregel
      v_errormsg := 'Scheidingsregel aanmaken';
      v_rap_count := v_rap_count + 1;

      INSERT INTO fac_rapport (fac_rapport_node,
                               fac_rapport_volgnr,
                               fac_rapport_regel,
                               fac_rapport_soort)
          VALUES (p_applname,
                  v_rap_count,
                  'INTERNE KOSTENPLAATSEN;;;;;;;;;;;',
                  0);

      v_teller := 0;

      -- Genereer sommatie- en specificatieregels voor interne kostenplaatsen
      FOR rec IN c_kpn
      LOOP
         v_aanduiding :=
            v_teller || ': ' || rec.deb_nr || '/' || rec.achternaam;
         v_errormsg := 'Sommatieregel KPN aanmaken';
         v_teller := v_teller + 1;
         v_rap_count := v_rap_count + 1;

         -- Sommatieregel
         INSERT INTO fac_rapport (fac_rapport_node,
                                  fac_rapport_volgnr,
                                  fac_rapport_regel,
                                  fac_rapport_soort)
             VALUES (p_applname,
                     v_rap_count,
                        v_teller
                     || ';'
                     || ';'
                     || '56000;'
                     || rec.kpn_grp
                     || ';'
                     || rec.deb_nr
                     || ';'
                     || TRIM(TO_CHAR (ABS (rec.bedrag),
                                      '99999999D99',
                                      'NLS_NUMERIC_CHARACTERS=,.'))
                     || ';'
                     || CASE
                           WHEN rec.bedrag < 0 THEN 'C;'
                           WHEN rec.bedrag >= 0 THEN 'D;'
                        END
                     || ';'
                     || rec.betreft
                     || ' '
                     || v_periodeNaam
                     || ' '
                     || rec.achternaam
                     || ';'
                     || ';'
                     || ';'
                     || '',
                     0);

         -- Tegenboeking
         v_errormsg := 'Tegenboeking aanmaken';
         v_rap_count := v_rap_count + 1;

         INSERT INTO fac_rapport (fac_rapport_node,
                                  fac_rapport_volgnr,
                                  fac_rapport_regel,
                                  fac_rapport_soort)
             VALUES (p_applname,
                     v_rap_count,
                        v_teller
                     || ';'
                     || ';'
                     || '76000;'
                     || rec.kpn_code_afd
                     || ';'
                     || rec.kpn_code_proj
                     || ';'
                     || TRIM(TO_CHAR (ABS (rec.bedrag),
                                      '99999999D99',
                                      'NLS_NUMERIC_CHARACTERS=,.'))
                     || ';'
                     || CASE
                           WHEN rec.bedrag < 0 THEN 'D;'
                           WHEN rec.bedrag >= 0 THEN 'C;'
                        END
                     || ';'
                     || rec.betreft
                     || ' '
                     || v_periodeNaam
                     || ' '
                     || rec.achternaam
                     || ';'
                     || ';'
                     || ';'
                     || '',
                     0);
      END LOOP;

      -- Scheidingsregel
      v_errormsg := 'Scheidingsregel aanmaken';
      v_rap_count := v_rap_count + 1;

      INSERT INTO fac_rapport (fac_rapport_node,
                               fac_rapport_volgnr,
                               fac_rapport_regel,
                               fac_rapport_soort)
          VALUES (p_applname,
                  v_rap_count,
                  'SALARISADMINISTRATIE;;;;;;;;;;;',
                  0);

      v_teller := 0;

      -- Genereer specificatieregels voor salarisadministratie
      FOR rec IN c_salaris
      LOOP
         v_aanduiding :=
            v_teller || ': ' || rec.personeelsnr || '/' || rec.achternaam;
         v_errormsg := 'Sommatieregel salarisadministratie aanmaken';
         v_teller := v_teller + 1;
         v_rap_count := v_rap_count + 1;

         -- Sommatieregel
         INSERT INTO fac_rapport (fac_rapport_node,
                                  fac_rapport_volgnr,
                                  fac_rapport_regel,
                                  fac_rapport_soort)
             VALUES (p_applname,
                     v_rap_count,
                        v_teller
                     || ';'
                     || rec.personeelsnr
                     || ';'
                     || rec.achternaam
                     || ';'
                     || rec.kpn_code_afd
                     || ';'
                     || rec.kpn_code_proj
                     || ';'
                     || TRIM(TO_CHAR (ABS (rec.bedrag),
                                      '99999999D99',
                                      'NLS_NUMERIC_CHARACTERS=,.'))
                     || ';'
                     || rec.btw_perc
                     || ';'
                     || rec.omschrijving
                     || ';'
                     || ';'
                     || ';'
                     || ';'
                     || '',
                     0);
      END LOOP;
   END IF;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
            v_errorhint
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog (p_applname,
                    'E',
                    v_aanduiding || v_errormsg,
                    'Onbekende fout!');
      COMMIT;
END nybu_select_huur_coda;
/

CREATE OR REPLACE VIEW nybu_v_export_huur_coda
AS
     SELECT fac_rapport_regel result, fac_rapport_volgnr result_order
       FROM fac_rapport
      WHERE fac_rapport_node = 'HUUR_CODA'
   ORDER BY fac_rapport_volgnr;

CREATE OR REPLACE PROCEDURE nybu_export_huur_coda (p_applname   IN VARCHAR2,
                                                   p_applrun    IN VARCHAR2,
                                                   p_filedir    IN VARCHAR2,
                                                   p_filename   IN VARCHAR2)
AS
   v_aanduiding     VARCHAR2 (200);
   v_errorhint      VARCHAR2 (1000);
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);

   v_run            DATE;
   v_count          NUMBER;
BEGIN
   v_run := TO_DATE (p_applrun, 'YYYY-MM-DD HH24:MI:SS');

   v_aanduiding := 'Init';
   v_errormsg := 'Init';

   -- Alleen als er iets geëxporteerd is!
   SELECT COUNT ( * )
     INTO v_count
     FROM fac_rapport
    WHERE fac_rapport_node = p_applname;

   IF (v_count > 0)
   THEN
      v_errormsg := 'Exportdatum zetten';

      -- Exportdatum van alle regels van de laatste export zetten
      UPDATE nybu_huur_archief
         SET naar_coda = v_run
       WHERE naar_coda IS NULL;
   END IF;

   fac.writelog (p_applname,
                 'S',
                 'Factuurregels geëxporteerd',
                 v_run);

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
            v_errorhint
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog (p_applname,
                    'E',
                    v_aanduiding || v_errormsg,
                    'Onbekende fout!');
      COMMIT;
END nybu_export_huur_coda;
/

-- Bepaalt mutaties aan contracten in de huidige periode, die in de volgende periode
-- gefactureerd moeten worden. Hiervoor worden op basis van de huidige contractgegevens
-- nieuwe factuurregels gemaakt en één-op-één vergeleken met de al bestaande regels.
-- Voor regels die afwijken worden verschilregels in het factuurarchief gezet, voor de komende
-- periode.

CREATE OR REPLACE PROCEDURE nybu_select_huur_mutaties (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
   v_aanduiding     VARCHAR2 (200);
   v_errorhint      VARCHAR2 (1000);
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);

   -- Mutaties nieuw versus oud (waarbij nieuw het uitgangspunt is ivm kameromschrijving):
   --   - oude bedrag != nieuwe bedrag
   --   - oud bestaat niet in nieuw
   --   - nieuw bestaat niet in oud
   -- NYBU#29529: regels ook vergelijken op naam van huurder, ivm deb_nr 'salaris', dat voor
   -- verschillende personen natuurlijk hetzelfde is (idem voor P-nummer, trouwens)
   CURSOR c (
      in_periode VARCHAR2)
   IS
      WITH nw AS (SELECT *
                    FROM nybu_huur_buffer
                   WHERE periode = in_periode),
           oud
              AS (SELECT a.*
                    FROM nybu_huur_archief a,
                         cnt_kenmerkcontract kc,
                         cnt_kenmerk k
                   WHERE     kc.cnt_contract_key = a.cnt_contract_key
                         AND kc.cnt_kenmerkcontract_verwijder IS NULL
                         AND k.cnt_kenmerk_key = KC.CNT_KENMERK_KEY
                         AND k.cnt_srtkenmerk_key = 681
                         AND periode = in_periode
                         AND naar_coda IS NOT NULL
                         AND (UPPER (omschrijving) LIKE '%RENT%'
                              OR UPPER (omschrijving) LIKE
                                   '%ADDITIONAL COSTS%'
                              OR UPPER (omschrijving) LIKE '%ADD. COSTS%'
                              OR UPPER (omschrijving) LIKE '%PARTNER CHARGE%')
                         AND ismutatie = 0)
      SELECT nw.*,
             COALESCE (oud.bedrag, 0) bedrag_oud,
             COALESCE (nw.bedrag, 0) bedrag_new
        FROM    nw
             LEFT OUTER JOIN
                oud
             ON     oud.cnt_contract_key = nw.cnt_contract_key --- Er moet ook naar de versie van het contract gekeken worden
                AND oud.deb_nr = nw.deb_nr
                AND oud.omschrijving = nw.omschrijving
                AND oud.kamer = nw.kamer
                AND COALESCE (oud.naam_full, 'apekool') =
                      COALESCE (nw.naam_full, 'apekool')
       WHERE oud.bedrag IS NULL                   -- nieuw bestaat niet in oud
                               OR nw.bedrag != oud.bedrag -- nieuw bedrag != oud bedrag
      UNION
      SELECT oud.*,
             COALESCE (oud.bedrag, 0) bedrag_oud,
             COALESCE (nw.bedrag, 0) bedrag_new
        FROM    oud
             LEFT OUTER JOIN
                nw
             ON     oud.cnt_contract_key = nw.cnt_contract_key --- Er moet ook naar de versie van het contract gekeken worden
                AND oud.deb_nr = nw.deb_nr
                AND oud.omschrijving = nw.omschrijving
                AND oud.kamer = nw.kamer
                AND COALESCE (oud.naam_full, 'apekool') =
                      COALESCE (nw.naam_full, 'apekool')
       WHERE nw.bedrag IS NULL                    -- oud bestaat niet in nieuw
                              ;

   v_run            DATE;
   v_periode        VARCHAR (6);
   v_periodeNaam    VARCHAR2 (20);
   v_next_period    VARCHAR (6);
BEGIN
   v_aanduiding := 'Init';
   v_errormsg := 'Periode bepalen';

   -- Deze export maakt correctieregels voor de huur van de laatst geëxporteerde maand
   -- TODO: afdwingen dat die periode niet te ver in het verleden ligt?
   v_run := TO_DATE (p_applrun, 'YYYY-MM-DD HH24:MI:SS');

   SELECT MAX (periode)
     INTO v_periode
     FROM nybu_huur_archief
    WHERE isMutatie = 0;

   v_periodeNaam := nybu.getPeriodeNaam (v_periode, 'EN');

   -- Mutaties over periode n komen op factuur voor periode n+1
   v_next_period :=
      TO_CHAR (ADD_MONTHS (TO_DATE (v_periode, 'YYYYMM'), 1), 'YYYYMM');

   DELETE imp_log
    WHERE imp_log_applicatie = p_applname;

   DELETE fac_rapport
    WHERE fac_rapport_node = p_applname;

   -- Eerder gemaakte mutatieregels voor deze periode verwijderen
   DELETE nybu_huur_archief
    WHERE isMutatie = 1 AND periode >= v_next_period AND naar_coda IS NULL;

   -- Genereer factuurregels voor deze maand (mode 2 = allonges)
   nybu_bereken_factuurregels (p_applname,
                               v_run,
                               v_periode,
                               2);

   -- Genereer mutatieregels
   FOR rec IN c (v_periode)
   LOOP
      v_aanduiding :=
            v_periode
         || '/'
         || rec.deb_nr
         || '/'
         || rec.achternaam
         || '/'
         || rec.omschrijving;
      v_errormsg := 'Mutatieregel aanmaken';

      INSERT INTO nybu_huur_archief (betreft,
                                     datum_export,
                                     periode,
                                     isMutatie,
                                     deb_nr,
                                     achternaam,
                                     naam_full,
                                     prs_perslid_key,
                                     cnt_contract_nr,
                                     cnt_contract_key,
                                     kamer,
                                     alg_ruimte_key,
                                     omschrijving,
                                     kpn_code_afd,
                                     kpn_code_proj,
                                     prs_kostensoort_refcode,
                                     btw_code,
                                     btw_perc,
                                     bedrag)
          VALUES (rec.betreft,
                  v_run,
                  v_next_period,
                  1,
                  rec.deb_nr,
                  rec.achternaam,
                  rec.naam_full,
                  rec.prs_perslid_key,
                  rec.cnt_contract_nr,
                  rec.cnt_contract_key,
                  rec.kamer,
                  rec.alg_ruimte_key,
                  'Correction ' || rec.omschrijving,
                  rec.kpn_code_afd,
                  rec.kpn_code_proj,
                  rec.prs_kostensoort_refcode,
                  rec.btw_code,
                  rec.btw_perc,
                  rec.bedrag_new - rec.bedrag_oud);

      fac.writelog (
         p_applname,
         'I',
         'Mutatieregel voor ' || v_aanduiding,
         rec.omschrijving || ': ' || (rec.bedrag_new - rec.bedrag_oud));
   END LOOP;

   -- Verwijder 'niet-mutatie regels' (die zijn in de buffer aangemaakt door nybu_bereken_factuurregels() )
   DELETE nybu_huur_buffer
    WHERE isMutatie = 0 AND periode = v_periode AND naar_coda IS NULL;

   -- Zet allongeregels in huurbuffer
   INSERT INTO nybu_huur_buffer
      SELECT *
        FROM nybu_huur_archief
       WHERE periode = v_next_period AND ismutatie = 1 AND naar_coda IS NULL;

   fac.writelog (p_applname,
                 'S',
                 'Mutatieregels gegenereerd',
                 'Periode ' || v_periode);

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
            v_errorhint
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog (p_applname,
                    'E',
                    v_aanduiding || v_errormsg,
                    'Onbekende fout!');
      COMMIT;
END nybu_select_huur_mutaties;
/



----- Rapportages --------------------------------

-- Toont de inhoud van de factuurbuffer (voor controle van gegenereerde factuurregels

CREATE OR REPLACE VIEW nybu_v_rap_factuur_buffer
AS
   SELECT h.periode fclt_f_periode,
          h.betreft fclt_f_betreft,
          h.deb_nr fclt_f_debiteurnr,
          DECODE (
             h.prs_perslid_key,
             NULL,
             NULL,
                '<a class="details" onclick=''FcltMgr.openDetail("'
             || 'appl/prs/prs_perslid.asp?key='
             || h.prs_perslid_key
             || '")''>'
             || HTF.escape_sc (h.naam_full)
             || '</a>')
             html_naam,
          h.naam_full fclt_x_naam,
          a.prs_afdeling_naam6 afdeling,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/cnt/cnt_contract.asp?urole=bo&'
          || 'cnt_key='
          || h.cnt_contract_key
          || '")''>'
          || HTF.escape_sc (
                h.cnt_contract_nr || ' - ' || c.cnt_contract_omschrijving)
          || '</a>'
             html_contract,
          h.cnt_contract_nr fclt_x_contract,
          g.alg_gebouw_naam fclt_f_gebouw,
          v.alg_verdieping_code fclt_f_verdieping,
          DECODE (
             h.cnt_contract_key,
             NULL,
             NULL,
                '<a class="details" onclick=''FcltMgr.openDetail("'
             || 'appl/ALG/alg_ruimte.asp?key='
             || h.alg_ruimte_key
             || '")''>'
             || HTF.escape_sc (r.alg_ruimte_nr)
             || '</a>')
             html_kamer,
          r.alg_ruimte_nr fclt_x_kamer,
          sr.alg_srtruimte_omschrijving kamertype,
          h.omschrijving fclt_f_omschrijving, -- TODO; alleen kernwoord ("rent", "service costs") eruit pikken
          h.bedrag,
          DECODE (h.ismutatie, 1, 1, NULL) ismutatie
     FROM nybu_huur_buffer h,
          cnt_contract c,
          alg_ruimte r,
          alg_srtruimte sr,
          alg_verdieping v,
          alg_gebouw g,
          prs_perslid p,
          prs_v_aanwezigafdeling a
    WHERE     c.cnt_contract_key = h.cnt_contract_key
          AND r.alg_ruimte_key(+) = h.alg_ruimte_key
          AND sr.alg_srtruimte_key(+) = r.alg_srtruimte_key
          AND v.alg_verdieping_key(+) = r.alg_verdieping_key
          AND g.alg_gebouw_key(+) = v.alg_gebouw_key
          AND p.prs_perslid_key(+) = h.prs_perslid_key
          AND a.prs_afdeling_key(+) = p.prs_afdeling_key;

-- Toont de inhoud van het factuurarchief (huurarchief)

CREATE OR REPLACE VIEW nybu_v_rap_factuur_archief
AS
   SELECT h.periode fclt_f_periode,
          h.betreft fclt_f_betreft,
          h.deb_nr fclt_f_debiteurnr,
          DECODE (
             h.prs_perslid_key,
             NULL,
             NULL,
                '<a class="details" onclick=''FcltMgr.openDetail("'
             || 'appl/prs/prs_perslid.asp?key='
             || h.prs_perslid_key
             || '")''>'
             || HTF.escape_sc (h.naam_full)
             || '</a>')
             html_naam,
          h.naam_full fclt_x_naam,
          a.prs_afdeling_naam6 afdeling,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/cnt/cnt_contract.asp?urole=bo&'
          || 'cnt_key='
          || h.cnt_contract_key
          || '")''>'
          || HTF.escape_sc (
                h.cnt_contract_nr || ' - ' || c.cnt_contract_omschrijving)
          || '</a>'
             html_contract,
          h.cnt_contract_nr fclt_x_contract,
          g.alg_gebouw_naam fclt_f_gebouw,
          v.alg_verdieping_code fclt_f_verdieping,
          DECODE (
             h.cnt_contract_key,
             NULL,
             NULL,
                '<a class="details" onclick=''FcltMgr.openDetail("'
             || 'appl/ALG/alg_ruimte.asp?key='
             || h.alg_ruimte_key
             || '")''>'
             || HTF.escape_sc (r.alg_ruimte_nr)
             || '</a>')
             html_kamer,
          r.alg_ruimte_nr fclt_x_kamer,
          sr.alg_srtruimte_omschrijving kamertype,
          h.omschrijving fclt_f_omschrijving, -- TODO; alleen kernwoord ("rent", "service costs") eruit pikken
          h.bedrag,
          DECODE (h.ismutatie, 1, 1, NULL) ismutatie,
          DECODE (h.naar_coda, NULL, NULL, 1) geexporteerd
     FROM nybu_huur_archief h,
          cnt_contract c,
          alg_ruimte r,
          alg_srtruimte sr,
          alg_verdieping v,
          alg_gebouw g,
          prs_perslid p,
          prs_v_aanwezigafdeling a
    WHERE     c.cnt_contract_key = h.cnt_contract_key
          AND r.alg_ruimte_key(+) = h.alg_ruimte_key
          AND sr.alg_srtruimte_key(+) = r.alg_srtruimte_key
          AND v.alg_verdieping_key(+) = r.alg_verdieping_key
          AND g.alg_gebouw_key(+) = v.alg_gebouw_key
          AND p.prs_perslid_key(+) = h.prs_perslid_key
          AND a.prs_afdeling_key(+) = p.prs_afdeling_key;


CREATE OR REPLACE VIEW nybu_v_rap_vb_coda_export
AS
     SELECT volgnr, regel
       FROM (SELECT 0 volgnr,
                    'Nummer;Adm.;Grootboek;Debiteur / Kostenplaats;Project;Bedrag;D/C;BTW;Regelomschrijving;Regeltype;Ext ref 1;Ext ref 2;Fact nummer'
                       regel
               FROM DUAL
             UNION ALL
             SELECT fac_rapport_volgnr volgnr, fac_rapport_regel regel
               FROM fac_rapport
              WHERE fac_rapport_node = 'T_HUUR_CODA')
   ORDER BY volgnr;

-- Actueel overzicht van huurcontracten studentenkamers, met te-factureren bedragen
-- NYBU#33043: contracten in voorbereiding hoeven niet aan een ruimte gekoppeld te zijn

CREATE OR REPLACE VIEW nybu_v_rap_huurcontracten
AS
   SELECT DISTINCT
          a.cnt_contract_nummer_intern hide_f_sort,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/cnt/cnt_contract.asp?urole=bo&'
          || 'cnt_key='
          || a.cnt_contract_key
          || '")''>'
          || HTF.escape_sc (a.cnt_contract_nummer_intern)
          || '</a>'
             html_nr,
          a.cnt_contract_nummer_intern fclt_x_nr,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/prs/prs_perslid.asp?key='
          || a.prs_perslid_key
          || '")''>'
          || HTF.escape_sc (a.naam)
          || '</a>'
             html_naam,
          a.codanr fclt_f_debiteur,
          a.naam fclt_x_naam,
          a.lichting,
          a.gebouw fclt_f_gebouw,
          a.verdieping fclt_f_verdieping,
          DECODE (
             a.alg_ruimte_key,
             NULL,
             '(Geen)',
                '<a class="details" onclick=''FcltMgr.openDetail("'
             || 'appl/ALG/alg_ruimte.asp?key='
             || a.alg_ruimte_key
             || '")''>'
             || HTF.escape_sc (a.kamer)
             || '</a>')
             html_kamer,
          COALESCE (a.kamer, '(Geen)') fclt_x_kamer,
          a.alg_srtruimte_omschrijving fclt_f_type,
          TO_CHAR (a.cnt_contract_looptijd_van, 'YYYY-MM-DD') van,
          TO_CHAR (a.cnt_contract_looptijd_tot, 'YYYY-MM-DD') tot,
          DECODE (b.prs_perslid_key, NULL, a.huur, a.huur / 2) kale_huur,
          DECODE (b.prs_perslid_key,
                  NULL, a.servicekosten,
                  a.servicekosten / 2)
             servicekosten,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/prs/prs_perslid.asp?key='
          || COALESCE (a.partner_key, b.prs_perslid_key)
          || '")''>'
          || HTF.escape_sc (
                COALESCE (a.partner_naam, b.prs_perslid_naam_full))
          || '</a>'
             html_partner,
          DECODE (b.prs_perslid_key,
                  NULL, DECODE (a.partner_key, NULL, 0, a.partnercharge),
                  a.partnercharge / 2)
             partnertoeslag,
          DECODE (b.prs_perslid_key, NULL, a.huur, a.huur / 2)
          + DECODE (b.prs_perslid_key,
                    NULL, a.servicekosten,
                    a.servicekosten / 2)
          + DECODE (b.prs_perslid_key,
                    NULL, DECODE (partner_key, NULL, 0, a.partnercharge),
                    a.partnercharge / 2)
             huurprijs
     FROM    nybu_v_huurcontracten_student a
          LEFT OUTER JOIN
             nybu_v_potential_roommates b
          ON     a.alg_ruimte_key IS NOT NULL
             AND b.cnt_contract_key != a.cnt_contract_key
             AND b.alg_ruimte_key = a.alg_ruimte_key
             AND b.cnt_contract_looptijd_van < a.cnt_contract_looptijd_tot
             AND b.cnt_contract_looptijd_tot > a.cnt_contract_looptijd_van
             AND b.cnt_contract_looptijd_tot > SYSDATE
    WHERE TRUNC (SYSDATE, 'MM') < a.cnt_contract_looptijd_tot;


--"Campuslijst: Studenten adressen huidig bestand: naam, lichting, kamernummer, telefoonnummerkamer en mobielnummer."
-- srtperslid "Student"             1537
-- alg_kenmerk "Telephone number"   1040
-- cnt_kenmerk "Tenant"               81
-- cnt_kenmerk "Student room"          1
--- NYBU#34285 alg_kenmerk "Telephone number"  1040 vervangen door  alg_kenmerk "Postal code"  1002

CREATE OR REPLACE VIEW NYBU_V_RAP_CAMPUSLIJST
(
   fclt_x_naam,
   html_naam,
   tussenvoegsel,
   voornaam,
   voorletters,
   fclt_f_lichting,
   html_contract,
   fclt_f_gebouw,
   fclt_f_verdieping,
   fclt_f_kamer,
   html_kamer,
   postcode,
   mobiel
)
AS
   SELECT pf.prs_perslid_naam_full fclt_f_naam,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/prs/prs_perslid.asp?prs_key='
          || p.prs_perslid_key
          || '")''>'
          || HTF.escape_sc (p.prs_perslid_naam)
          || '</a>',
          p.prs_perslid_tussenvoegsel,
          p.prs_perslid_voornaam,
          p.prs_perslid_voorletters,
          a.prs_afdeling_naam fclt_f_lichting,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/cnt/cnt_contract.asp?cnt_key='
          || c.cnt_contract_key
          || '")''>'
          || HTF.escape_sc(DECODE (
                              c.cnt_contract_versie,
                              '',
                              c.cnt_contract_nummer_intern,
                                 c.cnt_contract_nummer_intern
                              || '.'
                              || c.cnt_contract_versie))
          || '</a>',
          g.alg_gebouw_naam fclt_f_gebouw,
          rg.alg_verdieping_code fclt_f_verdieping,
          rg.alg_ruimte_nr fclt_f_kamer,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/alg/alg_ruimte.asp?key='
          || rg.alg_ruimte_key
          || '")''>'
          || HTF.escape_sc (rg.alg_ruimte_nr)
          || '</a>',
          --  kamtelnr.alg_onrgoedkenmerk_waarde telefoon_kamer,
          pc.alg_onrgoedkenmerk_waarde postcode,
          p.prs_perslid_mobiel mobiel
     FROM prs_perslid p,
          prs_v_perslid_fullnames pf,
          prs_v_aanwezigafdeling a,
          cnt_contract c,
          alg_v_ruimte_gegevens rg,
          alg_gebouw g,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1
                  AND cnt_kenmerkcontract_verwijder IS NULL) studkam,
          -- (SELECT *
          --    FROM alg_onrgoedkenmerk
          --  WHERE alg_kenmerk_key = 1040
          --       AND alg_onrgoedkenmerk_verwijder IS NULL) kamtelnr
          (SELECT *
             FROM alg_onrgoedkenmerk
            WHERE alg_kenmerk_key = 1002
                  AND alg_onrgoedkenmerk_verwijder IS NULL) pc
    WHERE     pf.prs_perslid_key = p.prs_perslid_key
          AND c.cnt_prs_perslid_key = p.prs_perslid_key
          AND a.prs_afdeling_key = p.prs_afdeling_key
          AND SYSDATE BETWEEN c.cnt_contract_looptijd_van
                          AND  c.cnt_contract_looptijd_tot
          AND studkam.cnt_contract_key = c.cnt_contract_key
          AND rg.alg_ruimte_key =
                fac.safe_to_number (studkam.cnt_kenmerkcontract_waarde)
          --AND kamtelnr.alg_onrgoed_key = rg.alg_ruimte_key
          AND pc.alg_onrgoed_key(+) = rg.alg_ruimte_key
          AND g.alg_gebouw_key = rg.alg_gebouw_key
          AND c.cnt_contract_verwijder IS NULL;

-- "Vertrekkerslijst incl. nieuw adres, borg, eventuele schade, te verrekenen huur (refund),
--  debiteurnummer en bankrekeningnummer"
-- Vertrekker = student met contract met "Contract status" = "Closed" en status = Actief (i.e. niet Gesloten)
-- naam, adres, contractnr, debnr, borgbedrag, damages, verrekening huur ("Refund" obv dagen eerder/later weg).
-- cnt_kenmerk "Tenant"                81
-- cnt_kenmerk "Student room"           1
-- cnt_kenmerk "Deposit amount"         2
-- cnt_kenmerk "Start call of wf"       3
-- cnt_kenmerk "Damages"               41 NYBU#51606 kenmerk komt te vervallen
-- cnt_kenmerk "Refund"               123 NYBU#51606 kenmerk komt te vervallen
-- cnt_kenmerk "Sleutel kwijt"		   1222 NYBU#51606 nieuw kenmerk
-- cnt_kenmerk "Factuur omschrijving"1201 NYBU#51606 nieuw kenmerk
-- cnt_kenmerk "Bedrag"    					 1202 NYBU#51606 nieuw kenmerk
-- cnt_kenmerk "Contract status"     141  (waarde 321 = "Closed")
-- cnt_kenmerk "Schoonmaak vertrek"  942
-- prs_kenmerk "Account number"     1029
-- prs_kenmerk "IBAN"               1040
-- prs_kenmerk "BIC"                1041
-- prs_kenmerk "Street"             1022
-- prs_kenmerk "Street (extra)"     1023
-- prs_kenmerk "ZIP/Postal code"    1024
-- prs_kenmerk "City"               1025
-- prs_kenmerk "Country"            1026
-- prs_kenmerk "CODA nr"            1000
-- prs_kenmerk "SAN nr"             1200
-- prs_kenmerk "OSIRIS nr"          1302
-- NYBU#30133 SAN-nummer overruled CODA-nummer (CON-nummer)
-- NYBU#32684 Ook kosten "Schoonmaak bij vertrek" tonen
-- NYBU#54060 OSIRIS-nummer overruled nu het SAN-nummer

CREATE OR REPLACE VIEW nybu_v_vertrekkers
(
   NUMMER,
   NAAM_FULL,
   PRS_PERSLID_NAAM,
   STUDENTNR,
   PERSLID_KEY,
   CONTRACT,
   CONTRACT_KEY,
   GEBOUW,
   VERDIEPING,
   KAMER,
   RUIMTE_KEY,
   EINDDATUM,
   ADRES,
   ADRES2,
   POSTCODE,
   PLAATS,
   lAND,
   BORG,
   WORKFLOW,
   SLEUTEL,
   SCHOONMAAK,
   FACT_OMSCHR,
   BEDRAG,
   DEBITEURNR,
   REKENINGNR,
   IBAN,
   BIC
)
AS
   SELECT ROW_NUMBER () OVER (ORDER BY pf.prs_perslid_naam_full) AS nummer,
          pf.prs_perslid_naam_full naam_full,
          p.prs_perslid_naam,
          p.prs_perslid_nr studentnr,
          p.prs_perslid_key,
          c.cnt_contract_nummer_intern contract,
          c.cnt_contract_key,
          g.alg_gebouw_naam gebouw,
          rg.alg_verdieping_code verdieping,
          rg.alg_ruimte_nr kamer,
          rg.alg_ruimte_key,
          TO_CHAR (c.cnt_contract_looptijd_tot, 'YYYY-MM-DD') einddatum,
          street1.prs_kenmerklink_waarde adres,
          street2.prs_kenmerklink_waarde adres2,
          zip.prs_kenmerklink_waarde postcode,
          city.prs_kenmerklink_waarde plaats,
          country.prs_kenmerklink_waarde land,
          fac.safe_to_number (borgbedr.cnt_kenmerkcontract_waarde) borg,
          fac.safe_to_number (workflow.cnt_kenmerkcontract_waarde) workflow,
          fac.safe_to_number (sleutel.cnt_kenmerkcontract_waarde) sleutel,
          fac.safe_to_number (schoonm.cnt_kenmerkcontract_waarde) schoonmaak,
          fact_omschr.cnt_kenmerkcontract_waarde,
          fac.safe_to_number (fact_bedrag.cnt_kenmerkcontract_waarde),
          COALESCE (sannr.prs_kenmerklink_waarde,
                    codanr.prs_kenmerklink_waarde)
             debiteurnr,
          reknr.prs_kenmerklink_waarde rekeningnr,
          iban.prs_kenmerklink_waarde iban,
          bic.prs_kenmerklink_waarde bic
     FROM prs_v_perslid_fullnames_all pf,
          prs_perslid p,
          cnt_contract c,
          alg_v_ruimte_gegevens rg,
          alg_gebouw g,
          (SELECT kc.*
             FROM cnt_kenmerkcontract kc, cnt_kenmerk k, cnt_srtkenmerk sk
            WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                  AND k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                  AND cnt_srtkenmerk_upper = 'CONTRACT STATUS'
                  AND kc.cnt_kenmerkcontract_verwijder IS NULL) cntstat,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1
                  AND cnt_kenmerkcontract_verwijder IS NULL) studkam,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 102
                  AND cnt_kenmerkcontract_verwijder IS NULL) verh_ruimte,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 2
                  AND cnt_kenmerkcontract_verwijder IS NULL) borgbedr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 3
                  AND cnt_kenmerkcontract_verwijder IS NULL) workflow,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1222
                  AND cnt_kenmerkcontract_verwijder IS NULL) sleutel,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1201
                  AND cnt_kenmerkcontract_verwijder IS NULL) fact_omschr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1202
                  AND cnt_kenmerkcontract_verwijder IS NULL) fact_bedrag,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 942
                  AND cnt_kenmerkcontract_verwijder IS NULL) schoonm,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1000
                  AND prs_kenmerklink_verwijder IS NULL) codanr,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1200
                  AND prs_kenmerklink_verwijder IS NULL) sannr,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1029
                  AND prs_kenmerklink_verwijder IS NULL) reknr,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1140
                  AND prs_kenmerklink_verwijder IS NULL) iban,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1141
                  AND prs_kenmerklink_verwijder IS NULL) bic,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1022
                  AND prs_kenmerklink_verwijder IS NULL) street1,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1023
                  AND prs_kenmerklink_verwijder IS NULL) street2,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1024
                  AND prs_kenmerklink_verwijder IS NULL) zip,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1025
                  AND prs_kenmerklink_verwijder IS NULL) city,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1026
                  AND prs_kenmerklink_verwijder IS NULL) country
    WHERE     fac.safe_to_number (cntstat.cnt_kenmerkcontract_waarde) = 321
          AND cntstat.cnt_contract_key = c.cnt_contract_key
          AND c.cnt_contract_status = 0
          AND c.cnt_contract_verwijder IS NULL
          AND NOT EXISTS
                (SELECT 1
                   FROM cnt_contract cc
                  WHERE cc.cnt_contract_key != c.cnt_contract_key
                        AND cc.cnt_contract_looptijd_tot >=
                              c.cnt_contract_looptijd_tot
                        AND cc.cnt_contract_status = 0
                        AND cc.cnt_contract_verwijder IS NULL
                        AND cc.cnt_prs_perslid_key = c.cnt_prs_perslid_key)
          AND borgbedr.cnt_contract_key(+) = c.cnt_contract_key
          AND workflow.cnt_contract_key(+) = c.cnt_contract_key
          AND sleutel.cnt_contract_key(+) = c.cnt_contract_key
          AND fact_omschr.cnt_contract_key(+) = c.cnt_contract_key
          AND fact_bedrag.cnt_contract_key(+) = c.cnt_contract_key
          AND schoonm.cnt_contract_key(+) = c.cnt_contract_key
          AND studkam.cnt_contract_key(+) = c.cnt_contract_key
          AND verh_ruimte.cnt_contract_key(+) = c.cnt_contract_key
          AND (rg.alg_ruimte_key =
                  fac.safe_to_number (studkam.cnt_kenmerkcontract_waarde)
               OR rg.alg_ruimte_key =
                    fac.safe_to_number (
                       verh_ruimte.cnt_kenmerkcontract_waarde))
          AND g.alg_gebouw_key = rg.alg_gebouw_key
          AND pf.prs_perslid_key = c.cnt_prs_perslid_key
          AND p.prs_perslid_key = pf.prs_perslid_key
          AND codanr.prs_link_key(+) = pf.prs_perslid_key
          AND sannr.prs_link_key(+) = pf.prs_perslid_key
          AND reknr.prs_link_key(+) = pf.prs_perslid_key
          AND iban.prs_link_key(+) = pf.prs_perslid_key
          AND bic.prs_link_key(+) = pf.prs_perslid_key
          AND street1.prs_link_key(+) = pf.prs_perslid_key
          AND street2.prs_link_key(+) = pf.prs_perslid_key
          AND zip.prs_link_key(+) = pf.prs_perslid_key
          AND city.prs_link_key(+) = pf.prs_perslid_key
          AND country.prs_link_key(+) = pf.prs_perslid_key;

-- Lijst met nieuwkomers, die nog borg moeten betalen
-- cnt_kenmerk "Deposit paid"         43
-- cnt_kenmerk "Contract status"     141  (waarde 221 = "In Preparation")
-- prs_kenmerk "SAN nr"             1200
-- NYBU#30133 SAN-nummer overruled CODA-nummer (CON-nummer)
-- NYBU#33043 contracten in voorbereiding hoeven niet aan een ruimte gekoppeld te zijn
-- NYBU#54060 OSIRIS-nummer overruled nu het SAN-nummer

CREATE OR REPLACE VIEW nybu_v_nieuwkomers
AS
   SELECT ROW_NUMBER () OVER (ORDER BY pf.prs_perslid_naam_full) AS nummer,
          pf.prs_perslid_naam_full naam_full,
          p.prs_perslid_naam,
          p.prs_perslid_nr studentnr,
          c.cnt_contract_nummer_intern contract,
          g.alg_gebouw_naam gebouw,
          rg.alg_verdieping_code verdieping,
          rg.alg_ruimte_nr kamer,
          TO_CHAR (c.cnt_contract_looptijd_van, 'YYYY-MM-DD') ingangsdatum,
          street1.prs_kenmerklink_waarde adres,
          street2.prs_kenmerklink_waarde adres2,
          zip.prs_kenmerklink_waarde postcode,
          city.prs_kenmerklink_waarde plaats,
          country.prs_kenmerklink_waarde land,
          fac.safe_to_number (borgbedr.cnt_kenmerkcontract_waarde) borg,
          COALESCE (
             osirisnr.prs_kenmerklink_waarde,
             COALESCE (sannr.prs_kenmerklink_waarde,
                       codanr.prs_kenmerklink_waarde))
             debiteurnr,
          reknr.prs_kenmerklink_waarde rekeningnr,
          iban.prs_kenmerklink_waarde iban,
          bic.prs_kenmerklink_waarde bic
     FROM prs_v_perslid_fullnames_all pf,
          prs_perslid p,
          cnt_contract c,
          alg_v_ruimte_gegevens rg,
          alg_gebouw g,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 141
                  AND cnt_kenmerkcontract_verwijder IS NULL) cntstat,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1
                  AND cnt_kenmerkcontract_verwijder IS NULL) studkam,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 2
                  AND cnt_kenmerkcontract_verwijder IS NULL) borgbedr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE     cnt_kenmerk_key = 43
                  AND cnt_kenmerkcontract_waarde != '0'
                  AND cnt_kenmerkcontract_verwijder IS NULL) borgbet,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1000
                  AND prs_kenmerklink_verwijder IS NULL) codanr,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1200
                  AND prs_kenmerklink_verwijder IS NULL) sannr,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1302
                  AND prs_kenmerklink_verwijder IS NULL) osirisnr,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1029
                  AND prs_kenmerklink_verwijder IS NULL) reknr,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1140
                  AND prs_kenmerklink_verwijder IS NULL) iban,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1141
                  AND prs_kenmerklink_verwijder IS NULL) bic,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1022
                  AND prs_kenmerklink_verwijder IS NULL) street1,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1023
                  AND prs_kenmerklink_verwijder IS NULL) street2,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1024
                  AND prs_kenmerklink_verwijder IS NULL) zip,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1025
                  AND prs_kenmerklink_verwijder IS NULL) city,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1026
                  AND prs_kenmerklink_verwijder IS NULL) country
    WHERE     fac.safe_to_number (cntstat.cnt_kenmerkcontract_waarde) = 221
          AND cntstat.cnt_contract_key = c.cnt_contract_key
          AND c.cnt_contract_status = 0
          AND NOT EXISTS
                (SELECT 1
                   FROM cnt_contract cc
                  WHERE     cc.cnt_contract_key != c.cnt_contract_key
                        AND cc.cnt_contract_verwijder IS NULL
                        AND cc.cnt_contract_status = 0
                        AND cc.cnt_prs_perslid_key = c.cnt_prs_perslid_key)
          AND borgbedr.cnt_contract_key(+) = c.cnt_contract_key
          AND borgbet.cnt_contract_key(+) = c.cnt_contract_key
          AND fac.safe_to_number (borgbet.cnt_kenmerkcontract_waarde) IS NULL
          AND studkam.cnt_contract_key(+) = c.cnt_contract_key
          AND rg.alg_ruimte_key(+) =
                fac.safe_to_number (studkam.cnt_kenmerkcontract_waarde)
          AND g.alg_gebouw_key(+) = rg.alg_gebouw_key
          AND pf.prs_perslid_key = c.cnt_prs_perslid_key
          AND p.prs_perslid_key = pf.prs_perslid_key
          AND codanr.prs_link_key(+) = pf.prs_perslid_key
          AND sannr.prs_link_key(+) = pf.prs_perslid_key
          AND osirisnr.prs_link_key(+) = pf.prs_perslid_key
          AND reknr.prs_link_key(+) = pf.prs_perslid_key
          AND iban.prs_link_key(+) = pf.prs_perslid_key
          AND bic.prs_link_key(+) = pf.prs_perslid_key
          AND street1.prs_link_key(+) = pf.prs_perslid_key
          AND street2.prs_link_key(+) = pf.prs_perslid_key
          AND zip.prs_link_key(+) = pf.prs_perslid_key
          AND city.prs_link_key(+) = pf.prs_perslid_key
          AND country.prs_link_key(+) = pf.prs_perslid_key
          AND c.cnt_contract_verwijder IS NULL;

-- Rapportage "HUUR: Vertrekkerslijst"

CREATE OR REPLACE VIEW nybu_v_rap_vertrekkers
(
   FCLT_F_NAAM,
   HTML_STUDENT,
   STUDENTNR,
   FCLT_F_CONTRACT,
   HTML_CONTRACT,
   GEBOUW,
   VERDIEPING,
   FCLT_F_KAMER,
   HTML_KAMER,
   EINDDATUM,
   ADRES,
   ADRES2,
   POSTCODE,
   PLAATS,
   LAND,
   BORG,
   HTML_WORKFLOW,
   SLEUTEL,
   SCHOONMAAK,
   FACT_OMSCHR,
   BEDRAG,
   DEBITEURNR,
   REKENINGNR,
   IBAN,
   BIC
)
AS
   SELECT naam_full fclt_f_naam,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/prs/prs_perslid.asp?'
          || 'prs_key='
          || perslid_key
          || '")''>'
          || HTF.escape_sc (naam_full)
          || '</a>',
          studentnr,
          contract fclt_f_contract,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/cnt/cnt_contract.asp?'
          || 'cnt_key='
          || contract_key
          || '")''>'
          || HTF.escape_sc (contract)
          || '</a>',
          gebouw,
          verdieping,
          kamer fclt_f_kamer,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/alg/alg_ruimte.asp?'
          || 'key='
          || ruimte_key
          || '")''>'
          || HTF.escape_sc (kamer)
          || '</a>',
          einddatum,
          adres,
          adres2,
          postcode,
          plaats,
          land,
          borg,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/mld/mld_show_melding.asp?urole=fo&'
          || 'mld_key='
          || workflow
          || '")''>'
          || HTF.escape_sc (workflow)
          || '</a>',
          sleutel,
          schoonmaak,
          fact_omschr,
          bedrag,
          debiteurnr,
          rekeningnr,
          iban,
          bic
     FROM nybu_v_vertrekkers;

-- Rapportage "HUUR: Nieuwkomers"

CREATE OR REPLACE VIEW nybu_v_rap_nieuwkomers
AS
   SELECT naam_full fclt_f_naam,
          studentnr,
          contract fclt_f_contract,
          gebouw,
          verdieping,
          COALESCE (kamer, '(Geen)') fclt_f_kamer,
          ingangsdatum,
          adres,
          adres2,
          postcode,
          plaats,
          land,
          borg,
          debiteurnr,
          rekeningnr,
          iban,
          bic
     FROM nybu_v_nieuwkomers;

-- CSV-export naar CODA, voor verrekening borgteruggaaf, schoonmaakkosten en schades etc

CREATE OR REPLACE VIEW nybu_v_rap_borg_terug
AS
   SELECT nummer,
          adm,
          grootbk,
          debiteurnr,
          proj,
          bedrag,
          dc,
          btw,
          oms omschrijving,
          regeltype,
          ref1,
          ref2
     FROM (  SELECT nummer,
                    0 idx,
                    '10' adm,
                    '13000' grootbk,
                    REPLACE (debiteurnr, 'CON', 'DC') debiteurnr,
                    NULL proj,
                    SUM(  COALESCE (borg, 0)
                        - COALESCE (sleutel, 0)
                        - COALESCE (schoonmaak, 0)
                        - COALESCE (bedrag, 0))
                       bedrag,
                    CASE
                       WHEN SUM(  COALESCE (borg, 0)
                                - COALESCE (sleutel, 0)
                                - COALESCE (schoonmaak, 0)
                                - COALESCE (bedrag, 0)) < 0
                       THEN
                          'D'
                       ELSE
                          'C'
                    END
                       dc,
                    NULL btw,
                    'Deposit ' || prs_perslid_naam oms,
                    'Summary' regeltype,
                    'K91200' ref1,
                    'P991210' ref2
               FROM nybu_v_vertrekkers
           GROUP BY nummer, debiteurnr, prs_perslid_naam
           UNION ALL
           SELECT nummer,
                  1 idx,
                  '12' adm,
                  '19140' grootbk,
                  'K91200' debiteurnr,
                  'P991210' proj,
                  borg bedrag,
                  CASE WHEN borg > 0 THEN 'D' ELSE 'C' END dc,
                  'VV' btw,
                  'Deposit ' || prs_perslid_naam oms,
                  'Analysis' regeltype,
                  NULL ref1,
                  NULL ref2
             FROM nybu_v_vertrekkers
            WHERE borg IS NOT NULL AND borg > 0
           UNION ALL
           SELECT nummer,
                  2 idx,
                  '12' adm,
                  '42490' grootbk,
                  'K91200' debiteurnr,
                  'P991210' proj,
                  sleutel bedrag,
                  CASE WHEN sleutel > 0 THEN 'C' ELSE 'D' END dc,
                  'VH21' btw,
                  'Lost key '
                  || DECODE (workflow,
                             NULL, prs_perslid_naam,
                             '(room check N' || TO_CHAR (workflow) || ')')
                     oms,
                  'Analysis' regeltype,
                  NULL ref1,
                  NULL ref2
             FROM nybu_v_vertrekkers
            WHERE sleutel IS NOT NULL AND sleutel > 0
           UNION ALL
           SELECT nummer,
                  3 idx,
                  '12' adm,
                  '42490' grootbk,
                  'K91200' debiteurnr,
                  'P991210' proj,
                  bedrag,
                  CASE WHEN bedrag > 0 THEN 'C' ELSE 'D' END dc,
                  'VH21' btw,
                  fact_omschr || ' ' || prs_perslid_naam,
                  'Analysis' regeltype,
                  NULL ref1,
                  NULL ref2
             FROM nybu_v_vertrekkers
            WHERE bedrag IS NOT NULL
           UNION ALL
           SELECT nummer,
                  4 idx,
                  '12' adm,
                  '48026' grootbk,
                  'K91200' debiteurnr,
                  'P991210' proj,
                  schoonmaak bedrag,
                  CASE WHEN schoonmaak > 0 THEN 'C' ELSE 'D' END dc,
                  'VH21' btw,
                  'Cleaning ' || prs_perslid_naam oms,
                  'Analysis' regeltype,
                  NULL ref1,
                  NULL ref2
             FROM nybu_v_vertrekkers
            WHERE schoonmaak IS NOT NULL AND schoonmaak > 0
           ORDER BY nummer, idx);


-- CSV-export naar CODA, voor betaling van borg door nieuwe huurders

CREATE OR REPLACE VIEW nybu_v_rap_borg_betalen
AS
     SELECT nummer,
            '10' adm,
            '13000' grootbk,
            REPLACE (debiteurnr, 'CON', 'DC') debiteurnr,
            NULL proj,
            SUM (borg) bedrag,
            'D' dc,
            NULL btw,
            'Deposit ' || prs_perslid_naam omschrijving,
            'Summary' regeltype,
            'K91200' ref1,
            'P991210' ref2
       FROM nybu_v_nieuwkomers
   GROUP BY nummer, debiteurnr, prs_perslid_naam
   UNION ALL
   SELECT nummer,
          '12' adm,
          '19140' grootbk,
          'K91200' debiteurnr,
          'P991210' proj,
          borg bedrag,
          'C' dc,
          'VV' btw,
          'Deposit ' || prs_perslid_naam omschrijving,
          'Analysis' regeltype,
          NULL ref1,
          NULL ref2
     FROM nybu_v_nieuwkomers
   ORDER BY nummer, regeltype DESC;

-- Basisview voor gestylede rapportages voor afdrukken contract en welkomstbrief
-- Veld fclt_f_tonen biedt de mogelijkheid om alleen de brief, alleen het contract, of beide af te drukken
-- Middels het bedrijf van het contract wordt in de rapportage bepaald of het om een student of een
-- medewerker gaat (voor beide zijn verschillende templates)
-- prs_kenmerk 1022     Street
-- prs_kenmerk 1023     Street (extra)
-- prs_kenmerk 1024     ZIP/Postal code
-- prs_kenmerk 1025     City
-- prs_kenmerk 1200     SAN number
-- prs_kenmerk 1302     OSIRIS number
-- cnt_kenmerk   63     Budget nr
-- cnt_kenmerk   64     Bill rent to
-- cnt_kenmerk   65     Bill service costs to
-- cnt_kenmerk   66     Bill telephone to  NYBU#51606 kenmerk komt te vervallen
-- cnt_kenmerk  681     Partnercharge to budgetnr

CREATE OR REPLACE VIEW nybu_v_contract_bon
AS
   SELECT a.*,
          DECODE (b.prs_perslid_key, NULL, a.huur, a.huur / 2) kale_huur,
          DECODE (b.prs_perslid_key, NULL, a.servkost, a.servkost / 2)
             servicekosten,
          DECODE (b.prs_perslid_key,
                  NULL, a.telefooncharge,
                  a.telefooncharge / 2)
             telkosten,
          DECODE (b.prs_perslid_key,
                  NULL, DECODE (a.partner_key, NULL, 0, a.partnercharge),
                  a.partnercharge / 2)
             partnertoeslag,
          b.roommate_naam,
          b.rm_straat1,
          b.rm_straat2,
          b.rm_postcode,
          b.rm_plaats
     FROM    (SELECT DECODE (
                        c.cnt_contract_versie,
                        NULL,
                        c.cnt_contract_nummer_intern,
                           c.cnt_contract_nummer_intern
                        || '.'
                        || c.cnt_contract_versie)
                        fclt_f_contractnr,
                     c.prs_bedrijf_key,
                     p.prs_perslid_key,
                     c.naam fclt_f_naam,
                     p.prs_perslid_nr fclt_f_studentnr,
                     p.prs_perslid_voornaam voornaam,
                     straat1.prs_kenmerklink_waarde straat1,
                     straat2.prs_kenmerklink_waarde straat2,
                     pc.prs_kenmerklink_waarde postcode,
                     plaats.prs_kenmerklink_waarde plaats,
                     san.prs_kenmerklink_waarde san_nr,
                     osiris.prs_kenmerklink_waarde osiris_nr,
                     a.prs_afdeling_omschrijving fclt_f_opleiding,
                     r.alg_ruimte_key,
                     r.alg_ruimte_nr,
                     c.alg_srtruimte_omschrijving,
                     v.alg_verdieping_volgnr,
                     g.alg_gebouw_naam,
                     pc_kamer.alg_onrgoedkenmerk_waarde postcode_kamer,
                     telnr.alg_onrgoedkenmerk_waarde telnr,
                     c.cnt_contract_looptijd_van van,
                     c.cnt_contract_looptijd_tot tot,
                     TO_CHAR (c.cnt_contract_looptijd_van, 'DD-MM-YYYY')
                        looptijd_van,
                     TO_CHAR (c.cnt_contract_looptijd_tot, 'DD-MM-YYYY')
                        looptijd_tot,
                     TO_CHAR (SYSDATE, 'DD-MM-YYYY') printdatum,
                     DECODE (rent.cnt_kenmerkcontract_waarde,
                             '442', k.prs_kostenplaats_nr,
                             '443', 'salaris',
                             NULL)
                        rent_to,
                     DECODE (serv.cnt_kenmerkcontract_waarde,
                             '442', k.prs_kostenplaats_nr,
                             '443', 'salaris',
                             NULL)
                        serv_to,
                     ---DECODE (tel.cnt_kenmerkcontract_waarde,
                     ---        '442', k.prs_kostenplaats_nr,
                     ---        '443', 'salaris',
                     ---        NULL)
                     '' tel_to,
                     DECODE (partnerch.cnt_kenmerkcontract_waarde,
                             '442', k.prs_kostenplaats_nr,
                             '443', 'salaris',
                             NULL)
                        partnerch_to,
                     c.partner_key,
                     c.huur,
                     c.servicekosten servkost,
                     c.telefooncharge,
                     c.partnercharge,
                     c.borg_tebetalen + c.borg_betaald borg,
                     PRINT.uitdraai fclt_f_tonen
                FROM nybu_v_huurcontracten_student c,
                     prs_perslid p,
                     prs_afdeling a,
                     alg_ruimte r,
                     alg_verdieping v,
                     alg_gebouw g,
                     (SELECT *
                        FROM alg_onrgoedkenmerk
                       WHERE     alg_onrgoedkenmerk_verwijder IS NULL
                             AND alg_onrgoed_niveau = 'R'
                             AND alg_kenmerk_key = 1002) pc_kamer,
                     (SELECT *
                        FROM alg_onrgoedkenmerk
                       WHERE     alg_onrgoedkenmerk_verwijder IS NULL
                             AND alg_onrgoed_niveau = 'R'
                             AND alg_kenmerk_key = 1040) telnr,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1022) straat1,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1023) straat2,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1024) pc,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1025) plaats,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1200) san,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1302) osiris,
                     (SELECT *
                        FROM cnt_kenmerkcontract
                       WHERE cnt_kenmerk_key = 63
                             AND cnt_kenmerkcontract_verwijder IS NULL)
                     budget,
                     prs_kostenplaats k,
                     (SELECT *
                        FROM cnt_kenmerkcontract
                       WHERE cnt_kenmerk_key = 64
                             AND cnt_kenmerkcontract_verwijder IS NULL) rent,
                     (SELECT *
                        FROM cnt_kenmerkcontract
                       WHERE cnt_kenmerk_key = 65
                             AND cnt_kenmerkcontract_verwijder IS NULL) serv,
                     ---(SELECT *
                     ---   FROM cnt_kenmerkcontract
                     ---  WHERE cnt_kenmerk_key = 66
                     ---        AND cnt_kenmerkcontract_verwijder IS NULL) tel,
                     (SELECT *
                        FROM cnt_kenmerkcontract
                       WHERE cnt_kenmerk_key = 681
                             AND cnt_kenmerkcontract_verwijder IS NULL)
                     partnerch,
                     (SELECT 'Bevestigingsbrief' uitdraai FROM DUAL
                      UNION ALL
                      SELECT 'Contract' uitdraai FROM DUAL
                      UNION ALL
                      SELECT 'Contract EN' FROM DUAL) PRINT
               WHERE     p.prs_perslid_key = c.prs_perslid_key
                     AND SYSDATE < c.cnt_contract_looptijd_tot
                     AND r.alg_ruimte_key = c.alg_ruimte_key
                     AND v.alg_verdieping_key = r.alg_verdieping_key
                     AND g.alg_gebouw_key = v.alg_gebouw_key
                     AND pc_kamer.alg_onrgoed_key(+) = r.alg_ruimte_key
                     AND a.prs_afdeling_key = p.prs_afdeling_key
                     AND straat1.prs_link_key(+) = p.prs_perslid_key
                     AND straat2.prs_link_key(+) = p.prs_perslid_key
                     AND pc.prs_link_key(+) = p.prs_perslid_key
                     AND plaats.prs_link_key(+) = p.prs_perslid_key
                     AND san.prs_link_key(+) = p.prs_perslid_key
                     AND osiris.prs_link_key(+) = p.prs_perslid_key
                     AND telnr.alg_onrgoed_key(+) = r.alg_ruimte_key
                     AND budget.cnt_contract_key(+) = c.cnt_contract_key
                     AND k.prs_kostenplaats_key(+) =
                           fac.safe_to_number (
                              budget.cnt_kenmerkcontract_waarde)
                     AND rent.cnt_contract_key(+) = c.cnt_contract_key
                     AND serv.cnt_contract_key(+) = c.cnt_contract_key
                     ---AND tel.cnt_contract_key(+) = c.cnt_contract_key
                     AND partnerch.cnt_contract_key(+) = c.cnt_contract_key
                     AND COALESCE (cnt_contract_versie, 'apekool') =
                           COALESCE (
                              (SELECT MAX (cnt_contract_versie)
                                 FROM cnt_contract
                                WHERE cnt_contract_nummer_intern =
                                         c.cnt_contract_nummer_intern
                                      AND cnt_contract_verwijder IS NULL),
                              'apekool')) a
          LEFT OUTER JOIN
             (SELECT pf.prs_perslid_key,
                     fac.safe_to_number (sk.cnt_kenmerkcontract_waarde)
                        alg_ruimte_key,
                     pf.prs_perslid_naam_full roommate_naam,
                     straat1.prs_kenmerklink_waarde rm_straat1,
                     straat2.prs_kenmerklink_waarde rm_straat2,
                     pc.prs_kenmerklink_waarde rm_postcode,
                     plaats.prs_kenmerklink_waarde rm_plaats,
                     c.cnt_contract_looptijd_van van,
                     c.cnt_contract_looptijd_tot tot
                FROM cnt_contract c,
                     prs_v_perslid_fullnames pf,
                     (SELECT *
                        FROM cnt_kenmerkcontract
                       WHERE cnt_kenmerk_key = 1
                             AND cnt_kenmerkcontract_verwijder IS NULL) sk,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1022) straat1,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1023) straat2,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1024) pc,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1025) plaats
               WHERE     c.ins_discipline_key = 55
                     AND c.cnt_contract_looptijd_tot > SYSDATE
                     AND c.cnt_contract_verwijder IS NULL
                     AND pf.prs_perslid_key = c.cnt_prs_perslid_key
                     AND sk.cnt_contract_key = c.cnt_contract_key
                     AND straat1.prs_link_key(+) = pf.prs_perslid_key
                     AND straat2.prs_link_key(+) = pf.prs_perslid_key
                     AND pc.prs_link_key(+) = pf.prs_perslid_key
                     AND plaats.prs_link_key(+) = pf.prs_perslid_key) b
          ON     a.alg_ruimte_key = b.alg_ruimte_key
             AND a.prs_perslid_key != b.prs_perslid_key
             AND b.van < a.tot
             AND b.tot > a.van;


-- Rapportageview voor afdrukken huurovereenkomst + bevestigingsbrief STUDENT

CREATE OR REPLACE VIEW nybu_v_rap_contract_student
AS
   SELECT *
     FROM nybu_v_contract_bon
    WHERE prs_bedrijf_key = 1643;

-- Rapportageview voor afdrukken huurovereenkomst + bevestigingsbrief MEDEWERKER
-- (voor tijdelijke verhuur studentenkamers aan medewerkers/stagiairs)

CREATE OR REPLACE VIEW nybu_v_rap_contract_medewerker
AS
   SELECT *
     FROM nybu_v_contract_bon
    WHERE prs_bedrijf_key != 1643;

-- Gestylede rapportage voor genereren vertrekbrief, o.b.v. workflowmelding en huurcontract
-- Filtering:
--  * stdmelding 941 ("Request roomcheck (Workflow)")
--  * alleen workflows zonder afgewezen meldingen.
--  * met gekozen kamernummer gekoppeld aan campuscontract
--  * melding binnen looptijd contract
--  * alleen actieve (niet-gesloten) contracten
-- mld_kenmerk        502  Date Roomcheck
-- mld_kenmerk        503  Time Roomcheck
-- cnt_kenmerk          1  Student room
-- cnt_kenmerk         81  Tenant
-- cnt_kenmerk        161  Vertrekdatum
-- alg_kenmerk       1002  Postal code
-- prs_kenmerk       1022  Street
-- prs_kenmerk       1023  Street (extra)
-- prs_kenmerk       1024  ZIP/Postal code
-- prs_kenmerk       1025  City
-- prs_kenmerk       1026  Country
-- prs_kenmerk       1180  Prive emailadres
-- prs_kenmerk       1140  IBAN

CREATE OR REPLACE VIEW nybu_v_rap_vertrekbrief
AS
     SELECT m.mld_melding_key,
            TO_CHAR (m.mld_melding_key) || ' - ' || pf.prs_perslid_naam_full
               fclt_f_melding,
            pf.prs_perslid_naam_full fclt_f_naam,
            r.alg_ruimte_nr fclt_f_kamer,
            TRUNC (m.mld_melding_datum) datum,
            chkdatum.mld_kenmerkmelding_waarde chkdatum,
            chktijd.mld_kenmerkmelding_waarde chktijd,
            c.cnt_contract_key,
            DECODE (
               c.cnt_contract_versie,
               NULL,
               c.cnt_contract_nummer_intern,
               c.cnt_contract_nummer_intern || '.' || c.cnt_contract_versie)
               fclt_f_contract,
            TO_CHAR (c.cnt_contract_looptijd_tot, 'DD-MM-YYYY') einddatum,
            r.alg_ruimte_key,
            r.alg_ruimte_nr kamer,
            TO_CHAR (
               fac.safe_to_date (vertrekdatum.cnt_kenmerkcontract_waarde,
                                 'DD-MM-YYYY'),
               'DD-MM-YYYY')
               vertrekdatum,
            pc.alg_onrgoedkenmerk_waarde postcode,
            p.prs_perslid_key,
            p.prs_perslid_naam naam,
            p.prs_perslid_tussenvoegsel tussenvoegsel,
            p.prs_perslid_voorletters voorletters,
            p.prs_perslid_voornaam voornaam,
            p.prs_perslid_mobiel mobiel,
            p.prs_perslid_telefoonnr telefoonnr,
            adres.prs_kenmerklink_waarde adres,
            adres2.prs_kenmerklink_waarde extraadres,
            zip.prs_kenmerklink_waarde zip,
            plaats.prs_kenmerklink_waarde plaats,
            land.prs_kenmerklink_waarde land,
            email.prs_kenmerklink_waarde email,
            iban.prs_kenmerklink_waarde iban
       FROM mld_melding m,
            (SELECT *
               FROM mld_kenmerkmelding
              WHERE mld_kenmerkmelding_verwijder IS NULL
                    AND mld_kenmerk_key = 502) chkdatum,
            (SELECT *
               FROM mld_kenmerkmelding
              WHERE mld_kenmerkmelding_verwijder IS NULL
                    AND mld_kenmerk_key = 503) chktijd,
            (SELECT *
               FROM cnt_kenmerkcontract
              WHERE cnt_kenmerkcontract_verwijder IS NULL
                    AND cnt_kenmerk_key = 1) kamer,
            (SELECT *
               FROM cnt_kenmerkcontract
              WHERE cnt_kenmerkcontract_verwijder IS NULL
                    AND cnt_kenmerk_key = 161) vertrekdatum,
            (SELECT *
               FROM cnt_contract c
              WHERE cnt_contract_verwijder IS NULL
                    AND COALESCE (cnt_contract_versie, '0') =
                          (SELECT COALESCE (MAX (cnt_contract_versie), '0')
                             FROM cnt_contract
                            WHERE cnt_contract_verwijder IS NULL
                                  AND cnt_contract_nummer_intern =
                                        c.cnt_contract_nummer_intern)) c,
            alg_ruimte r,
            (SELECT *
               FROM alg_onrgoedkenmerk
              WHERE alg_onrgoedkenmerk_verwijder IS NULL
                    AND alg_kenmerk_key = 1002) pc,
            prs_perslid p,
            prs_v_perslid_fullnames pf,
            (SELECT *
               FROM prs_kenmerklink
              WHERE prs_kenmerklink_verwijder IS NULL
                    AND prs_kenmerk_key = 1022) adres,
            (SELECT *
               FROM prs_kenmerklink
              WHERE prs_kenmerklink_verwijder IS NULL
                    AND prs_kenmerk_key = 1023) adres2,
            (SELECT *
               FROM prs_kenmerklink
              WHERE prs_kenmerklink_verwijder IS NULL
                    AND prs_kenmerk_key = 1024) zip,
            (SELECT *
               FROM prs_kenmerklink
              WHERE prs_kenmerklink_verwijder IS NULL
                    AND prs_kenmerk_key = 1025) plaats,
            (SELECT *
               FROM prs_kenmerklink
              WHERE prs_kenmerklink_verwijder IS NULL
                    AND prs_kenmerk_key = 1026) land,
            (SELECT *
               FROM prs_kenmerklink
              WHERE prs_kenmerklink_verwijder IS NULL
                    AND prs_kenmerk_key = 1180) email,
            (SELECT *
               FROM prs_kenmerklink
              WHERE prs_kenmerklink_verwijder IS NULL
                    AND prs_kenmerk_key = 1140) iban
      WHERE m.mld_stdmelding_key = 941
            AND m.mld_melding_status IN (0, 2, 3, 4, 7, 99)
            AND NOT EXISTS
                  (SELECT mld_melding_key
                     FROM mld_melding
                    WHERE mld_melding_status = 1
                          AND mld_melding_start_key = m.mld_melding_key)
            AND c.cnt_contract_status = 0
            AND c.cnt_contract_key = kamer.cnt_contract_key
            AND fac.safe_to_number (kamer.cnt_kenmerkcontract_waarde(+)) =
                  m.mld_alg_onroerendgoed_keys
            AND c.cnt_contract_key = vertrekdatum.cnt_contract_key(+)
            AND chkdatum.mld_melding_key(+) = m.mld_melding_key
            AND chktijd.mld_melding_key(+) = m.mld_melding_key
            AND r.alg_ruimte_key(+) = m.mld_alg_onroerendgoed_keys
            AND pc.alg_onrgoed_key(+) = r.alg_ruimte_key
            AND p.prs_perslid_key(+) = c.cnt_prs_perslid_key
            AND pf.prs_perslid_key(+) = p.prs_perslid_key
            AND adres.prs_link_key(+) = p.prs_perslid_key
            AND adres2.prs_link_key(+) = p.prs_perslid_key
            AND zip.prs_link_key(+) = p.prs_perslid_key
            AND plaats.prs_link_key(+) = p.prs_perslid_key
            AND land.prs_link_key(+) = p.prs_perslid_key
            AND email.prs_link_key(+) = p.prs_perslid_key
            AND iban.prs_link_key(+) = p.prs_perslid_key
   ORDER BY m.mld_melding_key, c.cnt_contract_key, p.prs_perslid_naam;

-- Voorbeeldrapportje CODA-export huurregistratie

CREATE OR REPLACE VIEW nybu_v_rap_vb_coda_export
AS
     SELECT volgnr hide_f_volgnr, regel
       FROM (SELECT 0 volgnr,
                    'Nummer;Adm.;Grootboek;Debiteur / Kostenplaats;Project;Bedrag;D/C;BTW;Regelomschrijving;Regeltype;Ext ref 1;Ext ref 2;Fact nummer'
                       regel
               FROM DUAL
             UNION ALL
             SELECT fac_rapport_volgnr volgnr, fac_rapport_regel regel
               FROM fac_rapport
              WHERE fac_rapport_node = 'HUUR_CODA')
   ORDER BY volgnr;

-- Rapportage van logging huurexports

CREATE OR REPLACE VIEW nybu_v_rap_huur_exports
AS
   SELECT imp_log_applicatie fclt_f_export,
          TO_CHAR (imp_log_datum, 'YYYY-MM-DD HH24:MI') fclt_f_datum,
          imp_log_status fclt_f_status,
          imp_log_omschrijving omschrijving,
          imp_log_hint hint
     FROM imp_log
    WHERE imp_log_applicatie IN ('T_HUUR_CODA', 'HUUR_CODA', 'HUUR_MUTATIES');


------- WERKPLEKDOORBELASTING --------------------------------------------------
-- View en rapportages werkplekdoorbelasting
-- Personen kunnen voor meerdere afdelingen (kostenplaatsen) werken.
-- Deze afdelingen en FTE per afdeling zijn in flexkenmerken bij personen geregistreerd
-- Kosten per werkplek per afdeling per persoon = FTE * m2 * tarief ruimtesoort

CREATE OR REPLACE VIEW nybu_v_werkplekken
AS
   SELECT wpg.*,
          COALESCE (fac.safe_to_number (fte.prs_kenmerklink_waarde), 1) fte
     FROM    (SELECT p.prs_perslid_key,
                     p.prs_perslid_nr,
                     pf.prs_perslid_naam_full,
                     kl.prs_kenmerk_key,
                     rb.bez_totaal,
                       wg.alg_ruimte_bruto_vloeropp
                     * pw.prs_perslidwerkplek_bezetting
                     / rb.bez_totaal
                        wpopp,
                     wg.alg_ruimte_bruto_vloeropp,
                     wg.alg_gebouw_upper,
                     wg.alg_verdieping_code,
                     wg.alg_ruimte_key,
                     wg.alg_ruimte_nr,
                     wg.alg_ruimte_aanduiding,
                     sr.alg_srtruimte_prijs,
                     pw.prs_perslidwerkplek_bezetting,
                     kpn.prs_kostenplaats_nr,
                     pf2.prs_perslid_naam_full budgethouder,
                     kpg.prs_kostenplaatsgrp_oms,
                     sr.alg_srtruimte_prijs * wg.alg_ruimte_bruto_vloeropp
                        ruimte_prijs,
                       sr.alg_srtruimte_prijs
                     * wg.alg_ruimte_bruto_vloeropp
                     * pw.prs_perslidwerkplek_bezetting
                     / rb.bez_totaal
                        wp_prijs
                FROM prs_perslid p,
                     prs_v_perslid_fullnames pf,
                     prs_v_perslid_fullnames pf2,
                     prs_perslidwerkplek pw,
                     prs_v_werkplek_gegevens wg,
                     (  SELECT alg_ruimte_key,
                               SUM (prs_perslidwerkplek_bezetting) bez_totaal
                          FROM prs_v_werkplek_gegevens wg,
                               prs_perslidwerkplek pw
                         WHERE pw.prs_werkplek_key = wg.prs_werkplek_key
                      GROUP BY alg_ruimte_key, alg_ruimte_bruto_vloeropp) rb,
                     alg_ruimte r,
                     alg_srtruimte sr,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE prs_kenmerk_key IN (1061, 1063, 1065, 1067)
                             AND prs_kenmerklink_verwijder IS NULL) kl,
                     prs_kostenplaats kpn,
                     prs_kostenplaatsgrp kpg
               WHERE     p.prs_perslid_naam NOT LIKE 'INACTIEF%'
                     AND pf.prs_perslid_key = p.prs_perslid_key
                     AND kpn.prs_perslid_key = pf2.prs_perslid_key(+)
                     AND kpn.prs_kostenplaatsgrp_key =
                           kpg.prs_kostenplaatsgrp_key(+)
                     AND pw.prs_perslid_key(+) = p.prs_perslid_key
                     AND wg.prs_werkplek_key(+) = pw.prs_werkplek_key
                     AND rb.alg_ruimte_key(+) = wg.alg_ruimte_key
                     AND r.alg_ruimte_key(+) = wg.alg_ruimte_key
                     AND r.alg_srtruimte_key NOT IN
                              (56, 43, 58, 39, 121, 141, 101, 201)
                     AND sr.alg_srtruimte_key(+) = r.alg_srtruimte_key
                     AND kl.prs_link_key(+) = p.prs_perslid_key
                     AND kpn.prs_kostenplaats_key(+) =
                           fac.safe_to_number (kl.prs_kenmerklink_waarde))
             wpg
          LEFT OUTER JOIN
             (SELECT * FROM prs_kenmerklink) fte
          ON fte.prs_link_key = wpg.prs_perslid_key
             AND fte.prs_kenmerk_key =
                   DECODE (wpg.prs_kenmerk_key,
                           1061, 1062,
                           1063, 1064,
                           1065, 1066,
                           1067, 1068);

CREATE OR REPLACE VIEW nybu_v_rap_werkplekken
AS
   SELECT prs_perslid_nr || prs_kostenplaats_nr hide_f_sort,
          prs_perslid_nr fclt_f_personeelsnummer,
          prs_perslid_naam_full fclt_x_naam,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/prs/prs_perslid.asp?prs_key='
          || w1.prs_perslid_key
          || '")''>'
          || HTF.escape_sc (prs_perslid_naam_full)
          || '</a>'
             html_naam,
          prs_kostenplaats_nr fclt_f_kostenplaats,
          budgethouder fclt_f_budgethouder,
          prs_kostenplaatsgrp_oms fclt_f_kostenplaatsgroep,
          w1.alg_gebouw_upper fclt_f_gebouw,
          alg_verdieping_code fclt_f_verdieping,
          alg_ruimte_aanduiding fclt_x_ruimte,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/ALG/alg_ruimte.asp?key='
          || alg_ruimte_key
          || '")''>'
          || HTF.escape_sc (alg_ruimte_nr)
          || '</a>'
             html_ruimte,
          alg_ruimte_bruto_vloeropp ruimte_m2,
          prs_perslidwerkplek_bezetting BEZETTINGSPERC,
          ROUND (DECODE (totaal, NULL, wpopp * fte, wpopp * (fte / totaal)),
                 2)
             m2_kostenplaats,
          wp_prijs prijs_werkplek,
          COALESCE (totaal, 1) fte_totaal,
          fte fte_kostenplaats,
          alg_srtruimte_prijs prijs_pm2_pmaand,
          ROUND (
             DECODE (totaal, NULL, wp_prijs * fte, wp_prijs * (fte / totaal)),
             2)
             prijs
     FROM nybu_v_werkplekken w1,
          alg_gebouw g,
          (  SELECT prs_link_key prs_perslid_key,
                    SUM(COALESCE (fac.safe_to_number (prs_kenmerklink_waarde),
                                  0))
                       totaal
               FROM prs_kenmerklink
              WHERE     prs_kenmerk_key IN (1062, 1064, 1066, 1068)
                    AND prs_kenmerklink_waarde IS NOT NULL
                    AND fac.safe_to_number (prs_kenmerklink_waarde) > 0
           GROUP BY prs_link_key) w2
    WHERE     w1.prs_perslid_key = w2.prs_perslid_key(+)
          AND g.alg_locatie_key = 29 -- locatie 29 = NBU, Nyenrode BU Breukelen
          AND w1.alg_gebouw_upper = UPPER (g.alg_gebouw_code);

CREATE OR REPLACE VIEW nybu_v_rap_werkplekken_totaal
AS
     SELECT fclt_f_kostenplaats kostenplaats, ROUND (SUM (prijs), 2) bedrag
       FROM nybu_v_rap_werkplekken
   GROUP BY fclt_f_kostenplaats;

------- IMPORT DEELTIJDPERCENTAGES MEDEWERKERS ---------------------------------

CREATE OR REPLACE PROCEDURE nybu_import_kpnprs (p_import_key IN NUMBER)
IS
   c_fielddelimitor          VARCHAR2 (1) := ';';
   c_headerline VARCHAR (1000)
         := 'Pers.nr.;Kostenpl;Naam samengesteld;Kostendr;Oms functie';
   v_newline                 VARCHAR2 (1000);                    -- Input line
   v_header                  VARCHAR2 (1000);
   v_aanduiding              VARCHAR2 (200);
   v_errorhint               VARCHAR2 (1000);
   v_errormsg                VARCHAR2 (1000);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   header_is_valid           NUMBER := 0;
   v_ongeldig                NUMBER (1);
   v_count_tot               NUMBER (10);
   v_count_import            NUMBER (10);
   v_count                   NUMBER;
   -- De importvelden:
   v_prs_perslid_nr          VARCHAR2 (256);
   v_prs_kostenplaats_nr     VARCHAR2 (256);
   v_prs_perslid_naamfull    VARCHAR2 (256);
   v_prs_project_nr          VARCHAR2 (256);
   v_prs_srtperslid_oms      VARCHAR2 (256);
   v_fte                     VARCHAR2 (256);
   v_fte_num                 NUMBER (6, 4);

   v_last_perslid_nr         VARCHAR2 (256);
   v_last_perslid_naamfull   VARCHAR2 (256);
   v_dummy                   VARCHAR2 (256);
   v_regel                   NUMBER (2);

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

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;
   v_regel := 1;

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

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_perslid_nr); -- Pers.nr.
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_kostenplaats_nr);                 -- Kostenpl
         fac.imp_getfield (v_newline,
                           c_fielddelimitor,
                           v_prs_perslid_naamfull);       -- Naam samengesteld
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_project_nr); -- Kostendr
         fac.imp_getfield (v_newline, c_fielddelimitor, v_prs_srtperslid_oms); -- Oms functie
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dummy);      -- %FTE
         fac.imp_getfield (v_newline, c_fielddelimitor, v_fte); -- % LV  *  %FTE

         v_aanduiding :=
               '['
            || v_prs_perslid_nr
            || '|'
            || v_prs_perslid_naamfull
            || '|'
            || v_prs_kostenplaats_nr
            || '/'
            || v_prs_project_nr
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF UPPER (v_header) LIKE UPPER (c_headerline || '%')
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            -- Lege regels aan het einde van het importbestand negeren
            IF (v_prs_perslid_nr IS NULL AND v_prs_perslid_naamfull IS NULL)
            THEN
               CONTINUE;
            END IF;

            v_count_tot := v_count_tot + 1;

            -- Controleer alle veldwaarden
            v_errorhint := 'Ongeldig personeelsnummer';
            v_prs_perslid_nr := TRIM (v_prs_perslid_nr);

            IF LENGTH (v_prs_perslid_nr) > 16
            THEN
               v_prs_perslid_nr := SUBSTR (v_prs_perslid_nr, 1, 16);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Personeelsnummer te lang',
                     'Personeelsnummer wordt afgebroken tot ['
                  || v_prs_perslid_nr
                  || ']');
            ELSE
               -- Niet iedere regel bevat het personeelsnummer. Dan het laatste hergebruiken.
               IF v_prs_perslid_nr IS NULL
               THEN
                  IF (v_prs_perslid_naamfull = v_last_perslid_naamfull)
                  THEN
                     v_prs_perslid_nr := v_last_perslid_nr;
                     -- Extra regel bij zelfde persoon
                     v_regel := v_regel + 1;
                  ELSE
                     fac.imp_writelog (
                        p_import_key,
                        'W',
                        v_aanduiding || 'Personeelsnummer ontbreekt',
                        'Eerste regel van persoon moet personeelsnummer bevatten');
                  END IF;
               ELSE
                  -- Nieuwe persoon; dus eerste regel
                  v_regel := 1;
               END IF;
            END IF;

            -- Bewaar personeelsnummer voor volgende regel (personen die voor meerdere
            -- P-nummers werken, komen vaker voor in het bestand, maar alleen de eerste
            -- regel bevat het personeelsnummer)
            v_last_perslid_nr := v_prs_perslid_nr;
            v_last_perslid_naamfull := v_prs_perslid_naamfull;

            v_errorhint := 'Ongeldige kostenplaatscode';
            v_prs_kostenplaats_nr := TRIM (v_prs_kostenplaats_nr);

            IF (v_prs_kostenplaats_nr IS NULL)
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Kostenplaatscode ontbreekt',
                  'Verwerken zal fout opleveren');
            ELSIF LENGTH (v_prs_kostenplaats_nr) > 30
            THEN
               v_prs_kostenplaats_nr := SUBSTR (v_prs_kostenplaats_nr, 1, 30);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Kostenplaatscode te lang',
                     'Kostenplaatscode wordt afgebroken tot ['
                  || v_prs_kostenplaats_nr
                  || ']');
            END IF;

            v_errorhint := 'Ongeldig projectnummer';
            v_prs_project_nr := TRIM (v_prs_project_nr);

            IF (v_prs_project_nr IS NULL)
            THEN
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Projectnummer ontbreekt',
                                 'Verwerken zal fout opleveren');
            ELSIF LENGTH (v_prs_project_nr) > 30
            THEN
               v_prs_project_nr := SUBSTR (v_prs_project_nr, 1, 30);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Projectnummer te lang',
                     'Projectnummer wordt afgebroken tot ['
                  || v_prs_project_nr
                  || ']');
            END IF;

            v_errorhint := 'Functieomschrijving te lang';
            v_prs_srtperslid_oms := TRIM (v_prs_srtperslid_oms);

            IF LENGTH (v_prs_srtperslid_oms) > 60
            THEN
               v_prs_srtperslid_oms := SUBSTR (v_prs_srtperslid_oms, 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errorhint,
                     'Functieomschrijving wordt afgebroken tot ['
                  || v_prs_srtperslid_oms
                  || ']');
            END IF;

            v_errorhint := 'Deeltijdpercentage ongeldig';
            v_fte_num := fac.safe_to_number (TRIM (REPLACE (v_fte, ',', '.')));

            IF (v_fte_num IS NULL)
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  v_aanduiding || v_errorhint,
                     'Regel wordt overgeslagen (waarde: '
                  || v_fte_num
                  || '/'
                  || v_fte
                  || ')');
            -- Percentage 0 betekent nul-urencontract. Inlezen als 0,01, zodat wel wordt doorbelast.
            -- ( dergelijke personen werken maar voor één afdeling en 0,01 / 0,01 = 1,
            -- dus werkplek wordt dan volledig doorbelast)
            ELSIF (v_fte_num = 0)
            THEN
               v_fte_num := 0.01;
               fac.imp_writelog (p_import_key,
                                 'I',
                                 v_aanduiding || 'Deeltijdpercentage is nul',
                                 'Wordt ingelezen als 0,01%');
            END IF;

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

                  INSERT INTO nybu_imp_kpnprs (fac_import_key,
                                               prs_perslid_nr,
                                               prs_perslid_naamfull,
                                               prs_kostenplaats_nr,
                                               prs_project_nr,
                                               prs_srtperslid_omschrijving,
                                               fte,
                                               regel)
                      VALUES (p_import_key,
                              v_prs_perslid_nr,
                              v_prs_perslid_naamfull,
                              v_prs_kostenplaats_nr,
                              v_prs_project_nr,
                              v_prs_srtperslid_oms,
                              v_fte_num,
                              v_regel);

                  COMMIT;

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

   IF (header_is_valid = 1)
   THEN
      fac.imp_writelog (p_import_key,
                        'S',
                        'Aantal ingelezen regels: ' || TO_CHAR (v_count_tot),
                        '');
      fac.imp_writelog (
         p_import_key,
         'S',
         'Aantal ongeldige importregels: '
         || TO_CHAR (v_count_tot - v_count_import),
         '');
   ELSE
      fac.imp_writelog (
         p_import_key,
         'E',
         'Ongeldige headerregel!',
         SUBSTR ('Moet zijn: "' || c_headerline || '..."', 1, 1000));
   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_aanduiding || v_errormsg,
                        v_errorhint);
      COMMIT;
END nybu_import_kpnprs;
/

--   prs_kenmerk     Account 1      1061
--   prs_kenmerk     FTE 1          1062
--   prs_kenmerk     Account 2      1063
--   prs_kenmerk     FTE 2          1064
--   prs_kenmerk     Account 3      1065
--   prs_kenmerk     FTE 3          1066
--   prs_kenmerk     Account 4      1067
--   prs_kenmerk     FTE 4          1068

CREATE OR REPLACE PROCEDURE nybu_update_kpnprs (p_import_key IN NUMBER)
IS
   -- Maximaal percentage aan nieuwe medewerkers tov. actieve medewerkers met een nummer
   c_max_delta_percentage   NUMBER (10) := 20;

   v_aanduiding             VARCHAR2 (200);
   v_errorhint              VARCHAR2 (1000);
   v_errormsg               VARCHAR2 (1000);
   oracle_err_num           NUMBER;
   oracle_err_mes           VARCHAR2 (200);
   v_count_tot              NUMBER (10);
   v_count_error            NUMBER (10);
   v_count                  NUMBER (10);
   --
   v_perslid_key            NUMBER (10);
   v_project_key            NUMBER (10);
   v_flex_account_key       NUMBER (10);
   v_flex_fte_key           NUMBER (10);
   v_account_old            prs_kostenplaats.prs_kostenplaats_nr%TYPE;
   v_fte_old                nybu_imp_kpnprs.fte%TYPE;

   -- Eerst checken: staat er projectnummer-kostenplaats-combinaties in de import
   -- die niet in FACILITOR bestaan?
   CURSOR c_check_kpn
   IS
      SELECT prs_perslid_nr,
             prs_perslid_naamfull,
             prs_project_nr,
             prs_kostenplaats_nr
        FROM nybu_imp_kpnprs i
       WHERE NOT EXISTS
                (SELECT ak.prs_kostenplaats_nr, kg.prs_kostenplaatsgrp_nr
                   FROM prs_v_aanwezigkostenplaats ak, prs_kostenplaatsgrp kg
                  WHERE kg.prs_kostenplaatsgrp_key =
                           ak.prs_kostenplaatsgrp_key
                        AND ak.prs_kostenplaats_nr = i.prs_project_nr
                        AND kg.prs_kostenplaatsgrp_nr = i.prs_kostenplaats_nr);

   -- Ook checken: staan er personeelsnummers in de import die niet in FACILITOR bestaan,
   -- of die vaker voorkomen in FACILITOR?
   CURSOR c_check_prsnr
   IS
      SELECT DISTINCT i.prs_perslid_nr, i.prs_perslid_naamfull
        FROM nybu_imp_kpnprs i
       WHERE prs_perslid_nr NOT IN (  SELECT prs_perslid_nr
                                        FROM prs_v_aanwezigperslid
                                    GROUP BY prs_perslid_nr
                                      HAVING COUNT ( * ) = 1);

   -- Verwijderen: deeltijdpercentages van personen met personeelsnummer in
   -- FACILITOR die niet (meer) voorkomen in de import.
   CURSOR c_del
   IS
        SELECT p.prs_perslid_nr,
               pf.prs_perslid_naam_full,
               k.prs_kostenplaats_nr prs_project_nr,
               fac.safe_to_number (f.prs_kenmerklink_waarde) fte,
               p.prs_perslid_key,
               a.prs_kenmerk_key accnt_key,
               f.prs_kenmerk_key fte_key
          FROM prs_kenmerklink a,
               prs_kenmerklink f,
               prs_kostenplaats k,
               prs_perslid p,
               prs_v_perslid_fullnames pf
         WHERE a.prs_kenmerk_key IN (1061, 1063, 1065, 1067)
               AND f.prs_kenmerk_key =
                     DECODE (a.prs_kenmerk_key,
                             1061, 1062,
                             1063, 1064,
                             1065, 1066,
                             1067, 1068)
               AND a.prs_kenmerklink_verwijder IS NULL
               AND f.prs_kenmerklink_verwijder IS NULL
               AND f.prs_link_key = a.prs_link_key
               AND p.prs_perslid_key = a.prs_link_key
               AND p.prs_perslid_nr IS NOT NULL
               AND pf.prs_perslid_key = a.prs_link_key
               AND k.prs_kostenplaats_key =
                     fac.safe_to_number (a.prs_kenmerklink_waarde)
               AND NOT EXISTS (SELECT *
                                 FROM nybu_imp_kpnprs
                                WHERE prs_perslid_nr = p.prs_perslid_nr)
      ORDER BY p.prs_perslid_nr, k.prs_kostenplaats_nr;

   -- Deeltijdpercentages (max 4) per medewerker
   -- Gegeven alle unieke personen in het bestand, haal alle deelpercentages met
   -- projectnummer en kostenplaatsnummer op.
   CURSOR c_accounts
   IS
        SELECT prs_perslid_nr,
               prs_perslid_naamfull,
               prs_project_nr,
               prs_kostenplaats_nr,
               fte,
               regel
          FROM (WITH pers
                        AS (SELECT DISTINCT
                                   prs_perslid_nr, prs_perslid_naamfull
                              FROM nybu_imp_kpnprs)
                SELECT i.prs_perslid_nr,
                       i.prs_perslid_naamfull,
                       i.prs_project_nr,
                       i.prs_kostenplaats_nr,
                       i.fte,
                       1 regel
                  FROM pers p, (SELECT *
                                  FROM nybu_imp_kpnprs
                                 WHERE regel = 1) i
                 WHERE i.prs_perslid_nr(+) = p.prs_perslid_nr
                       AND i.prs_perslid_naamfull(+) = p.prs_perslid_naamfull
                UNION ALL
                SELECT p.prs_perslid_nr,
                       p.prs_perslid_naamfull,
                       i.prs_project_nr,
                       i.prs_kostenplaats_nr,
                       i.fte,
                       2 regel
                  FROM pers p, (SELECT *
                                  FROM nybu_imp_kpnprs
                                 WHERE regel = 2) i
                 WHERE i.prs_perslid_nr(+) = p.prs_perslid_nr
                       AND i.prs_perslid_naamfull(+) = p.prs_perslid_naamfull
                UNION ALL
                SELECT p.prs_perslid_nr,
                       p.prs_perslid_naamfull,
                       i.prs_project_nr,
                       i.prs_kostenplaats_nr,
                       i.fte,
                       3 regel
                  FROM pers p, (SELECT *
                                  FROM nybu_imp_kpnprs
                                 WHERE regel = 3) i
                 WHERE i.prs_perslid_nr(+) = p.prs_perslid_nr
                       AND i.prs_perslid_naamfull(+) = p.prs_perslid_naamfull
                UNION ALL
                SELECT p.prs_perslid_nr,
                       p.prs_perslid_naamfull,
                       i.prs_project_nr,
                       i.prs_kostenplaats_nr,
                       i.fte,
                       4 regel
                  FROM pers p, (SELECT *
                                  FROM nybu_imp_kpnprs
                                 WHERE regel = 4) i
                 WHERE i.prs_perslid_nr(+) = p.prs_perslid_nr
                       AND i.prs_perslid_naamfull(+) = p.prs_perslid_naamfull)
      ORDER BY prs_perslid_nr, prs_perslid_naamfull, regel;
BEGIN
   v_count_tot := 0;
   v_count_error := 0;

   -- Check of alle projectnummers/kostenplaatsen bestaan in FACILITOR
   FOR rec IN c_check_kpn
   LOOP
      v_aanduiding :=
         '[' || rec.prs_perslid_nr || '|' || rec.prs_perslid_naamfull || ']';

      fac.imp_writelog (
         p_import_key,
         'E',
            'Projectnr '
         || rec.prs_project_nr
         || ' bestaat niet! (binnen kostenplaats '
         || rec.prs_kostenplaats_nr
         || ')',
         v_aanduiding);
      v_count_error := v_count_error + 1;
   END LOOP;

   IF (v_count_error > 0)
   THEN
      fac.imp_writelog (
         p_import_key,
         'S',
         v_count_error
         || ' onbekende project-/kostenplaatsnummer(s) gevonden.',
         'Import wordt afgebroken.');
   END IF;

   -- Check of alle personeelsnummers bestaan in FACILITOR
   FOR rec IN c_check_prsnr
   LOOP
      v_aanduiding :=
         '[' || rec.prs_perslid_nr || '|' || rec.prs_perslid_naamfull || ']';

      fac.imp_writelog (p_import_key,
                        'E',
                        'Personeelsnr niet gevonden!',
                        v_aanduiding);
      v_count_error := v_count_error + 1;
   END LOOP;

   IF (v_count_error > 0)
   THEN
      fac.imp_writelog (
         p_import_key,
         'S',
         v_count_error || ' onbekende personeelsnummer(s) gevonden.',
         'Import wordt afgebroken.');
   END IF;

   -- Alleen verder gaan als alle stamgegevens (kpn's, persnr's) matchen
   IF (v_count_error = 0)
   THEN
      -- Verwijder alle niet meer aanwezige deeltijdpercentages
      -- D.i. alle combinaties van een persoon en een projectnummer in FACILITOR
      -- die niet in het importbestand voorkomen.
      FOR rec IN c_del
      LOOP
         BEGIN
            v_aanduiding :=
                  '['
               || rec.prs_perslid_nr
               || '|'
               || rec.prs_perslid_naam_full
               || '] - ';

            v_errorhint :=
               'Fout bij verwijderen kenmerk Account'
               || (rec.accnt_key - 1059) / 2;
            prs.upsertkenmerk (rec.accnt_key, rec.prs_perslid_key, NULL);

            v_errorhint :=
               'Fout bij verwijderen kenmerk FTE' || (rec.fte_key - 1060) / 2;
            prs.upsertkenmerk (rec.fte_key, rec.prs_perslid_key, NULL);

            DBMS_OUTPUT.PUT_LINE(   v_aanduiding
                                 || ': '
                                 || 'Deeltijdpercentage '
                                 || rec.prs_project_nr
                                 || ' ('
                                 || TO_CHAR (rec.fte)
                                 || ') verwijderd');

            fac.imp_writelog (
               p_import_key,
               'I',
                  'Deeltijdpercentage '
               || rec.prs_project_nr
               || ' ('
               || TO_CHAR (rec.fte)
               || ') verwijderd',
               v_aanduiding || 'niet gevonden in importbestand');
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_count_error := v_count_error + 1;
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || 'Persoon niet gevonden',
                                 v_errorhint);
            WHEN TOO_MANY_ROWS
            THEN
               v_count_error := v_count_error + 1;
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  v_aanduiding
                  || 'Meerdere personen met hetzelfde personeelsnummer',
                  v_errorhint);
            WHEN OTHERS
            THEN
               v_count_error := v_count_error + 1;
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
               v_errormsg :=
                     'OTHERS (error '
                  || oracle_err_num
                  || '/'
                  || oracle_err_mes
                  || ')';
               fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint);
         --COMMIT;
         END;
      END LOOP;

      FOR rec IN c_accounts
      LOOP
         BEGIN
            v_count_tot := v_count_tot + 1;
            v_aanduiding :=
                  '['
               || rec.prs_perslid_nr
               || '|'
               || rec.prs_perslid_naamfull
               || '] - ['
               || rec.prs_project_nr
               || '/'
               || rec.prs_kostenplaats_nr
               || ']';

            -- Vind persoon met personeelsnummer. Niet of meermalen gevonden? Next!
            v_errorhint := 'Fout bij bepalen persoon; wordt overgeslagen.';

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

            -- Als een eenduidig persoon is gevonden, dan kunnen we verder.
            -- Bepalen over welke flexkenmerken we het hebben
            SELECT DECODE (rec.regel, 1, 1061, 2, 1063, 3, 1065, 4, 1067)
                      accnt,
                   DECODE (rec.regel, 1, 1062, 2, 1064, 3, 1066, 4, 1068) fte
              INTO v_flex_account_key, v_flex_fte_key
              FROM DUAL;

            -- Als geen projnr/kpn/fte, dan was dit geen regel in het importbestand en
            -- moeten alleen eventueel aanwezige kenmerken geleegd worden
            IF (    rec.prs_project_nr IS NULL
                AND rec.prs_kostenplaats_nr IS NULL
                AND rec.fte IS NULL)
            THEN
               v_project_key := NULL;
            ELSE
               v_errorhint :=
                     'Fout bij bepalen project '
                  || rec.prs_project_nr
                  || ' binnen kostenplaats '
                  || rec.prs_kostenplaats_nr;

               SELECT proj.prs_kostenplaats_key
                 INTO v_project_key
                 FROM prs_kostenplaats proj, prs_kostenplaatsgrp kpn
                WHERE proj.prs_kostenplaats_verwijder IS NULL
                      AND proj.prs_kostenplaats_upper =
                            UPPER (rec.prs_project_nr)
                      AND kpn.prs_kostenplaatsgrp_key =
                            proj.prs_kostenplaatsgrp_key
                      AND UPPER (kpn.prs_kostenplaatsgrp_nr) =
                            UPPER (rec.prs_kostenplaats_nr);
            END IF;

            -- Is er een gevuld kenmerk?
            v_errorhint :=
               'Fout bij bepalen deeltijdpercentage Account ' || rec.regel;

            SELECT COUNT ( * )
              INTO v_count
              FROM prs_kenmerklink
             WHERE prs_kenmerk_key IN (v_flex_account_key, v_flex_fte_key)
                   AND prs_kenmerklink_verwijder IS NULL
                   AND prs_link_key = v_perslid_key;

            IF (v_count >= 2)
            THEN
               v_errorhint :=
                  'Fout bij ophalen deeltijdpercentage Account ' || rec.regel;

               SELECT k.prs_kostenplaats_nr,
                      fac.safe_to_number (fte.prs_kenmerklink_waarde)
                 INTO v_account_old, v_fte_old
                 FROM prs_kostenplaats k,
                      prs_kenmerklink accnt,
                      prs_kenmerklink fte
                WHERE     accnt.prs_kenmerk_key = v_flex_account_key
                      AND accnt.prs_kenmerklink_verwijder IS NULL
                      AND accnt.prs_link_key = v_perslid_key
                      AND fte.prs_kenmerk_key = v_flex_fte_key
                      AND fte.prs_kenmerklink_verwijder IS NULL
                      AND fte.prs_link_key = v_perslid_key
                      AND k.prs_kostenplaats_key =
                            fac.safe_to_number (accnt.prs_kenmerklink_waarde);
            ELSE
               v_account_old := NULL;
               v_fte_old := NULL;
            END IF;

            -- Als de importwaarden afwijken van de huidige, dan bijwerken
            IF (COALESCE (v_account_old, 'apekool') !=
                   COALESCE (rec.prs_project_nr, 'apekool')
                OR COALESCE (v_fte_old, -1) != COALESCE (rec.fte, -1))
            THEN
               v_errorhint :=
                  'Fout bij aanmaken/bijwerken/verwijderen kenmerk Account '
                  || rec.regel;
               prs.upsertkenmerk (v_flex_account_key,
                                  v_perslid_key,
                                  TO_CHAR (v_project_key));

               v_errorhint :=
                  'Fout bij aanmaken/bijwerken/verwijderen kenmerk FTE '
                  || rec.regel;
               prs.upsertkenmerk (v_flex_fte_key,
                                  v_perslid_key,
                                  TO_CHAR (rec.fte));

               IF (v_project_key IS NOT NULL)
               THEN
                  DBMS_OUTPUT.PUT_LINE(   v_aanduiding
                                       || ': '
                                       || 'Deeltijdpercentage '
                                       || rec.prs_project_nr
                                       || ' = '
                                       || TO_CHAR (rec.fte)
                                       || ' (was '
                                       || v_account_old
                                       || ' = '
                                       || v_fte_old
                                       || ')');
                  fac.imp_writelog (
                     p_import_key,
                     'I',
                        'Deeltijdpercentage '
                     || rec.prs_project_nr
                     || ' = '
                     || TO_CHAR (rec.fte)
                     || ' (was '
                     || v_account_old
                     || ' = '
                     || v_fte_old
                     || ')',
                     v_aanduiding);
               ELSE
                  DBMS_OUTPUT.PUT_LINE(   v_aanduiding
                                       || ': '
                                       || 'Deeltijdpercentage '
                                       || v_account_old
                                       || ' verwijderd'
                                       || ' (was '
                                       || v_fte_old
                                       || ')');
                  fac.imp_writelog (
                     p_import_key,
                     'I',
                        'Deeltijdpercentage '
                     || v_account_old
                     || ' verwijderd'
                     || ' (was '
                     || v_fte_old
                     || ')',
                     v_aanduiding);
               END IF;
            END IF;

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

      fac.imp_writelog (
         p_import_key,
         'S',
         'Verwerkte regels zonder foutmelding: '
         || TO_CHAR (v_count_tot - v_count_error),
         '');
      fac.imp_writelog (
         p_import_key,
         'S',
         'Verwerkte regels met foutmelding: ' || TO_CHAR (v_count_error),
         '');
   END IF;
--COMMIT;
END nybu_update_kpnprs;
/


------- KOPPELING SENTIDO (Reserveringen) --------------------------------------

CREATE OR REPLACE VIEW nybu_v_res_sentido
AS
   SELECT    TO_CHAR (van, 'YYYY-MM-DD HH24:MI')
          || ' '
          || TO_CHAR (tot, 'HH24:MI')
             srt,
          res_nr,
          res_ruimte_nr,
          oms,
          TO_CHAR (van, 'DD/MM/YYYY HH24:MI') van,
          TO_CHAR (tot, 'DD/MM/YYYY HH24:MI') tot
     FROM (WITH r
                   AS                               -- 1   Show on info screen
                     (SELECT rr.res_rsv_ruimte_key,
                             rr.res_reservering_key res_nr,
                             r.res_ruimte_nr,
                             COALESCE (
                                alt_desc.res_kenmerkreservering_waarde,
                                rr.res_rsv_ruimte_omschrijving)
                                oms,
                             rr.res_rsv_ruimte_van van,
                             alt_start.res_kenmerkreservering_waarde alt_van,
                             rr.res_rsv_ruimte_tot tot,
                             alt_end.res_kenmerkreservering_waarde alt_tot
                        FROM res_rsv_ruimte rr,
                             res_ruimte_opstelling ro,
                             res_ruimte r,
                             res_kenmerkwaarde kw,
                             res_kenmerk k,
                             -- 2   Alt. start time
                             (SELECT kw.*
                                FROM res_kenmerkwaarde kw, res_kenmerk k
                               WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                                     AND k.res_srtkenmerk_key = 2
                                     AND kw.res_kenmerkreservering_waarde IS NOT NULL)
                             alt_start,
                             -- 3   Alt. end time
                             (SELECT kw.*
                                FROM res_kenmerkwaarde kw, res_kenmerk k
                               WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                                     AND k.res_srtkenmerk_key = 3
                                     AND kw.res_kenmerkreservering_waarde IS NOT NULL)
                             alt_end,
                             -- 4   Alt. description
                             (SELECT kw.*
                                FROM res_kenmerkwaarde kw, res_kenmerk k
                               WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                                     AND k.res_srtkenmerk_key = 4
                                     AND kw.res_kenmerkreservering_waarde IS NOT NULL)
                             alt_desc
                       WHERE kw.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                             AND kw.res_kenmerkreservering_waarde IS NOT NULL
                             AND kw.res_kenmerkreservering_waarde = '1'
                             AND k.res_kenmerk_key = kw.res_kenmerk_key
                             AND k.res_srtkenmerk_key = 1
                             AND ro.res_ruimte_opstel_key =
                                   rr.res_ruimte_opstel_key
                             AND r.res_ruimte_key = ro.res_ruimte_key
                             AND rr.res_rsv_ruimte_verwijder IS NULL
                             AND rr.res_status_fo_key NOT IN (3, 4)
                             AND TRUNC (rr.res_rsv_ruimte_van) BETWEEN TRUNC(SYSDATE)
                                                                   AND  TRUNC(SYSDATE
                                                                              + 3)
                             AND alt_desc.res_rsv_ruimte_key(+) =
                                   rr.res_rsv_ruimte_key
                             AND alt_start.res_rsv_ruimte_key(+) =
                                   rr.res_rsv_ruimte_key
                             AND alt_end.res_rsv_ruimte_key(+) =
                                   rr.res_rsv_ruimte_key)
           SELECT r.res_nr,
                  r.res_ruimte_nr,
                  r.oms,
                  DECODE (
                     r.alt_van,
                     NULL,
                     r.van,
                     TO_DATE (TO_CHAR (r.van, 'DD/MM/YYYY ') || r.alt_van,
                              'DD/MM/YYYY HH24:MI'))
                     van,
                  DECODE (
                     r.alt_tot,
                     NULL,
                     r.tot,
                     TO_DATE (TO_CHAR (r.tot, 'DD/MM/YYYY ') || r.alt_tot,
                              'DD/MM/YYYY HH24:MI'))
                     tot
             FROM r
           UNION ALL
           SELECT r.res_nr,
                  r.res_ruimte_nr,
                  ext1_desc.res_kenmerkreservering_waarde oms,
                  TO_DATE (
                     TO_CHAR (r.van, 'DD/MM/YYYY ')
                     || ext1_start.res_kenmerkreservering_waarde,
                     'DD/MM/YYYY HH24:MI')
                     van,
                  TO_DATE (
                     TO_CHAR (r.tot, 'DD/MM/YYYY ')
                     || ext1_end.res_kenmerkreservering_waarde,
                     'DD/MM/YYYY HH24:MI')
                     tot
             FROM r,
                  -- 7   Extra description 1
                  (SELECT kw.*
                     FROM res_kenmerkwaarde kw, res_kenmerk k
                    WHERE     kw.res_kenmerk_key = k.res_kenmerk_key
                          AND k.res_srtkenmerk_key = 7
                          AND kw.res_kenmerkreservering_waarde IS NOT NULL)
                  ext1_desc,
                  -- 8   Extra start time 1
                  (SELECT kw.*
                     FROM res_kenmerkwaarde kw, res_kenmerk k
                    WHERE     kw.res_kenmerk_key = k.res_kenmerk_key
                          AND k.res_srtkenmerk_key = 8
                          AND kw.res_kenmerkreservering_waarde IS NOT NULL)
                  ext1_start,
                  -- 9   Extra end time 1
                  (SELECT kw.*
                     FROM res_kenmerkwaarde kw, res_kenmerk k
                    WHERE     kw.res_kenmerk_key = k.res_kenmerk_key
                          AND k.res_srtkenmerk_key = 9
                          AND kw.res_kenmerkreservering_waarde IS NOT NULL)
                  ext1_end
            WHERE     ext1_desc.res_rsv_ruimte_key = r.res_rsv_ruimte_key
                  AND ext1_start.res_rsv_ruimte_key = r.res_rsv_ruimte_key
                  AND ext1_end.res_rsv_ruimte_key = r.res_rsv_ruimte_key
           UNION ALL
           SELECT r.res_nr,
                  r.res_ruimte_nr,
                  ext2_desc.res_kenmerkreservering_waarde oms,
                  TO_DATE (
                     TO_CHAR (r.van, 'DD/MM/YYYY ')
                     || ext2_start.res_kenmerkreservering_waarde,
                     'DD/MM/YYYY HH24:MI')
                     van,
                  TO_DATE (
                     TO_CHAR (r.tot, 'DD/MM/YYYY ')
                     || ext2_end.res_kenmerkreservering_waarde,
                     'DD/MM/YYYY HH24:MI')
                     tot
             FROM r,
                  --10   Extra description 2
                  (SELECT kw.*
                     FROM res_kenmerkwaarde kw, res_kenmerk k
                    WHERE     kw.res_kenmerk_key = k.res_kenmerk_key
                          AND k.res_srtkenmerk_key = 10
                          AND kw.res_kenmerkreservering_waarde IS NOT NULL)
                  ext2_desc,
                  --11   Extra start time 2
                  (SELECT kw.*
                     FROM res_kenmerkwaarde kw, res_kenmerk k
                    WHERE     kw.res_kenmerk_key = k.res_kenmerk_key
                          AND k.res_srtkenmerk_key = 11
                          AND kw.res_kenmerkreservering_waarde IS NOT NULL)
                  ext2_start,
                  --12   Extra end time 2
                  (SELECT kw.*
                     FROM res_kenmerkwaarde kw, res_kenmerk k
                    WHERE     kw.res_kenmerk_key = k.res_kenmerk_key
                          AND k.res_srtkenmerk_key = 12
                          AND kw.res_kenmerkreservering_waarde IS NOT NULL)
                  ext2_end
            WHERE     ext2_desc.res_rsv_ruimte_key = r.res_rsv_ruimte_key
                  AND ext2_start.res_rsv_ruimte_key = r.res_rsv_ruimte_key
                  AND ext2_end.res_rsv_ruimte_key = r.res_rsv_ruimte_key);


------- KOPPELING CODA (Reserveringen) -----------------------------------------

-- Externe reserveringen die moeten worden doorbelast
-- discipline        581   Verbruiksartikel   Inhuur Voorzieningen
-- discipline        462   Verbruiksartikel   Hotelkamers
-- res_srtkenmerk    202   Exportdatum
-- res_srtkenmerk     81   Company
-- fac_usrtab         42   CODA BTW-tarieven
-- NYBU#30023: deze view haalt nu ook reserveringen op met totaalprijs 0, omdat die
-- wel gecrediteerd kunnen worden (de export bepaalt per creditering of die in- of extern
-- is door 'm tegen de rsv_ruimte_keys in deze view te houden)
-- Facturatie is inclusief BTW.
-- Korting gaat alleen van rsv_ruimte af, omdat catering door Vermaat wordt gefactureerd.
-- Ruimteprijs is excl BTW, dus korting ook.

CREATE OR REPLACE VIEW nybu_v_res_factuur_extern
AS
   SELECT COALESCE (b.prs_bedrijf_naam, k.prs_kostenplaats_omschrijving)
             klant,
          xyz.res_rsv_ruimte_van,
          TO_CHAR (xyz.res_rsv_ruimte_van, 'YYYYMM') periode,
          xyz.prs_kostensoort_oms grootboek,
          kg.prs_kostenplaatsgrp_key kostenplaats_key,
          TRIM (SUBSTR (kg.prs_kostenplaatsgrp_oms, 1, 7)) kostenplaats,
          b.prs_leverancier_nr deb_nr,
          k.prs_kostenplaats_key proj_key,
          k.prs_kostenplaats_nr proj,
          xyz.btw,
          xyz.prs_kostensoort_btw,
          btwc.fac_usrdata_omschr btw_code,
          xyz.res_reservering_key res_key,
          xyz.res_rsv_ruimte_volgnr res_volgnr,
          kref.res_kenmerkreservering_waarde referentie,
          xyz.reservering,
          xyz.res_rsv_ruimte_key,
          DECODE (kref.res_kenmerkreservering_waarde,
                  NULL, '',
                  kref.res_kenmerkreservering_waarde || ' ')
          || xyz.res_rsv_ruimte_omschrijving
             descr,
          xyz.aantal,
          xyz.omschrijving,
          xyz.soort,
          -- deelresprijs excl = zaal_excl              + deel_excl  + artikel_excl
          --                   = (zaal - korting)(excl) + deel(excl) + artikel(excl)
          DECODE (xyz.prs_kostensoort_btw,
                  1, xyz.prijs / (1 + xyz.btw / 100),
                  xyz.prijs)
             prijs_ex,
          -- deelresprijs incl = zaal_incl              + deel_incl  + artikel_incl
          --                   = (zaal - korting)(incl) + deel(incl) + artikel(incl)
          DECODE (xyz.prs_kostensoort_btw,
                  1, xyz.prijs,
                  xyz.prijs * (1 + xyz.btw / 100))
             prijs_inc,
          -- btw laag = ruimte_btw_laag + deel_btw_laag + artikel_btw_laag
          --          = if(6% of 9%) artikel_btw (ruimte en deel zijn altijd 21%, maar dat gaat vanzelf goed)
          DECODE (
             xyz.btw,
             COALESCE (6, 9),
             DECODE (xyz.prs_kostensoort_btw,
                     1, xyz.prijs / (100 + xyz.btw) * xyz.btw,
                     xyz.prijs / 100 * xyz.btw),
             0)
             btw_laag,
          -- btw hoog = ruimte_btw                   + deel_btw_hoog    + artikel_btw_hoog
          --          = (zaal - korting)(excl) * 21% + if(21%) deel_btw + if(21%) artikel_btw
          DECODE (
             xyz.btw,
             21,
             DECODE (xyz.prs_kostensoort_btw,
                     1, xyz.prijs / (100 + xyz.btw) * xyz.btw,
                     xyz.prijs / 100 * xyz.btw),
             0)
             btw_hoog,
          xyz.korting,
          1 inex
     FROM (SELECT 'ruimte' soort,
                  rr.*,
                  ks.prs_kostensoort_oms,
                  ks.prs_kostensoort_btw,
                  21 btw,
                  rr.res_reservering_key || '/' || rr.res_rsv_ruimte_volgnr
                     reservering,
                  1 aantal,
                  r.res_ruimte_nr omschrijving,
                  res.getruimteprijs (rr.res_rsv_ruimte_key)
                  - COALESCE (res_rsv_ruimte_korting, 0)
                     prijs,
                  COALESCE (res_rsv_ruimte_korting, 0) korting
             FROM res_rsv_ruimte rr,
                  res_ruimte_opstelling ro,
                  res_ruimte r,
                  res_discipline di,
                  prs_kostensoort ks
            WHERE     ro.res_ruimte_opstel_key = rr.res_ruimte_opstel_key
                  AND r.res_ruimte_key = ro.res_ruimte_key
                  AND di.ins_discipline_key = r.res_discipline_key
                  AND ks.prs_kostensoort_key(+) = di.prs_kostensoort_key
           UNION ALL
           SELECT 'artikel' soort,
                  rr.*,
                  ks.prs_kostensoort_oms,
                  ks.prs_kostensoort_btw,
                  -- COALESCE (a.res_artikel_btw, 0) btw,
                  CASE
                     WHEN a.res_artikel_btw > 9
                     THEN
                        a.res_artikel_btw
                     WHEN (a.res_artikel_btw = 6 OR a.res_artikel_btw = 9)
                     THEN
                        CASE
                           WHEN ra.res_rsv_artikel_levering <
                                   TO_DATE ('1-1-2019', 'dd-mm-yyyy')
                           THEN
                              6
                           ELSE
                              a.res_artikel_btw
                        END
                     ELSE
                        0
                  END
                     btw,
                  rr.res_reservering_key || '/' || rr.res_rsv_ruimte_volgnr
                     reservering,
                  ra.res_rsv_artikel_aantal aantal,
                  a.res_artikel_omschrijving omschrijving,
                  res.getartikelprijs (ra.res_rsv_artikel_key) prijs,
                  0 korting
             FROM res_rsv_ruimte rr,
                  res_rsv_artikel ra,
                  res_artikel a,
                  res_discipline di,
                  prs_kostensoort ks
            WHERE     ra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                  AND res.getartikelprijs (ra.res_rsv_artikel_key) != 0
                  AND a.res_artikel_key = ra.res_artikel_key
                  AND di.ins_discipline_key = a.res_discipline_key
                  AND di.ins_discipline_key IN (581, 462)
                  AND ks.prs_kostensoort_key(+) = di.prs_kostensoort_key
           UNION ALL
           SELECT 'deel' soort,
                  rr.*,
                  ks.prs_kostensoort_oms,
                  ks.prs_kostensoort_btw,
                  21 btw,
                  rr.res_reservering_key || '/' || rr.res_rsv_ruimte_volgnr
                     reservering,
                  rd.res_rsv_deel_aantal aantal,
                  d.res_deel_omschrijving,
                  res.getdeelprijs (rd.res_rsv_deel_key) prijs,
                  0 korting
             FROM res_rsv_ruimte rr,
                  res_rsv_deel rd,
                  res_deel d,
                  res_discipline di,
                  prs_kostensoort ks
            WHERE     rd.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                  AND d.res_deel_key = rd.res_deel_key
                  AND res.getdeelprijs (rd.res_rsv_deel_key) != 0
                  AND di.ins_discipline_key = d.res_discipline_key
                  AND ks.prs_kostensoort_key(+) = di.prs_kostensoort_key) xyz,
          prs_kostenplaats k,
          prs_kostenplaatsgrp kg,
          (SELECT kw.*
             FROM res_kenmerkwaarde kw, res_kenmerk k
            WHERE     k.res_srtkenmerk_key = 121
                  AND kw.res_kenmerk_key = k.res_kenmerk_key
                  AND kw.res_kenmerkwaarde_verwijder IS NULL
                  AND k.res_kenmerk_verwijder IS NULL) kref,
          (SELECT kw.*
             FROM res_kenmerkwaarde kw, res_kenmerk k
            WHERE     k.res_srtkenmerk_key = 81
                  AND kw.res_kenmerk_key = k.res_kenmerk_key
                  AND kw.res_kenmerkwaarde_verwijder IS NULL
                  AND k.res_kenmerk_verwijder IS NULL) comp,
          prs_bedrijf b,
          (SELECT *
             FROM fac_usrdata
            WHERE fac_usrtab_key = 42) btwc
    WHERE     k.prs_kostenplaats_extern = 1
          AND kg.prs_kostenplaatsgrp_key = k.prs_kostenplaatsgrp_key
          AND xyz.prs_kostenplaats_key = k.prs_kostenplaats_key
          AND xyz.res_rsv_ruimte_dirtlevel = 0
          AND kref.res_rsv_ruimte_key(+) = xyz.res_rsv_ruimte_key
          AND comp.res_rsv_ruimte_key(+) = xyz.res_rsv_ruimte_key
          AND b.prs_bedrijf_key(+) =
                fac.safe_to_number (comp.res_kenmerkreservering_waarde)
          AND fac.safe_to_number (btwc.fac_usrdata_code) = xyz.btw
          AND ( (xyz.res_rsv_ruimte_verwijder IS NULL
                 AND xyz.res_status_bo_key = 5)
               OR (    xyz.res_rsv_ruimte_verwijder IS NOT NULL
                   AND xyz.res_status_fo_key = 4
                   AND xyz.res_status_bo_key != 6))
          -- Geen exportdatum
          AND NOT EXISTS
                (SELECT 1
                   FROM res_kenmerkwaarde kw, res_kenmerk k
                  WHERE     k.res_srtkenmerk_key = 202
                        AND kw.res_kenmerk_key = k.res_kenmerk_key
                        AND kw.res_kenmerkwaarde_verwijder IS NULL
                        AND k.res_kenmerk_verwijder IS NULL
                        AND kw.res_rsv_ruimte_key = xyz.res_rsv_ruimte_key);

-- Interne reserveringen die doorbelast moeten worden. View levert ook reserveringen met
-- totaalprijs 0, zodat we daar de crediteringen tegenaan kunnen houden
-- res_srtkenmerk    202   Exportdatum
-- Interne doorbelasting is exclusief BTW
-- deelresprijs excl = zaal(excl) - korting(excl)

CREATE OR REPLACE VIEW nybu_v_res_factuur_intern
AS
   SELECT k.prs_kostenplaats_omschrijving klant,
          rr.res_rsv_ruimte_van,
          TO_CHAR (rr.res_rsv_ruimte_van, 'YYYYMM') periode,
          ks.prs_kostensoort_oms grootboek,
          kg.prs_kostenplaatsgrp_key kostenplaats_key,
          TRIM (SUBSTR (kg.prs_kostenplaatsgrp_oms, 1, 7)) kostenplaats,
          k.prs_kostenplaats_nr deb_nr,
          k.prs_kostenplaats_key proj_key,
          k.prs_kostenplaats_nr proj,
          0 btw,
          ks.prs_kostensoort_btw,
          btwc.fac_usrdata_omschr btw_code,
          rr.res_reservering_key res_key,
          rr.res_rsv_ruimte_volgnr res_volgnr,
          NULL referentie,
          rr.res_reservering_key || '/' || rr.res_rsv_ruimte_volgnr
             reservering,
          rr.res_rsv_ruimte_key,
          rr.res_rsv_ruimte_omschrijving descr,
          1 aantal,
          r.res_ruimte_nr omschrijving,
          'ruimte' soort,
          COALESCE (res.getruimteprijs (rr.res_rsv_ruimte_key), 0)
          - COALESCE (rr.res_rsv_ruimte_korting, 0)
             prijs_ex,
          COALESCE (res.getruimteprijs (rr.res_rsv_ruimte_key), 0)
          - COALESCE (rr.res_rsv_ruimte_korting, 0)
             prijs_inc,
          0 btw_laag,
          0 btw_hoog,
          COALESCE (rr.res_rsv_ruimte_korting, 0) korting,
          0 inex
     FROM res_rsv_ruimte rr,
          prs_kostenplaats k,
          prs_kostenplaatsgrp kg,
          res_ruimte_opstelling ro,
          res_ruimte r,
          res_discipline di,
          prs_kostensoort ks,
          (SELECT MAX (fac_usrdata_omschr) fac_usrdata_omschr
             FROM fac_usrdata
            WHERE fac_usrtab_key = 42 AND fac_usrdata_code = '0') btwc
    WHERE     COALESCE (k.prs_kostenplaats_extern, 0) = 0
          AND kg.prs_kostenplaatsgrp_key = k.prs_kostenplaatsgrp_key
          AND rr.prs_kostenplaats_key = k.prs_kostenplaats_key
          AND rr.res_rsv_ruimte_dirtlevel = 0
          AND ( (rr.res_rsv_ruimte_verwijder IS NULL
                 AND rr.res_status_bo_key = 5)
               OR (    res_rsv_ruimte_verwijder IS NOT NULL
                   AND rr.res_status_fo_key = 4
                   AND rr.res_status_bo_key != 6))
          AND ro.res_ruimte_opstel_key = rr.res_ruimte_opstel_key
          AND r.res_ruimte_key = ro.res_ruimte_key
          AND di.ins_discipline_key = r.res_discipline_key
          AND ks.prs_kostensoort_key = di.prs_kostensoort_key
          AND ks.prs_kostensoort_key in ( 23 , 161)                   -- 23 = 84010 Zaalhuur , 161 = 61000 Zaalhuur Amsterdam
          -- Geen exportdatum
          AND NOT EXISTS
                (SELECT 1
                   FROM res_kenmerkwaarde kw, res_kenmerk k
                  WHERE     k.res_srtkenmerk_key = 202
                        AND kw.res_kenmerk_key = k.res_kenmerk_key
                        AND kw.res_kenmerkwaarde_verwijder IS NULL
                        AND k.res_kenmerk_verwijder IS NULL
                        AND kw.res_rsv_ruimte_key = rr.res_rsv_ruimte_key);

-- NYBU#30645: berekent verkoopfactuurregels voor reserveringen en plaatst die in fin_verkoopfactuur.
-- Gebruikt door nybu_select_res_coda().
-- fin_verkoopfactuur_n1 = intern/extern (0/1)
-- fin_verkoopfactuur_n2 = creditering nee/ja (0/1)
-- fin_verkoopfactuur_c1 = reserveringnummer
-- fin_verkoopfactuur_c2 = klantnaam
-- fin_verkoopfactuur_c3 = klantreferentie
-- fin_verkoopfactuur_c4 = type verkoopfactuur {'catering', 'ruimte/voorz'}
-- fin_verkoopfactuur_d1 = rsv_ruimte_datum_van

CREATE OR REPLACE PROCEDURE nybu_res_verkoopfacturen (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
   v_aanduiding     VARCHAR2 (200);
   v_errorhint      VARCHAR2 (1000);
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);

   -- Alle factuurregels voor zowel interne als externe reserveringen
   -- Intern worden alleen ruimtes gefactureerd, extern alles behalve catering van Vermaat
   CURSOR c_regels
   IS
      SELECT *
        FROM nybu_v_res_factuur_extern
       WHERE prijs_inc != 0
      UNION ALL
      SELECT *
        FROM nybu_v_res_factuur_intern
       WHERE prijs_ex != 0;

   -- Te crediteren verkoopfactuurregels. Per deelreservering wordt met vinkje "Te crediteren" aangegeven
   -- dat deze gecrediteerd moet worden. Van deze deelreserveringen worden de laatst
   -- geëxporteerde regels in fin_verkoopfactuur opgezocht. Die worden vervolgens met negatieve
   -- bedragen in dezelfde tabel gezet (zodat origineel bedrag + creditbedrag = 0).
   -- res_srtkenmerk    202   Exportdatum
   -- res_srtkenmerk    203   Te crediteren
   CURSOR c_credits
   IS
      SELECT vf.*
        FROM res_kenmerkwaarde kw, res_kenmerk k, fin_verkoopfactuur vf
       WHERE     k.res_srtkenmerk_key = 203
             AND kw.res_kenmerk_key = k.res_kenmerk_key
             AND kw.res_kenmerkwaarde_verwijder IS NULL
             AND k.res_kenmerk_verwijder IS NULL
             AND kw.res_kenmerkreservering_waarde = '1'
             AND vf.fin_verkoopfactuur_refkey = kw.res_rsv_ruimte_key
             AND vf.fin_verkoopfactuur_xmlnode = 'reservering'
             AND vf.fin_verkoopfactuur_c4 = 'ruimte/voorz'
             AND vf.fin_verkoopfactuur_datum IS NOT NULL
             AND vf.fin_verkoopfactuur_datum =
                   (SELECT MAX (fin_verkoopfactuur_datum)
                      FROM fin_verkoopfactuur
                     WHERE fin_verkoopfactuur_refkey = kw.res_rsv_ruimte_key
                           AND fin_verkoopfactuur_xmlnode = 'reservering')
             -- Geen exportdatum
             AND NOT EXISTS
                   (SELECT 1
                      FROM res_kenmerkwaarde kw1, res_kenmerk k1
                     WHERE     k1.res_srtkenmerk_key = 202
                           AND kw1.res_kenmerk_key = k1.res_kenmerk_key
                           AND kw1.res_kenmerkwaarde_verwijder IS NULL
                           AND k1.res_kenmerk_verwijder IS NULL
                           AND kw1.res_rsv_ruimte_key = kw.res_rsv_ruimte_key);

   v_debnr          VARCHAR2 (60);
BEGIN
   v_aanduiding := 'Init';
   v_errormsg := 'Init';

   DELETE imp_log
    WHERE imp_log_applicatie = p_applname;

   DELETE fin_verkoopfactuur vf
    WHERE vf.fin_verkoopfactuur_datum IS NULL
          AND vf.fin_verkoopfactuur_c4 = 'ruimte/voorz';

   -- Genereer verkoopfactuurregels voor externe reserveringen
   FOR rec IN c_regels
   LOOP
      v_errormsg := 'Regels';
      v_debnr := COALESCE (rec.deb_nr, rec.klant);
      v_aanduiding :=
            v_debnr
         || '/'
         || rec.proj
         || ' ('
         || rec.periode
         || '): '
         || rec.reservering
         || ' ('
         || rec.inex
         || ')';

      -- TODO algemeen:
      --   facturatie-views hebben nu één regel met twee BTW-percentages. Dat splitsen.
      --   creditering doet excl/laag/hoog zelfs helemaal apart, maar dat kan straks anders.
      -- TODO specifiek:
      --   prs_kostenplaats_key
      --   regel per BTW-percentage
      INSERT INTO fin_verkoopfactuur (fin_verkoopfactuur_id,
                                      fin_verkoopfactuur_datum,
                                      fin_verkoopfactuur_omschr,
                                      fin_verkoopfactuur_xmlnode,
                                      fin_verkoopfactuur_refkey,
                                      prs_kostenplaats_nr,
                                      prs_kostenplaats_omschrijving,
                                      prs_kostenplaatsgrp_oms,
                                      prs_kostensoort_oms,
                                      prs_debiteur_naam,
                                      fin_verkoopfactuur_bedrag,
                                      fin_verkoopfactuur_btw,
                                      fin_btwtabelwaarde_code,
                                      fin_btwtabelwaarde_oms,
                                      fin_btwtabelwaarde_perc,
                                      fin_verkoopfactuur_maand,
                                      fin_verkoopfactuur_n1,
                                      fin_verkoopfactuur_n2,
                                      fin_verkoopfactuur_c1,
                                      fin_verkoopfactuur_c2,
                                      fin_verkoopfactuur_c3,
                                      fin_verkoopfactuur_c4,
                                      fin_verkoopfactuur_d1)
          VALUES (TO_CHAR (SYSDATE, 'YYYY-MM-DD'),
                  NULL,
                  DECODE (rec.soort,
                          'ruimte', rec.omschrijving,
                          TO_CHAR (rec.aantal) || 'x ' || rec.omschrijving),
                  'reservering',
                  rec.res_rsv_ruimte_key,
                  rec.proj,
                  rec.proj,
                  rec.kostenplaats,
                  rec.grootboek,
                  v_debnr,
                  rec.prijs_ex,
                  COALESCE (rec.btw_hoog, rec.btw_laag),
                  rec.btw_code,
                  rec.btw_code,
                  rec.btw,
                  rec.periode,
                  rec.inex,
                  0,                                                  -- debet
                  rec.reservering,
                  rec.klant,
                  rec.referentie,
                  'ruimte/voorz',
                  rec.res_rsv_ruimte_van);

      fac.writelog (p_applname,
                    'D',
                    v_aanduiding,
                    'regels');
   END LOOP;

   COMMIT;

   -- Genereer creditfactuurregels voor ex- en interne reserveringen
   FOR rec IN c_credits
   LOOP
      v_errormsg := 'Regels';
      v_debnr := rec.prs_debiteur_naam;
      v_aanduiding :=
            v_debnr
         || '/'
         || rec.prs_kostenplaats_nr
         || ' ('
         || rec.fin_verkoopfactuur_maand
         || '): '
         || rec.fin_verkoopfactuur_omschr;

      INSERT INTO fin_verkoopfactuur (fin_verkoopfactuur_id,
                                      fin_verkoopfactuur_datum,
                                      fin_verkoopfactuur_omschr,
                                      fin_verkoopfactuur_xmlnode,
                                      fin_verkoopfactuur_refkey,
                                      prs_kostenplaats_nr,
                                      prs_kostenplaats_omschrijving,
                                      prs_kostenplaatsgrp_oms,
                                      prs_kostensoort_oms,
                                      prs_debiteur_naam,
                                      fin_verkoopfactuur_bedrag,
                                      fin_verkoopfactuur_btw,
                                      fin_btwtabelwaarde_code,
                                      fin_btwtabelwaarde_oms,
                                      fin_btwtabelwaarde_perc,
                                      fin_verkoopfactuur_maand,
                                      fin_verkoopfactuur_n1,
                                      fin_verkoopfactuur_n2,
                                      fin_verkoopfactuur_c1,
                                      fin_verkoopfactuur_c2,
                                      fin_verkoopfactuur_c3,
                                      fin_verkoopfactuur_c4,
                                      fin_verkoopfactuur_d1)
          VALUES (TO_CHAR (SYSDATE, 'YYYY-MM-DD'),
                  NULL,
                  'Correctie ' || rec.fin_verkoopfactuur_omschr,
                  rec.fin_verkoopfactuur_xmlnode,
                  rec.fin_verkoopfactuur_refkey,
                  rec.prs_kostenplaats_nr,
                  rec.prs_kostenplaats_omschrijving,
                  rec.prs_kostenplaatsgrp_oms,
                  rec.prs_kostensoort_oms,
                  rec.prs_debiteur_naam,
                  - (rec.fin_verkoopfactuur_bedrag),
                  - (rec.fin_verkoopfactuur_btw),
                  rec.fin_btwtabelwaarde_code,
                  rec.fin_btwtabelwaarde_oms,
                  rec.fin_btwtabelwaarde_perc,
                  rec.fin_verkoopfactuur_maand,
                  rec.fin_verkoopfactuur_n1,
                  1,                                                 -- credit
                  rec.fin_verkoopfactuur_c1,
                  rec.fin_verkoopfactuur_c2,
                  rec.fin_verkoopfactuur_c3,
                  'ruimte/voorz',
                  rec.fin_verkoopfactuur_d1);

      fac.writelog (p_applname,
                    'D',
                    v_aanduiding,
                    'credits');
   END LOOP;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
            v_errorhint
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog (p_applname,
                    'E',
                    v_aanduiding || v_errormsg,
                    'Onbekende fout!');
      COMMIT;
END nybu_res_verkoopfacturen;
/

-- Genereert exportbestand voor CODA over externe en interne reserveringen
-- Voor externe reserveringen worden factuurregels gegenereerd, voor interne doorbelastingsregels.
-- Beide soorten komen in één bestand, met een scheidingsregel ertussen.
-- Alle geëxporteerde rsv_ruimtes worden gemarkeerd met "In laatste export"; alleen die reserveringen
-- worden verwerkt door de verwerk-export
-- res_srtkenmerk    241   Laatste export
-- fin_verkoopfactuur_n1 = intern/extern (0/1)
-- fin_verkoopfactuur_n2 = credit nee/ja (0/1)
-- fin_verkoopfactuur_c1 = reserveringnummer
-- fin_verkoopfactuur_c2 = klantnaam
-- fin_verkoopfactuur_c3 = klantreferentie
-- fin_verkoopfactuur_d1 = res_rsv_ruimte_van
-- fin_verkoopfactuur_d2 = periode_tot (alleen voor catering)

CREATE OR REPLACE PROCEDURE nybu_select_res_coda (p_applname   IN VARCHAR2,
                                                  p_applrun    IN VARCHAR2)
AS
   v_aanduiding            VARCHAR2 (200);
   v_errorhint             VARCHAR2 (1000);
   v_errormsg              VARCHAR2 (1000);
   oracle_err_num          NUMBER;
   oracle_err_mes          VARCHAR2 (200);

   -- Individuele facturen voor debiteuren; ook voor sommatieregel met totaalbedrag
   -- Bedragen zijn incl BTW
   -- NYBU#30023: expliciet filteren op soort = ruimte, want creditering alleen op
   -- rsv_ruimte en niet ook nog op bijbehorende rsv_deel'en en rsv_artikel'en
   -- Ik ben alleen geïnteresseerd in rsv_ruimtes mét kosten óf mét een creditbedrag
   CURSOR c_deb
   IS
        SELECT deb_nr,
               periode,
               kostenplaats,
               proj,
               SUM (bedrag) bedrag,
               SUM (credit) credit
          FROM (SELECT COALESCE (prs_debiteur_naam, fin_verkoopfactuur_c1)
                          deb_nr,
                       fin_verkoopfactuur_maand periode,
                       prs_kostenplaatsgrp_oms kostenplaats,
                       prs_kostenplaats_nr proj,
                       ROUND (
                          DECODE (
                             fin_verkoopfactuur_n2,
                             0,
                             fin_verkoopfactuur_bedrag
                             + COALESCE (fin_verkoopfactuur_btw, 0),
                             0),
                          2)
                          bedrag,
                       ROUND (
                          DECODE (
                             fin_verkoopfactuur_n2,
                             1,
                             - (fin_verkoopfactuur_bedrag
                                + COALESCE (fin_verkoopfactuur_btw, 0)),
                             0),
                          2)
                          credit
                  FROM fin_verkoopfactuur
                 WHERE fin_verkoopfactuur_n1 = 1                     -- extern
                       AND fin_verkoopfactuur_datum IS NULL
                       AND COALESCE (fin_verkoopfactuur_c4, 'NOP') =
                             'ruimte/voorz')
         WHERE bedrag != 0 OR credit != 0
      GROUP BY deb_nr,
               periode,
               kostenplaats,
               proj
      ORDER BY deb_nr,
               periode,
               kostenplaats,
               proj;

   -- Factuurregels voor deze factuur (ook crediteringen)
   -- NYBU#30023: expliciet filteren op prijs != 0
   -- NYBU#31401: expliciet filteren op prijs_ex + btw != 0, anders vallen regels met alleen BTW weg
   -- (dat zijn dan credits voor 'oude' exportregels waar de totalen ex_btw, btw_hoog en btw_laag
   -- werden geëxporteerd)
   CURSOR regels (
      in_deb_nr                  VARCHAR2,
      in_periode                 VARCHAR2,
      in_proj                    VARCHAR2)
   IS
      SELECT *
        FROM fin_verkoopfactuur
       WHERE COALESCE (prs_debiteur_naam, fin_verkoopfactuur_c1) = in_deb_nr
             AND fin_verkoopfactuur_maand = in_periode
             AND prs_kostenplaats_nr = in_proj
             AND fin_verkoopfactuur_datum IS NULL
             AND fin_verkoopfactuur_bedrag + fin_verkoopfactuur_btw != 0
             AND COALESCE (fin_verkoopfactuur_c4, 'NOP') = 'ruimte/voorz';

   -- Individuele facturen voor interne kostenplaatsen, gesommeerd per P-nummer (project)
   -- (Crediteringen gaan apart)
   -- Bedragen zijn excl BTW
   -- NYBU#30023: expliciet filteren op prijs != 0
   CURSOR c_intern
   IS
        SELECT deb_nr,
               periode,
               kostenplaats,
               proj,
               SUM (bedrag) bedrag,
               SUM (credit) credit
          FROM (SELECT COALESCE (prs_debiteur_naam, fin_verkoopfactuur_c1)
                          deb_nr,
                       fin_verkoopfactuur_maand periode,
                       prs_kostenplaatsgrp_oms kostenplaats,
                       prs_kostenplaats_nr proj,
                       ROUND (
                          DECODE (
                             fin_verkoopfactuur_n2,
                             0,
                             fin_verkoopfactuur_bedrag
                             + COALESCE (fin_verkoopfactuur_btw, 0),
                             0),
                          2)
                          bedrag,
                       ROUND (
                          DECODE (
                             fin_verkoopfactuur_n2,
                             1,
                             - (fin_verkoopfactuur_bedrag
                                + COALESCE (fin_verkoopfactuur_btw, 0)),
                             0),
                          2)
                          credit
                  FROM fin_verkoopfactuur
                 WHERE fin_verkoopfactuur_n1 = 0                     -- intern
                       AND fin_verkoopfactuur_datum IS NULL
                       AND COALESCE (fin_verkoopfactuur_c4, 'NOP') =
                             'ruimte/voorz')
         WHERE bedrag != 0 OR credit != 0
      GROUP BY deb_nr,
               periode,
               kostenplaats,
               proj
      ORDER BY deb_nr,
               periode,
               kostenplaats,
               proj;

   CURSOR regels_intern (
      in_deb_nr                  VARCHAR2,
      in_periode                 VARCHAR2,
      in_proj                    VARCHAR2)
   IS
      SELECT *
        FROM fin_verkoopfactuur
       WHERE COALESCE (prs_debiteur_naam, fin_verkoopfactuur_c1) = in_deb_nr
             AND fin_verkoopfactuur_maand = in_periode
             AND prs_kostenplaats_nr = in_proj
             AND fin_verkoopfactuur_datum IS NULL
             AND fin_verkoopfactuur_bedrag + fin_verkoopfactuur_btw != 0
             AND COALESCE (fin_verkoopfactuur_c4, 'NOP') = 'ruimte/voorz';

   -- Voor markeren van de externe + interne reserveringen die we net gefactureerd/doorbelast/gecrediteerd
   -- hebben. (Daarvoor zetten we het kenmerk "In laatste export")
   -- Dat zijn: alle reserveringen in nybu_v_res_factuur_ex-/intern, ook met prijs = 0
   --           (dus dat is inclusief alle gecrediteerde reserveringen)
   CURSOR c_markeren
   IS
      SELECT DISTINCT res_rsv_ruimte_key, reservering
        FROM nybu_v_res_factuur_extern
      UNION ALL
      SELECT DISTINCT res_rsv_ruimte_key, reservering
        FROM nybu_v_res_factuur_intern;

   v_teller                NUMBER;
   v_rap_count             NUMBER;
   v_kenmerk_key_laatste   NUMBER;
BEGIN
   v_teller := 0;
   v_rap_count := 0;

   v_aanduiding := 'Init';
   v_errormsg := 'Periode bepalen';

   DELETE imp_log
    WHERE imp_log_applicatie = p_applname;

   DELETE fac_rapport
    WHERE fac_rapport_node = p_applname;

   -- Boekhouding: markering "In laatste export" verwijderen, zodat we met een schone lei beginnen
   DELETE res_kenmerkwaarde
    WHERE res_kenmerk_key IN (SELECT res_kenmerk_key
                                FROM res_kenmerk
                               WHERE res_srtkenmerk_key = 241);

   -- Vul tabel fin_verkoopfactuur met nieuwe regels (procedure verwijdert oude regels zelf al)
   nybu_res_verkoopfacturen (p_applname, p_applrun);

   -- Genereer headerregel
   INSERT INTO fac_rapport (fac_rapport_node,
                            fac_rapport_volgnr,
                            fac_rapport_regel,
                            fac_rapport_soort)
       VALUES (p_applname,
               v_rap_count,
               '"NUMMER";"ADM";"GROOTBK";"DEB / KPL";"PROJ";"BEDRAG (INCL BTW)";"D/C";"BTW";"DATUM (DD-MM) + OMSCHRIJVING";"(EXT REF 2)";"(EXT REF 3)";"KLANTREFERENTIE (EXT REF 1)";"COMMENTAAR (EXT REF 4)";"EXTRA VELD (EXT REF 5)";"REGELTYPE";"DOCNR"',
               0);

   -- Genereer sommatie-, specificatie- en creditregels voor debiteuren
   FOR rec IN c_deb
   LOOP
      v_errormsg := 'Sommatieregel aanmaken';
      v_teller := v_teller + 1;
      v_aanduiding :=
            v_teller
         || ': '
         || rec.deb_nr
         || '/'
         || rec.proj
         || ' ('
         || rec.periode
         || ')';
      v_rap_count := v_rap_count + 1;

      -- Sommatieregel
      INSERT INTO fac_rapport (fac_rapport_node,
                               fac_rapport_volgnr,
                               fac_rapport_regel,
                               fac_rapport_soort)
          VALUES (p_applname,
                  v_rap_count,
                     v_teller
                  || ';'
                  ||                                                 -- nummer
                    '10;'
                  ||                                                    -- adm
                    '13000;'
                  ||                                                -- grootbk
                    rec.deb_nr
                  || ';'
                  ||                                                -- deb/kpl
                    ';'
                  ||                                                   -- proj
                    TRIM(TO_CHAR (
                            ABS (rec.bedrag - COALESCE (rec.credit, 0)),
                            '99999999D99',
                            'NLS_NUMERIC_CHARACTERS=,.'))
                  || ';'
                  ||                                                 -- bedrag
                    CASE
                        WHEN rec.bedrag - COALESCE (rec.credit, 0) < 0
                        THEN
                           'C;'
                        WHEN rec.bedrag - COALESCE (rec.credit, 0) >= 0
                        THEN
                           'D;'
                     END
                  ||                                                    -- d/c
                    ';'
                  ||                                                    -- btw
                    SUBSTR (
                        'Zaalhuur '
                        || nybu.getPeriodeNaam (rec.periode, 'NL'),
                        1,
                        36)
                  || ';'
                  ||                                   -- datum + omschrijving
                    rec.proj
                  || ';'
                  ||                                              -- ext ref 2
                    ';'
                  ||                                              -- ext ref 3
                    rec.kostenplaats
                  || ';'
                  ||                            -- klantreferentie (ext ref 1)
                    ';'
                  ||                                 -- commentaar (ext ref 4)
                    ';'
                  ||                                 -- extra veld (ext ref 5)
                    'Summary;'
                  ||                                              -- regeltype
                    '',                                               -- docnr
                  0);

      IF rec.credit != 0
      THEN
         fac.writelog (
            p_applname,
            'S',
               'Externe facturen: '
            || rec.deb_nr
            || ' ('
            || rec.proj
            || ')'
            || ' totaal €'
            || TO_CHAR (rec.bedrag)
            || ' - €'
            || TO_CHAR (rec.credit)
            || ' incl BTW',
            'extern');
      ELSE
         fac.writelog (
            p_applname,
            'S',
               'Externe facturen: '
            || rec.deb_nr
            || ' ('
            || rec.proj
            || ')'
            || ' totaal €'
            || TO_CHAR (rec.bedrag)
            || ' incl BTW',
            'extern');
      END IF;

      -- Specificatieregels
      FOR reg IN regels (rec.deb_nr, rec.periode, rec.proj)
      LOOP
         v_errormsg := 'Specificatieregel aanmaken';
         v_aanduiding :=
               v_teller
            || ': '
            || rec.deb_nr
            || '/'
            || rec.proj
            || ' - '
            || reg.fin_verkoopfactuur_c1
            || ' ('
            || rec.periode
            || ')';
         v_rap_count := v_rap_count + 1;

         INSERT INTO fac_rapport (fac_rapport_node,
                                  fac_rapport_volgnr,
                                  fac_rapport_regel,
                                  fac_rapport_soort)
             VALUES (p_applname,
                     v_rap_count,
                        v_teller
                     || ';'
                     ||                                              -- nummer
                       '12;'
                     ||                                                 -- adm
                       reg.prs_kostensoort_oms
                     || ';'
                     ||                                             -- grootbk
                       reg.prs_kostenplaatsgrp_oms
                     || ';'
                     ||                                             -- deb/kpl
                       reg.prs_kostenplaats_nr
                     || ';'
                     ||                                                -- proj
                       TRIM(TO_CHAR (
                               ROUND (
                                  ABS(reg.fin_verkoopfactuur_bedrag
                                      + reg.fin_verkoopfactuur_btw),
                                  2),
                               '99999999D99',
                               'NLS_NUMERIC_CHARACTERS=,.'))
                     || ';'
                     ||                                              -- bedrag
                       CASE
                           WHEN reg.fin_verkoopfactuur_bedrag
                                + reg.fin_verkoopfactuur_btw < 0
                           THEN
                              'D;'
                           WHEN reg.fin_verkoopfactuur_bedrag
                                + reg.fin_verkoopfactuur_btw >= 0
                           THEN
                              'C;'
                        END
                     ||                                                 -- d/c
                       reg.fin_btwtabelwaarde_code
                     || ';'
                     ||                                                 -- btw
                       '"'
                     || SUBSTR (
                           TO_CHAR (reg.fin_verkoopfactuur_d1, 'DD-MM ')
                           || reg.fin_verkoopfactuur_omschr,
                           1,
                           36)
                     || '";'
                     ||                                -- datum + omschrijving
                       ';'
                     ||                                           -- ext ref 2
                       ';'
                     ||                                           -- ext ref 3
                       DECODE (reg.fin_verkoopfactuur_c3,
                               NULL, ';',
                               '"' || reg.fin_verkoopfactuur_c3 || '";')
                     ||                          -- klantreferente (ext ref 1)
                       '"Info: Sales &'
                     || ' Events 0346-291544";'
                     ||                              -- commentaar (ext ref 4)
                       '"Periode: '
                     || nybu.getPeriodeNaam (reg.fin_verkoopfactuur_maand,
                                             'NL')
                     || '";'
                     ||                              -- extra veld (ext ref 5)
                       'Analysis;'
                     ||                                           -- regeltype
                       reg.fin_verkoopfactuur_c1,                     -- docnr
                     0);
      END LOOP;
   END LOOP;


   -- Scheidingsregel
   v_errormsg := 'Scheidingsregel aanmaken';
   v_rap_count := v_rap_count + 1;

   INSERT INTO fac_rapport (fac_rapport_node,
                            fac_rapport_volgnr,
                            fac_rapport_regel,
                            fac_rapport_soort)
       VALUES (p_applname,
               v_rap_count,
               '"Nummer";"Adm.";"Grootboek";"Kostenplaats";"Project";"Medewerker";"Bedrag";"D/C";"Regelomschrijving"',
               0);

   v_teller := 0;

   -- Genereer regels voor interne kostenplaatsen
   -- Tegenboekingsregel (opbrengsten-boeking)
   v_errormsg := 'Opbrengsten-regel aanmaken';
   v_rap_count := v_rap_count + 1;

   INSERT INTO fac_rapport (fac_rapport_node,
                            fac_rapport_volgnr,
                            fac_rapport_regel,
                            fac_rapport_soort)
      SELECT p_applname,
             v_rap_count,
                '1;'
             || ';'
             || ks.prs_kostensoort_oms
             || ';'
             || TRIM (SUBSTR (kg.prs_kostenplaatsgrp_oms, 1, 7))
             || ';'
             || k.prs_kostenplaats_nr
             || ';'
             || ';'
             || TRIM(TO_CHAR (ABS (vf.bedrag),
                              '99999999D99',
                              'NLS_NUMERIC_CHARACTERS=,.'))
             || ';'
             || CASE
                   WHEN vf.bedrag < 0 THEN 'D'
                   WHEN vf.bedrag >= 0 THEN 'C'
                END
             || ';'
             || '"Zaalhuur '
             || nybu.getPeriodeNaam (vf.periode, 'NL')
             || '"',
             0
        FROM prs_kostensoort ks,
             prs_kostenplaats k,
             prs_kostenplaatsgrp kg,
             (SELECT SUM (fin_verkoopfactuur_bedrag) bedrag,
                     MAX (fin_verkoopfactuur_maand) periode
                FROM fin_verkoopfactuur
               WHERE fin_verkoopfactuur_datum IS NULL
                     AND fin_verkoopfactuur_n1 = 0                   -- intern
                     AND COALESCE (fin_verkoopfactuur_c4, 'NOP') =
                           'ruimte/voorz') vf
       WHERE     ks.prs_kostensoort_oms = '76015'
             AND k.prs_kostenplaats_key = ks.prs_kostenplaats_key
             AND kg.prs_kostenplaatsgrp_key = k.prs_kostenplaatsgrp_key;

   -- Genereer specificatieregels voor interne kostenplaatsen
   FOR rec IN c_intern
   LOOP
      IF rec.credit != 0
      THEN
         fac.writelog (
            p_applname,
            'S',
               'Externe facturen: '
            || rec.deb_nr
            || ' ('
            || rec.proj
            || ')'
            || ' totaal €'
            || TO_CHAR (rec.bedrag)
            || ' - €'
            || TO_CHAR (rec.credit)
            || ' incl BTW',
            'extern');
      ELSE
         fac.writelog (
            p_applname,
            'S',
               'Externe facturen: '
            || rec.deb_nr
            || ' ('
            || rec.proj
            || ')'
            || ' totaal €'
            || TO_CHAR (rec.bedrag)
            || ' incl BTW',
            'extern');
      END IF;

      -- Specificatieregels
      FOR reg IN regels_intern (rec.deb_nr, rec.periode, rec.proj)
      LOOP
         v_errormsg := 'Specificatieregel aanmaken';
         v_aanduiding :=
               v_teller
            || ': '
            || rec.deb_nr
            || '/'
            || rec.proj
            || ' - '
            || reg.fin_verkoopfactuur_c1
            || ' ('
            || rec.periode
            || ')';
         v_rap_count := v_rap_count + 1;

         INSERT INTO fac_rapport (fac_rapport_node,
                                  fac_rapport_volgnr,
                                  fac_rapport_regel,
                                  fac_rapport_soort)
             VALUES (p_applname,
                     v_rap_count,
                        v_teller
                     || ';'                                          -- nummer
                     || ';'                                             -- adm
                     || '56015;'                                    -- grootbk
                     || rec.kostenplaats
                     || ';'                                    ---kostenplaats
                     || rec.proj
                     || ';'                                         -- project
                     || ';'                                     --- medewerker
                     || TRIM(TO_CHAR (
                                ROUND (
                                   ABS(reg.fin_verkoopfactuur_bedrag
                                       + reg.fin_verkoopfactuur_btw),
                                   2),
                                '99999999D99',
                                'NLS_NUMERIC_CHARACTERS=,.'))
                     || ';'
                     || CASE
                           WHEN reg.fin_verkoopfactuur_bedrag
                                + reg.fin_verkoopfactuur_btw >= 0
                           THEN
                              'D;'
                           WHEN reg.fin_verkoopfactuur_bedrag
                                + reg.fin_verkoopfactuur_btw < 0
                           THEN
                              'C;'
                        END
                     || SUBSTR (
                           TO_CHAR (reg.fin_verkoopfactuur_d1, 'DD-MM ')
                           || reg.fin_verkoopfactuur_omschr,
                           1,
                           36)
                     || ';'
                     ||                                -- datum + omschrijving
                       '"Periode: '
                     || nybu.getPeriodeNaam (reg.fin_verkoopfactuur_maand,
                                             'NL')
                     || '";'
                     ||                              -- extra veld (ext ref 5)
                       'Analysis;'
                     ||                                           -- regeltype
                       reg.fin_verkoopfactuur_c1,                     -- docnr
                     0);
      END LOOP;
   END LOOP;

   -- Boekhouding: markeer alle reserveringen die we net gefactureerd hebben
   FOR rec IN c_markeren
   LOOP
      v_aanduiding := rec.reservering;
      v_errormsg := 'Kenmerk "In laatste export" bepalen';

      -- Vind kenmerk bij kenmerksoort voor activiteit van rsv_ruimte
      SELECT res_kenmerk_key
        INTO v_kenmerk_key_laatste
        FROM res_kenmerk k, res_rsv_ruimte rr
       WHERE     k.res_srtkenmerk_key = 241
             AND rr.res_activiteit_key = k.res_activiteit_key
             AND rr.res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

      v_errormsg := 'Reservering markeren';
      nybu.upsertkenmerk_res (v_kenmerk_key_laatste,
                              rec.res_rsv_ruimte_key,
                              '1');
   END LOOP;

   fac.writelog (p_applname,
                 'S',
                 'Factuurregels gegenereerd',
                 '');

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
            v_errorhint
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog (p_applname,
                    'E',
                    v_aanduiding || v_errormsg,
                    'Onbekende fout!');
      COMMIT;
END nybu_select_res_coda;
/

CREATE OR REPLACE VIEW nybu_v_export_res_coda
AS
     SELECT fac_rapport_regel result, fac_rapport_volgnr result_order
       FROM fac_rapport
      WHERE fac_rapport_node = 'RES_CODA'
   ORDER BY fac_rapport_volgnr;

-- Zet status van de met RES_CODA geëxporteerde reserveringen op Verwerkt.
-- res_srtkenmerk    202   Exportdatum
-- res_srtkenmerk    261   Geëxporteerd bedrag
-- res_srtkenmerk    203   Te crediteren
-- res_srtkenmerk    241   In laatste export
-- fin_verkoopfactuur_n1 = intern/extern (0/1)
-- fin_verkoopfactuur_n2 = credit nee/ja (0/1)
-- fin_verkoopfactuur_c1 = reserveringnummer
-- NB: "In laatste export" wordt door de verwerk-export niet gereset

CREATE OR REPLACE PROCEDURE nybu_export_res_verwerk (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2,
   p_filedir    IN VARCHAR2,
   p_filename   IN VARCHAR2)
AS
   v_aanduiding          VARCHAR2 (200);
   v_errorhint           VARCHAR2 (1000);
   v_errormsg            VARCHAR2 (1000);
   oracle_err_num        NUMBER;
   oracle_err_mes        VARCHAR2 (200);

   -- Alle doorbelaste rsv_ruimtes
   -- NYBU#30023: niet meer verwerken, maar exportdatum + bedragen zetten
   -- TODO: 6 maanden na dato verwerken?
   CURSOR c_rsv
   IS
      SELECT DISTINCT res_rsv_ruimte_key, reservering
        FROM nybu_v_res_factuur_extern
       WHERE 1 = 0
      UNION ALL
      SELECT DISTINCT
             rr.res_rsv_ruimte_key,
             rr.res_reservering_key || '/' || rr.res_rsv_ruimte_volgnr volgnr
        FROM res_rsv_ruimte rr, prs_kostenplaats k
       WHERE     1 = 0
             AND COALESCE (k.prs_kostenplaats_extern, 0) = 0
             AND rr.prs_kostenplaats_key = k.prs_kostenplaats_key
             AND ( (rr.res_rsv_ruimte_verwijder IS NULL
                    AND rr.res_status_bo_key = 5)
                  OR (    res_rsv_ruimte_verwijder IS NOT NULL
                      AND rr.res_status_bo_key < 6
                      AND rr.res_status_fo_key = 4));

   -- Gefactureerde externe + interne reserveringen in laatste export
   -- Bepaal gefactureerde bedragen per en leg vast bij deelreservering
   -- O.b.v. kenmerk "In laatste export" alleen reserveringen uit laatste export
   CURSOR c_fact
   IS
      SELECT ei.*, COALESCE (vf.prijs, 0) prijs
        FROM    (SELECT DISTINCT fe.res_rsv_ruimte_key,
                                 reservering,
                                 'extern' inex,
                                 'incl' inclexcl
                   FROM nybu_v_res_factuur_extern fe,
                        res_kenmerkwaarde kw,
                        res_kenmerk k
                  WHERE     kw.res_rsv_ruimte_key = fe.res_rsv_ruimte_key
                        AND kw.res_kenmerkreservering_waarde = '1'
                        AND kw.res_kenmerkwaarde_verwijder IS NULL
                        AND k.res_kenmerk_key = kw.res_kenmerk_key
                        AND k.res_srtkenmerk_key = 241
                        AND k.res_kenmerk_verwijder IS NULL
                 UNION ALL
                 SELECT DISTINCT fi.res_rsv_ruimte_key,
                                 reservering,
                                 'intern' inex,
                                 'excl' inclexcl
                   FROM nybu_v_res_factuur_intern fi,
                        res_kenmerkwaarde kw,
                        res_kenmerk k
                  WHERE     kw.res_rsv_ruimte_key = fi.res_rsv_ruimte_key
                        AND kw.res_kenmerkreservering_waarde = '1'
                        AND kw.res_kenmerkwaarde_verwijder IS NULL
                        AND k.res_kenmerk_key = kw.res_kenmerk_key
                        AND k.res_srtkenmerk_key = 241
                        AND k.res_kenmerk_verwijder IS NULL) ei
             LEFT OUTER JOIN
                (  SELECT fac.safe_to_number (vf.fin_verkoopfactuur_refkey)
                             res_rsv_ruimte_key,
                          ROUND (
                             SUM(fin_verkoopfactuur_bedrag
                                 + fin_verkoopfactuur_btw),
                             2)
                             prijs
                     FROM fin_verkoopfactuur vf
                    WHERE     vf.fin_verkoopfactuur_datum IS NULL
                          AND vf.fin_verkoopfactuur_c4 = 'ruimte/voorz'
                          AND vf.fin_verkoopfactuur_n2 = 0 -- geen creditering
                 GROUP BY fin_verkoopfactuur_refkey) vf
             ON vf.res_rsv_ruimte_key = ei.res_rsv_ruimte_key;

   -- Gecrediteerde reserveringen in laatste export
   -- Wis vink "Te crediteren"
   CURSOR c_cred
   IS
      SELECT rr.res_rsv_ruimte_key,
             rr.res_reservering_key || '/' || rr.res_rsv_ruimte_volgnr
                reservering,
             COALESCE (vf.credit, 0) credit,
             vf.inex,
             vf.inclexcl
        FROM res_rsv_ruimte rr,
             (SELECT kw.*
                FROM res_kenmerkwaarde kw, res_kenmerk k
               WHERE     k.res_srtkenmerk_key = 203
                     AND kw.res_kenmerk_key = k.res_kenmerk_key
                     AND kw.res_kenmerkwaarde_verwijder IS NULL
                     AND k.res_kenmerk_verwijder IS NULL
                     AND kw.res_kenmerkreservering_waarde = '1') te_cred,
             (SELECT kw.*
                FROM res_kenmerkwaarde kw, res_kenmerk k
               WHERE     k.res_srtkenmerk_key = 241
                     AND k.res_kenmerk_key = kw.res_kenmerk_key
                     AND kw.res_kenmerkwaarde_verwijder IS NULL
                     AND k.res_kenmerk_verwijder IS NULL
                     AND kw.res_kenmerkreservering_waarde = '1') in_laatste,
             (  SELECT fac.safe_to_number (fin_verkoopfactuur_refkey)
                          res_rsv_ruimte_key,
                       fin_verkoopfactuur_c1 reservering,
                       ROUND (
                          SUM(fin_verkoopfactuur_bedrag
                              + fin_verkoopfactuur_btw),
                          2)
                       * -1
                          credit,
                       DECODE (fin_verkoopfactuur_n1, 0, 'intern', 1, 'extern')
                          inex,
                       DECODE (fin_verkoopfactuur_n1, 0, 'excl', 1, 'incl')
                          inclexcl
                  FROM fin_verkoopfactuur
                 WHERE fin_verkoopfactuur_datum IS NULL
                       AND fin_verkoopfactuur_n2 = 1            -- creditering
              GROUP BY fin_verkoopfactuur_refkey,
                       fin_verkoopfactuur_n1,
                       fin_verkoopfactuur_c1) vf
       WHERE     te_cred.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
             AND in_laatste.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
             AND vf.res_rsv_ruimte_key(+) = rr.res_rsv_ruimte_key
             -- Geen exportdatum
             AND NOT EXISTS
                   (SELECT 1
                      FROM res_kenmerkwaarde kw, res_kenmerk k
                     WHERE     k.res_srtkenmerk_key = 202
                           AND kw.res_kenmerk_key = k.res_kenmerk_key
                           AND kw.res_kenmerkwaarde_verwijder IS NULL
                           AND k.res_kenmerk_verwijder IS NULL
                           AND kw.res_rsv_ruimte_key = rr.res_rsv_ruimte_key);

   v_periode             VARCHAR (6);
   v_periodeNaam         VARCHAR2 (20);
   v_kenmerk_key_cred    NUMBER;
   v_kenmerk_key_datum   NUMBER;
   v_kenmerk_key_geexp   NUMBER;
   v_trackmessage        VARCHAR2 (100);
BEGIN
   v_aanduiding := 'Init';
   v_errormsg := 'Periode bepalen';

   -- Deze export gaat over de maand-van-de-meest-recente-reserveringsdatum.
   SELECT TO_CHAR (MAX (res_rsv_ruimte_van), 'YYYYMM')
     INTO v_periode
     FROM nybu_v_res_factuur_extern;

   v_periodeNaam := nybu.getPeriodeNaam (v_periode, 'NL');

   DELETE imp_log
    WHERE imp_log_applicatie = p_applname;

   -- Gecrediteerde facturen: wis vinkje "Te crediteren" en geëxporteerde bedragen, maak tracking
   FOR rec IN c_cred
   LOOP
      v_aanduiding := rec.reservering;
      v_errorhint := 'Kenmerk "Te crediteren" bepalen';

      -- Vind kenmerk bij kenmerksoort voor activiteit van rsv_ruimte
      SELECT cred.res_kenmerk_key, geexp.res_kenmerk_key
        INTO v_kenmerk_key_cred, v_kenmerk_key_geexp
        FROM res_kenmerk cred, res_kenmerk geexp, res_rsv_ruimte rr
       WHERE     cred.res_srtkenmerk_key = 203
             AND geexp.res_srtkenmerk_key = 261
             AND cred.res_kenmerk_verwijder IS NULL
             AND geexp.res_kenmerk_verwijder IS NULL
             AND rr.res_activiteit_key = cred.res_activiteit_key
             AND rr.res_activiteit_key = geexp.res_activiteit_key
             AND rr.res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

      v_errormsg := 'Reset "Te crediteren"';
      nybu.upsertkenmerk_res (v_kenmerk_key_cred,
                              rec.res_rsv_ruimte_key,
                              NULL);
      v_errormsg := 'Reset bedrag';
      nybu.upsertkenmerk_res (v_kenmerk_key_geexp,
                              rec.res_rsv_ruimte_key,
                              NULL);

      fac.trackaction (
         'RESUPD',
         rec.res_rsv_ruimte_key,
         NULL,
         SYSDATE,
            '€'
         || TO_CHAR (rec.credit)
         || ' '
         || rec.inclexcl
         || ' BTW gecrediteerd');
      fac.writelog (
         p_applname,
         'I',
            rec.reservering
         || ': €'
         || TO_CHAR (rec.credit)
         || ' '
         || rec.inclexcl
         || ' BTW gecrediteerd',
         rec.inex);
   END LOOP;

   -- Externe + interne reserveringen: zet exportdatum en gefactureerd bedrag (incl resp excl BTW)
   -- En zet exportdatum in verkoopfactuurtabel
   FOR rec IN c_fact
   LOOP
      v_aanduiding := rec.reservering;
      v_errorhint := 'Kenmerken bepalen';

      -- Vind kenmerk bij kenmerksoort voor activiteit van rsv_ruimte
      SELECT datum.res_kenmerk_key, geexp.res_kenmerk_key
        INTO v_kenmerk_key_datum, v_kenmerk_key_geexp
        FROM res_kenmerk datum, res_kenmerk geexp, res_rsv_ruimte rr
       WHERE     datum.res_srtkenmerk_key = 202
             AND geexp.res_srtkenmerk_key = 261
             AND datum.res_kenmerk_verwijder IS NULL
             AND geexp.res_kenmerk_verwijder IS NULL
             AND rr.res_activiteit_key = datum.res_activiteit_key
             AND rr.res_activiteit_key = geexp.res_activiteit_key
             AND rr.res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

      v_aanduiding := rec.reservering;
      v_errorhint := 'Update kenmerken (' || rec.inex || ')';
      nybu.upsertkenmerk_res (v_kenmerk_key_datum,
                              rec.res_rsv_ruimte_key,
                              TO_CHAR (SYSDATE, 'DD-MM-YYYY'));

      IF (rec.prijs != 0)
      THEN
         nybu.upsertkenmerk_res (v_kenmerk_key_geexp,
                                 rec.res_rsv_ruimte_key,
                                 TO_CHAR (rec.prijs));
         v_trackmessage :=
               '€'
            || TO_CHAR (rec.prijs)
            || ' '
            || rec.inclexcl
            || ' BTW gefactureerd';
      ELSE
         v_trackmessage := 'Exportdatum gezet (geen kosten bij reservering)';
      END IF;

      fac.trackaction ('RESUPD',
                       rec.res_rsv_ruimte_key,
                       NULL,
                       SYSDATE,
                       v_trackmessage);
      fac.writelog (p_applname,
                    'I',
                    rec.reservering || ': ' || v_trackmessage,
                    rec.inex);

      v_errorhint := 'Zet exportdatum in verkoopfactuur';

      --- nybu#39069 geen datum zetten bij regels die betrekking hebben op catering
      UPDATE fin_verkoopfactuur
         SET fin_verkoopfactuur_datum = SYSDATE
       WHERE fac.safe_to_number (fin_verkoopfactuur_refkey) =
                rec.res_rsv_ruimte_key
             AND fin_verkoopfactuur_c4 = 'ruimte/voorz';
   END LOOP;

   FOR rec IN c_rsv
   LOOP
      v_aanduiding :=
            'Reservering '
         || rec.reservering
         || ' ('
         || rec.res_rsv_ruimte_key
         || ')';

      v_errormsg := 'Verbruiksartikelen verwerken';

      UPDATE res_rsv_artikel
         SET res_status_bo_key = 6
       WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

      v_errormsg := 'Voorzieningen verwerken';

      UPDATE res_rsv_deel
         SET res_status_bo_key = 6
       WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

      v_errormsg := 'Ruimte verwerken';

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

      fac.writelog (p_applname,
                    'I',
                    'Reservering verwerkt',
                    rec.reservering);

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

   fac.writelog (p_applname,
                 'S',
                 'Reserveringen verwerkt',
                 'Periode ' || v_periodeNaam);
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      ROLLBACK;
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
            v_errorhint
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog (p_applname,
                    'E',
                    v_aanduiding || v_errormsg,
                    'Onbekende fout! Niets verwerkt.');
      COMMIT;
END nybu_export_res_verwerk;
/


-- Genereert exportbestand voor doorbelasting catering over interne reserveringen
-- fin_verkoopfactuur_n1 = intern/extern (0 = intern)
-- fin_verkoopfactuur_n2 = credit nee/ja (0 = nee)
-- fin_verkoopfactuur_c1 = reserveringnummer
-- fin_verkoopfactuur_c2 = klantnaam
-- fin_verkoopfactuur_c3 = klantreferentie
-- fin_verkoopfactuur_c4 = catering
-- fin_verkoopfactuur_d1 = res_rsv_ruimte_van
-- fin_verkoopfactuur_d2 = periode_tot (alleen voor catering)

CREATE OR REPLACE PROCEDURE nybu_select_res_cat (p_applname   IN VARCHAR2,
                                                 p_applrun    IN VARCHAR2)
AS
   v_aanduiding              VARCHAR2 (200);
   v_errorhint               VARCHAR2 (1000);
   v_errormsg                VARCHAR2 (1000);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);

   CURSOR c (c_tot DATE)
   IS
        SELECT klant,
               res_rsv_ruimte_van,
               periode,
               grootboek,
               kostenplaats_key,
               kostenplaats,
               deb_nr,
               proj_key,
               proj,
               btw,
               prs_kostensoort_btw,
               res_key,
               res_volgnr,
               referentie,
               res_rsv_ruimte_key,
               descr,
               aantal,
               omschrijving,
               soort,
               btw_code,
               SUM (prijs_ex) prijs_ex,
               SUM (prijs_inc) prijs_inc,
               SUM (btw_laag) btw_laag,
               SUM (btw_hoog) btw_hoog,
               SUM (korting) korting,
               SUM (inex) inex
          FROM (SELECT k.prs_kostenplaats_omschrijving klant,
                       rr.res_rsv_ruimte_van,
                       TO_CHAR (rr.res_rsv_ruimte_van, 'YYYYMM') periode,
                       ks.prs_kostensoort_oms grootboek,
                       kg.prs_kostenplaatsgrp_key kostenplaats_key,
                       TRIM (SUBSTR (kg.prs_kostenplaatsgrp_oms, 1, 7))
                          kostenplaats,
                       k.prs_kostenplaats_nr deb_nr,
                       k.prs_kostenplaats_key proj_key,
                       k.prs_kostenplaats_nr proj,
                       CASE
                          WHEN btw.perc > 9
                          THEN
                             btw.perc
                          WHEN (btw.perc = 6 OR btw.perc = 9)
                          THEN
                             CASE
                                WHEN rra.res_rsv_artikel_levering <
                                        TO_DATE ('1-1-2019', 'dd-mm-yyyy')
                                THEN
                                   6
                                ELSE
                                   9
                             END
                          ELSE
                             0
                       END
                          btw,
                       ks.prs_kostensoort_btw,
                       CASE
                          WHEN btw.perc > 9
                          THEN
                             btw.btw_code
                          WHEN (btw.perc = 6 OR btw.perc = 9)
                          THEN
                             CASE
                                WHEN rra.res_rsv_artikel_levering <
                                        TO_DATE ('1-1-2019', 'dd-mm-yyyy')
                                THEN
                                   'VL'
                                ELSE
                                   btw.btw_code
                             END
                          ELSE
                             btw.btw_code
                       END
                          btw_code,
                       rr.res_reservering_key res_key,
                       rr.res_rsv_ruimte_volgnr res_volgnr,
                       NULL referentie,
                          rr.res_reservering_key
                       || '/'
                       || rr.res_rsv_ruimte_volgnr
                          reservering,
                       rr.res_rsv_ruimte_key,
                       rr.res_rsv_ruimte_omschrijving descr,
                       1 aantal,
                       NVL (
                          (SELECT r.res_ruimte_nr
                             FROM res_ruimte_opstelling ro, res_ruimte r
                            WHERE ro.res_ruimte_opstel_key =
                                     rr.res_ruimte_opstel_key
                                  AND r.res_ruimte_key = ro.res_ruimte_key),    ---- NVL ipv coalesce aangepast nav Oracle bug #55835
                          (SELECT    'Kamer '
                                  || alg_ruimte_nr
                                  || ' ('
                                  || alg_ruimte_omschrijving
                                  || ')'
                             FROM alg_v_ruimte_gegevens rg
                            WHERE rg.alg_ruimte_key = rr.alg_ruimte_key))
                          omschrijving,
                       'catering' soort,
                       (rra.res_rsv_artikel_prijs
                        / ( (CASE
                                WHEN btw.perc > 9
                                THEN
                                   btw.perc
                                WHEN (btw.perc = 6 OR btw.perc = 9)
                                THEN
                                   CASE
                                      WHEN rra.res_rsv_artikel_levering <
                                              TO_DATE ('1-1-2019',
                                                       'dd-mm-yyyy')
                                      THEN
                                         6
                                      ELSE
                                         9
                                   END
                                ELSE
                                   0
                             END)
                           + 100))
                       * 100
                          prijs_ex,
                       rra.res_rsv_artikel_prijs prijs_inc,
                       DECODE (
                          btw.perc,
                          9,
                          rra.res_rsv_artikel_prijs
                          * (CASE
                                WHEN rra.res_rsv_artikel_levering <
                                        TO_DATE ('1-1-2019', 'dd-mm-yyyy')
                                THEN
                                   6
                                ELSE
                                   9
                             END)
                          / (100
                             + (CASE
                                   WHEN rra.res_rsv_artikel_levering <
                                           TO_DATE ('1-1-2019', 'dd-mm-yyyy')
                                   THEN
                                      6
                                   ELSE
                                      9
                                END)),
                          0)
                          btw_laag,
                       DECODE (
                          btw.perc,
                          21,
                            rra.res_rsv_artikel_prijs
                          * btw.perc
                          / (100 + btw.perc),
                          0)
                          btw_hoog,
                       0 korting,
                       0 inex
                  FROM res_rsv_ruimte rr,
                       prs_kostenplaats k,
                       prs_kostenplaatsgrp kg,
                       res_rsv_artikel rra,
                       res_artikel ra,
                       res_discipline di,
                       prs_kostensoort ks,
                       (SELECT fac.safe_to_number (fac_usrdata_upper) perc,
                               fac_usrdata_omschr btw_code
                          FROM fac_usrdata
                         WHERE fac_usrtab_key = 42
                               AND fac_usrdata_verwijder IS NULL) btw
                 WHERE COALESCE (k.prs_kostenplaats_extern, 0) = 0
                       AND kg.prs_kostenplaatsgrp_key =
                             k.prs_kostenplaatsgrp_key
                       AND rr.prs_kostenplaats_key = k.prs_kostenplaats_key
                       AND rr.res_rsv_ruimte_dirtlevel = 0
                       AND rr.res_rsv_ruimte_afgerond = 1
                       AND rr.res_rsv_ruimte_verwijder IS NULL
                       AND rra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                       AND rra.res_artikel_key = ra.res_artikel_key
                       AND ra.res_discipline_key = di.ins_discipline_key
                       AND ks.prs_kostensoort_key = di.prs_kostensoort_key
                       AND di.ins_discipline_key NOT IN (462, 581, 741) -- hotelkamers, inhuur voorzieningen, linnen
                       AND ra.res_artikel_btw = btw.perc
                       AND rra.res_rsv_artikel_prijs <> 0
                       AND rra.res_rsv_artikel_levering  < c_tot
                       AND NOT EXISTS -- flag reservering bevat catering op externe kostenplaats is niet gezet.
                             (SELECT res_kenmerkwaarde_key
                                FROM res_kenmerkwaarde kw, res_kenmerk k
                               WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                                     AND k.res_srtkenmerk_key = 321 -- Reservering bevat catering op externe kostenpaats.
                                     AND kw.res_rsv_ruimte_key =
                                           rr.res_rsv_ruimte_key
                                     AND fac.safe_to_number (
                                           kw.res_kenmerkreservering_waarde) =
                                           1)
                       AND NOT EXISTS -- entry komt nog niet voor in de verkoopfactuurtabel
                             (SELECT fin_verkoopfactuur_key
                                FROM fin_verkoopfactuur vf
                               WHERE vf.fin_verkoopfactuur_xmlnode =
                                        'reservering'
                                     AND vf.fin_verkoopfactuur_refkey =
                                           rr.res_rsv_ruimte_key
                                     AND COALESCE (vf.fin_verkoopfactuur_c4,
                                                   'NOP') = 'catering'))
      GROUP BY klant,
               res_rsv_ruimte_van,
               periode,
               grootboek,
               kostenplaats_key,
               kostenplaats,
               deb_nr,
               proj_key,
               proj,
               btw,
               prs_kostensoort_btw,
               res_key,
               res_volgnr,
               referentie,
               res_rsv_ruimte_key,
               descr,
               aantal,
               omschrijving,
               soort,
               btw_code
      ORDER BY res_rsv_ruimte_key, btw_code;

   v_teller                  NUMBER;
   v_rap_count               NUMBER;
   v_kenmerk_key_laatste     NUMBER;
   v_ruimte_key_prev         NUMBER;
   v_verkoopfactuurkop_key   NUMBER;
   v_tot                     DATE;
   v_van                     DATE;
BEGIN
   v_teller := 0;
   v_rap_count := 0;

   v_aanduiding := 'Init';
   v_errormsg := 'Periode bepalen';

   SELECT TRUNC (MAX (fin_verkoopfactuur_d2))
     INTO v_van
     FROM fin_verkoopfactuur
    WHERE fin_verkoopfactuur_datum IS NOT NULL
          AND fin_verkoopfactuur_c4 = 'catering';

   -- We rekenen met periodes van 4 weken. Dit in overleg met Vermaat John Hendriksen.
   v_tot := v_van + 28;

   DELETE imp_log
    WHERE imp_log_applicatie = p_applname;

   -- verwijder regels die nog niet verwerkt zijn
   DELETE fin_verkoopfactuurkop
    WHERE fin_verkoopfactuurkop_key IN
                (SELECT fin_verkoopfactuurkop_key
                   FROM fin_verkoopfactuur
                  WHERE fin_verkoopfactuur_datum IS NULL
                        AND fin_verkoopfactuur_c4 = 'catering');

   DELETE fin_verkoopfactuur
    WHERE fin_verkoopfactuur_datum IS NULL
          AND fin_verkoopfactuur_c4 = 'catering';

   v_ruimte_key_prev := -1;

   FOR rec IN c (v_tot)
   LOOP
      IF rec.res_rsv_ruimte_key <> v_ruimte_key_prev
      THEN
         v_ruimte_key_prev := rec.res_rsv_ruimte_key;

         INSERT INTO fin_verkoopfactuurkop (fin_verkoopfactuurkop_id)
             VALUES (rec.res_key || '/' || rec.res_volgnr || '-c')
          RETURNING fin_verkoopfactuurkop_key
               INTO v_verkoopfactuurkop_key;
      END IF;

      INSERT INTO fin_verkoopfactuur (fin_verkoopfactuurkop_key,
                                      fin_verkoopfactuur_id,
                                      fin_verkoopfactuur_datum,
                                      fin_verkoopfactuur_omschr,
                                      fin_verkoopfactuur_xmlnode,
                                      fin_verkoopfactuur_refkey,
                                      prs_kostenplaats_nr,
                                      prs_kostenplaats_omschrijving,
                                      prs_kostenplaatsgrp_oms,
                                      prs_kostensoort_oms,
                                      prs_debiteur_naam,
                                      fin_verkoopfactuur_bedrag,
                                      fin_verkoopfactuur_btw,
                                      fin_btwtabelwaarde_code,
                                      fin_btwtabelwaarde_oms,
                                      fin_btwtabelwaarde_perc,
                                      fin_verkoopfactuur_maand,
                                      fin_verkoopfactuur_n1,
                                      fin_verkoopfactuur_n2,
                                      fin_verkoopfactuur_c1,
                                      fin_verkoopfactuur_c2,
                                      fin_verkoopfactuur_c3,
                                      fin_verkoopfactuur_c4,
                                      fin_verkoopfactuur_d1,
                                      fin_verkoopfactuur_d2)
          VALUES (v_verkoopfactuurkop_key,
                  TO_CHAR (SYSDATE, 'YYYY-MM-DD'),
                  NULL,
                  rec.omschrijving,
                  'reservering',
                  rec.res_rsv_ruimte_key,
                  rec.proj,
                  rec.proj,
                  rec.kostenplaats,
                  rec.grootboek,
                  rec.deb_nr,
                  rec.prijs_ex,
                  rec.btw_hoog + rec.btw_laag,
                  rec.btw_code,
                  rec.btw_code,
                  rec.btw,
                  rec.periode,
                  rec.inex,
                  0,                                                  -- debet
                  rec.res_key || '/' || rec.res_volgnr,
                  rec.klant,
                  rec.referentie,
                  'catering',
                  rec.res_rsv_ruimte_van,
                  v_tot);
   END LOOP;


   fac.writelog (p_applname,
                 'S',
                 'Factuurregels gegenereerd',
                 '');

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
            v_errorhint
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog (p_applname,
                    'E',
                    v_aanduiding || v_errormsg,
                    'Onbekende fout!');
      COMMIT;
END nybu_select_res_cat;
/

CREATE OR REPLACE VIEW nybu_v_exp_res_cat
(
   reservering,
   project,
   kostenplaats,
   kostensoort,
   bedrag,
   btw,
   btwcode,
   opmerking
)
AS
   SELECT res_reservering_key || '/' || res_rsv_ruimte_volgnr reservering,
          prs_kostenplaats_nr,
          prs_kostenplaatsgrp_oms,
          prs_kostensoort_oms,
          COALESCE (fin_verkoopfactuur_bedrag, 0),
          COALESCE (fin_verkoopfactuur_btw, 0),
          fin_btwtabelwaarde_code,
          DECODE (
             TRUNC (fin_verkoopfactuur_datum),
             NULL,
             (DECODE (alg_locatie_key, 29, 'Vermaat ', 'Catering Amsterdam ')),
             (DECODE (alg_locatie_key, 29, 'Vermaat ', 'Catering Amsterdam '))
             || TO_CHAR (fin_verkoopfactuur_d2 - 28, 'dd/mm/yyyy')
             || ' - '
             || TO_CHAR (fin_verkoopfactuur_d2 - 1, 'dd/mm/yyyy'))
     FROM fin_verkoopfactuur v,
          res_rsv_ruimte r,
          (SELECT l.alg_locatie_key,
                  alg_locatie_code,
                  alg_locatie_omschrijving,
                  r.alg_ruimte_key
             FROM alg_locatie l,
                  alg_gebouw g,
                  alg_verdieping v,
                  alg_ruimte r
            WHERE     l.alg_locatie_key = g.alg_locatie_key
                  AND g.alg_gebouw_key = v.alg_gebouw_key
                  AND v.alg_verdieping_key = r.alg_verdieping_key) locatie,
          (  SELECT res_rsv_ruimte_key,
                    MAX (o.res_opstelling_omschrijving) opstelling,
                    MAX (ro.res_ruimte_opstel_bezoekers) capaciteit,
                    MAX (ra.alg_ruimte_key) alg_ruimte_key,
                    MAX (rr.res_ruimte_nr) ruimte_nr
               FROM res_rsv_ruimte r,
                    res_ruimte_opstelling ro,
                    res_opstelling o,
                    res_ruimte rr,
                    res_alg_ruimte ra
              WHERE     r.res_rsv_ruimte_verwijder IS NULL
                    AND r.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                    AND ro.res_ruimte_key = rr.res_ruimte_key
                    AND ro.res_opstelling_key = o.res_opstelling_key
                    AND rr.res_ruimte_key = ra.res_ruimte_key
           GROUP BY res_rsv_ruimte_key
           UNION ALL
           SELECT res_rsv_ruimte_key,
                  '' opstelling,
                  NULL capaciteit,
                  rrr.alg_ruimte_key,
                  r.alg_ruimte_nr
             FROM res_rsv_ruimte rrr, alg_ruimte r
            WHERE rrr.alg_ruimte_key IS NOT NULL
                  AND r.alg_ruimte_key = rrr.alg_ruimte_key) r2a
    WHERE     fin_verkoopfactuur_c4 = 'catering'
          AND fin_verkoopfactuur_c1 <> 'dummy'
          AND r.res_rsv_ruimte_key = v.fin_verkoopfactuur_refkey
          AND locatie.alg_ruimte_key = r2a.alg_ruimte_key
          AND r.res_rsv_ruimte_key = r2a.res_rsv_ruimte_key(+);

CREATE OR REPLACE VIEW nybu_v_rap_factuur_cateraar
(
   kostenplaats,
   project,
   bedrag,
   btw,
   bedragibtw,
   btwcode,
   regelomschrijving
)
AS
     SELECT 'K90000' kostenplaats,
            'P990000' project,
            SUM (bedrag) bedrag,
            SUM (btw) btw,
            SUM (bedrag) + SUM (btw) bedragibtw,
            btwcode,
            opmerking
       FROM nybu_v_exp_res_cat
      WHERE UPPER (opmerking) LIKE '%VERMAAT%'
   GROUP BY btwcode, opmerking;

CREATE OR REPLACE VIEW nybu_v_rap_doorbelasting_cat
(
   nummer,
   adm,
   grootboek,
   kostenplaats,
   project,
   medewerker,
   bedrag,
   d_c,
   regelomschrijving
)
AS
     SELECT TO_CHAR (NULL) nummer,
            TO_CHAR (NULL) adm,
            kostensoort,
            kostenplaats,
            project,
            TO_CHAR (NULL) medewerker,
            SUM (bedrag) + SUM (btw),
            'D',
            opmerking
       FROM nybu_v_exp_res_cat
   GROUP BY kostensoort,
            kostenplaats,
            project,
            opmerking
   UNION ALL
     SELECT TO_CHAR (NULL) nummer,
            TO_CHAR (NULL) adm,
            kostensoort,
            'K90000' kostenplaats,
            'P990000' project,
            TO_CHAR (NULL) medewerker,
            SUM (bedrag) + SUM (btw),
            'C',
            opmerking
       FROM nybu_v_exp_res_cat
   GROUP BY kostensoort, opmerking;

CREATE OR REPLACE VIEW nybu_v_rap_doorbelasting_res
(
   reservering,
   grootboek,
   kostenplaats,
   project,
   bedrag,
   d_c,
   regelomschrijving
)
AS
     SELECT reservering,
            kostensoort,
            kostenplaats,
            project,
            SUM (bedrag) + SUM (btw),
            'D',
            opmerking
       FROM nybu_v_exp_res_cat
   GROUP BY reservering,
            kostensoort,
            kostenplaats,
            project,
            opmerking
   UNION ALL
     SELECT reservering,
            kostensoort,
            'K90000' kostenplaats,
            'P990000' project,
            SUM (bedrag) + SUM (btw),
            'C',
            opmerking
       FROM nybu_v_exp_res_cat
   GROUP BY reservering, kostensoort, opmerking;

-- Zet status van de met RES_CODA geëxporteerde reserveringen op Verwerkt.
-- res_srtkenmerk    202   Exportdatum
-- res_srtkenmerk    261   Geëxporteerd bedrag
-- res_srtkenmerk    203   Te crediteren
-- res_srtkenmerk    241   In laatste export
-- fin_verkoopfactuur_n1 = intern/extern (0/1)
-- fin_verkoopfactuur_n2 = credit nee/ja (0/1)
-- fin_verkoopfactuur_c1 = reserveringnummer
-- NB: "In laatste export" wordt door de verwerk-export niet gereset

CREATE OR REPLACE PROCEDURE nybu_export_res_cat_verwerk (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2,
   p_filedir    IN VARCHAR2,
   p_filename   IN VARCHAR2)
AS
   v_aanduiding          VARCHAR2 (200);
   v_errorhint           VARCHAR2 (1000);
   v_errormsg            VARCHAR2 (1000);
   oracle_err_num        NUMBER;
   oracle_err_mes        VARCHAR2 (200);

   v_periode             VARCHAR (6);
   v_periodeNaam         VARCHAR2 (20);
   v_kenmerk_key_cred    NUMBER;
   v_kenmerk_key_datum   NUMBER;
   v_kenmerk_key_geexp   NUMBER;
   v_trackmessage        VARCHAR2 (100);
BEGIN
   v_aanduiding := 'Init';
   v_errormsg := 'Aanpassen facturdatum';

   UPDATE fin_verkoopfactuur
      SET fin_verkoopfactuur_datum = SYSDATE
    WHERE fin_verkoopfactuur_datum IS NULL
          AND fin_verkoopfactuur_c4 = 'catering';

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      ROLLBACK;
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
            v_errorhint
         || ' ORACLE (error '
         || oracle_err_num
         || '/'
         || oracle_err_mes
         || ')';
      fac.writelog (p_applname,
                    'E',
                    v_aanduiding || v_errormsg,
                    'Onbekende fout! Niets verwerkt.');
      COMMIT;
END nybu_export_res_cat_verwerk;
/

-- NYBU#30645: Rapportage voor inzage in verkoopfactuurtabel
-- fin_verkoopfactuur_n1 = intern/extern (0/1)
-- fin_verkoopfactuur_n2 = creditering nee/ja (0/1)
-- fin_verkoopfactuur_c1 = reserveringnummer
-- fin_verkoopfactuur_c2 = klantnaam
-- fin_verkoopfactuur_c3 = klantreferentie
-- fin_verkoopfactuur_d1 = res_rsv_ruimte_van
-- fin_verkoopfactuur_d2 = periode_tot (alleen voor catering)

CREATE OR REPLACE VIEW nybu_v_rap_fin_verkoopfactuur
AS
   SELECT    fin_verkoopfactuur_maand
          || fin_verkoopfactuur_id
          || fin_verkoopfactuur_c1
          || REPLACE (fin_verkoopfactuur_omschr, 'Correctie ', ' ')
             hide_f_sort,
          fin_verkoopfactuur_maand fclt_f_periode,
          fin_verkoopfactuur_id fclt_f_factuur_id,
          fin_verkoopfactuur_c1 fclt_x_reservering,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/res/res_reservering.asp?urole=fo&'
          || 'rsv_ruimte_key='
          || rr.res_rsv_ruimte_key
          || '")''>'
          || fin_verkoopfactuur_c1
          || '</a>'
             html_reservering,
          fin_verkoopfactuur_omschr,
          prs_kostenplaats_nr fclt_f_project,
          prs_kostenplaatsgrp_oms fclt_f_kostenplaats,
          prs_kostensoort_oms fclt_f_kostensoort,
          prs_debiteur_naam || ' ' || fin_verkoopfactuur_c2 fclt_f_debiteur,
          fin_verkoopfactuur_c3 fclt_f_klantref,
          fin_verkoopfactuur_bedrag bedrag_ex,
          fin_verkoopfactuur_btw btw_bedrag,
             fin_btwtabelwaarde_code
          || ' ('
          || TO_CHAR (fin_btwtabelwaarde_perc)
          || '%)'
             btw_perc,
          DECODE (fin_verkoopfactuur_n1, 0, 'intern', 1, 'extern')
             fclt_f_inextern,
          DECODE (fin_verkoopfactuur_n2, 0, '', 1, 'credit') fclt_f_credit
     FROM fin_verkoopfactuur vf, res_rsv_ruimte rr
    WHERE     vf.fin_verkoopfactuur_xmlnode = 'reservering'
          AND vf.fin_verkoopfactuur_c4 = 'ruimte/voorz'
          AND rr.res_rsv_ruimte_key = fin_verkoopfactuur_refkey;

------- Rapportages Reserveringen ----------------------------------------------

-- Backoffice-looplijst voor General Services / schoonmaak


CREATE OR REPLACE VIEW nybu_v_rap_res_looplijst
AS
   SELECT DISTINCT
             TO_CHAR (rr.res_rsv_ruimte_van, 'yyyy-mm-dd')
          || rg.alg_gebouw_upper
          || TO_CHAR (rr.res_rsv_ruimte_van, 'hh24:mi')
             hide_f_srt,
          rr.res_reservering_key || '/' || rr.res_rsv_ruimte_volgnr nr,
          rg.alg_gebouw_omschrijving fclt_f_gebouw,
          rr.res_rsv_ruimte_van datum,
          TO_CHAR (rr.res_rsv_ruimte_van, 'hh24:mi') begintijd,
          TO_CHAR (rr.res_rsv_ruimte_tot, 'hh24:mi') eindtijd,
          start_progr.res_kenmerkreservering_waarde aanvang_programma,
          eind_progr.res_kenmerkreservering_waarde eind_programma,
          r.res_ruimte_nr fclt_f_ruimte,
          o.res_opstelling_omschrijving opstelling,
          rr.res_rsv_ruimte_bezoekers aantal,
          rr.res_rsv_ruimte_omschrijving omschrijving,
          mld.aant Meldingen,
          voorzieningen,
          rr.res_rsv_ruimte_key
     FROM res_rsv_ruimte rr,
          res_ruimte_opstelling ro,
          res_opstelling o,
          res_ruimte r,
          res_alg_ruimte ar,
          alg_v_ruimte_gegevens rg,
          (  SELECT res_rsv_ruimte_key,
                    'Ja (' || COUNT (res_rsv_ruimte_key) || ')' aant
               FROM mld_melding
              WHERE res_rsv_ruimte_key IS NOT NULL
           GROUP BY res_rsv_ruimte_key) mld,
          (  SELECT res_rsv_ruimte_key,
                    LISTAGG (voorziening, CHR (13) || CHR (10))
                       WITHIN GROUP (ORDER BY voorziening)
                       AS Voorzieningen
               FROM (SELECT res_rsv_ruimte_key,
                            res_deel_omschrijving voorziening
                       FROM res_deel rd, res_rsv_deel rrd
                      WHERE     RES_RSV_DEEL_verwijder IS NULL
                            AND rd.res_deel_key = rrd.res_deel_key
                            AND res_rsv_ruimte_key IS NOT NULL)
           GROUP BY res_rsv_ruimte_key) voorz,
          (SELECT w.*
             FROM res_kenmerk k, res_kenmerkwaarde w
            WHERE k.res_srtkenmerk_key = 341
                  AND k.res_kenmerk_key = w.res_kenmerk_key) start_progr,
          (SELECT w.*
             FROM res_kenmerk k, res_kenmerkwaarde w
            WHERE k.res_srtkenmerk_key = 382
                  AND k.res_kenmerk_key = w.res_kenmerk_key) eind_progr
    WHERE     rr.res_rsv_ruimte_verwijder IS NULL
          AND ro.res_ruimte_opstel_key = rr.res_ruimte_opstel_key
          AND o.res_opstelling_key = ro.res_opstelling_key
          AND r.res_ruimte_key = ro.res_ruimte_key
          AND ar.res_ruimte_key = r.res_ruimte_key
          AND ar.res_alg_ruimte_verwijder IS NULL
          AND rg.alg_ruimte_key = ar.alg_ruimte_key
          AND mld.res_rsv_ruimte_key(+) = rr.res_rsv_ruimte_key
          AND voorz.res_rsv_ruimte_key(+) = rr.res_rsv_ruimte_key
          AND start_progr.res_rsv_ruimte_key(+) = rr.res_rsv_ruimte_key
          AND eind_progr.res_rsv_ruimte_key(+) = rr.res_rsv_ruimte_key;

-- voor mobiel beperkt tot vandaag

CREATE OR REPLACE VIEW nybu_v_rap_mob_looplijst
AS
   SELECT *
     FROM nybu_v_rap_res_looplijst
    WHERE TRUNC (datum) = TRUNC (SYSDATE);

-- Overzicht van reserveringen voor de komende 7 dagen die vandaag toegevoegd/gewijzigd zijn (tbv backoffice).

CREATE OR REPLACE VIEW nybu_v_rap_res_lastminutes
AS
   SELECT    ROUND (fac.safe_to_number (SYSDATE - t.fac_tracking_datum), 5)
          || rr.res_reservering_key
          || '/'
          || res_rsv_ruimte_volgnr
             hide_f_srt,
          TO_CHAR (t.fac_tracking_datum, 'DD-MM-YYYY') fclt_d_datum,
          DECODE (
             fac.safe_to_number (
                TRUNC (SYSDATE) - TRUNC (t.fac_tracking_datum)),
             0,
             TO_CHAR (t.fac_tracking_datum, 'HH24:MI'),
             TO_CHAR (t.fac_tracking_datum, 'DD-MM-YYYY HH24:MI'))
             tijd,
          pf.prs_perslid_naam_full door,
          DECODE (sn.fac_srtnotificatie_code,
                  'RESUPD', 'Wijziging',
                  'RESNEW', 'Nieuw',
                  'RESDEL', 'Verwijderd')
             fclt_f_actie,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/res/res_reservering.asp?urole=fo&'
          || 'rsv_ruimte_key='
          || rr.res_rsv_ruimte_key
          || '")''>'
          || rr.res_reservering_key
          || '/'
          || res_rsv_ruimte_volgnr
          || '</a>'
             html_reservering,
          TO_CHAR (rr.res_rsv_ruimte_van, 'DD-MM-YYYY HH24:MI') aanvang,
          rr.res_rsv_ruimte_omschrijving omschrijving,
          t.fac_tracking_oms logtekst,
          k.prs_kostenplaats_nr || ' - ' || k.prs_kostenplaats_omschrijving
             pnummer
     FROM fac_tracking t,
          fac_srtnotificatie sn,
          res_rsv_ruimte rr,
          prs_v_perslid_fullnames pf,
          prs_kostenplaats k
    WHERE     sn.fac_srtnotificatie_code IN ('RESUPD', 'RESNEW', 'RESDEL')
          AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
          AND pf.prs_perslid_key = t.prs_perslid_key
          AND rr.res_rsv_ruimte_key = t.fac_tracking_refkey
          AND k.prs_kostenplaats_key = rr.prs_kostenplaats_key
          AND TRUNC (fac_tracking_datum) >= TRUNC (SYSDATE - 21)
          AND TRUNC (rr.res_rsv_ruimte_van) BETWEEN TRUNC (SYSDATE)
                                                AND  TRUNC (SYSDATE) + 14;

CREATE OR REPLACE VIEW nybu_v_rap_res_mut_events
AS
   -- Verwijderde reserveringen
   SELECT    ROUND (fac.safe_to_number (SYSDATE - t.fac_tracking_datum), 5)
          || rr.res_reservering_key
          || '/'
          || res_rsv_ruimte_volgnr
             hide_f_srt,
          TO_CHAR (t.fac_tracking_datum, 'DD-MM-YYYY') fclt_d_datum,
          DECODE (
             fac.safe_to_number (
                TRUNC (SYSDATE) - TRUNC (t.fac_tracking_datum)),
             0,
             TO_CHAR (t.fac_tracking_datum, 'HH24:MI'),
             TO_CHAR (t.fac_tracking_datum, 'DD-MM-YYYY HH24:MI'))
             tijd,
          pf.prs_perslid_naam_full door,
          'Verwijderd' fclt_f_actie,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/res/res_reservering.asp?urole=fo&'
          || 'rsv_ruimte_key='
          || rr.res_rsv_ruimte_key
          || '")''>'
          || rr.res_reservering_key
          || '/'
          || res_rsv_ruimte_volgnr
          || '</a>'
             html_reservering,
          --          TO_CHAR(rr.res_rsv_ruimte_van, 'DD-MM-YYYY HH24:MI') aanvang,
          sf.res_status_fo_omschrijving fclt_f_status,
          rr.res_rsv_ruimte_omschrijving omschrijving,
          COALESCE (t.fac_tracking_oms, lx.oms) logtekst,
          NULL fclt_f_voorziening
     FROM fac_tracking t,
          fac_srtnotificatie sn,
          res_rsv_ruimte rr,
          prs_v_perslid_fullnames pf,
          res_status_fo sf,
          (SELECT fac_locale_xsl_label,
                  COALESCE (fac_locale_xsl_cust, fac_locale_xsl_tekst) oms
             FROM fac_locale_xsl
            WHERE fac_locale_xsl_label LIKE 'lcl_res_is_%'
                  AND fac_locale_xsl_lang = lcl.getuserlanguage ()) lx
    WHERE sn.fac_srtnotificatie_code = 'RESDEL'
          AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
          AND lx.fac_locale_xsl_label(+) =
                'lcl_res_is_' || LOWER (sn.fac_srtnotificatie_code)
          AND rr.res_rsv_ruimte_key = t.fac_tracking_refkey
          AND pf.prs_perslid_key = t.prs_perslid_key
          AND sf.res_status_fo_key = rr.res_status_fo_key
          AND TRUNC (fac_tracking_datum) >= TRUNC (SYSDATE - 61)
   UNION ALL
   -- Mutaties/verwijdering hotelkamers + inhuur voorzieningen
   SELECT    ROUND (fac.safe_to_number (SYSDATE - t.fac_tracking_datum), 5)
          || rr.res_reservering_key
          || '/'
          || res_rsv_ruimte_volgnr
             hide_f_srt,
          TO_CHAR (t.fac_tracking_datum, 'DD-MM-YYYY') fclt_d_datum,
          DECODE (
             fac.safe_to_number (
                TRUNC (SYSDATE) - TRUNC (t.fac_tracking_datum)),
             0,
             TO_CHAR (t.fac_tracking_datum, 'HH24:MI'),
             TO_CHAR (t.fac_tracking_datum, 'DD-MM-YYYY HH24:MI'))
             tijd,
          pf.prs_perslid_naam_full door,
          DECODE (sn.fac_srtnotificatie_code,
                  'RESUPD', 'Wijziging/Nieuw',
                  'RESNEW', 'Nieuw',
                  'RESDEL', 'Verwijderd')
             actie,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/res/res_reservering.asp?urole=fo&'
          || 'rsv_ruimte_key='
          || rr.res_rsv_ruimte_key
          || '")''>'
          || rr.res_reservering_key
          || '/'
          || res_rsv_ruimte_volgnr
          || '</a>'
             html_reservering,
          --          TO_CHAR(rr.res_rsv_ruimte_van, 'DD-MM-YYYY HH24:MI') aanvang,
          sf.res_status_fo_omschrijving fclt_f_status,
          rr.res_rsv_ruimte_omschrijving,
          COALESCE (t.fac_tracking_oms, lx.oms),
             ra.ins_discipline_omschrijving
          || ' / '
          || ra.res_artikel_omschrijving
     FROM fac_tracking t,
          fac_srtnotificatie sn,
          res_rsv_ruimte rr,
          prs_v_perslid_fullnames pf,
          res_status_fo sf,
          (SELECT fac_locale_xsl_label,
                  COALESCE (fac_locale_xsl_cust, fac_locale_xsl_tekst) oms
             FROM fac_locale_xsl
            WHERE fac_locale_xsl_label LIKE 'lcl_res_is_%'
                  AND fac_locale_xsl_lang = lcl.getuserlanguage ()) lx,
          (SELECT ins_discipline_omschrijving, res_artikel_omschrijving
             FROM res_artikel a, res_discipline d
            WHERE a.res_discipline_key IN (462, 581)
                  AND d.ins_discipline_key = a.res_discipline_key) ra
    WHERE sn.fac_srtnotificatie_code LIKE 'RES%'
          AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
          AND lx.fac_locale_xsl_label(+) =
                'lcl_res_is_' || LOWER (sn.fac_srtnotificatie_code)
          AND rr.res_rsv_ruimte_key = t.fac_tracking_refkey
          AND pf.prs_perslid_key = t.prs_perslid_key
          AND sf.res_status_fo_key = rr.res_status_fo_key
          AND TRUNC (fac_tracking_datum) >= TRUNC (SYSDATE - 61)
          AND fac_tracking_oms LIKE
                '%Arti___ %' || ra.res_artikel_omschrijving || '%';

-- Lijst externe reserveringen, met link om offerte uit te draaien
-- alleen voor kostenplaatsen externe reserveringen

CREATE OR REPLACE VIEW nybu_v_rap_res_offertes
AS
   SELECT rr.res_reservering_key hide_f_srt,
          TO_CHAR (rr.res_reservering_key) fclt_f_reservering,
          TO_CHAR (rr.res_rsv_ruimte_van, 'YYYY-MM-DD') datum,
          rr.res_rsv_ruimte_omschrijving omschrijving,
          k.prs_kostenplaats_nr fclt_f_budgetnr,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/fac/fac_report.asp?usrrap_key=282&mode=list&fclt_f_reservering='
          || rr.res_reservering_key
          || '", "Offerte '
          || rr.res_reservering_key
          || '")''>Print offerte</a>'
             html_offerte
     FROM res_rsv_ruimte rr,
          prs_kostenplaats k,
          (  SELECT res_reservering_key, MIN (res_rsv_ruimte_volgnr) volgnr
               FROM res_rsv_ruimte rrr, prs_kostenplaats pk
              WHERE     res_rsv_ruimte_van >= SYSDATE
                    AND res_status_bo_key IN (2)
                    AND rrr.res_status_fo_key IN (1, 2, 3)
                    AND res_rsv_ruimte_verwijder IS NULL
                    AND rrr.prs_kostenplaats_key = pk.prs_kostenplaats_key
                    AND pk.prs_kostenplaats_extern = 1
           GROUP BY res_reservering_key) eerste
    WHERE     rr.res_reservering_key = eerste.res_reservering_key
          AND rr.res_rsv_ruimte_volgnr = eerste.volgnr
          AND k.prs_kostenplaats_key = rr.prs_kostenplaats_key;

-- Alle gegevens van een externe reservering die nodig zijn om een offerte-bon te kunnen maken.
-- kenmerk 201 = Bedrijf klant
-- kenmerk 141 = Contactpersoon bedrijf klant
-- kenmerk  55 = Alternative description
-- kenmerk 281 = referentie/kenmerk klant (bedrijf)

CREATE OR REPLACE VIEW nybu_v_rap_res_offerte
AS
   SELECT *
     FROM (SELECT *
             FROM    (                                          -- reservering
                      SELECT  rr.res_reservering_key fclt_key,
                              TO_CHAR (rr.res_reservering_key)
                                 fclt_f_reservering,
                              COALESCE (
                                 altdesc.res_kenmerkreservering_waarde,
                                 rr.res_rsv_ruimte_omschrijving)
                                 omschrijving,
                              TO_CHAR (rr.res_rsv_ruimte_van, 'DD') dag,
                              TO_CHAR (rr.res_rsv_ruimte_van, 'MM') maand,
                              TO_CHAR (rr.res_rsv_ruimte_van, 'YYYY') jaar,
                              rr.res_rsv_ruimte_bezoekers totaal_aantal,
                              cp.prs_contactpersoon_naam_full
                                 bedrijf_contactpersoon,
                              b.prs_bedrijf_naam bedrijf_naam,
                              b.prs_bedrijf_post_adres bedrijf_adres,
                              b.prs_bedrijf_post_postcode bedrijf_pc,
                              b.prs_bedrijf_post_plaats bedrijf_plaats,
                              b.prs_bedrijf_post_land bedrijf_land,
                              km.res_kenmerkreservering_waarde
                                 bedrijf_kenmerk,
                              prog.res_kenmerkreservering_waarde programma,
                              p.prs_perslid_voornaam user_voornaam,
                              p.prs_perslid_tussenvoegsel user_tv,
                              p.prs_perslid_naam user_naam
                         FROM res_rsv_ruimte rr,
                              prs_bedrijf b,
                              nybu_v_contactpersoon cp,
                              (SELECT *
                                 FROM res_kenmerkwaarde
                                WHERE res_kenmerkwaarde_verwijder IS NULL
                                      AND res_kenmerk_key = 201) bedr,
                              (SELECT *
                                 FROM res_kenmerkwaarde
                                WHERE res_kenmerkwaarde_verwijder IS NULL
                                      AND res_kenmerk_key = 141) cont,
                              (SELECT *
                                 FROM res_kenmerkwaarde
                                WHERE res_kenmerkwaarde_verwijder IS NULL
                                      AND res_kenmerk_key = 55) altdesc,
                              (SELECT *
                                 FROM res_kenmerkwaarde
                                WHERE res_kenmerkwaarde_verwijder IS NULL
                                      AND res_kenmerk_key = 281) km,
                              (SELECT *
                                 FROM res_kenmerkwaarde
                                WHERE res_kenmerkwaarde_verwijder IS NULL
                                      AND res_kenmerk_key = 243) prog,
                              prs_perslid p
                        WHERE rr.res_rsv_ruimte_verwijder IS NULL
                              AND bedr.res_rsv_ruimte_key(+) =
                                    rr.res_rsv_ruimte_key
                              AND b.prs_bedrijf_key(+) =
                                    fac.safe_to_number (
                                       bedr.res_kenmerkreservering_waarde)
                              AND cont.res_rsv_ruimte_key(+) =
                                    rr.res_rsv_ruimte_key
                              AND cp.prs_contactpersoon_key(+) =
                                    fac.safe_to_number (
                                       cont.res_kenmerkreservering_waarde)
                              AND altdesc.res_rsv_ruimte_key(+) =
                                    rr.res_rsv_ruimte_key
                              AND km.res_rsv_ruimte_key(+) =
                                    rr.res_rsv_ruimte_key
                              AND prog.res_rsv_ruimte_key(+) =
                                    rr.res_rsv_ruimte_key
                              AND rr.res_rsv_ruimte_key =
                                    (SELECT MIN (res_rsv_ruimte_key)
                                       FROM res_rsv_ruimte
                                      WHERE res_reservering_key =
                                               rr.res_reservering_key
                                            AND res_rsv_ruimte_verwijder IS NULL)
                              AND p.prs_perslid_key =
                                    rr.res_rsv_ruimte_contact_key) r1
                  LEFT OUTER JOIN
                     (                                              -- ruimtes
                      SELECT  'ruimte' soort,
                              reservering,
                              ruimte,
                              max_bez,
                              aantal,
                              datum,
                              van,
                              tot,
                              disc,
                              opstel,
                              ROUND (
                                 DECODE (btw_incl,
                                         0, prijs,
                                         1, prijs / (1 + (btw_perc / 100))),
                                 2)
                                 prijs_ex,
                              ROUND (
                                 DECODE (btw_incl,
                                         0, prijs * (1 + (btw_perc / 100)),
                                         1, prijs),
                                 2)
                                 prijs_in
                         FROM (SELECT rr.res_reservering_key reservering,
                                      rog.res_ruimte_nr ruimte,
                                      rog.res_ruimte_opstel_bezoekers max_bez,
                                      rr.res_rsv_ruimte_bezoekers aantal,
                                      TO_CHAR (rr.res_rsv_ruimte_van,
                                               'DD-MM-YYYY')
                                         datum,
                                      TO_CHAR (rr.res_rsv_ruimte_van,
                                               'HH24:MI')
                                         van,
                                      TO_CHAR (rr.res_rsv_ruimte_tot,
                                               'HH24:MI')
                                         tot,
                                      d.ins_discipline_key disc,
                                      rog.res_opstelling_omschrijving opstel,
                                      res.getruimteprijs (
                                         rr.res_rsv_ruimte_key)
                                      - COALESCE (res_rsv_ruimte_korting, 0)
                                         prijs,
                                      21 btw_perc,
                                      COALESCE (ks.prs_kostensoort_btw, 1)
                                         btw_incl
                                 FROM res_rsv_ruimte rr,
                                      res_v_ruimte_opstel_gegevens rog,
                                      res_ruimte r,
                                      res_discipline d,
                                      prs_kostensoort ks
                                WHERE rr.res_rsv_ruimte_verwijder IS NULL
                                      AND rog.res_ruimte_opstel_key =
                                            rr.res_ruimte_opstel_key
                                      AND r.res_ruimte_key =
                                            rog.res_ruimte_key
                                      AND d.ins_discipline_key =
                                            r.res_discipline_key
                                      AND ks.prs_kostensoort_key(+) =
                                            d.prs_kostensoort_key)
                      UNION ALL
                      -- objecten
                      SELECT 'deel' soort,
                             reservering,
                             deel,
                             NULL bez_max,
                             aantal,
                             datum,
                             van,
                             tot,
                             disc,
                             NULL opstel,
                             ROUND (
                                DECODE (btw_incl,
                                        0, prijs,
                                        1, prijs / (1 + (btw_perc / 100))),
                                2)
                                prijs_ex,
                             ROUND (
                                DECODE (btw_incl,
                                        0, prijs * (1 + (btw_perc / 100)),
                                        1, prijs),
                                2)
                                prijs_in
                        FROM (SELECT rr.res_reservering_key reservering,
                                     d.res_deel_omschrijving deel,
                                     rd.res_rsv_deel_aantal aantal,
                                     TO_CHAR (rr.res_rsv_ruimte_van,
                                              'DD-MM-YYYY')
                                        datum,
                                     TO_CHAR (rd.res_rsv_deel_van, 'HH24:MI')
                                        van,
                                     TO_CHAR (rd.res_rsv_deel_tot, 'HH24:MI')
                                        tot,
                                     d.ins_discipline_key disc,
                                     res.getdeelprijs (rd.res_rsv_deel_key)
                                        prijs,
                                     21 btw_perc,
                                     COALESCE (ks.prs_kostensoort_btw, 1)
                                        btw_incl
                                FROM res_rsv_ruimte rr,
                                     res_rsv_deel rd,
                                     res_deel d,
                                     res_discipline d,
                                     prs_kostensoort ks
                               WHERE rr.res_rsv_ruimte_verwijder IS NULL
                                     AND rd.res_rsv_ruimte_key =
                                           rr.res_rsv_ruimte_key
                                     AND rd.res_rsv_deel_verwijder IS NULL
                                     AND d.res_deel_key = rd.res_deel_key
                                     AND d.ins_discipline_key =
                                           d.res_discipline_key
                                     AND ks.prs_kostensoort_key(+) =
                                           d.prs_kostensoort_key)
                      UNION ALL
                      -- artikelen
                      SELECT 'artikel' soort,
                             reservering,
                             artikel,
                             volgnr bez_max,
                             aantal,
                             datum,
                             van,
                             NULL tot,
                             disc,
                             NULL opstel,
                             ROUND (
                                DECODE (btw_incl,
                                        0, prijs,
                                        1, prijs / (1 + (btw_perc / 100))),
                                2)
                                prijs_ex,
                             ROUND (
                                DECODE (btw_incl,
                                        0, prijs * (1 + (btw_perc / 100)),
                                        1, prijs),
                                2)
                                prijs_in
                        FROM (SELECT rr.res_reservering_key reservering,
                                     a.res_artikel_omschrijving artikel,
                                     ra.res_rsv_artikel_aantal aantal,
                                     TO_CHAR (ra.res_rsv_artikel_levering,
                                              'DD-MM-YYYY')
                                        datum,
                                     TO_CHAR (ra.res_rsv_artikel_levering,
                                              'HH24:MI')
                                        van,
                                     d.ins_discipline_key disc,
                                     a.res_artikel_volgnummer volgnr,
                                     res.getartikelprijs (
                                        ra.res_rsv_artikel_key)
                                        prijs,
                                     --    COALESCE (a.res_artikel_btw, 0) btw_perc,
                                     --    per 1-1-2019 is de btw laag van 6% naar 9% gegaan
                                     CASE
                                        WHEN a.res_artikel_btw > 9
                                        THEN
                                           a.res_artikel_btw
                                        WHEN (a.res_artikel_btw = 6
                                              OR a.res_artikel_btw = 9)
                                        THEN
                                           CASE
                                              WHEN ra.res_rsv_artikel_levering <
                                                      TO_DATE ('1-1-2019',
                                                               'dd-mm-yyyy')
                                              THEN
                                                 6
                                              ELSE
                                                 a.res_artikel_btw
                                           END
                                        ELSE
                                           0
                                     END
                                        btw_perc,
                                     COALESCE (ks.prs_kostensoort_btw, 1)
                                        btw_incl
                                FROM res_rsv_ruimte rr,
                                     res_rsv_artikel ra,
                                     res_artikel a,
                                     res_discipline d,
                                     prs_kostensoort ks
                               WHERE rr.res_rsv_ruimte_verwijder IS NULL
                                     AND ra.res_rsv_ruimte_key =
                                           rr.res_rsv_ruimte_key
                                     AND ra.res_rsv_artikel_verwijder IS NULL
                                     AND a.res_artikel_key =
                                           ra.res_artikel_key
                                     AND d.ins_discipline_key =
                                           a.res_discipline_key
                                     AND ks.prs_kostensoort_key(+) =
                                           d.prs_kostensoort_key)) r2
                  ON r1.fclt_key = r2.reservering);

------- Overig Reserveringen ---------------------------------------------------

-- Voor kenmerkdomein contactpersoon (RES)

CREATE OR REPLACE VIEW nybu_v_contactpersoon
AS
   SELECT prs_contactpersoon_key,
          DECODE (prs_contactpersoon_aanhef,
                  NULL, 'dhr/mevr ',
                  prs_contactpersoon_aanhef || ' ')
          || DECODE (prs_contactpersoon_voorletters,
                     NULL, '',
                     prs_contactpersoon_voorletters || ' ')
          || DECODE (prs_contactpersoon_tussenv,
                     NULL, '',
                     prs_contactpersoon_tussenv || ' ')
          || prs_contactpersoon_naam
             prs_contactpersoon_naam_full,
          b.prs_bedrijf_naam
     FROM prs_contactpersoon p, prs_bedrijf b
    WHERE p.prs_bedrijf_key = b.prs_bedrijf_key;

-- Notificatiejob res_reminder: 4 weken voor aanvang (obv 24/7)

CREATE OR REPLACE VIEW nybu_v_noti_resreminder
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   XKEY
)
AS
   SELECT 'RESINF',
          NULL,
          rsvr.res_rsv_ruimte_contact_key,
             'Reservering '
          || res.res_reservering_key
          || ': U heeft op '
          || TO_CHAR (rsvr.res_rsv_ruimte_van, 'DD-MM')
          || ' van '
          || TO_CHAR (rsvr.res_rsv_ruimte_van, 'HH24:MI')
          || ' tot '
          || TO_CHAR (rsvr.res_rsv_ruimte_tot, 'HH24:MI')
          || ' ruimte '
          || r.res_ruimte_nr
          || ' gereserveerd.',
          res.res_reservering_key,
          rsvr.res_rsv_ruimte_key
     FROM res_v_aanwezigreservering res,
          res_v_aanwezigrsv_ruimte rsvr,
          res_ruimte_opstelling opst,
          res_disc_params rdp,
          res_ruimte r
    WHERE     r.res_discipline_key = rdp.res_ins_discipline_key
          AND rdp.res_disc_params_noti_dagen IS NOT NULL
          AND res.res_reservering_key = rsvr.res_reservering_key
          AND opst.res_ruimte_opstel_key = rsvr.res_ruimte_opstel_key
          AND opst.res_ruimte_key = r.res_ruimte_key
          AND rsvr.res_status_fo_key <= 5
          AND rsvr.res_rsv_ruimte_van BETWEEN SYSDATE
                                              + res_disc_params_noti_dagen
                                          AND    SYSDATE
                                               + res_disc_params_noti_dagen
                                               + 1
          AND rsvr.res_rsv_ruimte_van >= SYSDATE
   UNION ALL
     SELECT 'RESINF',
            NULL,
            res_rsv_ruimte_contact_key,
               'Reservering '
            || res_reservering_key
            || ': U heeft op '
            || TO_CHAR (MIN (van), 'dd-mm')
            || DECODE (
                  MIN (van),
                  MAX (tot),
                  ' om ' || TO_CHAR (MIN (van), 'hh24:mi'),
                     ' van '
                  || TO_CHAR (MIN (van), 'hh24:mi')
                  || ' tot '
                  || TO_CHAR (MAX (tot), 'hh24:mi'))
            || ' in ruimte ('
            || (SELECT    alg_gebouw_code
                       || '-'
                       || alg_verdieping_code
                       || '-'
                       || alg_ruimte_nr
                  FROM alg_v_onroerendgoed_gegevens arg
                 WHERE arg.alg_ruimte_key = ruimte_key)
            || ') '
            || COUNT (res_reservering_key)
            || ' voorziening(en) gereserveerd.',
            res_reservering_key,
            res_rsv_ruimte_key
       FROM (SELECT rsvr.res_rsv_ruimte_contact_key,
                    res.res_reservering_key,
                    rsvd.res_rsv_deel_van van,
                    rsvd.res_rsv_deel_tot tot,
                    rsvr.res_rsv_ruimte_key,
                    rsvr.alg_ruimte_key ruimte_key
               FROM res_v_aanwezigreservering res,
                    res_v_aanwezigrsv_ruimte rsvr,
                    res_disc_params rdp,
                    res_rsv_deel rsvd,
                    res_deel rd
              WHERE     rsvd.res_rsv_ruimte_key = rsvr.res_rsv_ruimte_key
                    AND rd.res_deel_key = rsvd.res_deel_key
                    AND rd.res_discipline_key = rdp.res_ins_discipline_key
                    AND rdp.res_disc_params_noti_dagen IS NOT NULL
                    AND res.res_reservering_key = rsvr.res_reservering_key
                    AND rsvr.res_ruimte_opstel_key IS NULL
                    AND rsvr.res_status_fo_key <= 5
                    AND rsvd.res_rsv_deel_verwijder IS NULL
                    AND rsvd.res_rsv_deel_van BETWEEN SYSDATE
                                                      + res_disc_params_noti_dagen
                                                  AND  SYSDATE
                                                       + res_disc_params_noti_dagen
                                                       + 1
                    AND rsvd.res_rsv_deel_van >= SYSDATE
             UNION ALL
             SELECT rsvr.res_rsv_ruimte_contact_key,
                    res.res_reservering_key,
                    rsva.res_rsv_artikel_levering van,
                    rsva.res_rsv_artikel_levering tot,
                    rsvr.res_rsv_ruimte_key,
                    rsvr.alg_ruimte_key ruimte_key
               FROM res_v_aanwezigreservering res,
                    res_v_aanwezigrsv_ruimte rsvr,
                    res_disc_params rdp,
                    res_rsv_artikel rsva,
                    res_artikel ra
              WHERE     rsva.res_rsv_ruimte_key = rsvr.res_rsv_ruimte_key
                    AND ra.res_discipline_key = rdp.res_ins_discipline_key
                    AND rsva.res_artikel_key = ra.res_artikel_key
                    AND rdp.res_disc_params_noti_dagen IS NOT NULL
                    AND res.res_reservering_key = rsvr.res_reservering_key
                    AND rsvr.res_ruimte_opstel_key IS NULL
                    AND rsvr.res_status_fo_key <= 5
                    AND rsva.res_rsv_artikel_verwijder IS NULL
                    AND rsva.res_rsv_artikel_levering BETWEEN SYSDATE
                                                              + res_disc_params_noti_dagen
                                                          AND  SYSDATE
                                                               + res_disc_params_noti_dagen
                                                               + 1
                    AND rsva.res_rsv_artikel_levering >= SYSDATE)
   GROUP BY res_rsv_ruimte_contact_key,
            res_reservering_key,
            res_rsv_ruimte_key,
            ruimte_key;

-- Alle door Vermaat geleverde artikelen
--   - Ná 1-1-2016, ivm performance NYBU#43607
--   - Met 3D-scoping op catalogi
--   - Alleen catering geleverd in Breukelen

CREATE OR REPLACE VIEW NYBU_V_VERMAAT
(
    RES_RESERVERING_KEY,
    RES_RSV_RUIMTE_VOLGNR,
    RES_RSV_RUIMTE_KEY,
    RES_RSV_RUIMTE_VAN,
    RES_RSV_ARTIKEL_LEVERING,
    DATUM,
    TIJD,
    RES_SRTACTIVITEIT_KEY,
    RES_ARTIKEL_KEY,
    ARTIKELNR,
    ARTIKELOMS,
    INS_DISCIPLINE_KEY,
    CATALOGUS,
    STATUS,
    AANTAL,
    RES_RSV_ARTIKEL_PRIJS,
    RES_ARTIKEL_PRIJS,
    EENHEID,
    EENHEIDSPRIJS,
    ARTIKEL_BTW,
    BTW,
    TOTAALPRIJS_EX,
    TOTAALPRIJS_IN,
    TOTAAL_BTW,
    PRS_KOSTENPLAATS_NR,
    PRS_KOSTENPLAATS_OMSCHRIJVING,
    KOSTENPLAATS_INT_EXT,
    KPNGRP_NR,
    KPNGRP_OMS,
    PRS_PERSLID_KEY,
    PRS_PERSLID_NAAM_FULL
)
AS
  SELECT res_reservering_key,
           res_rsv_ruimte_volgnr,
           r.res_rsv_ruimte_key,
           res_rsv_ruimte_van,
           res_rsv_artikel_levering,
           TO_CHAR (res_rsv_artikel_levering, 'DD-MM-YYYY')
               datum,
           TO_CHAR (res_rsv_artikel_levering, 'HH24:MI')
               tijd,
           res_srtactiviteit_key,
           res_artikel_key,
           artikelnr,
           artikeloms,
           ins_discipline_key,
           catalogus,
           status,
           aantal,
           res_rsv_artikel_prijs,
           res_artikel_prijs,
           eenheid,
           eenheidsprijs,
           artikel_btw,
           btw,
           DECODE (prs_kostensoort_btw,
                   0, totaalprijs,
                   1, totaalprijs / btw)
               totaalprijs_ex,
           DECODE (prs_kostensoort_btw,
                   0, totaalprijs * btw,
                   1, totaalprijs)
               totaalprijs_in,
           DECODE (prs_kostensoort_btw,
                   0, totaalprijs * (btw - 1),
                   1, totaalprijs - totaalprijs / btw)
               totaal_btw,
           prs_kostenplaats_nr,
           prs_kostenplaats_omschrijving,
           kostenplaats_int_ext,
           SUBSTR (prs_kostenplaatsgrp_oms,
                   1,
                   INSTR (prs_kostenplaatsgrp_oms, ' - ') - 1)
               kpngrp_nr,
           SUBSTR (prs_kostenplaatsgrp_oms,
                   INSTR (prs_kostenplaatsgrp_oms, ' - ') + 3)
               kpngrp_oms,
           prs_perslid_key,
           prs_perslid_naam_full
      FROM (SELECT rr.res_reservering_key,
                   rr.res_rsv_ruimte_volgnr,
                   rr.res_rsv_ruimte_key,
                   rr.res_rsv_ruimte_van,
                   ra.res_rsv_artikel_levering,
                   act.res_srtactiviteit_key,
                   a.res_artikel_key,
                   a.res_artikel_nr
                       artikelnr,
                   a.res_artikel_omschrijving
                       artikeloms,
                   d.ins_discipline_key,
                   d.ins_discipline_omschrijving
                       catalogus,
                   ra.res_status_bo_key
                       status,
                   ra.res_rsv_artikel_aantal
                       aantal,
                   ra.res_rsv_artikel_prijs,
                   a.res_artikel_prijs,
                   a.res_artikel_eenheid
                       eenheid,
                   a.res_artikel_prijs
                       eenheidsprijs,
                   -- a.res_artikel_btw,
                   CASE
                       WHEN a.res_artikel_btw > 9
                       THEN
                           a.res_artikel_btw
                       WHEN (a.res_artikel_btw = 6 OR a.res_artikel_btw = 9)
                       THEN
                           CASE
                               WHEN ra.res_rsv_artikel_levering <
                                    TO_DATE ('1-1-2019', 'dd-mm-yyyy')
                               THEN
                                   6
                               ELSE
                                   a.res_artikel_btw
                           END
                       ELSE
                           0
                   END
                       artikel_btw,
                   COALESCE (
                         1
                       + (  (CASE
                                 WHEN a.res_artikel_btw > 9
                                 THEN
                                     a.res_artikel_btw
                                 WHEN (   a.res_artikel_btw = 6
                                       OR a.res_artikel_btw = 9)
                                 THEN
                                     CASE
                                         WHEN ra.res_rsv_artikel_levering <
                                              TO_DATE ('1-1-2019',
                                                       'dd-mm-yyyy')
                                         THEN
                                             6
                                         ELSE
                                             a.res_artikel_btw
                                     END
                                 ELSE
                                     0
                             END)
                          / 100),
                       1)
                       btw,
                   res.getartikelprijs (ra.res_rsv_artikel_key)
                       totaalprijs,
                   k.prs_kostenplaats_nr,
                   k.prs_kostenplaats_omschrijving,
                   DECODE (k.prs_kostenplaats_extern, 1, 'Extern', 'Intern') as kostenplaats_int_ext,
                   kg.prs_kostenplaatsgrp_oms,
                   ks.prs_kostensoort_btw,
                   pf.prs_perslid_key,
                   pf.prs_perslid_naam_full
              FROM res_rsv_artikel          ra,
                   res_artikel              a,
                   res_discipline           d,
                   res_rsv_ruimte           rr,
                   res_activiteit           act,
                   prs_kostenplaats         k,
                   prs_kostenplaatsgrp      kg,
                   prs_kostensoort          ks,
                   prs_v_perslid_fullnames  pf
             WHERE     ra.res_rsv_artikel_verwijder IS NULL
                   AND ra.res_rsv_artikel_levering >=
                       TO_DATE ('01-01-2016', 'DD-MM-YYYY')
                   AND a.res_artikel_key = ra.res_artikel_key
                   AND d.ins_discipline_key = a.res_discipline_key
                   AND d.ins_discipline_min_level = 2
                   AND d.ins_discipline_key NOT IN (462, 581)
                   AND rr.res_rsv_ruimte_key = ra.res_rsv_ruimte_key
                   AND act.res_activiteit_key = rr.res_activiteit_key
                   AND k.prs_kostenplaats_key = rr.prs_kostenplaats_key
                   AND kg.prs_kostenplaatsgrp_key(+) =
                       k.prs_kostenplaatsgrp_key
                   AND ks.prs_kostensoort_key(+) = d.prs_kostensoort_key
                   AND pf.prs_perslid_key = rr.res_rsv_ruimte_contact_key) r,
           (  SELECT res_rsv_ruimte_key,
                     MAX (o.res_opstelling_omschrijving)      opstelling,
                     MAX (ro.res_ruimte_opstel_bezoekers)     capaciteit,
                     MAX (ra.alg_ruimte_key)                  alg_ruimte_key,
                     MAX (rr.res_ruimte_nr)                   ruimte_nr
                FROM res_rsv_ruimte       r,
                     res_ruimte_opstelling ro,
                     res_opstelling       o,
                     res_ruimte           rr,
                     res_alg_ruimte       ra
               WHERE     r.res_rsv_ruimte_verwijder IS NULL
                     AND r.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                     AND ro.res_ruimte_key = rr.res_ruimte_key
                     AND ro.res_opstelling_key = o.res_opstelling_key
                     AND rr.res_ruimte_key = ra.res_ruimte_key
            GROUP BY res_rsv_ruimte_key
            UNION ALL
            SELECT res_rsv_ruimte_key,
                   ''       opstelling,
                   NULL     capaciteit,
                   rrr.alg_ruimte_key,
                   r.alg_ruimte_nr
              FROM res_rsv_ruimte rrr, alg_ruimte r
             WHERE     rrr.alg_ruimte_key IS NOT NULL
                   AND r.alg_ruimte_key = rrr.alg_ruimte_key) r2a,
           (SELECT l.alg_locatie_key,
                   alg_locatie_code,
                   alg_locatie_omschrijving,
                   r.alg_ruimte_key
              FROM alg_locatie     l,
                   alg_gebouw      g,
                   alg_verdieping  v,
                   alg_ruimte      r
             WHERE     l.alg_locatie_key = g.alg_locatie_key
                   AND g.alg_gebouw_key = v.alg_gebouw_key
                   AND v.alg_verdieping_key = r.alg_verdieping_key) locatie
     WHERE     locatie.alg_ruimte_key = r2a.alg_ruimte_key
           AND locatie.alg_locatie_key = 29 -- Vermaat doet alleen locatie Breukelen
           AND r.res_rsv_ruimte_key = r2a.res_rsv_ruimte_key(+);

CREATE OR REPLACE VIEW nybu_v_rap_vermaat
AS
   SELECT res_rsv_artikel_levering hide_f_sort,
          res_reservering_key || '/' || res_rsv_ruimte_volgnr
             fclt_f_reservering,
          datum fclt_d_datum,
          tijd,
          artikelnr,
          artikeloms fclt_f_artikel,
          catalogus fclt_f_catalogus,
          aantal,
          eenheid,
          eenheidsprijs,
          artikel_btw artikel_btw,
          ROUND (totaalprijs_ex, 2) totaalprijs_excl,
          ROUND (totaalprijs_in, 2) totaalprijs_incl,
          prs_kostenplaats_nr || ' - ' || prs_kostenplaats_omschrijving
             fclt_f_pnummer,
          kpngrp_nr || ' - ' || kpngrp_oms fclt_f_kostenplaats,
          ins_discipline_key fclt_3d_discipline_key
     FROM nybu_v_vermaat;

CREATE OR REPLACE VIEW nybu_v_rap_vermaat_cumulatief
AS
     SELECT datum fclt_d_datum,
            TO_CHAR (res_rsv_artikel_levering, 'YYYY-MM-DD') hide_f_levering,
            catalogus || artikeloms hide_f_regel,
            artikelnr,
            artikeloms fclt_f_artikel,
            eenheid,
            catalogus fclt_f_catalogus,
            COALESCE (SUM (totaalprijs_ex), 0) totaalprijs_ex,
            COALESCE (SUM (totaalprijs_in), 0) totaalprijs_in,
            ins_discipline_key fclt_3d_discipline_key
       FROM nybu_v_vermaat
   GROUP BY datum,
            TO_CHAR (res_rsv_artikel_levering, 'YYYY-MM-DD'),
            artikelnr,
            artikeloms,
            eenheid,
            catalogus,
            ins_discipline_key;

CREATE OR REPLACE VIEW nybu_v_rap_vermaat_kpn
AS
     SELECT datum fclt_d_datum,
            TO_CHAR (res_rsv_artikel_levering, 'YYYY-MM-DD') hide_f_levering,
            prs_kostenplaats_nr || artikeloms hide_f_regel,
            artikelnr,
            artikeloms fclt_f_artikel,
            eenheid,
            prs_kostenplaats_nr || ' - ' || prs_kostenplaats_omschrijving
               fclt_f_pnummer,
            kpngrp_nr || ' - ' || kpngrp_oms fclt_f_kostenplaats,
            COALESCE (SUM (totaalprijs_ex), 0) totaalprijs_ex,
            COALESCE (SUM (totaalprijs_in), 0) totaalprijs_in,
            ins_discipline_key fclt_3d_discipline_key
       FROM nybu_v_vermaat
   GROUP BY datum,
            TO_CHAR (res_rsv_artikel_levering, 'YYYY-MM-DD'),
            artikelnr,
            artikeloms,
            eenheid,
            prs_kostenplaats_nr,
            prs_kostenplaats_omschrijving,
            kpngrp_nr,
            kpngrp_oms,
            ins_discipline_key;

--res_srtkenmerk     External contact      41
--res_srtkenmerk     Company               81
--res_srtkenmerk     Referentie klant     121
--res_srtactiviteit  Extern                10

CREATE OR REPLACE VIEW NYBU_V_RAP_VERMAAT_FACTURATIE
(
    HIDE_F_SORT,
    FCLT_F_RESERVERING,
    FCLT_X_PNUMMER,
    FCLT_X_KOSTENPLAATS,
    PNUMMER,
    PNUMMER_OMS,
    KOSTENPLAATS,
    KOSTENPLAATS_OMS,
    KOSTENPLAATS_INT_EXT,
    FCLT_D_DATUM,
    FCLT_F_CONTACTPERSOON,
    EXCL_BTW_LAAG,
    BTW_LAAG,
    EXCL_BTW_HOOG,
    BTW_HOOG,
    TOTAAL_EXCL,
    TOTAAL_BTW,
    TOTAAL_INCL,
    REFERENTIE_KLANT,
    KLANT_AANHEF,
    KLANT_VOORLETTERS,
    KLANT_VOORNAAM,
    KLANT_TUSSENVOEGSEL,
    KLANT_ACHTERNAAM,
    KLANT_TEL1,
    KLANT_TEL2,
    KLANT_EMAIL,
    BEDRIJF_NAAM,
    BEDRIJF_POSTADRES,
    BEDRIJF_POSTCODE,
    BEDRIJF_PLAATS,
    BEDRIJF_LAND,
    BEDRIJF_TEL,
    BEDRIJF_EMAIL,
    BEDRIJF_DEBITEURNR
)
AS
    SELECT    TO_CHAR (r.res_rsv_ruimte_van, 'YYYYMMDDHH24MI-')
           || r.res_reservering_key
           || '/'
           || res_rsv_ruimte_volgnr
               hide_f_sort,
           r.res_reservering_key || '/' || res_rsv_ruimte_volgnr
               fclt_f_reservering,
           r.prs_kostenplaats_nr || ' - ' || r.prs_kostenplaats_omschrijving
               fclt_x_pnummer,
           r.kpngrp_nr || ' - ' || r.kpngrp_oms
               fclt_x_kostenplaats,
           r.prs_kostenplaats_nr
               pnummer,
           r.prs_kostenplaats_omschrijving
               pnummer_oms,
           r.kpngrp_nr
               kostenplaats,
           r.kpngrp_oms
               kostenplaats_oms,
           kostenplaats_int_ext,
           r.datum
               fclt_d_datum,
           REPLACE (r.prs_perslid_naam_full, 'INACTIEF: ', '')
               fclt_f_contactpersoon,
           ROUND (COALESCE (l.ex_btw, 0), 2)
               excl_btw_laag,
           ROUND (COALESCE (l.btw, 0), 2)
               btw_laag,
           ROUND (COALESCE (h.ex_btw, 0), 2)
               excl_btw_hoog,
           ROUND (COALESCE (h.btw, 0), 2)
               btw_hoog,
           ROUND (COALESCE (l.ex_btw, 0) + COALESCE (h.ex_btw, 0), 2)
               totaal_excl,
           ROUND (COALESCE (l.btw, 0) + COALESCE (h.btw, 0), 2)
               totaal_btw,
           ROUND (COALESCE (l.totaal, 0) + COALESCE (h.totaal, 0), 2)
               totaal_incl,
           --          a.totaal chck,
           res_kenmerkreservering_waarde
               referentie_klant,
           prs_contactpersoon_aanhef
               klant_aanhef,
           prs_contactpersoon_voorletters
               klant_voorletters,
           prs_contactpersoon_voornaam
               klant_voornaam,
           prs_contactpersoon_tussenv
               klant_tussenvoegsel,
           prs_contactpersoon_naam
               klant_achternaam,
           prs_contactpersoon_telefoon_1
               klant_tel1,
           prs_contactpersoon_telefoon_2
               klant_tel2,
           prs_contactpersoon_email
               klant_email,
           prs_bedrijf_naam
               bedrijf_naam,
           prs_bedrijf_post_adres
               bedrijf_postadres,
           prs_bedrijf_post_postcode
               bedrijf_postcode,
           prs_bedrijf_post_plaats
               bedrijf_plaats,
           prs_bedrijf_post_land
               bedrijf_land,
           prs_bedrijf_telefoon
               bedrijf_tel,
           prs_bedrijf_email
               bedrijf_email,
           prs_leverancier_nr
               bedrijf_debiteurnr
      FROM (SELECT DISTINCT res_rsv_ruimte_key,
                            res_reservering_key,
                            res_rsv_ruimte_volgnr,
                            res_rsv_ruimte_van,
                            prs_kostenplaats_nr,
                            prs_kostenplaats_omschrijving,
                            kostenplaats_int_ext,
                            kpngrp_nr,
                            kpngrp_oms,
                            datum,
                            prs_perslid_naam_full,
                            'Extern'     extern,
                            cp.prs_contactpersoon_aanhef,
                            cp.prs_contactpersoon_voorletters,
                            cp.prs_contactpersoon_tussenv,
                            cp.prs_contactpersoon_naam,
                            cp.prs_contactpersoon_voornaam,
                            cp.prs_contactpersoon_telefoon_1,
                            cp.prs_contactpersoon_telefoon_2,
                            cp.prs_contactpersoon_email,
                            b.prs_bedrijf_naam,
                            b.prs_bedrijf_post_adres,
                            b.prs_bedrijf_post_postcode,
                            b.prs_bedrijf_post_plaats,
                            b.prs_bedrijf_post_land,
                            b.prs_bedrijf_telefoon,
                            b.prs_bedrijf_email,
                            b.prs_leverancier_nr,
                            rf.res_kenmerkreservering_waarde
              FROM nybu_v_vermaat  v,
                   (SELECT kw.res_rsv_ruimte_key cp_rsv_ruimte_key, p.*
                      FROM res_kenmerkwaarde   kw,
                           res_kenmerk         k,
                           prs_contactpersoon  p
                     WHERE     kw.res_kenmerkwaarde_verwijder IS NULL
                           AND k.res_kenmerk_verwijder IS NULL
                           AND k.res_kenmerk_key = kw.res_kenmerk_key
                           AND k.res_srtkenmerk_key = 41
                           AND p.prs_contactpersoon_key =
                               fac.safe_to_number (
                                   kw.res_kenmerkreservering_waarde)) cp,
                   (SELECT kw.res_rsv_ruimte_key b_rsv_ruimte_key, b.*
                      FROM res_kenmerkwaarde      kw,
                           res_kenmerk            k,
                           prs_v_aanwezigbedrijf  b
                     WHERE     kw.res_kenmerkwaarde_verwijder IS NULL
                           AND k.res_kenmerk_verwijder IS NULL
                           AND k.res_kenmerk_key = kw.res_kenmerk_key
                           AND k.res_srtkenmerk_key = 81
                           AND b.prs_bedrijf_key =
                               fac.safe_to_number (
                                   kw.res_kenmerkreservering_waarde)) b,
                   (SELECT kw.res_rsv_ruimte_key     rf_rsv_ruimte_key,
                           res_kenmerkreservering_waarde
                      FROM res_kenmerkwaarde kw, res_kenmerk k
                     WHERE     kw.res_kenmerkwaarde_verwijder IS NULL
                           AND k.res_kenmerk_verwijder IS NULL
                           AND k.res_kenmerk_key = kw.res_kenmerk_key
                           AND k.res_srtkenmerk_key = 121) rf
             WHERE     v.res_srtactiviteit_key = 10
                   AND cp.cp_rsv_ruimte_key(+) = v.res_rsv_ruimte_key
                   AND b.b_rsv_ruimte_key(+) = v.res_rsv_ruimte_key
                   AND rf.rf_rsv_ruimte_key(+) = v.res_rsv_ruimte_key
            UNION ALL
            SELECT DISTINCT res_rsv_ruimte_key,
                            res_reservering_key,
                            res_rsv_ruimte_volgnr,
                            res_rsv_ruimte_van,
                            prs_kostenplaats_nr,
                            prs_kostenplaats_omschrijving,
                            kostenplaats_int_ext,
                            kpngrp_nr,
                            kpngrp_oms,
                            datum,
                            prs_perslid_naam_full,
                            'Intern'     extern,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            NULL
              FROM nybu_v_vermaat
             WHERE res_srtactiviteit_key != 10) r
           LEFT OUTER JOIN (  SELECT res_rsv_ruimte_key,
                                     SUM (totaalprijs_ex)     ex_btw,
                                     SUM (totaal_btw)         btw,
                                     SUM (totaalprijs_in)     totaal
                                FROM nybu_v_vermaat
                               WHERE artikel_btw = 6 OR artikel_btw = 9
                            GROUP BY res_rsv_ruimte_key) l
               ON l.res_rsv_ruimte_key = r.res_rsv_ruimte_key
           LEFT OUTER JOIN (  SELECT res_rsv_ruimte_key,
                                     SUM (totaalprijs_ex)     ex_btw,
                                     SUM (totaal_btw)         btw,
                                     SUM (totaalprijs_in)     totaal
                                FROM nybu_v_vermaat
                               WHERE artikel_btw = 21
                            GROUP BY res_rsv_ruimte_key) h
               ON h.res_rsv_ruimte_key = r.res_rsv_ruimte_key
--   LEFT OUTER JOIN (
--      SELECT res_rsv_ruimte_key,
--             SUM(totaalprijs_ex) ex_btw,
--             SUM(totaal_btw) btw,
--             SUM(totaalprijs_in) totaal
--        FROM nybu_v_vermaat
--    GROUP BY res_rsv_ruimte_key
--   ) a
--   ON a.res_rsv_ruimte_key = r.res_rsv_ruimte_key
;
---------------------------------------------------------------------------------
-- Rapportages goedkeuring catering
--

CREATE OR REPLACE VIEW nybu_v_res_approve
(
   hide_f_srt,
   datum,
   contact_key,
   collega_key,
   contact,
   rsv_ruimte_key,
   goedgekeurd,
   melding,
   html_nieuwe_opmerking,
   bedrag,
   catering,
   status,
   export,
   html_reservering,
   html_reservering_bo,
   aanvang,
   omschrijving,
   pnummer,
   intern_extern,
   locatie
)
AS
   SELECT    ROUND (fac.safe_to_number (SYSDATE - res_rsv_ruimte_van), 5)
          || rr.res_reservering_key
          || '/'
          || res_rsv_ruimte_volgnr
             hide_f_srt,
          res_rsv_ruimte_van datum,
          rr.res_rsv_ruimte_contact_key,
          c.prs_perslid_key_alt collega_key,
          pfc.prs_perslid_naam_friendly contact,
          rr.res_rsv_ruimte_key,
          DECODE (rr.res_rsv_ruimte_afgerond, 1, 'Ja', 'Nee') goedgekeurd,
          mld_melding_key,
          '<a class="details" onclick=''FcltMgr.openDetail("default.asp?u=YDsGBTulSHsSiCwP&amp;rsv_ruimte_key='
          || rr.res_rsv_ruimte_key
          || '&amp;txt=Opmerking over reservering:  '
          || rr.res_reservering_key
          || '/'
          || res_rsv_ruimte_volgnr
          || '")''>Opmerking</a>'
             nieuwe_opmerking,
          res.getdeelresprijs (rr.res_rsv_ruimte_key) bedrag,
          COALESCE (
             (SELECT SUM (res.getartikelprijs (res_rsv_artikel_key))
                FROM res_rsv_artikel rra, res_artikel ra
               WHERE     res_rsv_artikel_verwijder IS NULL
                     AND rra.res_artikel_key = ra.res_artikel_key
                     AND ra.res_discipline_key NOT IN (462, 581, 741) -- hotelkamers, inhuur voorzieningen, linnen
                     AND rra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key),
             0)
             catering,
          DECODE (res_kenmerkreservering_waarde,
                  NULL, s.res_status_bo_omschrijving,
                  'Verwerkt')
             status,
          res_kenmerkreservering_waarde export,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/res/res_reservering.asp?urole=fe&'
          || 'rsv_ruimte_key='
          || rr.res_rsv_ruimte_key
          || '")''>'
          || rr.res_reservering_key
          || '/'
          || res_rsv_ruimte_volgnr
          || '</a>'
             html_reservering,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/res/res_reservering.asp?urole=fo&'
          || 'rsv_ruimte_key='
          || rr.res_rsv_ruimte_key
          || '")''>'
          || rr.res_reservering_key
          || '/'
          || res_rsv_ruimte_volgnr
          || '</a>'
             html_reservering_bo,
          TO_CHAR (rr.res_rsv_ruimte_van, 'DD-MM-YYYY HH24:MI') aanvang,
          rr.res_rsv_ruimte_omschrijving omschrijving,
          k.prs_kostenplaats_nr || ' - ' || k.prs_kostenplaats_omschrijving
             pnummer,
          DECODE (
             (SELECT res_kenmerkwaarde_key
                FROM res_kenmerkwaarde kw, res_kenmerk k
               WHERE     kw.res_kenmerk_key = k.res_kenmerk_key
                     AND k.res_srtkenmerk_key = 321 -- Reservering bevat catering op externe kostenpaats.
                     AND kw.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                     AND fac.safe_to_number (
                           kw.res_kenmerkreservering_waarde) = 1),
             NULL,
             DECODE (prs_kostenplaats_extern, 0, 'Intern', 'Extern'),
             'Extern')
             bevatextcat,
             l.locatie_plaats
     FROM res_rsv_ruimte rr,
           res_v_udr_reservering l, 
          (SELECT prs_perslid_key_alt, prs_perslid_key FROM prs_collega
           UNION ALL
           SELECT prs_perslid_key, prs_perslid_key FROM prs_perslid) c,
          prs_v_perslid_fullnames pfc,
          prs_kostenplaats k,
          res_status_bo s,
          (  SELECT res_rsv_ruimte_key, MAX (mld_melding_key) mld_melding_key
               FROM mld_melding
              WHERE mld_stdmelding_key = 1301
           GROUP BY res_rsv_ruimte_key) m,          -- opmerking over catering
          (SELECT res_kenmerkreservering_waarde, res_rsv_ruimte_key
             FROM res_kenmerkwaarde kw, res_kenmerk k
            WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                  AND k.res_srtkenmerk_key = 202) e,
          (  SELECT MIN (res_status_bo_key) res_status_bo_key,
                    res_rsv_ruimte_key
               FROM (SELECT res_status_bo_key, rr1.res_rsv_ruimte_key
                       FROM res_rsv_ruimte rr1
                      WHERE rr1.res_rsv_ruimte_verwijder IS NULL
                     UNION ALL
                     SELECT res_status_bo_key, rd1.res_rsv_ruimte_key
                       FROM res_rsv_deel rd1
                      WHERE rd1.res_rsv_deel_verwijder IS NULL
                     UNION ALL
                     SELECT res_status_bo_key, ra1.res_rsv_ruimte_key
                       FROM res_rsv_artikel ra1
                      WHERE ra1.res_rsv_artikel_verwijder IS NULL)
           GROUP BY res_rsv_ruimte_key) bo_stat
    WHERE     rr.res_rsv_ruimte_verwijder IS NULL
          AND rr.res_rsv_ruimte_contact_key = c.prs_perslid_key
          AND l.key =   rr.res_rsv_ruimte_key
          AND pfc.prs_perslid_key = rr.res_rsv_ruimte_contact_key
          AND k.prs_kostenplaats_key = rr.prs_kostenplaats_key
          AND bo_stat.res_status_bo_key = s.res_status_bo_key
          AND bo_stat.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
          AND rr.res_rsv_ruimte_key = e.res_rsv_ruimte_key(+)
          AND m.res_rsv_ruimte_key(+) = rr.res_rsv_ruimte_key
          AND s.res_status_bo_key = 5
          AND NOT EXISTS
                (SELECT fin_verkoopfactuur_refkey
                   FROM fin_verkoopfactuur
                  WHERE fin_verkoopfactuur_datum IS NOT NULL
                        AND COALESCE (fin_verkoopfactuur_c4, 'NOP') =
                              'catering'
                        AND fin_verkoopfactuur_refkey = rr.res_rsv_ruimte_key)
          AND rr.res_rsv_ruimte_van > TO_DATE ('20160101', 'yyyymmdd');


CREATE OR REPLACE VIEW nybu_v_rap_res_approve
AS
   SELECT *
     FROM nybu_v_res_approve
    WHERE catering > 0;

-- notificatie naar contactpersoon als de reservering goedgekeurd moet worden. De mail wordt
-- drie werkdagen na de reservering verzonden. Aangezien er ook in het weekend gereserveerd
-- kan worden controleert de view of dezelfde notificatie ook gisteren verstuurd zou zijn.

CREATE OR REPLACE VIEW nybu_v_noti_goedkeuring_cat
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   XKEY
)
AS
   SELECT 'CUST01',
          NULL,
          res_rsv_ruimte_contact_key,
          'Akkoord cateringkosten',
          res_rsv_ruimte_key,
          NULL
     FROM res_rsv_ruimte rrr
    WHERE fac.datumtijdplusuitvoertijd (TRUNC (SYSDATE),
                                        -4,
                                        'DAGEN',
                                        0,
                                        24,
                                        1) <>
             fac.datumtijdplusuitvoertijd (TRUNC (SYSDATE - 1),
                                           -4,
                                           'DAGEN',
                                           0,
                                           24,
                                           1)
          AND res_rsv_ruimte_tot BETWEEN fac.datumtijdplusuitvoertijd (
                                            TRUNC (SYSDATE - 1),
                                            -4,
                                            'DAGEN',
                                            0,
                                            24,
                                            1)
                                     AND  fac.datumtijdplusuitvoertijd (
                                             TRUNC (SYSDATE),
                                             -4,
                                             'DAGEN',
                                             0,
                                             24,
                                             1)
          AND COALESCE (
                (SELECT SUM (res.getartikelprijs (res_rsv_artikel_key))
                   FROM res_rsv_artikel rra, res_artikel ra
                  WHERE     res_rsv_artikel_verwijder IS NULL
                        AND rra.res_artikel_key = ra.res_artikel_key
                        AND ra.res_discipline_key NOT IN (462, 581, 741) -- hotelkamers, inhuur voorzieningen, linnen
                        AND rra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key),
                0) > 0;

---------------------------------------------------------------------------------
-- Koppeling met VIPS.
-- Deze view wordt gebruikt in soap-service: zie FSN#29345.

CREATE OR REPLACE VIEW nybu_v_vips_koppeling
AS
   SELECT rr.res_reservering_key,
          rr.res_rsv_ruimte_volgnr,
          rr.res_rsv_ruimte_key,
          r.res_ruimte_key,
          r.res_ruimte_nr,
          l.alg_locatie_code,
          l.alg_locatie_omschrijving,
          g.alg_gebouw_code,
          g.alg_gebouw_naam,
          v.alg_verdieping_volgnr,
          v.alg_verdieping_omschrijving,
          ar.alg_ruimte_nr,
          ar.alg_ruimte_omschrijving,
          op.res_opstelling_key,
          op.res_opstelling_omschrijving,
          rr.res_rsv_ruimte_van,
          rr.res_rsv_ruimte_omschrijving,
          rr.res_rsv_ruimte_opmerking,
          rr.res_rsv_ruimte_bezoekers,
          rr.res_status_fo_key,
          rr.res_status_bo_key,
          ra.res_rsv_artikel_levering,
          TO_CHAR (ra.res_rsv_artikel_levering, 'DD-MM-YYYY') datum,
          TO_CHAR (ra.res_rsv_artikel_levering, 'HH24:MI') tijd,
          ra.res_rsv_artikel_aantal aantal,
          a.res_artikel_key,
          a.res_artikel_nr artikelnr,
          a.res_artikel_omschrijving artikeloms,
          d.ins_discipline_key,
          d.ins_discipline_omschrijving catalogus,
          ra.res_rsv_artikel_prijs,
          a.res_artikel_prijs,
          a.res_artikel_prijs eenheidsprijs,
          res.getartikelprijs (ra.res_rsv_artikel_key) totaalprijs,
          c.prs_perslid_naam contact_naam,
          c.prs_perslid_tussenvoegsel contact_tussenvoegsel,
          c.prs_perslid_voorletters contact_voorletters,
          c.prs_perslid_voornaam contact_voornaam,
          DECODE (c.prs_perslid_geslacht, 0, 'V', 1, 'M', '')
             contact_geslacht,
          c.prs_perslid_email contact_email,
          c.prs_perslid_telefoonnr contact_telefoonnr,
          c.prs_perslid_mobiel contact_mobiel,
          h.prs_perslid_naam host_naam,
          h.prs_perslid_tussenvoegsel host_tussenvoegsel,
          h.prs_perslid_voorletters host_voorletters,
          h.prs_perslid_voornaam host_voornaam,
          DECODE (h.prs_perslid_geslacht, 0, 'V', 1, 'M', '') host_geslacht,
          h.prs_perslid_email host_email,
          h.prs_perslid_telefoonnr host_telefoonnr,
          h.prs_perslid_mobiel host_mobiel,
          k.prs_kostenplaats_nr,
          (SELECT w.res_kenmerkreservering_waarde
             FROM res_kenmerkwaarde w, res_kenmerk k
            WHERE     w.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                  AND w.res_kenmerk_key = k.res_kenmerk_key
                  AND k.res_srtkenmerk_key = 161
                  AND w.res_kenmerkwaarde_verwijder IS NULL)
             Dieet_wensen,
          (SELECT w.res_kenmerkreservering_waarde
             FROM res_kenmerkwaarde w, res_kenmerk k
            WHERE     w.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                  AND w.res_kenmerk_key = k.res_kenmerk_key
                  AND k.res_srtkenmerk_key = 102
                  AND w.res_kenmerkwaarde_verwijder IS NULL)
             Aanvullende_wensen,
          (SELECT w.res_kenmerkreservering_waarde
             FROM res_kenmerkwaarde w, res_kenmerk k
            WHERE     w.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                  AND w.res_kenmerk_key = k.res_kenmerk_key
                  AND k.res_srtkenmerk_key = 101
                  AND w.res_kenmerkwaarde_verwijder IS NULL)
             Programmatijden,
          (SELECT b.prs_bedrijf_naam
             FROM PRS_V_AANWEZIGBEDRIJF b, res_kenmerkwaarde w, res_kenmerk k
            WHERE b.prs_bedrijf_key =
                     fac.safe_to_number (w.res_kenmerkreservering_waarde)
                  AND w.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                  AND w.res_kenmerk_key = k.res_kenmerk_key
                  AND k.res_srtkenmerk_key = 81
                  AND w.res_kenmerkwaarde_verwijder IS NULL)
             extern_bedrijf,
          (SELECT cp.prs_contactpersoon_naam_full
             FROM NYBU_V_CONTACTPERSOON cp,
                  res_kenmerkwaarde w,
                  res_kenmerk k
            WHERE cp.prs_contactpersoon_key =
                     fac.safe_to_number (w.res_kenmerkreservering_waarde)
                  AND w.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                  AND w.res_kenmerk_key = k.res_kenmerk_key
                  AND k.res_srtkenmerk_key = 41
                  AND w.res_kenmerkwaarde_verwijder IS NULL)
             extern_contact
     FROM res_rsv_artikel ra,
          res_artikel a,
          res_discipline d,
          res_rsv_ruimte rr,
          res_ruimte_opstelling ro,
          res_opstelling op,
          res_ruimte r,
          alg_ruimte ar,
          alg_verdieping v,
          alg_gebouw g,
          alg_locatie l,
          prs_perslid c,
          prs_kostenplaats k,
          prs_perslid h
    WHERE     rr.res_rsv_ruimte_verwijder IS NULL
          AND rr.res_rsv_ruimte_van >= SYSDATE - (4 * 7 * 24) / 24
          AND rr.res_rsv_ruimte_van <= SYSDATE + (4 * 7 * 24) / 24
          AND a.res_artikel_key = ra.res_artikel_key
          AND d.ins_discipline_key = a.res_discipline_key
          AND d.ins_discipline_key NOT IN (462, 581)
          AND UPPER (d.ins_discipline_omschrijving) NOT LIKE '%(AMS)%'
          AND UPPER (d.ins_discipline_omschrijving) NOT LIKE '%AMSTERDAM%'
          AND d.ins_discipline_min_level = 2
          AND rr.res_rsv_ruimte_key = ra.res_rsv_ruimte_key
          AND rr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key(+)
          AND ro.res_ruimte_key = r.res_ruimte_key(+)
          AND ro.res_opstelling_key = op.res_opstelling_key(+)
          AND rr.alg_ruimte_key = ar.alg_ruimte_key(+)
          AND ar.alg_verdieping_key = v.alg_verdieping_key(+)
          AND v.alg_gebouw_key = g.alg_gebouw_key(+)
          AND g.alg_locatie_key = l.alg_locatie_key(+)
          AND rr.res_rsv_ruimte_contact_key = c.prs_perslid_key
          AND k.prs_kostenplaats_key = rr.prs_kostenplaats_key
          AND rr.res_rsv_ruimte_host_key = h.prs_perslid_key
          AND rr.res_rsv_ruimte_dirtlevel = 0;

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

-- notificatiejob voor Delivery at Servicepoint (stdmelding 961)

CREATE OR REPLACE VIEW nybu_v_noti_deliveryreminder
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   XKEY
)
AS
   SELECT 'MLDINF',
          NULL,
          prs_perslid_key_voor,
          'Reminder: Delivery at Servicepoint',
          mld_melding_key,
          NULL
     FROM mld_melding
    WHERE     mld_stdmelding_key = 961
          AND mld_melding_status IN (0, 2, 3, 4, 7)
          AND TRUNC (mld_melding_datum) = TRUNC (SYSDATE - 7);

------- USRGRAPHS ---------------------------------------------------------------

CREATE OR REPLACE VIEW nybu_v_graph_mld_ppi_uitv
(
   FCLT_XAS_AANTAL,
   FCLT_YAS_TOTAAL,
   FCLT_3D_DISCIPLINE_KEY
)
AS
   SELECT TO_CHAR (SUM (uitvoeringoptijd)) aantal,
          COUNT (mld_key) totaal,
          MAX (ins_discipline_key)
     FROM (SELECT DISTINCT
                  m.mld_melding_key mld_key,
                  md.ins_discipline_key,
                  CASE
                     WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NULL
                     THEN
                        CASE SIGN(fac.datumtijdplusuitvoertijd (
                                     m.mld_melding_datum,
                                     m.mld_melding_t_uitvoertijd.tijdsduur,
                                     m.mld_melding_t_uitvoertijd.eenheid)
                                  - COALESCE (
                                       fac.gettrackingdate (
                                          'MLDREJ',
                                          m.mld_melding_key),
                                       fac.gettrackingdate (
                                          'MLDAFM',
                                          m.mld_melding_key),
                                       SYSDATE))
                           WHEN -1
                           THEN
                              0
                           ELSE
                              1
                        END
                     ELSE
                        1
                  END
                     uitvoeringoptijd
             FROM mld_melding m,
                  mld_discipline md,
                  mld_stdmelding std,
                  fac_groeprechten gr
            WHERE     md.ins_discipline_key = std.mld_ins_discipline_key
                  AND std.mld_stdmelding_key = m.mld_stdmelding_key
                  AND mld_melding_status IN (2, 3, 4, 7, 0)
                  AND gr.ins_discipline_key = std.mld_ins_discipline_key
                  AND gr.fac_groep_key = 21
                  AND gr.fac_functie_key = 33);

CREATE OR REPLACE VIEW nybu_v_graph_mld_ppi_accept
(
   FCLT_XAS_AANTAL,
   FCLT_YAS_TOTAAL,
   FCLT_3D_DISCIPLINE_KEY
)
AS
   SELECT -- ROUND ( (SUM (acceptoptijd) / COUNT (mld_key)) * 100)  acceptoptijd,
         TO_CHAR (SUM (acceptoptijd)) aantal,
          COUNT (mld_key) totaal,
          MAX (ins_discipline_key)
     FROM (SELECT DISTINCT
                  m.mld_melding_key mld_key,
                  md.ins_discipline_key,
                  CASE SIGN(fac.datumtijdplusuitvoertijd (
                               fac.gettrackingdate ('MLDNEW',
                                                    m.mld_melding_key),
                               std.mld_stdmelding_t_accepttijd.tijdsduur,
                               std.mld_stdmelding_t_accepttijd.eenheid)
                            - SYSDATE)
                     WHEN -1
                     THEN
                        0
                     ELSE
                        1
                  END
                     acceptoptijd
             FROM mld_melding m,
                  mld_discipline md,
                  mld_stdmelding std,
                  fac_groeprechten gr
            WHERE     md.ins_discipline_key = std.mld_ins_discipline_key
                  AND std.mld_stdmelding_key = m.mld_stdmelding_key
                  AND mld_melding_status IN (2, 3)
                  AND gr.ins_discipline_key = std.mld_ins_discipline_key
                  AND gr.fac_groep_key = 21
                  AND gr.fac_functie_key = 33);


CREATE OR REPLACE VIEW nybu_v_graph_busyxdiscipline
(
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_URL,
   FCLT_3D_DISCIPLINE_KEY
)
AS
     SELECT discipline_omschrijving,
            SUM (aantal),
            'appl/mld/mld_search.asp?urole=bo&autosearch=1&chkSelf=1&chkNew=0&disc_key_str='
            || ins_discipline_key,
            ins_discipline_key
       FROM (SELECT d.ins_discipline_key,
                       sd.ins_srtdiscipline_prefix
                    || '-'
                    || d.ins_discipline_omschrijving
                       discipline_omschrijving,
                    aantal
               FROM (  SELECT mld_stdmelding_key, COUNT ( * ) aantal
                         FROM mld_melding
                        WHERE mld_melding_status IN (4, 7, 0)
                     GROUP BY mld_stdmelding_key) m2,
                    mld_stdmelding std,
                    ins_tab_discipline d,
                    ins_srtdiscipline sd
              WHERE     m2.mld_stdmelding_key(+) = std.mld_stdmelding_key
                    AND std.mld_ins_discipline_key = d.ins_discipline_key
                    AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                    AND aantal IS NOT NULL)
   GROUP BY discipline_omschrijving, ins_discipline_key;

-- Aantal open (te behandelen) meldingen per discipline

CREATE OR REPLACE VIEW nybu_v_graph_todoxdiscipline
(
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_URL,
   FCLT_3D_DISCIPLINE_KEY
)
AS
     SELECT discipline_omschrijving,
            SUM (aantal),
            'appl/mld/mld_search.asp?urole=bo&autosearch=1&disc_key_str='
            || ins_discipline_key,
            ins_discipline_key
       FROM (SELECT d.ins_discipline_key,
                       sd.ins_srtdiscipline_prefix
                    || '-'
                    || d.ins_discipline_omschrijving
                       discipline_omschrijving,
                    aantal
               FROM (  SELECT mld_stdmelding_key, COUNT ( * ) aantal
                         FROM mld_melding
                        WHERE mld_melding_status IN (2, 3)
                     GROUP BY mld_stdmelding_key) m2,
                    mld_stdmelding std,
                    ins_tab_discipline d,
                    ins_srtdiscipline sd
              WHERE     m2.mld_stdmelding_key(+) = std.mld_stdmelding_key
                    AND std.mld_ins_discipline_key = d.ins_discipline_key
                    AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                    AND aantal IS NOT NULL)
   GROUP BY discipline_omschrijving, ins_discipline_key;

CREATE OR REPLACE VIEW nybu_v_graph_mldnieuw_verloop
(
   FCLT_XAS_,
   FCLT_YAS_
)
AS
   SELECT tijd || ':00', 0
     FROM (    SELECT TRIM (TO_CHAR (LEVEL, '09')) tijd, LEVEL nivo
                 FROM DUAL
           CONNECT BY LEVEL <= 24)
    WHERE nivo >= 7 AND nivo <= 19
          AND NOT EXISTS
                (SELECT ''
                   FROM mld_melding m
                  WHERE TRUNC (m.mld_melding_datum) = TRUNC (SYSDATE)
                        AND TO_CHAR (m.mld_melding_datum, 'hh24') = tijd)
   UNION
     SELECT TO_CHAR (m.mld_melding_datum, 'hh24') || ':00', COUNT ( * ) aantal
       FROM mld_melding m, fac_groeprechten gr, mld_stdmelding s
      WHERE     TRUNC (m.mld_melding_datum) = TRUNC (SYSDATE)
            AND gr.fac_groep_key = 21
            AND gr.fac_functie_key = 33
            AND gr.ins_discipline_key = s.mld_ins_discipline_key
            AND m.mld_stdmelding_key = s.mld_stdmelding_key
   GROUP BY TO_CHAR (m.mld_melding_datum, 'hh24');

CREATE OR REPLACE VIEW nybu_v_graph_aanafgemeld
(
   FCLT_XAS_,
   FCLT_YAS_AANGEMELD,
   FCLT_YAS2_AFGEMELD,
   DATUM
)
AS
     -- 21 "ICT Servicedesk"
     -- 33 WEB_MLDBOF
     SELECT TO_CHAR (dt.datum, 'DD-MM') datum_label,
            COALESCE (aan.aantal, 0) aangemeld,
            COALESCE (af.aantal, 0) afgemeld,
            dt.datum datum
       FROM (    SELECT TRUNC (SYSDATE + 1 - ROWNUM) datum
                   FROM DUAL
             CONNECT BY ROWNUM <= (SYSDATE - ADD_MONTHS (SYSDATE, -1))) dt
            LEFT OUTER JOIN (                      -- 36 = MLDAFM, 41 = MLDREJ
                             SELECT   TRUNC (t.fac_tracking_datum) datum,
                                      COUNT ( * ) aantal
                                 FROM fac_tracking t,
                                      mld_melding m,
                                      fac_groeprechten gr,
                                      mld_stdmelding s
                                WHERE fac_srtnotificatie_key IN (36, 41)
                                      AND TRUNC (fac_tracking_datum) BETWEEN ADD_MONTHS (
                                                                                SYSDATE,
                                                                                -1)
                                                                         AND  TRUNC(SYSDATE)
                                      AND m.mld_melding_key =
                                            t.fac_tracking_refkey
                                      AND m.mld_stdmelding_key =
                                            s.mld_stdmelding_key
                                      AND gr.ins_discipline_key =
                                            s.mld_ins_discipline_key
                                      AND gr.fac_groep_key = 21
                                      AND gr.fac_functie_key = 33
                             GROUP BY TRUNC (fac_tracking_datum)) af
               ON af.datum = dt.datum
            LEFT OUTER JOIN (  SELECT TRUNC (m.mld_melding_datum) datum,
                                      COUNT ( * ) aantal
                                 FROM mld_melding m,
                                      fac_groeprechten gr,
                                      mld_stdmelding s
                                WHERE gr.fac_groep_key = 21
                                      AND gr.fac_functie_key = 33
                                      AND gr.ins_discipline_key =
                                            s.mld_ins_discipline_key
                                      AND m.mld_stdmelding_key =
                                            s.mld_stdmelding_key
                                      AND TRUNC (m.mld_melding_datum) BETWEEN ADD_MONTHS (
                                                                                 SYSDATE,
                                                                                 -1)
                                                                          AND  TRUNC(SYSDATE)
                             GROUP BY TRUNC (m.mld_melding_datum)) aan
               ON aan.datum = dt.datum
   ORDER BY datum;

CREATE OR REPLACE VIEW nybu_v_graph_aanaf_vandaag
(
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_
)
AS
   SELECT 'Aangemeld', fclt_yas_aangemeld, 0 af
     FROM nybu_v_graph_aanafgemeld
    WHERE datum = TRUNC (SYSDATE)
   UNION ALL
   SELECT 'Afgemeld', 0, fclt_yas2_afgemeld
     FROM nybu_v_graph_aanafgemeld
    WHERE datum = TRUNC (SYSDATE);

CREATE OR REPLACE VIEW nybu_v_budgethouders
(
   perslid_key,
   naam
)
AS
   SELECT prs_perslid_key, prs_perslid_naam_full
     FROM prs_v_perslid_fullnames
    WHERE prs_perslid_key IN
                (SELECT DISTINCT k.prs_perslid_key
                   FROM prs_kostenplaats k
                  WHERE K.PRS_KOSTENPLAATS_VERWIJDER IS NULL
                        AND (TRUNC (K.PRS_KOSTENPLAATS_EIND) >
                                TRUNC (SYSDATE)
                             OR K.PRS_KOSTENPLAATS_EIND IS NULL));

CREATE OR REPLACE VIEW NYBU_V_ICT_LEVERANCIERS
(
   bedrijf_key,
   naam_leverancier
)
AS
   SELECT b.prs_bedrijf_key, b.prs_bedrijf_naam
     FROM prs_v_leverancierbedrijf b, prs_kenmerklink k
    WHERE K.PRS_LINK_KEY = B.PRS_BEDRIJF_KEY AND K.PRS_KENMERK_KEY = 1260;

CREATE OR REPLACE VIEW NYBU_V_RAP_WIJZIGINGSVERZOEKEN
(
   MELDINGNR,
   MELDING,
   DATUM,
   STATUS,
   AANVRAGER,
   APPLICATIE,
   ONDERWERP,
   URGENTIE,
   BEHANDELAAR
)
AS
   SELECT m.mld_melding_key meldingnr,
          m.mld_melding_key melding,
          TO_DATE (m.mld_melding_datum) datum,
          CASE m.mld_melding_status
             WHEN 1 THEN 'Afgewezen'
             WHEN 2 THEN 'Nieuw'
             WHEN 3 THEN 'Te accepteren'
             WHEN 4 THEN 'In behandeling'
             WHEN 5 THEN 'Afgemeld'
             WHEN 6 THEN 'Historie'
             WHEN 7 THEN 'Uitgegeven'
          END
             status,
          a.prs_perslid_naam_friendly aanvrager,
          appl.fac_usrdata_code applicatie,
          ond.mld_kenmerkmelding_waarde onderwerp,
          urgw.fac_usrdata_code urgentie,
          B.PRS_PERSLID_NAAM_FRIENDLY behandelaar
     FROM mld_melding m,
          prs_v_perslid_fullnames_all b,
          prs_v_perslid_fullnames_all a,
          mld_kenmerkmelding ka,
          fac_usrdata appl,
          mld_kenmerkmelding ond,
          mld_kenmerkmelding urg,
          fac_usrdata urgw
    WHERE     m.mld_stdmelding_key = 1821                --- wijzigingsverzoek
          AND m.prs_perslid_key_voor = a.prs_perslid_key
          AND m.mld_melding_behandelaar_key = b.prs_perslid_key(+)
          AND ka.mld_melding_key = m.mld_melding_key
          AND ka.mld_kenmerk_key = 1801                         --- applicatie
          AND ka.mld_kenmerkmelding_waarde = appl.fac_usrdata_key
          AND ond.mld_melding_key = m.mld_melding_key
          AND ond.mld_kenmerk_key = 1803                          ---onderwerp
          AND urg.mld_melding_key = m.mld_melding_key
          AND urg.mld_kenmerk_key = 1805                           --- urentie
          AND urg.mld_kenmerkmelding_waarde = urgw.fac_usrdata_key;

CREATE OR REPLACE VIEW NYBU_V_RAP_ADV_WIJZIGINGSVERZ
(
   MELDINGNR,
   MELDING,
   DATUM,
   STATUS,
   AANVRAGER,
   APPLICATIE,
   ONDERWERP,
   URGENTIE,
   BEHANDELAAR,
   CATEGORIE
)
AS
   SELECT m.mld_melding_key,
          m.mld_melding_key meldingnr,
          TO_DATE (m.mld_melding_datum) datum,
          CASE m.mld_melding_status
             WHEN 1 THEN 'Afgewezen'
             WHEN 2 THEN 'Nieuw'
             WHEN 3 THEN 'Te accepteren'
             WHEN 4 THEN 'In behandeling'
             WHEN 5 THEN 'Afgemeld'
             WHEN 6 THEN 'Historie'
             WHEN 7 THEN 'Uitgegeven'
          END
             status,
          p.prs_perslid_naam_friendly aanvrager,
          applw.fac_usrdata_code applicatie,
          ond.mld_kenmerkmelding_waarde onderwerp,
          urgw.fac_usrdata_code urgentie,
          b.prs_perslid_naam_friendly behandelaar,
          CASE cat.mld_kenmerkmelding_waarde
             WHEN '921' THEN 'Categorie 1 - functioneel beheerder beslist'
             WHEN '922' THEN 'Categorie 2 - het wijzigingsoverleg beslist'
             WHEN '923' THEN 'Categorie 3 - College van Bestuur beslist'
          END
             categorie
     FROM mld_melding m,
          prs_v_perslid_fullnames_all p,
          prs_v_perslid_fullnames_all b,
          mld_kenmerkmelding appl,
          fac_usrdata applw,
          mld_kenmerkmelding ond,
          mld_kenmerkmelding urg,
          fac_usrdata urgw,
          mld_kenmerkmelding cat
    WHERE     m.mld_stdmelding_key = 1821                --- wijzigingsverzoek
          AND p.prs_perslid_key = m.prs_perslid_key_voor
          AND b.prs_perslid_key(+) = m.mld_melding_behandelaar_key
          AND appl.mld_melding_key = m.mld_melding_key
          AND appl.mld_kenmerk_key = 1801                       --- applicatie
          AND appl.mld_kenmerkmelding_waarde = applw.fac_usrdata_key
          AND ond.mld_melding_key = m.mld_melding_key
          AND ond.mld_kenmerk_key = 1803                          ---onderwerp
          AND urg.mld_melding_key = m.mld_melding_key
          AND urg.mld_kenmerk_key = 1805                           --- urentie
          AND urg.mld_kenmerkmelding_waarde = urgw.fac_usrdata_key
          AND cat.mld_melding_key = m.mld_melding_key
          AND cat.mld_kenmerk_key = 1861                         --- categorie
          AND NOT EXISTS
                (SELECT besw.fac_usrdata_code besluit
                   FROM mld_kenmerkmelding bes, fac_usrdata besw
                  WHERE bes.mld_melding_key(+) = m.mld_melding_key
                        AND bes.mld_kenmerk_key = 1862
                        AND bes.mld_kenmerkmelding_waarde =
                              besw.fac_usrdata_key);

-- NYBU#36783 controle rapport facturatieproces reserveringen

CREATE OR REPLACE VIEW NYBU_V_RAP_CONTR_FACT_RESV
(
   EXP,
   TAAK,
   UITGEVOERD
)
AS
     SELECT CASE S.IMP_SCHEDULE_NAME
               WHEN 'RES_CODA' THEN 'Zaalhuur'
               WHEN 'RES_VERWERK' THEN 'Zaalhuur'
               WHEN 'RES_CAT' THEN 'Catering'
               WHEN 'RES_CAT_VERWERK' THEN 'Catering'
               WHEN 'T_HUUR_CODA' THEN 'Campus'
               WHEN 'HUUR_CODA' THEN 'Campus'
            END
               EXPORT, CASE S.IMP_SCHEDULE_NAME
                          WHEN 'RES_CODA' THEN 'Export Coda'
                          WHEN 'RES_VERWERK' THEN 'Afsluiten facturatie'
                          WHEN 'RES_CAT' THEN 'Export Coda'
                          WHEN 'RES_CAT_VERWERK' THEN 'Afsluiten facturatie'
                          WHEN 'T_HUUR_CODA' THEN 'Controle factuuregels'
                          WHEN 'HUUR_CODA' THEN 'Export Coda'
                       END
                          TAAK, S.IMP_SCHEDULE_DONE UITGEVOERD
       FROM IMP_SCHEDULE s
      WHERE S.IMP_SCHEDULE_NAME IN
                  ('RES_CODA',
                   'RES_VERWERK',
                   'RES_CAT',
                   'RES_CAT_VERWERK',
                   'T_HUUR_CODA',
                   'HUUR_CODA')
   ORDER BY EXPORT, S.IMP_SCHEDULE_DONE DESC;

CREATE OR REPLACE FORCE VIEW NYBU_V_RAP_WERKPLEKKEN_KPLGRP
(
   KOSTENPLAATSGROEP,
   BEDRAG
)
AS
     SELECT fclt_f_kostenplaatsgroep kostenplaatsgroep,
            ROUND (SUM (prijs), 2) bedrag
       FROM nybu_v_rap_werkplekken
   GROUP BY fclt_f_kostenplaatsgroep;


CREATE OR REPLACE VIEW NYBU_V_RAP_RESERVERING_INT_EXT
(
   KEY,
   NUMMER,
   RES_OMSCHRIJVING,
   INVOERDATUM,
   DATUM,
   GASTHEER,
   CONTACT,
   INVOERDER,
   KOSTENSOORTGROEP,
   KOSTENSOORT,
   KPN,
   KPN_OMSCHRIJVING,
   KNP_EXTERN,
   FCLT_3D_AFDELING_KEY,
   AFDELING_CODE,
   AFDELING_OMSCHRIJVING,
   REGIO_OMSCHRIJVING,
   DISTRICT_OMSCHIJVING,
   FCLT_3D_LOCATIE_KEY,
   LOCATIE,
   LOCATIE_OMSCHRIJVING,
   LOCATIE_PLAATS,
   GEBOUW,
   VERDIEPING,
   RUIMTE,
   OPSTELLING,
   CAPACITEIT,
   NO_SHOW,
   MANDAAT,
   PERSONEELSNR,
   FCLT_3D_DISCIPLINE_KEY,
   CATALOGUS_KEY,
   CATALOGUS,
   RESERVEERBARE_RUIMTE,
   BEZOEKERS,
   VAN,
   TOT,
   DUUR,
   STATUS,
   BOSTATUS,
   ACTIVITEIT,
   SRTACTIVITEIT_KEY,
   ACTIVITEITSOORT,
   VOORZIENING_DISCIPLINE_KEY,
   VOORZIENING_TYPE,
   VOORZIENING_CATALOGUS,
   VOORZIENING_PRODUCT_KEY,
   VOORZIENING_PRODUCT,
   VOORZIENING_TOTAALPRIJS,
   VOORZIENING_VAN,
   VOORZIENING_TOT,
   VOORZIENING_AANTAL,
   VOORZIENING_PRIJS
)
AS
   SELECT rrr.res_rsv_ruimte_key,
          res.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr,
          rrr.res_rsv_ruimte_omschrijving,
          COALESCE (rrr.res_rsv_ruimte_aanmaak, voorz.van),
          COALESCE (rrr.res_rsv_ruimte_van, voorz.van),
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = rrr.res_rsv_ruimte_host_key),
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = rrr.res_rsv_ruimte_contact_key),
          (SELECT pf.prs_perslid_naam_full
             FROM fac_tracking tr,
                  fac_srtnotificatie str,
                  prs_v_perslid_fullnames_all pf
            WHERE     tr.prs_perslid_key = pf.prs_perslid_key
                  AND str.fac_srtnotificatie_code = 'RESNEW'
                  AND tr.fac_srtnotificatie_key = str.fac_srtnotificatie_key
                  AND tr.fac_tracking_refkey = rrr.res_rsv_ruimte_key),
          (SELECT ksg.prs_kostensoortgrp_oms
             FROM prs_kostensoortgrp ksg, prs_kostensoort ks
            WHERE ksg.prs_kostensoortgrp_key = ks.prs_kostensoortgrp_key
                  AND ks.prs_kostensoort_key =
                        (SELECT disc.prs_kostensoort_key
                           FROM res_discipline disc
                          WHERE disc.ins_discipline_key =
                                   COALESCE (
                                      voorz.ins_discipline_key,
                                      (SELECT ins_discipline_key
                                         FROM ins_tab_discipline d,
                                              res_ruimte_opstelling ro,
                                              res_ruimte rr
                                        WHERE rrr.res_ruimte_opstel_key =
                                                 ro.res_ruimte_opstel_key
                                              AND ro.res_ruimte_key =
                                                    rr.res_ruimte_key
                                              AND rr.res_discipline_key =
                                                    d.ins_discipline_key))))
             kostensoortgroep,
          (SELECT ks.prs_kostensoort_oms
             FROM prs_kostensoort ks
            WHERE ks.prs_kostensoort_key =
                     (SELECT disc.prs_kostensoort_key
                        FROM res_discipline disc
                       WHERE disc.ins_discipline_key =
                                COALESCE (
                                   voorz.ins_discipline_key,
                                   (SELECT ins_discipline_key
                                      FROM ins_tab_discipline d,
                                           res_ruimte_opstelling ro,
                                           res_ruimte rr
                                     WHERE rrr.res_ruimte_opstel_key =
                                              ro.res_ruimte_opstel_key
                                           AND ro.res_ruimte_key =
                                                 rr.res_ruimte_key
                                           AND rr.res_discipline_key =
                                                 d.ins_discipline_key))))
             kostensoort,
          k.prs_kostenplaats_nr,
          k.prs_kostenplaats_omschrijving,
          DECODE (k.prs_kostenplaats_extern,
                  0, 'Intern',
                  1, 'Extern',
                  'Intern'),
          a.prs_afdeling_key,
          a.prs_afdeling_naam,
          a.prs_afdeling_omschrijving,
          (SELECT rg.alg_regio_omschrijving
             FROM alg_regio rg,
                  alg_district d,
                  alg_locatie l,
                  alg_gebouw G,
                  alg_verdieping v,
                  alg_ruimte r
            WHERE     rg.alg_regio_key = d.alg_regio_key
                  AND d.alg_district_key = l.alg_district_key
                  AND l.alg_locatie_key = g.alg_locatie_key
                  AND g.alg_gebouw_key = v.alg_gebouw_key
                  AND v.alg_verdieping_key = r.alg_verdieping_key
                  AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT d.alg_district_omschrijving
             FROM alg_district d,
                  alg_locatie l,
                  alg_gebouw G,
                  alg_verdieping v,
                  alg_ruimte r
            WHERE     d.alg_district_key = l.alg_district_key
                  AND l.alg_locatie_key = g.alg_locatie_key
                  AND g.alg_gebouw_key = v.alg_gebouw_key
                  AND v.alg_verdieping_key = r.alg_verdieping_key
                  AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT l.alg_locatie_key
             FROM alg_locatie l,
                  alg_gebouw G,
                  alg_verdieping v,
                  alg_ruimte r
            WHERE     l.alg_locatie_key = g.alg_locatie_key
                  AND g.alg_gebouw_key = v.alg_gebouw_key
                  AND v.alg_verdieping_key = r.alg_verdieping_key
                  AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT alg_locatie_code
             FROM alg_locatie l,
                  alg_gebouw G,
                  alg_verdieping v,
                  alg_ruimte r
            WHERE     l.alg_locatie_key = g.alg_locatie_key
                  AND g.alg_gebouw_key = v.alg_gebouw_key
                  AND v.alg_verdieping_key = r.alg_verdieping_key
                  AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT alg_locatie_omschrijving
             FROM alg_locatie l,
                  alg_gebouw G,
                  alg_verdieping v,
                  alg_ruimte r
            WHERE     l.alg_locatie_key = g.alg_locatie_key
                  AND g.alg_gebouw_key = v.alg_gebouw_key
                  AND v.alg_verdieping_key = r.alg_verdieping_key
                  AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT alg_locatie_plaats
             FROM alg_locatie l,
                  alg_gebouw G,
                  alg_verdieping v,
                  alg_ruimte r
            WHERE     l.alg_locatie_key = g.alg_locatie_key
                  AND g.alg_gebouw_key = v.alg_gebouw_key
                  AND v.alg_verdieping_key = r.alg_verdieping_key
                  AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT alg_gebouw_code
             FROM alg_gebouw G, alg_verdieping v, alg_ruimte r
            WHERE     g.alg_gebouw_key = v.alg_gebouw_key
                  AND v.alg_verdieping_key = r.alg_verdieping_key
                  AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT alg_verdieping_code
             FROM alg_verdieping v, alg_ruimte r
            WHERE v.alg_verdieping_key = r.alg_verdieping_key
                  AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          r2a.ruimte_nr,
          r2a.opstelling,
          r2a.capaciteit,
          rrr.res_rsv_ruimte_noshow,
          NVL ( (SELECT pr.fac_profiel_limiet
                   FROM fac_profiel pr
                  WHERE p.fac_profiel_key = pr.fac_profiel_key), 0),
          prs_perslid_nr,
          COALESCE (
             voorz.ins_discipline_key,
             (SELECT ins_discipline_key
                FROM ins_tab_discipline d,
                     res_ruimte_opstelling ro,
                     res_ruimte rr
               WHERE     rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                     AND ro.res_ruimte_key = rr.res_ruimte_key
                     AND rr.res_discipline_key = d.ins_discipline_key)),
          (SELECT ins_discipline_key
             FROM ins_tab_discipline d,
                  res_ruimte_opstelling ro,
                  res_ruimte rr
            WHERE     rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                  AND ro.res_ruimte_key = rr.res_ruimte_key
                  AND rr.res_discipline_key = d.ins_discipline_key),
          (SELECT ins_discipline_omschrijving
             FROM ins_tab_discipline d,
                  res_ruimte_opstelling ro,
                  res_ruimte rr
            WHERE     rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                  AND ro.res_ruimte_key = rr.res_ruimte_key
                  AND rr.res_discipline_key = d.ins_discipline_key),
          DECODE (rrr.alg_ruimte_key, NULL, 'Ja', 'Nee'),
          rrr.res_rsv_ruimte_bezoekers,
          rrr.res_rsv_ruimte_van,
          rrr.res_rsv_ruimte_tot,
          COALESCE ( (rrr.res_rsv_ruimte_tot - rrr.res_rsv_ruimte_van) * 24,
                    0),
          (SELECT res_status_fo_omschrijving
             FROM res_status_fo rs
            WHERE rs.res_status_fo_key = rrr.res_status_fo_key),
          (SELECT res_status_bo_omschrijving
             FROM res_status_bo rs
            WHERE rs.res_status_bo_key = rrr.res_status_bo_key),
          ra.res_activiteit_omschrijving,
          rsa.res_srtactiviteit_key,
          rsa.res_srtactiviteit_omschrijving,
          voorz.ins_discipline_key,
          voorz.vtype,
          voorz.catalogus,
          voorz.product_key,
          voorz.product,
          voorz.totaalprijs,
          TO_CHAR (voorz.van, 'hh24:mi'),
          TO_CHAR (voorz.tot, 'hh24:mi'),
          voorz.aantal,
          voorz.prijs
     FROM res_v_aanwezigrsv_ruimte rrr,
          res_activiteit ra,
          res_srtactiviteit rsa,
          res_reservering res,
          prs_kostenplaats K,
          prs_perslid P,
          prs_afdeling A,
          (  SELECT res_rsv_ruimte_key,
                    MAX (o.res_opstelling_omschrijving) opstelling,
                    MAX (ro.res_ruimte_opstel_bezoekers) capaciteit,
                    MAX (ra.alg_ruimte_key) alg_ruimte_key,
                    MAX (rr.res_ruimte_nr) ruimte_nr
               FROM res_rsv_ruimte r,
                    res_ruimte_opstelling ro,
                    res_opstelling o,
                    res_ruimte rr,
                    res_alg_ruimte ra
              WHERE     r.res_rsv_ruimte_verwijder IS NULL
                    AND r.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                    AND ro.res_ruimte_key = rr.res_ruimte_key
                    AND ro.res_opstelling_key = o.res_opstelling_key
                    AND rr.res_ruimte_key = ra.res_ruimte_key
           GROUP BY res_rsv_ruimte_key
           UNION ALL
           SELECT res_rsv_ruimte_key,
                  '' opstelling,
                  NULL capaciteit,
                  rrr.alg_ruimte_key,
                  r.alg_ruimte_nr
             FROM res_rsv_ruimte rrr, alg_ruimte r
            WHERE rrr.alg_ruimte_key IS NOT NULL
                  AND r.alg_ruimte_key = rrr.alg_ruimte_key) r2a,
          (SELECT rrd.res_rsv_ruimte_key res_rsv_ruimte_key,
                  -rd.res_deel_key product_key,
                  rd.res_deel_omschrijving product,
                  DECODE (
                     rd.res_deel_prijs_vast,
                     1,
                     NVL (rrd.res_rsv_deel_prijs, rd.res_deel_prijs),
                       (rrd.res_rsv_deel_tot - rrd.res_rsv_deel_van)
                     * 24
                     * NVL (rrd.res_rsv_deel_prijs, rd.res_deel_prijs))
                     totaalprijs,
                  rrd.res_rsv_deel_van van,
                  rrd.res_rsv_deel_tot tot,
                  (rrd.res_rsv_deel_tot - rrd.res_rsv_deel_van) * 24 aantal,
                  NVL (rrd.res_rsv_deel_prijs, rd.res_deel_prijs) prijs,
                  c.ins_discipline_key ins_discipline_key,
                  c.ins_discipline_omschrijving catalogus,
                  'object' vtype
             FROM res_v_aanwezigrsv_deel rrd,
                  res_deel rd,
                  ins_deel d,
                  ins_tab_discipline C
            WHERE     rrd.res_deel_key = rd.res_deel_key
                  AND d.ins_deel_key = rd.res_ins_deel_key
                  AND rrd.res_rsv_ruimte_key IS NOT NULL
                  AND c.ins_discipline_key = rd.res_discipline_key
           UNION ALL
           SELECT rra.res_rsv_ruimte_key res_rsv_ruimte_key,
                  ra.res_artikel_key product_key,
                  ra.res_artikel_omschrijving product,
                  NVL (rra.res_rsv_artikel_prijs,
                       rra.res_rsv_artikel_aantal * res_artikel_prijs)
                     totaalprijs,
                  rra.res_rsv_artikel_levering van,
                  NULL tot,
                  rra.res_rsv_artikel_aantal aantal,
                  NVL (
                     rra.res_rsv_artikel_prijs / rra.res_rsv_artikel_aantal,
                     res_artikel_prijs)
                     prijs,
                  c.ins_discipline_key ins_discipline_key,
                  c.ins_discipline_omschrijving catalogus,
                  'consumable' vtype
             FROM res_v_aanwezigrsv_artikel rra,
                  res_artikel ra,
                  ins_tab_discipline C
            WHERE rra.res_artikel_key = ra.res_artikel_key
                  AND ra.res_discipline_key = c.ins_discipline_key) voorz
    WHERE     rrr.res_reservering_key = res.res_reservering_key
          AND rrr.res_rsv_ruimte_key = r2a.res_rsv_ruimte_key(+)
          AND rrr.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
          AND rrr.res_rsv_ruimte_key = voorz.res_rsv_ruimte_key(+)
          AND rrr.res_activiteit_key = ra.res_activiteit_key
          AND ra.res_srtactiviteit_key = rsa.res_srtactiviteit_key
          AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
          AND p.prs_afdeling_key = a.prs_afdeling_key
          AND (rrr.res_ruimte_opstel_key IS NOT NULL
               OR voorz.res_rsv_ruimte_key IS NOT NULL)
          AND rrr.res_rsv_ruimte_van >= TO_DATE ('01-01-2009', 'DD-MM-YYYY');

CREATE OR REPLACE VIEW NYBU_V_RAP_SLE_TOEGANG
(
   FCLT_3D_LOCATIE_KEY,
   FCLT_F_BEZITTER,
   HTML_BEZITTER,
   FCLT_F_SLEUTELSET_CODE,
   FCLT_F_SLEUTELSET_OMS,
   SLEUTEL,
   FCLT_X_LOCATIE,
   FCLT_F_PLAATS,
   HTML_PLAATS
)
AS
   SELECT l.alg_locatie_key,
          pf.prs_perslid_naam_full,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/prs/prs_perslid.asp?prs_key='
          || pf.prs_perslid_key
          || '")''>'
          || HTF.escape_sc (pf.prs_perslid_naam_full)
          || '</a>',
          s.ins_srtdeel_code sset_code,
          s.ins_srtdeel_omschrijving sset_oms,
          sle.ins_deel_omschrijving sleutel,
          l.alg_locatie_code,     -- Locatie ruimte-cilinder (deur of bureau)!
          DECODE (
             cil.ins_alg_ruimte_key_org,
             NULL,                                   -- Als op (stam)bureau,..
             NULL,                                   -- ..dan nergens toegang!
                l.alg_locatie_code
             || '-'
             || aog.alg_gebouw_code
             || '-'
             || aog.alg_verdieping_code
             || '-'
             || aog.alg_ruimte_nr)
             plaats,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/alg/alg_ruimte.asp?key='
          || aog.alg_ruimte_key
          || '")''>'
          || HTF.escape_sc(DECODE (
                              cil.ins_alg_ruimte_key_org,
                              NULL,                  -- Als op (stam)bureau,..
                              NULL,                  -- ..dan nergens toegang!
                                 l.alg_locatie_code
                              || '-'
                              || aog.alg_gebouw_code
                              || '-'
                              || aog.alg_verdieping_code
                              || '-'
                              || aog.alg_ruimte_nr))
          || '</a>'
     FROM ins_srtdeel_srtdeel iss,
          ins_srtdeel C,
          ins_v_aanwezigdeel cil,
          alg_v_allonrgoed_gegevens aog,
          alg_locatie l,
          ins_srtdeel s,
          ins_v_aanwezigdeel sle,
          prs_v_perslid_fullnames_all pf
    WHERE     iss.ins_module = 'SLE'
          AND iss.ins_srtdeel_key_1 = c.ins_srtdeel_key
          AND c.ins_srtdeel_key = cil.ins_srtdeel_key
          AND cil.ins_alg_ruimte_type = 'R'        -- Ingenomen of uitgegeven!
          AND cil.ins_alg_ruimte_key = aog.alg_onroerendgoed_keys
          AND aog.alg_locatie_key = l.alg_locatie_key
          AND iss.ins_srtdeel_key_2 = s.ins_srtdeel_key
          AND s.ins_srtdeel_key = sle.ins_srtdeel_key
          AND sle.ins_alg_ruimte_type = 'P'
          AND sle.ins_alg_ruimte_key = pf.prs_perslid_key
   UNION ALL          -- Uitgegeven sleutels voor uitgegeven terrein-cilinders
   SELECT l.alg_locatie_key,
          pf.prs_perslid_naam_full,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/prs/prs_perslid.asp?prs_key='
          || pf.prs_perslid_key
          || '")''>'
          || HTF.escape_sc (pf.prs_perslid_naam_full)
          || '</a>',
          s.ins_srtdeel_code sset_code,
          s.ins_srtdeel_omschrijving sset_oms,
          sle.ins_deel_omschrijving sleutel,
          l.alg_locatie_code,     -- Locatie ruimte-cilinder (deur of bureau)!
          l.alg_locatie_code || '-' || t.alg_terreinsector_code plaats,
          ''
     FROM ins_srtdeel_srtdeel iss,
          ins_srtdeel C,
          ins_v_aanwezigdeel cil,
          alg_terreinsector T,
          alg_locatie l,
          ins_srtdeel s,
          ins_v_aanwezigdeel sle,
          prs_v_perslid_fullnames_all pf
    WHERE     iss.ins_module = 'SLE'
          AND iss.ins_srtdeel_key_1 = c.ins_srtdeel_key
          AND c.ins_srtdeel_key = cil.ins_srtdeel_key
          AND cil.ins_alg_ruimte_type = 'T'
          AND cil.ins_alg_ruimte_key = t.alg_terreinsector_key
          AND t.alg_locatie_key = l.alg_locatie_key
          AND iss.ins_srtdeel_key_2 = s.ins_srtdeel_key
          AND s.ins_srtdeel_key = sle.ins_srtdeel_key
          AND sle.ins_alg_ruimte_type = 'P'
          AND sle.ins_alg_ruimte_key = pf.prs_perslid_key;

CREATE OR REPLACE VIEW NYBU_V_NOTI_VERTREKBRIEF
(
   SENDER,
   RECEIVER,
   TEXT,
   CODE,
   FAC_SRTNOTIFICATIE_KEY,
   KEY,
   XKEY,
   XEMAIL,
   XMOBILE
)
AS
   SELECT DISTINCT
          NULL sender,
          NULL receiver,
          REPLACE (n.fac_srtnotificatie_oms, '##room##', ar.alg_ruimte_nr), ---omschrijving student room,
          fac_srtnotificatie_code,
          n.fac_srtnotificatie_key,
          m.mld_melding_key,
          NULL xkey,
          s.prs_perslid_email xemail,
          NULL xmobile
     FROM fac_tracking t,
          mld_melding m,
          fac_srtnotificatie n,
          alg_ruimte ar,
          prs_perslid s
    WHERE     t.fac_tracking_refkey = m.mld_melding_key
          AND m.prs_perslid_key_voor = s.prs_perslid_key
          AND t.fac_srtnotificatie_key = 40                         --- mldnew
          AND n.fac_srtnotificatie_code = 'CUST02'
          AND m.mld_stdmelding_key = 941                  -- student departure
          AND m.mld_alg_onroerendgoed_keys = ar.alg_ruimte_key
          AND t.fac_tracking_datum >
                (SELECT fac_notificatie_job_nextrun
                        - fac_notificatie_job_interval / 24
                   FROM fac_notificatie_job
                  WHERE UPPER (fac_notificatie_job_view) =
                           'NYBU_V_NOTI_VERTREKBRIEF')
          AND t.fac_tracking_datum <
                (SELECT fac_notificatie_job_nextrun
                   FROM fac_notificatie_job
                  WHERE UPPER (fac_notificatie_job_view) =
                           'NYBU_V_NOTI_VERTREKBRIEF');

-- NYBU#51606 telto (kenmerk key 66), schade (kenmerk key 41), bill in advance (kenmerk key 122), refund (kenmerk key 123) niet meer van toepassing
-- NYBU#51606 Nieuwe kenmerken bij vertrek: sleutel kwijt (1222) , facturatie omschrijving (1201), bedrag (1202) toegevoegd


CREATE OR REPLACE VIEW NYBU_V_HUURCNT_STUDENT_ALL
(
   CNT_CONTRACT_KEY,
   CNT_CONTRACT_NUMMER_INTERN,
   CNT_CONTRACT_VERSIE,
   CNT_CONTRACT_NR_VERSIE,
   CNT_CONTRACT_STATUS,
   CNT_CONTRACT_LOOPTIJD_VAN,
   CNT_CONTRACT_LOOPTIJD_TOT,
   CNT_PRS_BEDRIJF_KEY,
   KPN,
   KPNGRP,
   KOSTENSOORT,
   ALG_RUIMTE_KEY,
   GEBOUW,
   VERDIEPING,
   KAMER,
   PRS_PERSLID_KEY,
   ACHTERNAAM,
   NAAM,
   CODANR,
   PARTNER_KEY,
   PARTNER_NAAM,
   ALG_SRTRUIMTE_OMSCHRIJVING,
   HUUR,
   BUDGET_HUUR,
   SERVICEKOSTEN,
   BUDGET_SERVICE,
   PARTNERCHARGE,
   BUDGET_PARTNERCHARGE,
   TELEFOONCHARGE,
   BUDGET_TELEFOON,
   BORG_TEBETALEN,
   BORG_BETAALD,
   SLEUTEL,
   AANTAL_PERIODES,
   BETAALD_TOT,
   FACT_OMSCHR,
   FACT_BEDRAG,
   SCHOONMAAK,
   MAAK_ALLONGE
)
AS
   SELECT c.cnt_contract_key,
          c.cnt_contract_nummer_intern,
          c.cnt_contract_versie,
          DECODE (
             c.cnt_contract_versie,
             NULL,
             c.cnt_contract_nummer_intern,
             c.cnt_contract_nummer_intern || '.' || c.cnt_contract_versie)
             cnt_contract_nr_versie,
          c.cnt_contract_status,
          c.cnt_contract_looptijd_van,
          c.cnt_contract_looptijd_tot,                                -- eind,
          b.prs_bedrijf_key,
          kp.prs_kostenplaats_nr kpn,
          SUBSTR (kg.prs_kostenplaatsgrp_oms, 1, 7) kpngrp,
          ks.prs_kostensoort_oms AS kostensoort,
          r.alg_ruimte_key,
          g.alg_gebouw_naam gebouw,
          v.alg_verdieping_code verdieping,
          r.alg_ruimte_nr kamer,
          p.prs_perslid_key,
          p.prs_perslid_naam achternaam,
          pf.prs_perslid_naam_full naam,
          COALESCE (
             osirisnr.prs_kenmerklink_waarde,
             COALESCE (sannr.prs_kenmerklink_waarde,
                       codanr.prs_kenmerklink_waarde))
             codanr,
          partner.prs_perslid_key partner_key,
          partner.prs_perslid_naam_full partner_naam,
          sr.alg_srtruimte_omschrijving,
          COALESCE (sr.alg_srtruimte_prijs, 0) huur,
          DECODE (rentto.cnt_kenmerkcontract_waarde,
                  '442', ak.prs_kostenplaats_nr,
                  '443', 'salaris',
                  NULL)
             budget_huur,
          COALESCE (sr.alg_srtruimte_prijs2, 0) servicekosten,
          DECODE (servto.cnt_kenmerkcontract_waarde,
                  '442', ak.prs_kostenplaats_nr,
                  '443', 'salaris',
                  NULL)
             budget_service,
          COALESCE (sr.alg_srtruimte_prijs3, 0) partnercharge,
          DECODE (partnerto.cnt_kenmerkcontract_waarde,
                  '442', ak.prs_kostenplaats_nr,
                  '443', 'salaris',
                  NULL)
             budget_partnercharge,
          DECODE (telaansl.cnt_kenmerkcontract_waarde,
                  '1', (SELECT fac_usrdata_prijs
                          FROM fac_usrdata
                         WHERE fac_usrdata_key = 61),
                  0)
             telefooncharge,
          ---DECODE (telto.cnt_kenmerkcontract_waarde,
          ---        '442', ak.prs_kostenplaats_nr,
          ---        '443', 'salaris',
          ---        NULL)
          '' budget_telefoon,
          DECODE (borgbet.cnt_kenmerkcontract_waarde,
                  '1', 0,
                  fac.safe_to_number (borgbedr.cnt_kenmerkcontract_waarde))
             borg_tebetalen,
          DECODE (borgbet.cnt_kenmerkcontract_waarde,
                  '1',
                  fac.safe_to_number (borgbedr.cnt_kenmerkcontract_waarde),
                  0)
             borg_betaald,
          COALESCE (
             fac.safe_to_number (sleutel_verh.cnt_kenmerkcontract_waarde),
             fac.safe_to_number (sleutel_vertr.cnt_kenmerkcontract_waarde))
             sleutel,
          --- DECODE (fac.safe_to_number (vooruit.cnt_kenmerkcontract_waarde),
          ---        NULL, 1,
          ---        fac.safe_to_number (vooruit.cnt_kenmerkcontract_waarde))
          1 aantal_periodes,
          bettot.cnt_kenmerkcontract_waarde betaald_tot,
          fact_omschr.cnt_kenmerkcontract_waarde fact_omschr,
          fac.safe_to_number (fact_bedrag.cnt_kenmerkcontract_waarde)
             fact_bedrag,
          fac.safe_to_number (schoonm.cnt_kenmerkcontract_waarde) schoonmaak,
          fac.safe_to_number (allonge.cnt_kenmerkcontract_waarde)
             maak_allonge
     FROM cnt_contract c,
          prs_perslid p,
          prs_v_perslid_fullnames pf,
          prs_v_aanwezigkostenplaats ak,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1000
                  AND prs_kenmerklink_verwijder IS NULL) codanr,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1200
                  AND prs_kenmerklink_verwijder IS NULL) sannr,
          (SELECT *
             FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1302
                  AND prs_kenmerklink_verwijder IS NULL) osirisnr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1
                  AND cnt_kenmerkcontract_verwijder IS NULL) studkam,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 2
                  AND cnt_kenmerkcontract_verwijder IS NULL) borgbedr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 43
                  AND cnt_kenmerkcontract_verwijder IS NULL) borgbet,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 42
                  AND cnt_kenmerkcontract_verwijder IS NULL) telaansl,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1222
                  AND cnt_kenmerkcontract_verwijder IS NULL) sleutel_vertr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1181
                  AND cnt_kenmerkcontract_verwijder IS NULL) sleutel_verh,
          (SELECT kc.cnt_contract_key, pf.*
             FROM cnt_kenmerkcontract kc, prs_v_perslid_fullnames pf
            WHERE kc.cnt_kenmerk_key = 21
                  AND cnt_kenmerkcontract_verwijder IS NULL
                  AND fac.safe_to_number (kc.cnt_kenmerkcontract_waarde) =
                        pf.prs_perslid_key) partner,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 63
                  AND cnt_kenmerkcontract_verwijder IS NULL) budgnr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 64
                  AND cnt_kenmerkcontract_verwijder IS NULL) rentto,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 65
                  AND cnt_kenmerkcontract_verwijder IS NULL) servto,
          ---(SELECT *
          ---   FROM cnt_kenmerkcontract
          ---  WHERE cnt_kenmerk_key = 66
          ---        AND cnt_kenmerkcontract_verwijder IS NULL) telto,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 681
                  AND cnt_kenmerkcontract_verwijder IS NULL) partnerto,
          ---(SELECT *
          ---   FROM cnt_kenmerkcontract
          ---  WHERE cnt_kenmerk_key = 122
          ---        AND cnt_kenmerkcontract_verwijder IS NULL) vooruit,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 124
                  AND cnt_kenmerkcontract_verwijder IS NULL) bettot,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1202
                  AND cnt_kenmerkcontract_verwijder IS NULL) fact_bedrag,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 1201
                  AND cnt_kenmerkcontract_verwijder IS NULL) fact_omschr,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 941
                  AND cnt_kenmerkcontract_verwijder IS NULL) schoonm,
          (SELECT *
             FROM cnt_kenmerkcontract
            WHERE cnt_kenmerk_key = 781
                  AND cnt_kenmerkcontract_verwijder IS NULL) allonge,
          alg_ruimte r,
          alg_verdieping v,
          alg_gebouw g,
          alg_srtruimte sr,
          prs_afdeling a,
          prs_v_afdeling b,
          prs_kostenplaats kp,
          prs_kostenplaatsgrp kg,
          ins_tab_discipline d,
          prs_kostensoort ks
    WHERE     c.ins_discipline_key = 55
          AND c.ins_discipline_key = d.ins_discipline_key
          AND d.prs_kostensoort_key = ks.prs_kostensoort_key
          AND c.cnt_contract_verwijder IS NULL
          --    AND c.cnt_contract_status = 0
          AND p.prs_perslid_key = c.cnt_prs_perslid_key
          AND p.prs_afdeling_key = b.prs_afdeling_key
          AND pf.prs_perslid_key = p.prs_perslid_key
          AND codanr.prs_link_key(+) = p.prs_perslid_key
          AND sannr.prs_link_key(+) = p.prs_perslid_key
          AND osirisnr.prs_link_key(+) = p.prs_perslid_key
          AND studkam.cnt_contract_key(+) = c.cnt_contract_key
          AND r.alg_ruimte_key(+) =
                fac.safe_to_number (studkam.cnt_kenmerkcontract_waarde)
          AND v.alg_verdieping_key(+) = r.alg_verdieping_key
          AND g.alg_gebouw_key(+) = v.alg_gebouw_key
          AND sr.alg_srtruimte_key(+) = r.alg_srtruimte_key
          AND borgbedr.cnt_contract_key(+) = c.cnt_contract_key
          AND borgbet.cnt_contract_key(+) = c.cnt_contract_key
          AND telaansl.cnt_contract_key(+) = c.cnt_contract_key
          AND sleutel_verh.cnt_contract_key(+) = c.cnt_contract_key
          AND sleutel_vertr.cnt_contract_key(+) = c.cnt_contract_key
          AND partner.cnt_contract_key(+) = c.cnt_contract_key
          AND budgnr.cnt_contract_key(+) = c.cnt_contract_key
          AND ak.prs_kostenplaats_key(+) =
                fac.safe_to_number (budgnr.cnt_kenmerkcontract_waarde)
          AND rentto.cnt_contract_key(+) = c.cnt_contract_key
          AND servto.cnt_contract_key(+) = c.cnt_contract_key
          -- AND telto.cnt_contract_key(+) = c.cnt_contract_key
          AND partnerto.cnt_contract_key(+) = c.cnt_contract_key
          -- AND vooruit.cnt_contract_key(+) = c.cnt_contract_key
          AND bettot.cnt_contract_key(+) = c.cnt_contract_key
          AND fact_bedrag.cnt_contract_key(+) = c.cnt_contract_key
          AND fact_omschr.cnt_contract_key(+) = c.cnt_contract_key
          AND schoonm.cnt_contract_key(+) = c.cnt_contract_key
          AND allonge.cnt_contract_key(+) = c.cnt_contract_key
          AND a.prs_afdeling_key = p.prs_afdeling_key
          AND kp.prs_kostenplaats_key = c.prs_kostenplaats_key
          AND kg.prs_kostenplaatsgrp_key(+) = kp.prs_kostenplaatsgrp_key
          AND COALESCE (
                osirisnr.prs_kenmerklink_waarde,
                COALESCE (sannr.prs_kenmerklink_waarde,
                          codanr.prs_kenmerklink_waarde)) IS NOT NULL;

CREATE OR REPLACE VIEW NYBU_V_CONTRACT_BON_ALL
(
   FCLT_F_CONTRACTNR,
   CNT_CONTRACT_STATUS,
   CNT_PRS_BEDRIJF_KEY,
   PRS_PERSLID_KEY,
   FCLT_F_NAAM,
   FCLT_F_STUDENTNR,
   VOORNAAM,
   STRAAT1,
   STRAAT2,
   POSTCODE,
   PLAATS,
   SAN_NR,
   OSIRIS_NR,
   FCLT_F_OPLEIDING,
   ALG_RUIMTE_KEY,
   ALG_RUIMTE_NR,
   ALG_SRTRUIMTE_OMSCHRIJVING,
   ALG_VERDIEPING_VOLGNR,
   ALG_GEBOUW_NAAM,
   POSTCODE_KAMER,
   TELNR,
   VAN,
   TOT,
   LOOPTIJD_VAN,
   LOOPTIJD_TOT,
   PRINTDATUM,
   RENT_TO,
   SERV_TO,
   TEL_TO,
   PARTNERCH_TO,
   PARTNER_KEY,
   HUUR,
   SERVKOST,
   TELEFOONCHARGE,
   PARTNERCHARGE,
   BORG,
   FCLT_F_TONEN,
   KALE_HUUR,
   SERVICEKOSTEN,
   TELKOSTEN,
   PARTNERTOESLAG,
   ROOMMATE_NAAM,
   RM_STRAAT1,
   RM_STRAAT2,
   RM_POSTCODE,
   RM_PLAATS
)
AS
   SELECT a."FCLT_F_CONTRACTNR",
          a."CONTRACT_STATUS",
          a."CNT_PRS_BEDRIJF_KEY",
          a."PRS_PERSLID_KEY",
          a."FCLT_F_NAAM",
          a."FCLT_F_STUDENTNR",
          a."VOORNAAM",
          a."STRAAT1",
          a."STRAAT2",
          a."POSTCODE",
          a."PLAATS",
          a."SAN_NR",
          a."OSIRIS_NR",
          a."FCLT_F_OPLEIDING",
          a."ALG_RUIMTE_KEY",
          a."ALG_RUIMTE_NR",
          a."ALG_SRTRUIMTE_OMSCHRIJVING",
          a."ALG_VERDIEPING_VOLGNR",
          a."ALG_GEBOUW_NAAM",
          a."POSTCODE_KAMER",
          a."TELNR",
          a."VAN",
          a."TOT",
          a."LOOPTIJD_VAN",
          a."LOOPTIJD_TOT",
          a."PRINTDATUM",
          a."RENT_TO",
          a."SERV_TO",
          a."TEL_TO",
          a."PARTNERCH_TO",
          a."PARTNER_KEY",
          a."HUUR",
          a."SERVKOST",
          a."TELEFOONCHARGE",
          a."PARTNERCHARGE",
          a."BORG",
          a."FCLT_F_TONEN",
          DECODE (b.prs_perslid_key, NULL, a.huur, a.huur / 2) kale_huur,
          DECODE (b.prs_perslid_key, NULL, a.servkost, a.servkost / 2)
             servicekosten,
          DECODE (b.prs_perslid_key,
                  NULL, a.telefooncharge,
                  a.telefooncharge / 2)
             telkosten,
          DECODE (b.prs_perslid_key,
                  NULL, DECODE (a.partner_key, NULL, 0, a.partnercharge),
                  a.partnercharge / 2)
             partnertoeslag,
          b.roommate_naam,
          b.rm_straat1,
          b.rm_straat2,
          b.rm_postcode,
          b.rm_plaats
     FROM    (SELECT DECODE (
                        c.cnt_contract_versie,
                        NULL,
                        c.cnt_contract_nummer_intern,
                           c.cnt_contract_nummer_intern
                        || '.'
                        || c.cnt_contract_versie)
                        fclt_f_contractnr,
                     c.cnt_prs_bedrijf_key,
                     p.prs_perslid_key,
                     c.naam fclt_f_naam,
                     p.prs_perslid_nr fclt_f_studentnr,
                     p.prs_perslid_voornaam voornaam,
                     straat1.prs_kenmerklink_waarde straat1,
                     straat2.prs_kenmerklink_waarde straat2,
                     pc.prs_kenmerklink_waarde postcode,
                     plaats.prs_kenmerklink_waarde plaats,
                     san.prs_kenmerklink_waarde san_nr,
                     osiris.prs_kenmerklink_waarde osiris_nr,
                     a.prs_afdeling_omschrijving fclt_f_opleiding,
                     r.alg_ruimte_key,
                     r.alg_ruimte_nr,
                     c.alg_srtruimte_omschrijving,
                     v.alg_verdieping_volgnr,
                     g.alg_gebouw_naam,
                     pc_kamer.alg_onrgoedkenmerk_waarde postcode_kamer,
                     telnr.alg_onrgoedkenmerk_waarde telnr,
                     DECODE (c.cnt_contract_status,
                             1, '1 - Gesloten',
                             0, '0 - Definitief',
                             2, '2 - Nieuw',
                             3, '3 - Ter goedkeuring',
                             'Onbekend')
                        AS contract_status,
                     c.cnt_contract_looptijd_van van,
                     c.cnt_contract_looptijd_tot tot,
                     TO_CHAR (c.cnt_contract_looptijd_van, 'DD-MM-YYYY')
                        looptijd_van,
                     TO_CHAR (c.cnt_contract_looptijd_tot, 'DD-MM-YYYY')
                        looptijd_tot,
                     TO_CHAR (SYSDATE, 'DD-MM-YYYY') printdatum,
                     DECODE (rent.cnt_kenmerkcontract_waarde,
                             '442', k.prs_kostenplaats_nr,
                             '443', 'salaris',
                             NULL)
                        rent_to,
                     DECODE (serv.cnt_kenmerkcontract_waarde,
                             '442', k.prs_kostenplaats_nr,
                             '443', 'salaris',
                             NULL)
                        serv_to,
                     DECODE (tel.cnt_kenmerkcontract_waarde,
                             '442', k.prs_kostenplaats_nr,
                             '443', 'salaris',
                             NULL)
                        tel_to,
                     DECODE (partnerch.cnt_kenmerkcontract_waarde,
                             '442', k.prs_kostenplaats_nr,
                             '443', 'salaris',
                             NULL)
                        partnerch_to,
                     c.partner_key,
                     c.huur,
                     c.servicekosten servkost,
                     c.telefooncharge,
                     c.partnercharge,
                     c.borg_tebetalen + c.borg_betaald borg,
                     PRINT.uitdraai fclt_f_tonen
                FROM nybu_v_huurcnt_student_all c,
                     prs_perslid p,
                     prs_afdeling a,
                     alg_ruimte r,
                     alg_verdieping v,
                     alg_gebouw g,
                     (SELECT *
                        FROM alg_onrgoedkenmerk
                       WHERE     alg_onrgoedkenmerk_verwijder IS NULL
                             AND alg_onrgoed_niveau = 'R'
                             AND alg_kenmerk_key = 1002) pc_kamer,
                     (SELECT *
                        FROM alg_onrgoedkenmerk
                       WHERE     alg_onrgoedkenmerk_verwijder IS NULL
                             AND alg_onrgoed_niveau = 'R'
                             AND alg_kenmerk_key = 1040) telnr,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1022) straat1,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1023) straat2,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1024) pc,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1025) plaats,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1200) san,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1302) osiris,
                     (SELECT *
                        FROM cnt_kenmerkcontract
                       WHERE cnt_kenmerk_key = 63
                             AND cnt_kenmerkcontract_verwijder IS NULL)
                     budget,
                     prs_kostenplaats k,
                     (SELECT *
                        FROM cnt_kenmerkcontract
                       WHERE cnt_kenmerk_key = 64
                             AND cnt_kenmerkcontract_verwijder IS NULL) rent,
                     (SELECT *
                        FROM cnt_kenmerkcontract
                       WHERE cnt_kenmerk_key = 65
                             AND cnt_kenmerkcontract_verwijder IS NULL) serv,
                     (SELECT *
                        FROM cnt_kenmerkcontract
                       WHERE cnt_kenmerk_key = 66
                             AND cnt_kenmerkcontract_verwijder IS NULL) tel,
                     (SELECT *
                        FROM cnt_kenmerkcontract
                       WHERE cnt_kenmerk_key = 681
                             AND cnt_kenmerkcontract_verwijder IS NULL)
                     partnerch,
                     (SELECT 'Bevestigingsbrief' uitdraai FROM DUAL
                      UNION ALL
                      SELECT 'Contract' uitdraai FROM DUAL) PRINT
               WHERE     p.prs_perslid_key = c.prs_perslid_key
                     --        AND SYSDATE < c.cnt_contract_looptijd_tot
                     AND r.alg_ruimte_key = c.alg_ruimte_key
                     AND v.alg_verdieping_key = r.alg_verdieping_key
                     AND g.alg_gebouw_key = v.alg_gebouw_key
                     AND pc_kamer.alg_onrgoed_key(+) = r.alg_ruimte_key
                     AND a.prs_afdeling_key = p.prs_afdeling_key
                     AND straat1.prs_link_key(+) = p.prs_perslid_key
                     AND straat2.prs_link_key(+) = p.prs_perslid_key
                     AND pc.prs_link_key(+) = p.prs_perslid_key
                     AND plaats.prs_link_key(+) = p.prs_perslid_key
                     AND san.prs_link_key(+) = p.prs_perslid_key
                     AND osiris.prs_link_key(+) = p.prs_perslid_key
                     AND telnr.alg_onrgoed_key(+) = r.alg_ruimte_key
                     AND budget.cnt_contract_key(+) = c.cnt_contract_key
                     AND k.prs_kostenplaats_key(+) =
                           fac.safe_to_number (
                              budget.cnt_kenmerkcontract_waarde)
                     AND rent.cnt_contract_key(+) = c.cnt_contract_key
                     AND serv.cnt_contract_key(+) = c.cnt_contract_key
                     AND tel.cnt_contract_key(+) = c.cnt_contract_key
                     AND partnerch.cnt_contract_key(+) = c.cnt_contract_key)
             a
          LEFT OUTER JOIN
             (SELECT pf.prs_perslid_key,
                     fac.safe_to_number (sk.cnt_kenmerkcontract_waarde)
                        alg_ruimte_key,
                     pf.prs_perslid_naam_full roommate_naam,
                     straat1.prs_kenmerklink_waarde rm_straat1,
                     straat2.prs_kenmerklink_waarde rm_straat2,
                     pc.prs_kenmerklink_waarde rm_postcode,
                     plaats.prs_kenmerklink_waarde rm_plaats,
                     c.cnt_contract_looptijd_van van,
                     c.cnt_contract_looptijd_tot tot
                FROM cnt_contract c,
                     prs_v_perslid_fullnames pf,
                     (SELECT *
                        FROM cnt_kenmerkcontract
                       WHERE cnt_kenmerk_key = 1
                             AND cnt_kenmerkcontract_verwijder IS NULL) sk,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1022) straat1,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1023) straat2,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1024) pc,
                     (SELECT *
                        FROM prs_kenmerklink
                       WHERE     prs_kenmerklink_verwijder IS NULL
                             AND prs_kenmerklink_niveau = 'P'
                             AND prs_kenmerk_key = 1025) plaats
               WHERE     c.ins_discipline_key = 55
                     --         AND c.cnt_contract_looptijd_tot > SYSDATE
                     AND c.cnt_contract_verwijder IS NULL
                     AND pf.prs_perslid_key = c.cnt_prs_perslid_key
                     AND sk.cnt_contract_key = c.cnt_contract_key
                     AND straat1.prs_link_key(+) = pf.prs_perslid_key
                     AND straat2.prs_link_key(+) = pf.prs_perslid_key
                     AND pc.prs_link_key(+) = pf.prs_perslid_key
                     AND plaats.prs_link_key(+) = pf.prs_perslid_key) b
          ON     a.alg_ruimte_key = b.alg_ruimte_key
             AND a.prs_perslid_key != b.prs_perslid_key
             AND b.van < a.tot
             AND b.tot > a.van;

CREATE OR REPLACE VIEW NYBU_V_RAP_CNT_STUDENT_ALL
(
   FCLT_F_CONTRACTNR,
   CNT_CONTRACT_STATUS,
   CNT_PRS_BEDRIJF_KEY,
   PRS_PERSLID_KEY,
   FCLT_F_NAAM,
   FCLT_F_STUDENTNR,
   VOORNAAM,
   STRAAT1,
   STRAAT2,
   POSTCODE,
   PLAATS,
   SAN_NR,
   OSIRIS_NR,
   FCLT_F_OPLEIDING,
   ALG_RUIMTE_KEY,
   ALG_RUIMTE_NR,
   ALG_SRTRUIMTE_OMSCHRIJVING,
   ALG_VERDIEPING_VOLGNR,
   ALG_GEBOUW_NAAM,
   POSTCODE_KAMER,
   TELNR,
   VAN,
   TOT,
   LOOPTIJD_VAN,
   LOOPTIJD_TOT,
   PRINTDATUM,
   RENT_TO,
   SERV_TO,
   TEL_TO,
   PARTNERCH_TO,
   PARTNER_KEY,
   HUUR,
   SERVKOST,
   TELEFOONCHARGE,
   PARTNERCHARGE,
   BORG,
   FCLT_F_TONEN,
   KALE_HUUR,
   SERVICEKOSTEN,
   TELKOSTEN,
   PARTNERTOESLAG,
   ROOMMATE_NAAM,
   RM_STRAAT1,
   RM_STRAAT2,
   RM_POSTCODE,
   RM_PLAATS
)
AS
   SELECT "FCLT_F_CONTRACTNR",
          "CNT_CONTRACT_STATUS",
          "CNT_PRS_BEDRIJF_KEY",
          "PRS_PERSLID_KEY",
          "FCLT_F_NAAM",
          "FCLT_F_STUDENTNR",
          "VOORNAAM",
          "STRAAT1",
          "STRAAT2",
          "POSTCODE",
          "PLAATS",
          "SAN_NR",
          "OSIRIS_NR",
          "FCLT_F_OPLEIDING",
          "ALG_RUIMTE_KEY",
          "ALG_RUIMTE_NR",
          "ALG_SRTRUIMTE_OMSCHRIJVING",
          "ALG_VERDIEPING_VOLGNR",
          "ALG_GEBOUW_NAAM",
          "POSTCODE_KAMER",
          "TELNR",
          "VAN",
          "TOT",
          "LOOPTIJD_VAN",
          "LOOPTIJD_TOT",
          "PRINTDATUM",
          "RENT_TO",
          "SERV_TO",
          "TEL_TO",
          "PARTNERCH_TO",
          "PARTNER_KEY",
          "HUUR",
          "SERVKOST",
          "TELEFOONCHARGE",
          "PARTNERCHARGE",
          "BORG",
          "FCLT_F_TONEN",
          "KALE_HUUR",
          "SERVICEKOSTEN",
          "TELKOSTEN",
          "PARTNERTOESLAG",
          "ROOMMATE_NAAM",
          "RM_STRAAT1",
          "RM_STRAAT2",
          "RM_POSTCODE",
          "RM_PLAATS"
     FROM nybu_v_contract_bon_all
    WHERE cnt_prs_bedrijf_key = 1643;

CREATE OR REPLACE VIEW nybu_v_rap_res_bezetting
AS
   (SELECT resbes.mnd,
           d.ins_discipline_omschrijving,
           resbes.res_ruimte_nr,
           r.alg_ruimte_nr,
           r.alg_ruimte_omschrijving,
           resbes.res_ruimte_begintijd,
           resbes.res_ruimte_eindtijd,
           resbes.uren_dag,
           resbes.uren_mnd,
           resbez.reservering,
           resbez.dag,
           resbez.datum_van,
           TO_CHAR (resbez.datum_van, 'dd-mm-yyyy') datum,
           resbez.tijd_van,
           --    resbez.datum_tot,
           resbez.tijd_tot,
           resbez.duur,
           CASE WHEN TO_NUMBER (resbez.tijd_van) < 13 THEN 1 ELSE 0 END
              AS ochtend,
           CASE
              WHEN (TO_NUMBER (resbez.tijd_tot) > 13
                    AND TO_NUMBER (resbez.tijd_van) <= 18)
              THEN
                 1
              ELSE
                 0
           END
              AS middag,
           CASE WHEN TO_NUMBER (resbez.tijd_tot) > 18 THEN 1 ELSE 0 END
              AS avond
      FROM alg_ruimte r,
           res_discipline d,
           (SELECT DISTINCT
                   TO_CHAR (p.mnd, 'yyyy-mm') mnd, -- DISTINCT igv. verwijderde res_alg_ruimte!
                   rr.res_discipline_key,
                   rr.res_ruimte_key,
                   rr.res_ruimte_nr,
                   ra.alg_ruimte_key,
                   (COALESCE (rr.res_ruimte_begintijd, 7))
                      res_ruimte_begintijd,
                   (COALESCE (rr.res_ruimte_eindtijd, 23))
                      res_ruimte_eindtijd,
                   (LEAST (COALESCE (rr.res_ruimte_eindtijd, 23), 23)
                    - GREATEST (COALESCE (rr.res_ruimte_begintijd, 7), 7))
                      uren_dag,
                   fac.count_work_days (p.mnd - 1, ADD_MONTHS (p.mnd, 1) - 1)
                   * (LEAST (COALESCE (rr.res_ruimte_eindtijd, 23), 23)
                      - GREATEST (COALESCE (rr.res_ruimte_begintijd, 7), 7))
                      uren_mnd
              FROM res_ruimte rr,
                   res_alg_ruimte ra,
                   (    SELECT ADD_MONTHS (TRUNC (SYSDATE, 'mm'), LEVEL - 26) mnd
                          FROM DUAL
                    CONNECT BY LEVEL <= 25) p
             WHERE rr.res_ruimte_key = ra.res_ruimte_key
                   AND ra.res_alg_ruimte_aanmaak < ADD_MONTHS (p.mnd, 1)
                   AND (ra.res_alg_ruimte_verwijder IS NULL
                        OR ra.res_alg_ruimte_verwijder >= p.mnd)) resbes,
           (  SELECT TO_CHAR (rrr.res_rsv_ruimte_tot, 'yyyy-mm') mnd,
                     rr.res_discipline_key,
                     rr.res_ruimte_key,
                     rr.res_ruimte_nr,
                     ra.alg_ruimte_key,
                        rrr.res_reservering_KEY
                     || '/'
                     || rrr.res_rsv_ruimte_volgnr
                        reservering,
                     DECODE (fac.getweekdaynum (rrr.res_rsv_ruimte_van),
                             2, 'maandag',
                             3, 'dinsdag',
                             4, 'woensdag',
                             5, 'donderdag',
                             6, 'vrijdag',
                             7, 'zaterdag',
                             1, 'zondag')
                        AS dag,
                     rrr.res_rsv_ruimte_van RESERVERING_VAN,
                     TRUNC (rrr.res_rsv_ruimte_van) DATUM_VAN,
                     GREATEST (
                        (rrr.res_rsv_ruimte_van
                         - TRUNC (rrr.res_rsv_ruimte_van))
                        * 24,
                        7)
                        TIJD_VAN,
                     rrr.res_rsv_ruimte_tot RESERVERING_TOT,
                     TRUNC (rrr.res_rsv_ruimte_tot) DATUM_TOT,
                     LEAST (
                        (rrr.res_rsv_ruimte_tot
                         - TRUNC (rrr.res_rsv_ruimte_tot))
                        * 24,
                        23)
                        TIJD_TOT,
                     SUM(LEAST (
                            (rrr.res_rsv_ruimte_tot
                             - TRUNC (rrr.res_rsv_ruimte_tot))
                            * 24,
                            23)
                         - GREATEST (
                              (rrr.res_rsv_ruimte_van
                               - TRUNC (rrr.res_rsv_ruimte_van))
                              * 24,
                              7))
                        DUUR
                FROM res_rsv_ruimte rrr,
                     res_ruimte_opstelling ro,
                     res_ruimte rr,
                     res_alg_ruimte ra
               WHERE     rrr.res_rsv_ruimte_verwijder IS NULL
                     AND rrr.res_rsv_ruimte_dirtlevel = 0
                     AND rrr.res_status_fo_key IN (1, 2)   -- Optie/Definitief
                     AND rrr.res_rsv_ruimte_tot BETWEEN ADD_MONTHS (
                                                           TRUNC (SYSDATE,
                                                                  'mm'),
                                                           -25)
                                                    AND  TRUNC (SYSDATE, 'mm')
                     AND TO_CHAR (rrr.res_rsv_ruimte_tot, 'd') BETWEEN '2'
                                                                   AND  '6'
                     AND NOT EXISTS
                           (SELECT 1
                              FROM mld_vrije_dagen
                             WHERE TRUNC (mld_vrije_dagen_datum) =
                                      TRUNC (rrr.res_rsv_ruimte_tot))
                     AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                     AND ro.res_ruimte_key = rr.res_ruimte_key
                     AND rr.res_ruimte_key = ra.res_ruimte_key
            GROUP BY TO_CHAR (rrr.res_rsv_ruimte_tot, 'yyyy-mm'),
                        rrr.res_reservering_KEY
                     || '/'
                     || rrr.res_rsv_ruimte_volgnr,
                     rr.res_discipline_key,
                     rr.res_ruimte_key,
                     rrr.res_rsv_ruimte_van,
                     TRUNC (rrr.res_rsv_ruimte_van),
                     LEAST (
                        (rrr.res_rsv_ruimte_tot
                         - TRUNC (rrr.res_rsv_ruimte_tot))
                        * 24,
                        23),
                     rrr.res_rsv_ruimte_tot,
                     TRUNC (rrr.res_rsv_ruimte_tot),
                     GREATEST (
                        (rrr.res_rsv_ruimte_van
                         - TRUNC (rrr.res_rsv_ruimte_van))
                        * 24,
                        7),
                     rr.res_ruimte_key,
                     rr.res_ruimte_nr,
                     ra.alg_ruimte_key) resbez
     WHERE     r.alg_ruimte_key = resbes.alg_ruimte_key
           AND d.ins_discipline_key = resbes.res_discipline_key
           AND resbes.mnd = resbez.mnd(+)
           AND resbes.res_discipline_key = resbez.res_discipline_key(+)
           AND resbes.res_ruimte_key = resbez.res_ruimte_key(+)
           AND resbes.alg_ruimte_key = resbez.alg_ruimte_key(+));

-- toevoegen categorisering catering tbv vermaat
-- nybu#41786

CREATE OR REPLACE VIEW NYBU_V_RAP_VERMAAT_CAT
(
   HIDE_F_SORT,
   FCLT_F_RESERVERING,
   FCLT_D_DATUM,
   TIJD,
   ARTIKELNR,
   FCLT_F_ARTIKEL,
   FCLT_F_CATALOGUS,
   AANTAL,
   EENHEID,
   EENHEIDSPRIJS,
   TOTAALPRIJS_EXCL,
   TOTAALPRIJS_INCL,
   FCLT_F_PNUMMER,
   FCLT_F_KOSTENPLAATS,
   FCLT_3D_DISCIPLINE_KEY,
   ONTBIJT,
   LUNCH,
   DINER
)
AS
   SELECT res_rsv_artikel_levering hide_f_sort,
          res_reservering_key || '/' || res_rsv_ruimte_volgnr
             fclt_f_reservering,
          datum fclt_d_datum,
          tijd,
          artikelnr,
          artikeloms fclt_f_artikel,
          catalogus fclt_f_catalogus,
          aantal,
          eenheid,
          eenheidsprijs,
          ROUND (totaalprijs_ex, 2) totaalprijs_excl,
          ROUND (totaalprijs_in, 2) totaalprijs_incl,
          prs_kostenplaats_nr || ' - ' || prs_kostenplaats_omschrijving
             fclt_f_pnummer,
          kpngrp_nr || ' - ' || kpngrp_oms fclt_f_kostenplaats,
          ins_discipline_key fclt_3d_discipline_key,
          CASE
             WHEN (UPPER (res_artikel_opmerking) LIKE '%ONTBIJT%'
                   OR UPPER (CATALOGUS) LIKE '%ONTBIJT%')
             THEN
                'Ja'
             ELSE
                'Nee'
          END
             AS Ontbijt,
          CASE
             WHEN (UPPER (res_artikel_opmerking) LIKE '%LUNCH%'
                   OR UPPER (CATALOGUS) LIKE '%LUNCH%')
             THEN
                'Ja'
             ELSE
                'Nee'
          END
             AS Lunch,
          CASE
             WHEN (UPPER (res_artikel_opmerking) LIKE '%DINER%'
                   OR UPPER (CATALOGUS) LIKE '%DINER%')
             THEN
                'Ja'
             ELSE
                'Nee'
          END
             AS Diner
     FROM nybu_v_vermaat v, res_artikel a
    WHERE v.res_artikel_key = a.res_artikel_key;

CREATE OR REPLACE VIEW NYBU_V_RAP_VERMAAT_CUM_CAT
(
   FCLT_D_DATUM,
   HIDE_F_LEVERING,
   HIDE_F_REGEL,
   ARTIKELNR,
   FCLT_F_ARTIKEL,
   EENHEID,
   FCLT_F_CATALOGUS,
   ONTBIJT,
   LUNCH,
   DINER,
   TOTAALPRIJS_EX,
   TOTAALPRIJS_IN,
   FCLT_3D_DISCIPLINE_KEY
)
AS
     SELECT datum fclt_d_datum,
            TO_CHAR (res_rsv_artikel_levering, 'YYYY-MM-DD') hide_f_levering,
            catalogus || artikeloms hide_f_regel,
            artikelnr,
            artikeloms fclt_f_artikel,
            eenheid,
            catalogus fclt_f_catalogus,
            CASE
               WHEN (UPPER (res_artikel_opmerking) LIKE '%ONTBIJT%'
                     OR UPPER (CATALOGUS) LIKE '%ONTBIJT%')
               THEN
                  'Ja'
               ELSE
                  'Nee'
            END
               AS Ontbijt,
            CASE
               WHEN (UPPER (res_artikel_opmerking) LIKE '%LUNCH%'
                     OR UPPER (CATALOGUS) LIKE '%LUNCH%')
               THEN
                  'Ja'
               ELSE
                  'Nee'
            END
               AS Lunch,
            CASE
               WHEN (UPPER (res_artikel_opmerking) LIKE '%DINER%'
                     OR UPPER (CATALOGUS) LIKE '%DINER%')
               THEN
                  'Ja'
               ELSE
                  'Nee'
            END
               AS Diner,
            COALESCE (SUM (totaalprijs_ex), 0) totaalprijs_ex,
            COALESCE (SUM (totaalprijs_in), 0) totaalprijs_in,
            ins_discipline_key fclt_3d_discipline_key
       FROM nybu_v_vermaat v, res_artikel a
      WHERE v.res_artikel_key = a.res_artikel_key
   GROUP BY datum,
            TO_CHAR (res_rsv_artikel_levering, 'YYYY-MM-DD'),
            artikelnr,
            artikeloms,
            eenheid,
            catalogus,
            CASE
               WHEN (UPPER (res_artikel_opmerking) LIKE '%ONTBIJT%'
                     OR UPPER (CATALOGUS) LIKE '%ONTBIJT%')
               THEN
                  'Ja'
               ELSE
                  'Nee'
            END,
            CASE
               WHEN (UPPER (res_artikel_opmerking) LIKE '%LUNCH%'
                     OR UPPER (CATALOGUS) LIKE '%LUNCH%')
               THEN
                  'Ja'
               ELSE
                  'Nee'
            END,
            CASE
               WHEN (UPPER (res_artikel_opmerking) LIKE '%DINER%'
                     OR UPPER (CATALOGUS) LIKE '%DINER%')
               THEN
                  'Ja'
               ELSE
                  'Nee'
            END,
            ins_discipline_key;

CREATE OR REPLACE VIEW NYBU_V_OVERNAMEFORMULIER
(
   mld_key,
   omschrijving
)
AS
   SELECT m.mld_melding_key,
             p.prs_perslid_naam_full
          || ' - '
          || sd.ins_srtdiscipline_prefix
          || m.mld_melding_key
     FROM mld_melding m,
          mld_kenmerkmelding km,
          prs_v_perslid_fullnames_all p,
          mld_stdmelding s,
          mld_discipline md,
          ins_srtdiscipline sd
    WHERE     m.mld_stdmelding_key = 2141
          AND km.mld_melding_key = m.mld_melding_key
          AND km.mld_kenmerk_key = 2524
          AND km.mld_kenmerkmelding_waarde = p.prs_perslid_key
          AND m.mld_stdmelding_key = s.mld_stdmelding_key
          AND md.ins_discipline_key = s.mld_ins_discipline_key
          AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key;

CREATE OR REPLACE VIEW NYBU_V_WINSTVERLIES
(
   mld_melding_key,
   bedrijf,
   datum,
   reserveringsnr,
   ruimte,
   aant_pers,
   ruimte_kosten,
   catering_kosten,
   hotel_kosten,
   voorz_kosten,
   reden_afw,
   vervolgactie,
   opmerkingen
)
AS
   SELECT m.mld_melding_key,
          bedrijf.waarde bedrijf,
          fac.safe_to_date (datum.mld_kenmerkmelding_waarde, 'dd-mm-yyyy')
             AS datum,
          CASE
             WHEN r.res_rsv_ruimte_volgnr IS NOT NULL
             THEN
                r.res_reservering_key || '/' || r.res_rsv_ruimte_volgnr
             ELSE
                ''
          END
             AS reserveringsnr,
          ruimte.mld_kenmerkmelding_waarde ruimte,
          fac.safe_to_number (aant_pers.mld_kenmerkmelding_waarde),
          fac.safe_to_number (ruimte_kosten.mld_kenmerkmelding_waarde),
          fac.safe_to_number (catering_kosten.mld_kenmerkmelding_waarde),
          fac.safe_to_number (hotel_kosten.mld_kenmerkmelding_waarde),
          fac.safe_to_number (voorz_kosten.mld_kenmerkmelding_waarde),
          reden_afw.waarde reden_afw,
          vervolgactie.waarde vervolgactie,
          opmerkingen.mld_kenmerkmelding_waarde opmerkingen
     FROM mld_melding m,
          res_rsv_ruimte r,
          (SELECT mld_melding_key, b.prs_bedrijf_naam waarde
             FROM mld_kenmerkmelding km, prs_bedrijf b
            WHERE km.mld_kenmerk_key = 2601
                  AND mld_kenmerkmelding_waarde = b.prs_bedrijf_key) bedrijf,
          (SELECT mld_melding_key, mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding km
            WHERE km.mld_kenmerk_key = 2682) datum,
          (SELECT mld_melding_key, mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding km
            WHERE km.mld_kenmerk_key = 2610) ruimte,
          (SELECT mld_melding_key, mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding km
            WHERE km.mld_kenmerk_key = 2611) aant_pers,
          (SELECT mld_melding_key, mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding km
            WHERE km.mld_kenmerk_key = 2603) ruimte_kosten,
          (SELECT mld_melding_key, mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding km
            WHERE km.mld_kenmerk_key = 2604) catering_kosten,
          (SELECT mld_melding_key, mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding km
            WHERE km.mld_kenmerk_key = 2606) hotel_kosten,
          (SELECT mld_melding_key, mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding km
            WHERE km.mld_kenmerk_key = 2605) voorz_kosten,
          (SELECT km.mld_melding_key, ud.fac_usrdata_code waarde
             FROM mld_kenmerk k, mld_kenmerkmelding km, fac_usrdata ud
            WHERE     km.mld_kenmerk_key = 2608
                  AND km.mld_kenmerk_key = k.mld_kenmerk_key
                  AND ud.fac_usrdata_key = km.mld_kenmerkmelding_waarde)
          reden_afw,
          (SELECT km.mld_melding_key, ud.fac_usrdata_code waarde
             FROM mld_kenmerk k, mld_kenmerkmelding km, fac_usrdata ud
            WHERE     km.mld_kenmerk_key = 2681
                  AND km.mld_kenmerk_key = k.mld_kenmerk_key
                  AND ud.fac_usrdata_key = km.mld_kenmerkmelding_waarde)
          vervolgactie,
          (SELECT mld_melding_key, mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding km
            WHERE km.mld_kenmerk_key = 2612) opmerkingen
    WHERE     m.mld_stdmelding_key = 2161
          AND m.mld_melding_kto_key = r.res_rsv_ruimte_key(+)
          AND m.mld_melding_key = bedrijf.mld_melding_key(+)
          AND m.mld_melding_key = datum.mld_melding_key(+)
          AND m.mld_melding_key = ruimte.mld_melding_key(+)
          AND m.mld_melding_key = aant_pers.mld_melding_key(+)
          AND m.mld_melding_key = ruimte_kosten.mld_melding_key(+)
          AND m.mld_melding_key = catering_kosten.mld_melding_key(+)
          AND m.mld_melding_key = hotel_kosten.mld_melding_key(+)
          AND m.mld_melding_key = voorz_kosten.mld_melding_key(+)
          AND m.mld_melding_key = reden_afw.mld_melding_key(+)
          AND m.mld_melding_key = vervolgactie.mld_melding_key(+)
          AND m.mld_melding_key = opmerkingen.mld_melding_key(+);

CREATE OR REPLACE VIEW NYBU_V_INVENTARISFORMULIER
(
   mld_melding_key,
   omschrijving
)
AS
   SELECT mld_melding_key,
             p.prs_perslid_naam_full
          || ' '
          || mld_stdmelding_omschrijving
          || ' '
          || mld_melding_key
     FROM mld_melding m, prs_v_perslid_fullnames_all p, mld_stdmelding sm
    WHERE     m.mld_stdmelding_key IN (2101, 2102, 2103, 1552)
          AND m.prs_perslid_key_voor = p.prs_perslid_key
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key;

CREATE OR REPLACE VIEW NYBU_V_MLD_VERTREK
(
   mld_melding_key,
   omschrijving
)
AS
   SELECT mld_melding_key,
             p.prs_perslid_naam_full
          || ' '
          || mld_melding_key
          || ': '
          || mld_stdmelding_omschrijving
     FROM mld_melding m, prs_v_perslid_fullnames_all p, mld_stdmelding sm
    WHERE     m.mld_stdmelding_key = 144
          AND m.prs_perslid_key_voor = p.prs_perslid_key
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key;

CREATE OR REPLACE PROCEDURE nybu_select_res_ruimte_xml (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
   CURSOR c_res
   IS
        SELECT TRIM(SUBSTR (
                       rr.res_ruimte_nr,
                       DECODE (INSTR (rr.res_ruimte_nr, 'etage -'),
                               0, 0,
                               INSTR (rr.res_ruimte_nr, 'etage -') + 7)))
                  res_ruimte_nr,
               rg.alg_locatie_code,
               rg.alg_locatie_omschrijving,
               rg.alg_gebouw_upper,
               rg.alg_gebouw_omschrijving,
               rg.alg_verdieping_code,
               rg.alg_verdieping_omschrijving,
               rr.res_ruimte_key,
               TO_CHAR (rrr.res_rsv_ruimte_van, 'hh24:mi') van,
               TO_CHAR (rrr.res_rsv_ruimte_tot, 'hh24:mi') tot,
               rrr.res_reservering_key,
               rrr.res_rsv_ruimte_volgnr,
               rrr.res_rsv_ruimte_omschrijving,
               ph.prs_perslid_naam_full HOST,
               pc.prs_perslid_naam_full contact,
               rrr.res_rsv_ruimte_host_key,
               rrr.res_rsv_ruimte_bezoekers,
               DECODE (
                  (SELECT COUNT ( * )
                     FROM bez_bezoekers b, bez_afspraak a
                    WHERE a.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
                          AND a.bez_afspraak_key = b.bez_afspraak_key),
                  0,
                  'nee',
                  'ja')
                  bez_aangemeld,
               rd.res_disc_params_preposttime schoonmaak
          FROM res_rsv_ruimte rrr,
               (  SELECT res_rsv_ruimte_key,
                         res_ruimte_key,
                         MAX (alg_ruimte_key) alg_ruimte_key
                    FROM res_v_rsv_ruimte_2_alg_ruimte
                GROUP BY res_rsv_ruimte_key, res_ruimte_key) rarg,
               res_ruimte rr,
               alg_v_ruimte_gegevens rg,
               prs_v_perslid_fullnames pc,
               prs_v_perslid_fullnames ph,
               res_disc_params rd
         WHERE     rarg.res_ruimte_key IS NOT NULL
               AND rarg.res_ruimte_key = rr.res_ruimte_key
               AND rarg.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
               AND TRUNC (rrr.res_rsv_ruimte_van) = TRUNC (SYSDATE)
               AND rarg.alg_ruimte_key = rg.alg_ruimte_key
               AND rg.alg_locatie_code = 'NBU-A'
               AND rrr.res_rsv_ruimte_host_key = ph.prs_perslid_key
               AND rrr.res_rsv_ruimte_contact_key = pc.prs_perslid_key
               AND rr.res_discipline_key = rd.res_ins_discipline_key
               AND rrr.res_rsv_ruimte_key NOT IN
                        (SELECT kw.res_rsv_ruimte_key
                           FROM res_srtkenmerk sk,
                                res_kenmerk k,
                                res_kenmerkwaarde kw
                          WHERE sk.res_srtkenmerk_key = 481
                                AND sk.res_srtkenmerk_key =
                                      k.res_srtkenmerk_key
                                AND k.res_kenmerk_key = kw.res_kenmerk_key)
      ORDER BY TO_CHAR (rrr.res_rsv_ruimte_van, 'hh24:mi'),
               TO_CHAR (rrr.res_rsv_ruimte_tot, 'hh24:mi');

   v_first   NUMBER;
   v_count   NUMBER;

   PROCEDURE add_row (p_regel IN VARCHAR2)
   AS
   BEGIN
      INSERT INTO fac_rapport (fac_rapport_node,
                               fac_rapport_volgnr,
                               fac_rapport_regel)
          VALUES (SUBSTR (p_applname, 1, 12), v_count, p_regel);

      v_count := v_count + 1;
   END;

   PROCEDURE add_element (p_tag IN VARCHAR2, p_value IN VARCHAR2)
   AS
   BEGIN
      add_row(   '<'
              || p_tag
              || '>'
              || xml.char_to_html (p_value)
              || '</'
              || p_tag
              || '>');
   END;
BEGIN
   v_count := 0;

   DELETE fac_rapport
    WHERE fac_rapport_node = SUBSTR (p_applname, 1, 12);

   -- header
   add_row (
      '<?xml version="1.0" encoding="windows-1252" standalone="yes" ?>');
   add_row ('<FACILITOR>');
   add_row ('<RESERVERING>');

   FOR rec IN c_res
   LOOP
      BEGIN
         add_row ('<ROW>');
         add_element ('RUIMTE_NAAM', rec.res_ruimte_nr);
         add_element ('LOCATIE_CODE', rec.alg_locatie_code);
         add_element ('LOCATIE_NAAM', rec.alg_locatie_omschrijving);
         add_element ('GEBOUW_CODE', rec.alg_gebouw_upper);
         add_element ('GEBOUW_NAAM', rec.alg_gebouw_omschrijving);
         add_element ('VERDIEPING_CODE', rec.alg_verdieping_code);
         add_element ('VERDIEPING_NAAM', rec.alg_verdieping_omschrijving);
         add_element ('RUIMTE_KEY', rec.res_ruimte_key);
         add_element ('VAN', rec.van);
         add_element ('TOT', rec.tot);
         add_element ('GASTHEER_NAAM', rec.HOST);
         add_element ('CONTACT_NAAM', rec.contact);
         add_element ('OMSCHRIJVING', rec.res_rsv_ruimte_omschrijving);
         add_element ('BEZOEKERS_AANGEMELD', rec.bez_aangemeld);
         add_element ('SCHOONMAAKTIJD', rec.schoonmaak);
         add_row ('</ROW>');
      END;
   END LOOP;

   add_row ('</RESERVERING>');
   add_row ('</FACILITOR>');
END;
/

CREATE OR REPLACE VIEW NYBU_V_EXPORT_RES_RUIMTE_XML (RESULT, RESULT_ORDER)
AS
   SELECT fac_rapport_regel, fac_rapport_volgnr
     FROM fac_rapport
    WHERE fac_rapport_node = SUBSTR ('RES_RUIMTE_XML', 1, 12);

CREATE OR REPLACE PROCEDURE nybu_processemail (
   pfrom        IN VARCHAR2,
   pto          IN VARCHAR2,
   psubject     IN VARCHAR2,
   pbody        IN VARCHAR2,
   psessionid   IN VARCHAR2,
   puserkey     IN NUMBER DEFAULT NULL)
AS
   v_count             NUMBER;
   sender              prs_perslid.prs_perslid_key%TYPE;
   kostenplaats        prs_afdeling.prs_kostenplaats_key%TYPE;
   newkey              mld_melding.mld_melding_key%TYPE;
   defaultstdmelding   fac_setting.fac_setting_default%TYPE;
   -- kkey                mld_kenmerk.mld_kenmerk_key%TYPE;
   errormsg            fac_result.fac_result_waarde%TYPE;
BEGIN
   -- Valideer de sender in pfrom: kennen we deze?
   SELECT COUNT ( * )
     INTO v_count
     FROM prs_perslid p, prs_afdeling d
    WHERE p.prs_afdeling_key = d.prs_afdeling_key
          AND UPPER (prs_perslid_email) = UPPER (pfrom);

   -- Bekende afzender --> dat is de melder
   IF (v_count = 1)
   THEN
      SELECT prs_perslid_key, d.prs_kostenplaats_key
        INTO sender, kostenplaats
        FROM prs_perslid p, prs_afdeling d
       WHERE p.prs_afdeling_key = d.prs_afdeling_key
             AND UPPER (prs_perslid_email) = UPPER (pfrom);
   -- Geen bekende afzender --> _FACILITOR (prs_perslid_key 4)
   ELSE
      SELECT prs_perslid_key, d.prs_kostenplaats_key
        INTO sender, kostenplaats
        FROM prs_perslid p, prs_afdeling d
       WHERE p.prs_afdeling_key = d.prs_afdeling_key AND prs_perslid_key = 4;
   END IF;

   CASE
      WHEN UPPER (pto) LIKE 'HELPDESK@%'
      THEN
         defaultstdmelding := '2421';
      WHEN UPPER (pto) LIKE 'SERVICEDESK@%'
      THEN
         defaultstdmelding := '2422';
      ELSE
         NULL;
   END CASE;

   -- suggested extensions:
   -- check for MLDUSE-write autorisations
   -- parse the subject to find an appropriate stdmelding, if uniquely possible
   BEGIN
      INSERT INTO mld_melding (mld_melding_module,
                               mld_meldbron_key,
                               mld_melding_datum,
                               mld_melding_onderwerp,
                               mld_melding_omschrijving,
                               mld_melding_status,
                               mld_stdmelding_key,
                               mld_alg_locatie_key,
                               prs_perslid_key,
                               prs_perslid_key_voor,
                               prs_kostenplaats_key,
                               mld_melding_spoed)
          VALUES ('MLD',
                  4,                                                  -- email
                  SYSDATE,
                  SUBSTR (psubject, 1, 60),
                  SUBSTR (
                     REPLACE (SUBSTR (pbody, 1, 4000),
                              CHR (13) || CHR (10) || CHR (13) || CHR (10),
                              CHR (13) || CHR (10)),
                     1,
                     4000),                    -- verwijder onnodige witregels
                  2,                -- status is nieuw
                  defaultstdmelding,
                  29, -- Hoe bepalen we de locatie? Nu maar even op 29 = Breukelen
                  sender,
                  sender,
                  kostenplaats,
                  3)
       RETURNING mld_melding_key
            INTO newkey;

      INSERT INTO fac_result (fac_result_sessionid,
                              fac_result_naam,
                              fac_result_waarde)
          VALUES (psessionid,
                  'maillog',
                  'Geregistreerd onder melding ' || newkey);
   END;


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

      INSERT INTO fac_result (fac_result_sessionid,
                              fac_result_naam,
                              fac_result_waarde)
          VALUES (psessionid,
                  'errormsg',
                  'Database fout - Neem contact op met uw systeembeheerder');
END nybu_processemail;
/


CREATE OR REPLACE PROCEDURE nybu_export_student_wp (p_applname   IN VARCHAR2,
                                                    p_applrun    IN VARCHAR2,
                                                    p_filedir    IN VARCHAR2,
                                                    p_filename   IN VARCHAR2)
AS
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_errormsg       VARCHAR2 (400);
   v_errorhint      VARCHAR2 (400);

   -- Stap 1
   -- Alle studenten met een actief contract moeten aan de juiste werkplek gekoppeld worden
   -- Gebruik standaard procedure movetoruimte uit prs_pac.src met de volgende parameters: p_prs_key, p_ruimte_key, p_alg_type (altijd 'R'  want obv alg_ruimte_key), p_virtual  is default 0 (laten we staat)
   CURSOR act_students
   IS
      SELECT p.prs_perslid_key, c.cnt_contract_key, r.alg_ruimte_key
        FROM prs_perslid p,
             prs_v_afdeling b,
             cnt_contract c,
             cnt_kenmerkcontract kc,
             cnt_kenmerk k,
             alg_ruimte r
       WHERE     p.prs_perslid_verwijder IS NULL
             AND p.prs_afdeling_key = b.prs_afdeling_key   --- 1643 = Students
             AND b.prs_bedrijf_key = 1643
             AND p.prs_perslid_key = c.cnt_prs_perslid_key
             AND c.ins_discipline_key = 55           --- 55 = Campuscontracten
             AND c.cnt_contract_key = kc.cnt_contract_key
             AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
             AND k.cnt_srtkenmerk_key = 1               --- 1 = kenmerk ruimte
             AND kc.cnt_kenmerkcontract_waarde = r.alg_ruimte_key
             AND c.cnt_contract_status = 0
             AND cnt_contract_verwijder IS NULL         --- uiterlijk op de dag zelf worden de studenten op de juiste kamer gezet.
             AND c.cnt_contract_looptijd_van < = trunc(sysdate);

   -- Werkplekken waar een student aan gekoppeld is
   -- Als die student geen contract heeft voor die ruimte, mag de werkplek weg
   CURSOR wp_verwijderen
   IS
      SELECT st_wp.prs_perslid_key,
               st_wp.prs_werkplek_key,
               st_wp.prs_alg_ruimte_key,
               st_wp.prs_perslidwerkplek_key
          FROM (SELECT p.prs_perslid_key, wp.*, pwp.prs_perslidwerkplek_key
                  FROM prs_perslid          p,
                       prs_v_afdeling       b,
                       prs_werkplek         wp,
                       prs_perslidwerkplek  pwp
                 WHERE     p.prs_perslid_verwijder IS NULL
                       AND p.prs_afdeling_key = b.prs_afdeling_key --- 1643 = Students
                       AND b.prs_bedrijf_key = 1643
                       AND wp.prs_werkplek_key = pwp.prs_werkplek_key
                       AND pwp.prs_perslid_key = p.prs_perslid_key) st_wp
               JOIN
               (SELECT pc.prs_perslid_key,
                       rc.alg_ruimte_key,
                       c.cnt_contract_key,
                       c.cnt_contract_looptijd_tot
                  FROM prs_perslid          pc,
                       cnt_contract         c,
                       cnt_kenmerkcontract  kc,
                       cnt_kenmerk          k,
                       alg_ruimte           rc
                 WHERE     pc.prs_perslid_verwijder IS NULL
                       AND pc.prs_perslid_key = c.cnt_prs_perslid_key
                       AND c.ins_discipline_key = 55 --- 55 = Campuscontracten
                       AND c.cnt_contract_key = kc.cnt_contract_key
                       AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                       AND k.cnt_srtkenmerk_key = 1     --- 1 = kenmerk ruimte
                       AND kc.cnt_kenmerkcontract_waarde = rc.alg_ruimte_key
                       --AND c.cnt_contract_status = 0
                       AND cnt_contract_looptijd_tot < TRUNC (SYSDATE)
                       AND cnt_contract_verwijder IS NULL) verlopen_cnt
                   ON     st_wp.prs_perslid_key =
                          verlopen_cnt.prs_perslid_key
                      AND st_wp.prs_alg_ruimte_key =
                          verlopen_cnt.alg_ruimte_key;
                
BEGIN
   FOR rec IN act_students
   LOOP
      BEGIN
         prs.movetoruimte (rec.prs_perslid_key, rec.alg_ruimte_key, '');
      END;
   END LOOP;

   FOR rec IN wp_verwijderen
   LOOP
      BEGIN
         -- Verwijderen oude -vaste- werkplek(ken) op meegegeven niveau.

         IF fac.getsetting ('prs_werkplek_implicit') = '0'         --expliciet
         THEN
            -- Wis de bezetting maar laat de werkplek bestaan
            DELETE FROM prs_perslidwerkplek pw
                  WHERE pw.prs_perslidwerkplek_key =
                           rec.prs_perslidwerkplek_key;
         ELSE
            -- Wis de werkplek, automatisch inclusief de bezetting
            DELETE FROM prs_werkplek wp
                  WHERE     wp.prs_werkplek_virtueel = 0
                        AND wp.prs_werkplek_type = 0   -- alleen vaste plekken
                        AND wp.prs_werkplek_key = rec.prs_werkplek_key;
         END IF;
      END;
   END LOOP;

   COMMIT;
END nybu_export_student_wp;
/


CREATE OR REPLACE VIEW NYBU_V_CONTRACT_OVERVIEW
(
   HTML_CONTRACT_NR,
   LOOPTIJD_VAN,
   LOOPTIJD_TOT,
   STATUS,
   SUBSTATUS,
   DEB_NR,
   STUDENT_NAAM,
   HTML_STUDENT_NAME,
   HTML_RUIMTE,
   AANKOMST,
   VERTREK,
   KALE_HUUR,
   SERVICE_KOSTEN,
   PARTERTOESLAG,
   HTML_LAATSTE_FACTUURDATUM
)
AS
     SELECT    '<a class="details" onclick=''FcltMgr.openDetail("'
            || 'appl/cnt/cnt_show_contract.asp?'
            || 'cnt_key='
            || c.cnt_contract_key
            || '")''>'
            || HTF.escape_sc(CASE
                                WHEN c.cnt_contract_versie IS NULL
                                THEN
                                   TO_CHAR (c.cnt_contract_nummer_intern)
                                ELSE
                                      c.cnt_contract_nummer_intern
                                   || '.'
                                   || c.cnt_contract_versie
                             END)
            || '</a>',
            c.cnt_contract_looptijd_van,
            c.cnt_contract_looptijd_tot,
            DECODE (c.cnt_contract_status, 0, 'Actief', 1, 'Gesloten')
               AS status,
            substatus.substatus,
            deb_nr.deb_nr,
            stud.prs_perslid_naam_full,
               '<a class="details" onclick=''FcltMgr.openDetail("'
            || 'appl/prs/prs_show_perslid.asp?'
            || 'prs_key='
            || c.cnt_prs_perslid_key
            || '")''>'
            || HTF.escape_sc (stud.prs_perslid_naam_full)
            || '</a>',
               '<a class="details" onclick=''FcltMgr.openDetail("'
            || 'appl/alg/alg_show_ruimte.asp?'
            || 'room_key='
            || ruimte.alg_ruimte_key
            || '")''>'
            || HTF.escape_sc (ruimte.ruimte_oms)
            || '</a>',
            aank_datum.aank_datum,
            vertrek_datum.vertrek_datum,
            ruimte.kale_huur,
            ruimte.servicekosten,
            ruimte.partnertoeslag,
               '<a class="details" onclick=''FcltMgr.openDetail("'
            || 'appl/fin/fin_verkoopfactuur.asp?mode=list&'
            || 'concerning=contract&'
            || 'ref_key='
            || c.cnt_contract_key
            || '")''>'
            || HTF.escape_sc (MAX (TRUNC (factuur.fin_verkoopfactuur_datum)))
            || '</a>'
       FROM cnt_contract c,
            prs_v_perslid_fullnames_all stud,
            (SELECT cnt_contract_key, fac_usrdata_omschr substatus
               FROM cnt_kenmerkcontract kc, cnt_kenmerk k, fac_usrdata stat
              WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                    AND k.cnt_srtkenmerk_key = 141
                    AND cnt_kenmerkcontract_waarde = stat.fac_usrdata_key)
            substatus,
            (SELECT cnt_contract_key,
                    r.*,
                    prijs.alg_srtruimte_prijs kale_huur,
                    prijs.alg_srtruimte_prijs2 servicekosten,
                    prijs.alg_srtruimte_prijs3 partnertoeslag
               FROM cnt_kenmerkcontract kc,
                    cnt_kenmerk k,
                    nybu_v_studentenkamers r,
                    alg_ruimte ar,
                    alg_srtruimte prijs
              WHERE     kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                    AND k.cnt_srtkenmerk_key = 1
                    AND r.alg_ruimte_key = ar.alg_ruimte_key
                    AND prijs.alg_srtruimte_key = ar.alg_srtruimte_key
                    AND fac.safe_to_number (kc.cnt_kenmerkcontract_waarde) =
                          r.alg_ruimte_key) ruimte,
            (SELECT kc.cnt_contract_key, cnt_kenmerkcontract_waarde aank_datum
               FROM cnt_kenmerkcontract kc, cnt_kenmerk k
              WHERE kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                    AND k.cnt_srtkenmerk_key = 162) aank_datum,
            (SELECT kc.cnt_contract_key,
                    cnt_kenmerkcontract_waarde vertrek_datum
               FROM cnt_kenmerkcontract kc, cnt_kenmerk k
              WHERE kc.cnt_kenmerk_key = k.cnt_kenmerk_key
                    AND k.cnt_srtkenmerk_key = 161) vertrek_datum,
            (SELECT p.prs_perslid_key,
                    COALESCE (osirisnr.prs_kenmerklink_waarde,
                              sannr.prs_kenmerklink_waarde,
                              codanr.prs_kenmerklink_waarde,
                              'Geen nr. bekend')
                       deb_nr
               FROM prs_perslid p,
                    (SELECT *
                       FROM prs_kenmerklink
                      WHERE prs_kenmerk_key = 1000
                            AND prs_kenmerklink_verwijder IS NULL) codanr,
                    (SELECT *
                       FROM prs_kenmerklink
                      WHERE prs_kenmerk_key = 1200
                            AND prs_kenmerklink_verwijder IS NULL) sannr,
                    (SELECT *
                       FROM prs_kenmerklink
                      WHERE prs_kenmerk_key = 1302
                            AND prs_kenmerklink_verwijder IS NULL) osirisnr
              WHERE     codanr.prs_link_key(+) = p.prs_perslid_key
                    AND sannr.prs_link_key(+) = p.prs_perslid_key
                    AND osirisnr.prs_link_key(+) = p.prs_perslid_key) deb_nr,
            (  SELECT DISTINCT
                      c.cnt_contract_key,
                      MAX (TRUNC (f.fin_verkoopfactuur_datum))
                         fin_verkoopfactuur_datum
                 FROM fin_verkoopfactuur f, cnt_contract c
                WHERE f.fin_verkoopfactuur_xmlnode = 'contract'
                      AND f.fin_verkoopfactuur_refkey = c.cnt_contract_key
             GROUP BY c.cnt_contract_key) factuur
      WHERE     c.ins_discipline_key = 55
            AND cnt_contract_verwijder IS NULL
            AND c.cnt_prs_perslid_key = stud.prs_perslid_key(+)
            AND c.cnt_contract_key = substatus.cnt_contract_key(+)
            AND c.cnt_contract_key = ruimte.cnt_contract_key(+)
            AND c.cnt_contract_key = aank_datum.cnt_contract_key(+)
            AND c.cnt_contract_key = vertrek_datum.cnt_contract_key(+)
            AND c.cnt_prs_perslid_key = deb_nr.prs_perslid_key(+)
            AND c.cnt_contract_key = factuur.cnt_contract_key(+)
   GROUP BY c.cnt_contract_key,
            factuur.fin_verkoopfactuur_datum,
            CASE
               WHEN c.cnt_contract_versie IS NULL
               THEN
                  TO_CHAR (c.cnt_contract_nummer_intern)
               ELSE
                     c.cnt_contract_nummer_intern
                  || '.'
                  || c.cnt_contract_versie
            END,
            c.cnt_contract_looptijd_van,
            c.cnt_contract_looptijd_tot,
            c.cnt_contract_status,
            substatus.substatus,
            c.cnt_contract_omschrijving,
            stud.prs_perslid_naam_full,
            c.cnt_prs_perslid_key,
            deb_nr.deb_nr,
            stud.prs_perslid_naam_full,
            ruimte.alg_ruimte_key,
            ruimte.ruimte_oms,
            aank_datum.aank_datum,
            vertrek_datum.vertrek_datum,
            ruimte.kale_huur,
            ruimte.servicekosten,
            ruimte.partnertoeslag;

CREATE OR REPLACE VIEW NYBU_V_RAP_VERMAAT_DAGLIJST
(
    HIDE_F_DATUM,
    HIDE_F_RSV_RUIMTE,
    RESNR,
    DAG,
    RUIMTE,
    VAN,
    TOT,
    TIJD_CATERING,
    AANTAL,
    ARTIKELOMSCHRIJVING,
    ARTIKELOPMERKING,
    CATERING_LOCATIE,
    OPMERKINGEN,
    RES_OPMERKINGEN,
    RES_OMSCHRIJVING,
    DIEETWENSEN,
    MEDEWERKER,
    MENSA_LAKEI,
    GROEPERING
)
AS
    SELECT res_rsv_artikel_levering,
           r.res_rsv_ruimte_key,
           r.res_reservering_key || '/' || r.res_rsv_ruimte_volgnr,
           TO_CHAR (res_rsv_ruimte_van, 'DAY')
               dag,
           r2a.ruimte_nr
               ruimte,
           res_rsv_ruimte_van
               ruimte_van,
           res_rsv_ruimte_tot
               ruimte_tot,
           TO_CHAR (res_rsv_artikel_levering, 'HH24:MI')
               levering_catering,
           aantal,
           artikeloms,
           artikelopm,
           COALESCE (catering_locatie, r2a.ruimte_nr)
               catering_locatie,
           opmerking,
           r2a.ruimte_opmerking,
           r2a.ruimte_omschrijving,
           dieetwensen,
           ''
               medewerker,
           CASE
               WHEN (   UPPER (r2a.ruimte_nr) LIKE '%LAKEI%'
                     OR UPPER (r2a.ruimte_nr) LIKE '%MENSA%'
                     OR UPPER (catering_locatie) LIKE '%LAKEI%'
                     OR UPPER (catering_locatie) LIKE '%MENSA%')
               THEN
                   'Ja'
               ELSE
                   'Nee'
           END
               AS mensa_lakei,
           COALESCE (groepering, 'Geen')
      FROM (SELECT rr.res_reservering_key,
                   rr.res_rsv_ruimte_volgnr,
                   rr.res_rsv_ruimte_key,
                   rr.res_rsv_ruimte_van,
                   rr.res_rsv_ruimte_tot,
                   ra.res_rsv_artikel_key,
                   ra.res_rsv_artikel_levering,
                   act.res_srtactiviteit_key,
                   a.res_artikel_key,
                   a.res_artikel_nr                        artikelnr,
                   a.res_artikel_omschrijving              artikeloms,
                   a.res_artikel_opmerking                 artikelopm,
                   d.ins_discipline_key,
                   d.ins_discipline_omschrijving           catalogus,
                   ra.res_status_bo_key                    status,
                   ra.res_rsv_artikel_aantal               aantal,
                   a.res_artikel_eenheid                   eenheid,
                   a.res_artikel_groep                     groepering,
                   pf.prs_perslid_key,
                   pf.prs_perslid_naam_full,
                   catering_locatie.catering_locatie,
                   opmerking.res_kenmerkartikel_waarde     opmerking,
                   dieetwensen.dieetwensen
              FROM res_rsv_artikel          ra,
                   res_artikel              a,
                   res_discipline           d,
                   res_rsv_ruimte           rr,
                   res_activiteit           act,
                   prs_v_perslid_fullnames  pf,
                   (SELECT ka.res_rsv_artikel_key,
                           ud.fac_usrdata_omschr     catering_locatie
                      FROM res_kenmerkartikel  ka,
                           res_kenmerk         k,
                           res_srtkenmerk      sk,
                           fac_usrdata         ud,
                           fac_usrtab          ut
                     WHERE     ka.res_kenmerk_key = k.res_kenmerk_key
                           AND k.res_srtkenmerk_key = sk.res_srtkenmerk_key
                           AND UPPER (ut.fac_usrtab_naam) =
                               'CATERING LOCATIE'
                           AND ud.fac_usrtab_key = ut.fac_usrtab_key
                           AND ka.res_kenmerkartikel_waarde =
                               TO_CHAR (ud.fac_usrdata_key)
                           AND res_srtkenmerk_upper = 'CATERING LOCATIE')
                   catering_locatie,
                   (SELECT ka.res_rsv_artikel_key, res_kenmerkartikel_waarde
                      FROM res_kenmerkartikel  ka,
                           res_kenmerk         k,
                           res_srtkenmerk      sk
                     WHERE     ka.res_kenmerk_key = k.res_kenmerk_key
                           AND k.res_srtkenmerk_key = sk.res_srtkenmerk_key
                           AND res_srtkenmerk_upper = 'OPMERKING') opmerking,
                   (SELECT res_rsv_ruimte_key,
                           res_kenmerkreservering_waarde     dieetwensen
                      FROM res_kenmerkwaarde  kw,
                           res_kenmerk        k,
                           res_srtkenmerk     sk
                     WHERE     kw.res_kenmerk_key = k.res_kenmerk_key
                           AND k.res_srtkenmerk_key = sk.res_srtkenmerk_key
                           AND sk.res_srtkenmerk_upper = 'DIEETWENSEN')
                   dieetwensen
             WHERE     ra.res_rsv_artikel_verwijder IS NULL
                   AND ra.res_rsv_artikel_key =
                       catering_locatie.res_rsv_artikel_key(+)
                   AND ra.res_rsv_artikel_key =
                       opmerking.res_rsv_artikel_key(+)
                   AND ra.res_rsv_artikel_levering >=
                       TO_DATE ('01-01-2016', 'DD-MM-YYYY')
                   AND a.res_artikel_key = ra.res_artikel_key
                   AND d.ins_discipline_key = a.res_discipline_key
                   AND d.ins_discipline_min_level = 2
                   AND d.ins_discipline_key NOT IN (462, 581)
                   AND rr.res_rsv_ruimte_key = ra.res_rsv_ruimte_key
                   AND act.res_activiteit_key = rr.res_activiteit_key
                   AND dieetwensen.res_rsv_ruimte_key (+) = rr.res_rsv_ruimte_key
                   AND pf.prs_perslid_key = rr.res_rsv_ruimte_contact_key) r,
           (  SELECT res_rsv_ruimte_key,
                     MAX (r.res_rsv_ruimte_omschrijving)
                         ruimte_omschrijving,
                     MAX (r.res_rsv_ruimte_opmerking)
                         ruimte_opmerking,
                     MAX (o.res_opstelling_omschrijving)
                         opstelling,
                     MAX (ro.res_ruimte_opstel_bezoekers)
                         capaciteit,
                     MAX (ra.alg_ruimte_key)
                         alg_ruimte_key,
                     MAX (rr.res_ruimte_nr)
                         ruimte_nr
                FROM res_rsv_ruimte       r,
                     res_ruimte_opstelling ro,
                     res_opstelling       o,
                     res_ruimte           rr,
                     res_alg_ruimte       ra
               WHERE     r.res_rsv_ruimte_verwijder IS NULL
                     AND r.res_ruimte_opstel_key = ro.res_ruimte_opstel_key(+)
                     AND ro.res_ruimte_key = rr.res_ruimte_key
                     AND ro.res_opstelling_key = o.res_opstelling_key(+)
                     AND rr.res_ruimte_key = ra.res_ruimte_key
            GROUP BY res_rsv_ruimte_key
            UNION ALL
            SELECT res_rsv_ruimte_key,
                   rrr.res_rsv_ruimte_opmerking        ruimte_opmerking,
                   rrr.res_rsv_ruimte_omschrijving     ruimte_omschrijving,
                   ''                                  opstelling,
                   NULL                                capaciteit,
                   rrr.alg_ruimte_key,
                   r.alg_ruimte_nr
              FROM res_rsv_ruimte rrr, alg_ruimte r
             WHERE     rrr.alg_ruimte_key IS NOT NULL
                   AND r.alg_ruimte_key = rrr.alg_ruimte_key) r2a,
           (SELECT l.alg_locatie_key,
                   alg_locatie_code,
                   alg_locatie_omschrijving,
                   r.alg_ruimte_key
              FROM alg_locatie     l,
                   alg_gebouw      g,
                   alg_verdieping  v,
                   alg_ruimte      r
             WHERE     l.alg_locatie_key = g.alg_locatie_key
                   AND g.alg_gebouw_key = v.alg_gebouw_key
                   AND v.alg_verdieping_key = r.alg_verdieping_key) locatie
     WHERE     locatie.alg_ruimte_key = r2a.alg_ruimte_key
           AND locatie.alg_locatie_key = 29 -- Vermaat doet alleen locatie Breukelen
           AND r.res_rsv_ruimte_key = r2a.res_rsv_ruimte_key(+);

CREATE OR REPLACE VIEW NYBU_V_NOTI_OUT_OF_ORDER
(
    SENDER,
    RECEIVER,
    TEXT,
    CODE,
    FAC_SRTNOTIFICATIE_KEY,
    KEY,
    XKEY,
    XEMAIL,
    XMOBILE
)
AS
    SELECT 
           NULL                    sender,
           NULL                    receiver,
           REPLACE (n.fac_srtnotificatie_oms, '##room##', og.alg_plaatsaanduiding) TEXT, 
           fac_srtnotificatie_code,
           n.fac_srtnotificatie_key,
           r.alg_ruimte_key,
           NULL                    xkey,
           'campus@nyenrode.nl'     xemail,
           NULL                    xmobile
      FROM    
           fac_srtnotificatie  n,
           alg_onrgoedkenmerk ok, 
           alg_ruimte r, 
           alg_v_onroerendgoed_gegevens og          
     WHERE       ok.alg_onrgoed_key = r.alg_ruimte_key
       AND r.alg_ruimte_key = og.alg_ruimte_key
       AND ok.alg_kenmerk_key = 1100
       AND ok.alg_onrgoed_niveau = 'R'         
           AND n.fac_srtnotificatie_code = 'CUST03'  
           AND   TO_DATE (alg_onrgoedkenmerk_waarde, 'dd-mm-yyyy') - TRUNC (SYSDATE)  = 14;           

CREATE OR REPLACE VIEW NYBU_V_INS_QRC_MLD
(
    HIDE_F_SORT,
    FCLT_F_LOCATIE,
    FCLT_F_GEBOUW,
    FCLT_F_PLAATS,
    FCLT_F_DISCIPLINE,
    FCLT_F_OBJECTGROEP,
    FCLT_F_OBJECTSOORT,
    FCLT_F_IDENTIFICATIE,
    FCLT_F_MELDING,
    INS_DEEL_KEY,
    INS_SRTDEEL_KEY,
    ALG_GEBOUW_CODE,
    ALG_VERDIEPING_CODE,
    FCLT_3D_DISCIPLINE_KEY,
    FCLT_3D_LOCATIE_KEY,
    INS_ALG_RUIMTE_TYPE,
    INS_ALG_RUIMTE_KEY,
    HIDE_F_BOOKMARK_ID
)
AS
    SELECT i.ins_deel_omschrijving
               hide_f_sort,
           l.alg_locatie_code || ' ' || l.alg_locatie_omschrijving
               fclt_f_locatie,
           o.alg_gebouw_omschrijving
               fclt_f_gebouw,
           o.alg_plaatsaanduiding
               fclt_f_plaats,
           d.ins_discipline_omschrijving
               fclt_f_discipline,
           g.ins_srtgroep_omschrijving
               fclt_f_objectgroep,
           s.ins_srtdeel_omschrijving
               fclt_f_objectsoort,
           i.ins_deel_omschrijving
               fclt_f_identificatie,
              d.ins_discipline_omschrijving
           || ' / '
           || sm.mld_stdmelding_omschrijving
               fclt_f_melding,
           i.ins_deel_key,
           s.ins_srtdeel_key,
           o.alg_gebouw_code,
           o.alg_verdieping_code,
           i.ins_discipline_key
               fclt_3d_discipline_key,
           l.alg_locatie_key
               fclt_3d_locatie_key,
           i.ins_alg_ruimte_type,
           i.ins_alg_ruimte_key,
           b.fac_bookmark_id
               hide_f_bookmark_id
      FROM ins_deel                i,
           ins_v_alg_overzicht     o,
           ins_srtdeel             s,
           ins_srtgroep            g,
           ins_discipline          d,
           alg_locatie             l,
           fac_bookmark            b,
           mld_stdmelding          sm,
           mld_stdmelding_srtinst  si
     WHERE     b.fac_bookmark_naam = 'QRC_MELDING'
           AND (   b.fac_bookmark_expire IS NULL
                OR b.fac_bookmark_expire > SYSDATE)
           AND ins_deel_verwijder IS NULL
           AND i.ins_deel_module = 'INS'
           AND i.ins_deel_parent_key IS NULL
           AND s.ins_srtdeel_key = i.ins_srtdeel_key
           AND g.ins_srtgroep_key = s.ins_srtgroep_key
           AND d.ins_discipline_key = g.ins_discipline_key
           AND o.alg_onroerendgoed_keys = i.ins_alg_ruimte_key
           AND o.alg_onroerendgoed_type = i.ins_alg_ruimte_type
           AND i.ins_alg_ruimte_type IN ('T', 'R', 'W')
           AND o.alg_locatie_key = i.ins_alg_locatie_key
           AND i.ins_alg_locatie_key = l.alg_locatie_key
           AND sm.mld_stdmelding_key = si.mld_stdmelding_key
           AND si.ins_srtinstallatie_key =
               DECODE (si.ins_srtinstallatie_niveau,
                       'S', i.ins_srtdeel_key,
                       'G', s.ins_srtgroep_key,
                       'D', g.ins_discipline_key);


CREATE OR REPLACE VIEW NYBU_V_RAP_BEZETTING_STUDROOM
(
    GEBOUW,
    RUIMTE,
    RUIMTE_OMSCHRIJVING,
    SOORT_RUIMTE,
    ZIJDE,
    VLOERAFWERKING,
    MAX_AANT_PERS,
    AANT_ACTUELE_HUURDERS,
    AANT_MAN,
    AANT_VROUW,
    AANT_OVER
)
AS
      SELECT rg.alg_gebouw_omschrijving,
             rg.alg_ruimte_nr,
             r.alg_ruimte_omschrijving,
             sr.alg_srtruimte_omschrijving,
             zijde.zijde,
             vloerafw.vloerafwerking,
             max_prs.max_prs,
             COUNT (contr.prs_perslid_key)                       aant_act_huurders,
             SUM (contr.man)                                     aant_man,
             SUM (contr.vrouw)                                   aant_vrouw,
             max_prs.max_prs - COUNT (contr.prs_perslid_key)     aant_over
        FROM alg_ruimte               r,
             alg_v_ruimte_gegevens_all rg,
             alg_srtruimte            sr,
             (SELECT alg_onrgoed_key, ud.fac_usrdata_omschr zijde
                FROM alg_onrgoedkenmerk ogk, alg_kenmerk k, fac_usrdata ud
               WHERE     ogk.alg_kenmerk_key = k.alg_kenmerk_key
                     AND alg_onrgoed_niveau = 'R'
                     AND k.alg_kenmerk_key = 1080
                     AND ud.fac_usrtab_key = 281
                     AND alg_onrgoedkenmerk_waarde = ud.fac_usrdata_key) zijde,
             (SELECT alg_onrgoed_key, ud.fac_usrdata_omschr vloerafwerking
                FROM alg_onrgoedkenmerk ogk, alg_kenmerk k, fac_usrdata ud
               WHERE     ogk.alg_kenmerk_key = k.alg_kenmerk_key
                     AND alg_onrgoed_niveau = 'R'
                     AND k.alg_kenmerk_key = 2
                     AND ud.fac_usrtab_key = 201
                     AND alg_onrgoedkenmerk_waarde = ud.fac_usrdata_key)
             vloerafw,
             (SELECT alg_onrgoed_key, alg_onrgoedkenmerk_waarde max_prs
                FROM alg_onrgoedkenmerk ogk, alg_kenmerk k
               WHERE     ogk.alg_kenmerk_key = k.alg_kenmerk_key
                     AND alg_onrgoed_niveau = 'R'
                     AND k.alg_kenmerk_key = 1120) max_prs,
             (SELECT contr.cnt_contract_key,
                     contr.prs_perslid_key,
                     contr.alg_ruimte_key,
                     man.man,
                     vrouw.vrouw
                FROM nybu_v_huurcontracten_student contr,
                     (SELECT prs_perslid_key, prs_perslid_geslacht man
                        FROM prs_perslid p
                       WHERE prs_perslid_geslacht = 1) man,
                     (SELECT prs_perslid_key,
                             DECODE (prs_perslid_geslacht, 0, 1, 0)     vrouw
                        FROM prs_perslid p
                       WHERE prs_perslid_geslacht = 0) vrouw
               WHERE     contr.prs_perslid_key = man.prs_perslid_key(+)
                     AND contr.prs_perslid_key = vrouw.prs_perslid_key(+))
             contr
       WHERE     r.alg_srtruimte_key = sr.alg_srtruimte_key(+)
             AND r.alg_ruimte_key = max_prs.alg_onrgoed_key(+)
             AND r.alg_ruimte_key = zijde.alg_onrgoed_key(+)
             AND r.alg_ruimte_key = vloerafw.alg_onrgoed_key(+)
             AND r.alg_ruimte_key = rg.alg_ruimte_key
             AND contr.alg_ruimte_key(+) = r.alg_ruimte_key
             AND sr.prs_verhuurbaar = '1'
    GROUP BY rg.alg_gebouw_omschrijving,
             rg.alg_ruimte_nr,
             r.alg_ruimte_omschrijving,
             sr.alg_srtruimte_omschrijving,
             zijde.zijde,
             vloerafw.vloerafwerking,
             max_prs.max_prs;

CREATE OR REPLACE VIEW NYBU_V_RAP_VERMAAT_MUTATIES
(
    HIDE_F_RSV_RUIMTE,
    RESNR,
    HIDE_F_DATUM,
    RUIMTE,
    DAG,
    VAN,
    TOT,
    MUTATIE_DATUM,
    MUTATIE
)
AS
  SELECT distinct res.hide_f_rsv_ruimte,
         res.resnr,
         TRUNC (res.hide_f_datum),
         res.ruimte,
         res.dag,
         res.van,
         res.tot,
         log.fac_tracking_datum                                                       mutatie_datum,
         DECODE (
             SUBSTR (LOG.fac_tracking_oms, 1, 11),
             'Reservation', (SUBSTR (
                                 LOG.fac_tracking_oms,
                                 INSTR (LOG.fac_tracking_oms, 'adjusted') + 9)),
             'Reservering', (SUBSTR (
                                 LOG.fac_tracking_oms,
                                 INSTR (LOG.fac_tracking_oms, 'gewijzigd') + 10)))    AS mutatie
    FROM nybu_v_rap_vermaat_daglijst res, fac_tracking LOG
   WHERE     res.hide_f_rsv_ruimte = LOG.fac_tracking_refkey
         AND LOG.fac_srtnotificatie_key = 77
         AND (   UPPER (fac_tracking_oms) LIKE '%RUIMTE%'
              OR UPPER (fac_tracking_oms) LIKE '%ROOM%'
              OR UPPER (fac_tracking_oms) LIKE '%ARTIKEL%'
              OR UPPER (fac_tracking_oms) LIKE '%ARTICLE%'
              OR UPPER (fac_tracking_oms) LIKE '%DIEET%'
              OR UPPER (fac_tracking_oms) LIKE '%DIET%'
              OR UPPER (fac_tracking_oms) LIKE '%PERSONEN%'
              OR UPPER (fac_tracking_oms) LIKE '%PERSONS%'
              OR UPPER (fac_tracking_oms) LIKE '%WENSEN%'
              OR UPPER (fac_tracking_oms) LIKE '%WISHES%'
              OR UPPER (fac_tracking_oms) LIKE '%OM:%'
              OR UPPER (fac_tracking_oms) LIKE '%AT:%')
ORDER BY res.hide_f_rsv_ruimte, log.fac_tracking_datum   DESC;
                 
------ 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