--
-- $Id$
-- Comment voor éncoding test
-- Script containing customer specific db-configuration for VLKC.
DEFINE thisfile = 'VLKC.SQL'
DEFINE dbuser   = '^VLKC'

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

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

CREATE OR REPLACE VIEW vlkc_v_rap_import_log
(
   fclt_f_applicatie,
   datum,
   fclt_f_status,
   omschrijving,
   hint
)
AS
   SELECT COALESCE (fac_import_app_code, imp_log_applicatie),
          TO_CHAR (imp_log_datum, 'dd-mm-yyyy hh24:mi'),
          imp_log_status,
          imp_log_omschrijving,
          imp_log_hint
     FROM imp_log il1, fac_import fi1, fac_import_app fia1
    WHERE il1.fac_import_key = fi1.fac_import_key(+)
          AND fi1.fac_import_app_key = fia1.fac_import_app_key(+)
          AND NOT EXISTS
                (SELECT 1
                   FROM imp_log il2, fac_import fi2
                  WHERE     il2.fac_import_key = fi2.fac_import_key
                        AND fi2.fac_import_app_key = fi1.fac_import_app_key
                        AND il2.fac_import_key > il1.fac_import_key);


/* Formatted on 21-12-2016 16:36:24 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE vlkc_import_org (p_import_key IN NUMBER)
AS
   c_delim           VARCHAR2 (1) := ';';                   -- Field seperator
   v_newline         fac_imp_file.fac_imp_file_line%TYPE;       -- Import line
   v_errormsg        VARCHAR2 (1000) := '';
   oracle_err_num    NUMBER;
   oracle_err_mes    VARCHAR2 (200);
   v_aanduiding      VARCHAR2 (1000) := '';
   header_is_valid   NUMBER := 0;
   v_count_tot       NUMBER (10) := 0;
   v_count_imp       NUMBER (10) := 0;
   -- De importvelden
   v_afd_oms         VARCHAR2 (255);
   v_afd_naam        VARCHAR2 (255);
   v_afd_parent      VARCHAR2 (255);
   v_manager         VARCHAR2 (255);
   v_kpn_nr          VARCHAR2 (255);
   v_kpn_oms         VARCHAR2 (255);

   CURSOR c1
   IS
        SELECT fac_imp_file_line,
               LENGTH (TRIM (REPLACE (fac_imp_file_line, c_delim, '')))
                  regellengte
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM fac_imp_organisatie;
   COMMIT;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen importregel';
         v_aanduiding := '';
         -- Lees alle veldwaarden
         -- Afdeling;Afd.-nr.;Nr. bovenliggende afd.;Manager;Nr. kostenplaats;Kostenplaats;Bestaat sinds;Tot en met
         fac.imp_getfield (v_newline, c_delim, v_afd_oms);
         fac.imp_getfield (v_newline, c_delim, v_afd_naam);
         fac.imp_getfield (v_newline, c_delim, v_afd_parent);
         fac.imp_getfield (v_newline, c_delim, v_manager);       -- Don't care
         fac.imp_getfield (v_newline, c_delim, v_kpn_nr);
         fac.imp_getfield (v_newline, c_delim, v_kpn_oms);

         v_aanduiding := '[' || '|' || v_afd_naam || '|' || v_afd_parent || v_afd_oms || '] ';

         -- 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     v_afd_oms = 'Afdeling'
               AND v_afd_naam = 'Afd.-nr.'
               AND v_afd_parent = 'Nr. bovenliggende afd.'
               AND v_manager = 'Manager'
               AND v_kpn_nr = 'Nr. kostenplaats'
               AND v_kpn_oms = 'Kostenplaats'
            THEN
               header_is_valid := 1;
            END IF;
         ELSIF (rec1.regellengte > 0)                 -- Lege regels overslaan
         THEN
            BEGIN
               v_count_tot := v_count_tot + 1;

               -- Direct wegschrijven; controleer alle veldwaarden maar niet.
               v_errormsg := 'Fout wegschrijven importregel';

               INSERT INTO fac_imp_organisatie (prs_bedrijf_naam, -- Vullen met kostenplaatsomschrijving!
                                                prs_afdeling_naam,
                                                prs_afdeling_naam_parent,
                                                prs_afdeling_omschrijving,
                                                prs_kostenplaats_nr)
                   VALUES (SUBSTR (TRIM (v_kpn_oms), 1, 60),
                           SUBSTR (TRIM (v_afd_naam), 1, 15),
                           SUBSTR (TRIM (v_afd_parent), 1, 15),
                           SUBSTR (TRIM (v_afd_oms), 1, 60),
                           SUBSTR (TRIM (v_kpn_nr), 1, 30));

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

            COMMIT;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key, 'E',
                        'Ongeldig importbestand', 'Geen header of header niet volgens afspraak!');
   ELSE
      fac.imp_writelog (p_import_key, 'S',
                        'Afdelingen/#ingelezen importregels: ' || TO_CHAR (v_count_tot), '');
      fac.imp_writelog (p_import_key, 'S',
                       'Afdelingen/#ongeldige niet ingelezen importregels: ' || TO_CHAR (v_count_tot - v_count_imp), '');
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Inleesproces Afdelingen afgebroken!');

      -- Maak importtabel leeg om import van foutieve bestanden te voorkomen!
      DELETE FROM fac_imp_organisatie;
END;
/

/* Formatted on 21-12-2016 19:35:25 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE vlkc_update_org (p_import_key IN NUMBER)
AS
   c_prs_bedrijf_key   NUMBER := 2241;       --  F. Van Lanschot Bankiers N.V.
   v_errormsg          VARCHAR2 (1000) := '';
   oracle_err_num      NUMBER;
   oracle_err_mes      VARCHAR2 (200);
   v_aanduiding        VARCHAR2 (1000) := '';
   v_count             NUMBER;
   l_impcountafd       NUMBER;
   l_oldcountafd       NUMBER;
   l_oldcountkpn       NUMBER;
   lkostenplaatskey    prs_kostenplaats.prs_kostenplaats_key%TYPE;
   lafdelingkey        prs_afdeling.prs_afdeling_key%TYPE;
   l_cur_lev           NUMBER;
   l_cur_parentkey     prs_afdeling.prs_afdeling_parentkey%TYPE;
   l_new_parentkey     prs_afdeling.prs_afdeling_parentkey%TYPE;
   l_vervcountafd      NUMBER;
   l_vervcountkpn      NUMBER;
   l_newcountafd       NUMBER;
   l_newcountkpn       NUMBER;

   -- Uitgangspunt is dat afbeelding in FACILITOR stuctureel gelijk blijft aan
   -- structuur zoals geimporteerd uit X(?).
   -- Wel geldt dat er in FACILITOR slechts 5 niveaus zijn (excl. bedrijf)
   -- en in X(?) meer. De "lagere" regionen worden daarom op niveau 5 gehangen
   -- (en onder niveau 4).
   CURSOR cafdelingsboom
   IS
          SELECT LEVEL imp_lev,
                 DECODE (LEVEL, 1, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 5) fac_lev,
                 UPPER (prs_afdeling_naam) prs_afdeling_naam,
                 UPPER (prs_afdeling_naam_parent) prs_afdeling_naam_parent,
                 prs_afdeling_omschrijving,
                 UPPER (prs_kostenplaats_nr) prs_kostenplaats_nr,
                 prs_bedrijf_naam prs_kostenplaats_omschrijving
            FROM fac_imp_organisatie
           WHERE prs_afdeling_naam IS NOT NULL             -- Geen lege regels
      CONNECT BY PRIOR prs_afdeling_naam = prs_afdeling_naam_parent
      START WITH prs_afdeling_naam_parent IS NULL
        ORDER BY LEVEL;
BEGIN
   -- How many records are imported?
   SELECT COUNT ( * ) INTO l_impcountafd FROM fac_imp_organisatie;

   -- How many active afdelingen are now present?
   SELECT COUNT ( * )                         -- ALLEEN onder F. van Lanschot!
     INTO l_oldcountafd
     FROM prs_v_aanwezigafdeling a, prs_v_afdeling_boom ab
    WHERE UPPER (COALESCE (a.prs_afdeling_omschrijving, '-')) NOT LIKE 'VERVALLEN:%'
          AND a.prs_afdeling_key = ab.prs_afdeling_key
          AND ab.prs_bedrijf_key = c_prs_bedrijf_key;

   SELECT COUNT ( * )
     INTO l_oldcountkpn
     FROM prs_v_aanwezigkostenplaats
    WHERE prs_kostenplaats_module = 'PRS'
          AND UPPER (COALESCE (prs_kostenplaats_omschrijving, '-')) NOT LIKE 'VERVALLEN:%';

   -- Check #regels, stop als onvoldoende = minder dan de helft overblijft!
   IF (l_impcountafd < l_oldcountafd / 2)
   THEN
      fac.imp_writelog (p_import_key, 'E', 'Verdacht importbestand', 'Te weinig regels; update afgebroken!');
      RETURN;
   END IF;

   FOR rc IN cafdelingsboom
   LOOP
      v_aanduiding := '[' || rc.prs_afdeling_naam || '|' || rc.prs_afdeling_naam_parent || '|' || rc.prs_kostenplaats_nr || '] ';

      -- Bestaat de kostenplaats al?
      v_errormsg := 'Fout bepalen kostenplaats.';
      BEGIN
         SELECT prs_kostenplaats_key
           INTO lkostenplaatskey
           FROM prs_v_aanwezigkostenplaats
          WHERE prs_kostenplaats_upper = rc.prs_kostenplaats_nr;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            lkostenplaatskey := -1;
      END;

      -- Bestaat de afdeling al?
      v_errormsg := 'Fout bepalen afdeling.';
      BEGIN
         SELECT a.prs_afdeling_key, COALESCE (fac.safe_to_number (ab.niveau), -1), a.prs_afdeling_parentkey
           INTO lafdelingkey, l_cur_lev, l_cur_parentkey
           FROM prs_afdeling a, prs_v_afdeling_boom ab -- LET OP: Niet prs_v_aanwezigafdeling (want soms "lager" dan 5)!
          WHERE     a.prs_afdeling_verwijder IS NULL
                AND a.prs_afdeling_key = ab.prs_afdeling_key(+) -- LET OP: Kan tijdelijk uit beeld raken ("lager" dan 5)!
                AND a.prs_afdeling_upper = rc.prs_afdeling_naam;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            lafdelingkey := -1;
            l_cur_lev := -1;
            l_cur_parentkey := -1;
      END;

      l_new_parentkey := -1;

      v_errormsg := 'Fout toevoegen/bijwerken kostenplaats.';

      BEGIN
         IF lkostenplaatskey = -1
         THEN
            INSERT INTO prs_kostenplaats (prs_kostenplaats_nr,
                                          prs_kostenplaats_omschrijving,
                                          prs_kostenplaats_module,
                                          prs_kostenplaats_begin,
                                          prs_kostenplaats_eind)
                VALUES (rc.prs_kostenplaats_nr,
                        rc.prs_kostenplaats_omschrijving,
                        'PRS',
                        SYSDATE,
                        NULL)
             RETURNING prs_kostenplaats_key INTO lkostenplaatskey;
         ELSE  -- Bijwerken kostenplaats met omschrijving het hoogst in de boom!
            SELECT COUNT ( * )
              INTO v_count
              FROM (    SELECT LEVEL imp_lev,
                               DECODE (LEVEL, 1, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 5) fac_lev,
                               UPPER (prs_afdeling_naam) prs_afdeling_naam,
                               UPPER (prs_afdeling_naam_parent) prs_afdeling_naam_parent,
                               prs_afdeling_omschrijving,
                               UPPER (prs_kostenplaats_nr) prs_kostenplaats_nr,
                               prs_bedrijf_naam prs_kostenplaats_omschrijving
                          FROM fac_imp_organisatie
                         WHERE prs_afdeling_naam IS NOT NULL  -- Geen lege regels
                    CONNECT BY PRIOR prs_afdeling_naam = prs_afdeling_naam_parent
                    START WITH prs_afdeling_naam_parent IS NULL
                      ORDER BY LEVEL) x
             WHERE UPPER (x.prs_kostenplaats_nr) = rc.prs_kostenplaats_nr
                   AND x.fac_lev < rc.fac_lev;

            IF (v_count = 0)
            THEN
               UPDATE prs_kostenplaats
                  SET prs_kostenplaats_omschrijving = rc.prs_kostenplaats_omschrijving
                WHERE prs_kostenplaats_key = lkostenplaatskey;
            END IF;
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
            fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, '');
      END;

      -- Bij de mapping naar afdelingen slaan wel level=1 over en pakken we de
      -- afdelingen vanaf level=2 (= FACILITOR Afdeling-1).
      IF rc.imp_lev >= 2 AND lkostenplaatskey <> -1 -- Elke afdeling heeft kostenplaats!
      THEN
         IF lafdelingkey = -1                 -- Nieuwe afdeling -> toevoegen!
         THEN
            BEGIN
               v_errormsg := 'Fout toevoegen afdeling.';

               IF rc.fac_lev = 1     -- Ingelezen afdeling betreft Afdeling-1!
               THEN
                  INSERT INTO prs_afdeling (prs_afdeling_naam,
                                            prs_afdeling_omschrijving,
                                            prs_bedrijf_key,
                                            prs_afdeling_parentkey,
                                            prs_kostenplaats_key)
                      VALUES (rc.prs_afdeling_naam,
                              rc.prs_afdeling_omschrijving,
                              c_prs_bedrijf_key,
                              NULL,
                              lkostenplaatskey)
                   RETURNING prs_afdeling_key INTO lafdelingkey;
               ELSIF rc.imp_lev <= 6             -- Afdeling-2 t/m Afdeling-5!
               THEN
                  -- Bepaal key van parent!
                  SELECT prs_afdeling_key
                    INTO l_new_parentkey
                    FROM prs_afdeling -- LET OP: Niet prs_v_aanwezigafdeling (want soms "lager" dan 5)!
                   WHERE     prs_afdeling_verwijder IS NULL
                         AND prs_afdeling_upper = rc.prs_afdeling_naam_parent;

                  INSERT INTO prs_afdeling (prs_afdeling_naam,
                                            prs_afdeling_omschrijving,
                                            prs_bedrijf_key,
                                            prs_afdeling_parentkey,
                                            prs_kostenplaats_key)
                      VALUES (rc.prs_afdeling_naam,
                              rc.prs_afdeling_omschrijving,
                              NULL,
                              l_new_parentkey,
                              lkostenplaatskey)
                   RETURNING prs_afdeling_key INTO lafdelingkey;
               ELSE    -- Omhoog geschoven afdeling op/naar niveau Afdeling-5!
                  -- Bepaal key van parent van (soms zelf verschoven) parent!
                  SELECT prs_afdeling_parentkey
                    INTO l_new_parentkey
                    FROM prs_afdeling -- LET OP: Niet prs_v_aanwezigafdeling (want soms "lager" dan 5)!
                   WHERE     prs_afdeling_verwijder IS NULL
                         AND prs_afdeling_upper = rc.prs_afdeling_naam_parent;

                  -- Doordat cursor van hoog naar laag door organisatie loopt,
                  -- komen afdelingen vanaf (imp_)lev>=7 keurig onder gewenste
                  -- Afdeling-4 te hangen.
                  INSERT INTO prs_afdeling (prs_afdeling_naam,
                                            prs_afdeling_omschrijving,
                                            prs_bedrijf_key,
                                            prs_afdeling_parentkey,
                                            prs_kostenplaats_key)
                      VALUES (rc.prs_afdeling_naam,
                              rc.prs_afdeling_omschrijving,
                              NULL,
                              l_new_parentkey,
                              lkostenplaatskey)
                   RETURNING prs_afdeling_key INTO lafdelingkey;
               END IF;

               fac.imp_writelog (p_import_key, 'I', v_aanduiding, 'Afdeling toegevoegd.');
            EXCEPTION
               WHEN OTHERS
               THEN
                  oracle_err_num := SQLCODE;
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                  v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                  fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, '');
            END;
         ELSE                  -- Bestaande afdeling -> bijwerken (misschien)!
            BEGIN
               v_errormsg := 'Fout bijwerken afdeling.';

               -- Zonodig bijwerken omschrijving (deze kon eerder vervallen
               -- zijn) en/of omhangen naar de juiste plek in de boom.
               IF rc.fac_lev = 1     -- Ingelezen afdeling betreft Afdeling-1!
               THEN
                  UPDATE prs_afdeling
                     SET prs_afdeling_omschrijving = rc.prs_afdeling_omschrijving,
                         prs_bedrijf_key = c_prs_bedrijf_key,
                         prs_afdeling_parentkey = NULL,
                         prs_kostenplaats_key = lkostenplaatskey
                   WHERE prs_afdeling_key = lafdelingkey
                         AND (COALESCE (prs_afdeling_omschrijving, '-') <> rc.prs_afdeling_omschrijving -- Oms. gewijzigd?
                              OR prs_afdeling_parentkey IS NOT NULL -- Niveau gewijzigd?
                              OR prs_kostenplaats_key <> lkostenplaatskey); -- Kostenplaats gewijzigd?
               ELSIF rc.imp_lev <= 6             -- Afdeling-2 t/m Afdeling-5!
               THEN
                  -- Bepaal key van parent!
                  SELECT prs_afdeling_key
                    INTO l_new_parentkey
                    FROM prs_afdeling -- LET OP: Niet prs_v_aanwezigafdeling (want soms "lager" dan 5)!
                   WHERE     prs_afdeling_verwijder IS NULL
                         AND prs_afdeling_upper = rc.prs_afdeling_naam_parent;

                  UPDATE prs_afdeling
                     SET prs_afdeling_omschrijving = rc.prs_afdeling_omschrijving,
                         prs_bedrijf_key = NULL,
                         prs_afdeling_parentkey = l_new_parentkey,
                         prs_kostenplaats_key = lkostenplaatskey
                   WHERE prs_afdeling_key = lafdelingkey
                         AND (COALESCE (prs_afdeling_omschrijving, '-') <> rc.prs_afdeling_omschrijving -- Oms. gewijzigd?
                              OR COALESCE (prs_afdeling_parentkey, -1) <> l_new_parentkey -- Parent gewijzigd?
                              OR prs_kostenplaats_key <> lkostenplaatskey); -- Kostenplaats gewijzigd?
               ELSE    -- Omhoog geschoven afdeling op/naar niveau Afdeling-5!
                  -- Bepaal key van parent van (soms zelf verschoven) parent!
                  SELECT prs_afdeling_parentkey
                    INTO l_new_parentkey
                    FROM prs_afdeling -- LET OP: Niet prs_v_aanwezigafdeling (want soms "lager" dan 5)!
                   WHERE     prs_afdeling_verwijder IS NULL
                         AND prs_afdeling_upper = rc.prs_afdeling_naam_parent;

                  -- Doordat cursor van hoog naar laag door organisatie loopt,
                  -- komen afdelingen vanaf (imp_)lev>=7 keurig onder gewenste
                  -- Afdeling-4 te hangen.
                  UPDATE prs_afdeling
                     SET prs_afdeling_omschrijving = rc.prs_afdeling_omschrijving,
                         prs_bedrijf_key = NULL,
                         prs_afdeling_parentkey = l_new_parentkey,
                         prs_kostenplaats_key = lkostenplaatskey
                   WHERE prs_afdeling_key = lafdelingkey
                         AND (COALESCE (prs_afdeling_omschrijving, '-') <> rc.prs_afdeling_omschrijving -- Oms. gewijzigd?
                              OR COALESCE (prs_afdeling_parentkey, -1) <> l_new_parentkey -- Parent gewijzigd?
                              OR prs_kostenplaats_key <> lkostenplaatskey); -- Kostenplaats gewijzigd?
               END IF;

               IF rc.fac_lev <> l_cur_lev OR l_new_parentkey <> l_cur_parentkey
               THEN
                  fac.imp_writelog (p_import_key, 'I', v_aanduiding, 'Afdeling omgehangen naar level=' || TO_CHAR (rc.fac_lev));
               END IF;
            EXCEPTION
               WHEN OTHERS
               THEN
                  oracle_err_num := SQLCODE;
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                  v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                  fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, '');
            END;
         END IF;

         COMMIT;
      END IF;
   END LOOP;

   -- Zet kostenplaatsen op VERVALLEN; de rest handmatig verder maar regelen!
   v_errormsg := 'Fout inactiveren kostenplaatsen.';

   SELECT COUNT ( * )
     INTO l_vervcountkpn
     FROM prs_v_aanwezigkostenplaats kp
    WHERE kp.prs_kostenplaats_module = 'PRS'
          AND UPPER (COALESCE (kp.prs_kostenplaats_omschrijving, '-')) NOT LIKE 'VERVALLEN:%'
          AND NOT EXISTS
                (SELECT 1
                   FROM fac_imp_organisatie
                  WHERE UPPER (prs_kostenplaats_nr) = kp.prs_kostenplaats_upper);

   UPDATE prs_kostenplaats kp
      SET kp.prs_kostenplaats_omschrijving = SUBSTR ('VERVALLEN:' || COALESCE (prs_kostenplaats_omschrijving, '-'), 1, 60)
    WHERE kp.prs_kostenplaats_verwijder IS NULL
          AND kp.prs_kostenplaats_module = 'PRS'
          AND UPPER (COALESCE (prs_kostenplaats_omschrijving, '-')) NOT LIKE 'VERVALLEN:%'
          AND NOT EXISTS
                (SELECT 1
                   FROM fac_imp_organisatie
                  WHERE UPPER (prs_kostenplaats_nr) = kp.prs_kostenplaats_upper);

   COMMIT;

   -- Zet afdelingen op VERVALLEN; de rest handmatig verder maar regelen!
   v_errormsg := 'Fout inactiveren afdelingen.';

   SELECT COUNT ( * )                         -- ALLEEN onder F. van Lanschot!
     INTO l_vervcountafd
     FROM prs_v_aanwezigafdeling a, prs_v_afdeling_boom ab
    WHERE UPPER (COALESCE (a.prs_afdeling_omschrijving, '-')) NOT LIKE 'VERVALLEN:%'
          AND a.prs_afdeling_key = ab.prs_afdeling_key
          AND ab.prs_bedrijf_key = c_prs_bedrijf_key
          AND NOT EXISTS
                (SELECT 1
                   FROM fac_imp_organisatie
                  WHERE UPPER (prs_afdeling_naam) = a.prs_afdeling_upper);

   UPDATE prs_afdeling a                      -- ALLEEN onder F. van Lanschot!
      SET a.prs_afdeling_omschrijving = SUBSTR ('VERVALLEN:' || COALESCE (prs_afdeling_omschrijving, '-'), 1, 60)
    WHERE a.prs_afdeling_verwijder IS NULL
          AND UPPER (COALESCE (a.prs_afdeling_omschrijving, '-')) NOT LIKE 'VERVALLEN:%'
          AND EXISTS
                (SELECT 1
                   FROM prs_v_afdeling_boom
                  WHERE prs_afdeling_key = a.prs_afdeling_key
                        AND prs_bedrijf_key = c_prs_bedrijf_key)
          AND NOT EXISTS
                (SELECT 1
                   FROM fac_imp_organisatie
                  WHERE UPPER (prs_afdeling_naam) = a.prs_afdeling_upper);

   COMMIT;

   -- For summary only.
   SELECT COUNT ( * )                         -- ALLEEN onder F. van Lanschot!
     INTO l_newcountafd
     FROM prs_v_aanwezigafdeling a, prs_v_afdeling_boom ab
    WHERE UPPER (COALESCE (a.prs_afdeling_omschrijving, '-')) NOT LIKE 'VERVALLEN:%'
          AND a.prs_afdeling_key = ab.prs_afdeling_key
          AND ab.prs_bedrijf_key = c_prs_bedrijf_key;

   SELECT COUNT ( * )
     INTO l_newcountkpn
     FROM prs_v_aanwezigkostenplaats
    WHERE prs_kostenplaats_module = 'PRS'
          AND UPPER (COALESCE (prs_kostenplaats_omschrijving, '-')) NOT LIKE 'VERVALLEN:%';

   fac.imp_writelog (
      p_import_key, 'S',
      'Aantal afdelingen in importbestand: ' || TO_CHAR (l_impcountafd),
      '');
   fac.imp_writelog (
      p_import_key, 'S',
      'Aantal actieve afdelingen vooraf: '
      || TO_CHAR (l_oldcountafd)
      || '  nu: '
      || TO_CHAR (l_newcountafd),
      '');
   fac.imp_writelog (
      p_import_key, 'S',
      'Aantal afdelingen vervallen: ' || TO_CHAR (l_vervcountafd),
      '');
   fac.imp_writelog (
      p_import_key, 'S',
      'Aantal actieve kostenplaatsen vooraf: '
      || TO_CHAR (l_oldcountkpn)
      || '  nu: '
      || TO_CHAR (l_newcountkpn),
      '');
   fac.imp_writelog (
      p_import_key, 'S',
      'Aantal kostenplaatsen vervallen: ' || TO_CHAR (l_vervcountkpn),
      '');
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Importproces Afdelingen afgebroken!');
END;
/


/* Formatted on 17-12-2015 14:48:12 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE vlkc_import_prs (p_import_key IN NUMBER)
AS
   v_errormsg       VARCHAR2 (1000) := '-';
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
   -- Verwijder spaties en haakjes ('(' en ')') uit Telefoonnr.
   UPDATE fac_imp_file
      SET fac_imp_file_line =
             SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 9))
             || REPLACE (
                   REPLACE (
                      REPLACE (
                         SUBSTR (fac_imp_file_line,
                                 INSTR (fac_imp_file_line, ';', 1, 9) + 1,
                                 INSTR (fac_imp_file_line, ';', 1, 10) - INSTR (fac_imp_file_line, ';', 1, 9) - 1),
                         ' ', ''),
                      '(', ''),
                   ')', '')
          || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 10))
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1;

   COMMIT;

   -- Verwijder spaties en haakjes ('(' en ')') uit Mobiel.
   UPDATE fac_imp_file
      SET fac_imp_file_line =
             SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 10))
             || REPLACE (
                   REPLACE (
                      REPLACE (
                         SUBSTR (fac_imp_file_line,
                                 INSTR (fac_imp_file_line, ';', 1, 10) + 1,
                                 INSTR (fac_imp_file_line, ';', 1, 11) - INSTR (fac_imp_file_line, ';', 1, 10) - 1),
                         ' ', ''),
                      '(', ''),
                   ')', '')
          || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 11))
    WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1;

   COMMIT;

   -- Generieke import.
   -- De sequence array staat beschreven in PRS_PAC.SRC bij de import_perslid-PROCEDURE.
   -- Met Stamplaats wordt nog niets gedaan!
   --'%"Personeelsnummer";"Loginnaam";"Achternaam";"Tussenvoegsel";"Voorletters";"Voornaam";"Afdelingscode";"Functie";"Email";"Telefoonnr";"Mobiel";"Stamplaats"%');
   --'%Personeelsnummer;Loginnaam;Achternaam;Tussenvoegsel;Voorletters;Voornaam;Afdelingscode;Functie;Email;Telefoonnr;Mobiel;Stamplaats%');
   prs.import_perslid (
      p_import_key,
         '0;0;0;0;0;0;7;3;4;6;'
      || '5;0;0;0;0;10;11;9;0;1;'
      || '8;2;0;0;0;0;12;13;0;0;'
      || '0;0;0;0;0;0;0;0;0;0;'
      || '0;0;0;0;0;0',
      '%Personeelsnummer;Login;Achternaam;Tussenvoegsel;Voorletters;Voornaam;Afdelingscode;Functie;Email;Telefoonnr;Mobiel;Stamplaats;Login2%');

   -- Klantspecifieke aanpassingen.
   -- Als geen Login aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_oslogin =
             (SELECT MAX (prs_perslid_oslogin)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_oslogin IS NULL        -- Aangeleverde Loginnaam wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_oslogin IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);

   COMMIT;

   -- Als geen Voorletters aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_voorletters =
             (SELECT MAX (prs_perslid_voorletters)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_voorletters IS NULL -- Aangeleverde Voorletters winnen!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_voorletters IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);

   COMMIT;

   -- Als geen Voornaam aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_voornaam =
             (SELECT MAX (prs_perslid_voornaam)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_voornaam IS NULL        -- Aangeleverde Voornaam wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_voornaam IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);

   COMMIT;

   -- Iedereen de Functie 'Collega'.
   UPDATE fac_imp_perslid
      SET prs_srtperslid_omschrijving = 'Collega';

   COMMIT;

   -- Als geen Email aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_email =
             (SELECT MAX (prs_perslid_email)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_email IS NULL              -- Aangeleverde Email wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_email IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);

   COMMIT;

   -- Als geen Telefoonnr aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_telefoonnr =
             (SELECT MAX (prs_perslid_telefoonnr)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_telefoonnr IS NULL    -- Aangeleverde Telefoonnr wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_telefoonnr IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);

   COMMIT;

   -- Als geen Mobiel aangeleverd, dan handmatig toegekende niet wissen.
   UPDATE fac_imp_perslid i
      SET i.prs_perslid_mobiel =
             (SELECT MAX (prs_perslid_mobiel)
                FROM prs_v_aanwezigperslid
               WHERE prs_perslid_nr = i.prs_perslid_nr)
    WHERE i.prs_perslid_mobiel IS NULL            -- Aangeleverde Mobiel wint!
          AND EXISTS
                (SELECT 1
                   FROM prs_v_aanwezigperslid
                  WHERE prs_perslid_mobiel IS NOT NULL
                        AND prs_perslid_nr = i.prs_perslid_nr);

   COMMIT;

   -- Klantspecifieke aanpassingen.
   -- Locatie/Gebouw/Verdieping/Ruimte bepalen via Kenmerk1-kolom -> Eigen tabel (key = 1) ->
   -- Gebouw en daaronder Ruimte '_000' op de verdieping met het laagste volgnummer!
   -- Als persoon al een WP heeft op import-locatie, dan is dat de juiste en blijft deze
   -- (handmatig gecorrigeerde WP) ongewijzigd. In alle andere gevallen verhuist persoon naar
   -- '_000' op de meegegeven locatie.
   -- Eventuele WPs onder andere locaties dan import-locatie blijven ook ongewijzigd!
   UPDATE fac_imp_perslid i
      SET i.alg_locatie_code =
             (SELECT il.alg_locatie_code
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il
               WHERE ud.fac_usrtab_key = -1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key)),
          i.alg_gebouw_code =
             (SELECT ig.alg_gebouw_code
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il
               WHERE ud.fac_usrtab_key = -1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key)),
          i.alg_verdieping_volgnr =
             (SELECT iv.alg_verdieping_volgnr
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il,
                     alg_verdieping iv,
                     alg_ruimte ir
               WHERE ud.fac_usrtab_key = -1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key)
                     AND ig.alg_gebouw_key = iv.alg_gebouw_key
                     AND iv.alg_verdieping_key = ir.alg_verdieping_key
                     AND ir.alg_ruimte_nr = '_000'
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanwezigruimte r, alg_verdieping v
                             WHERE r.alg_ruimte_nr = '_000'
                                   AND r.alg_verdieping_key = v.alg_verdieping_key
                                   AND v.alg_verdieping_volgnr < iv.alg_verdieping_volgnr)),
          i.alg_ruimte_nr =
             (SELECT '_000'
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il
               WHERE ud.fac_usrtab_key = -1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key))
    WHERE NOT EXISTS                          -- Nog geen werkplek op Locatie!
             (SELECT 1
                FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode
                     alg_v_aanweziggebouw ig,
                     alg_locatie il,
                     prs_v_aanwezigperslid p,
                     prs_perslidwerkplek pw,
                     prs_werkplek cw,
                     alg_v_aanwezigruimte cr,
                     alg_verdieping cv,
                     alg_gebouw cg
               WHERE ud.fac_usrtab_key = -1
                     AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1)
                     AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code)
                     AND ig.alg_locatie_key = il.alg_locatie_key
                     AND NOT EXISTS
                           (SELECT 1
                              FROM alg_v_aanweziggebouw
                             WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr)
                                   AND alg_locatie_key < il.alg_locatie_key)
                     AND p.prs_perslid_nr = i.prs_perslid_nr
                     AND p.prs_perslid_key = pw.prs_perslid_key
                     AND pw.prs_werkplek_key = cw.prs_werkplek_key
                     AND cw.prs_alg_ruimte_key = cr.alg_ruimte_key
                     AND cr.alg_verdieping_key = cv.alg_verdieping_key
                     AND cv.alg_gebouw_key = cg.alg_gebouw_key
                     AND cg.alg_locatie_key = il.alg_locatie_key);

   COMMIT;

   -- Resulteert in nette foutmelding als ruimte niet kan worden bepaald.
   UPDATE fac_imp_perslid
      SET alg_verdieping_volgnr = 0
    WHERE alg_gebouw_code IS NOT NULL
      AND alg_verdieping_volgnr IS NULL;

   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.imp_writelog (p_import_key, 'E', v_errormsg, 'Inleesproces personen afgebroken!');
END vlkc_import_prs;
/

CREATE OR REPLACE PROCEDURE vlkc_update_prs (p_import_key IN NUMBER)
AS
   -- Maximale afname van medewerkers na import tov. huidig aantal met nummer!
   c_max_delta_percentage   NUMBER (10) := 25;                         -- 25%!
   v_errormsg               VARCHAR2 (1000);
   oracle_err_num           NUMBER;
   oracle_err_mes           VARCHAR2 (200);
   v_afd_count              NUMBER (10);
   v_afd_digit              VARCHAR2 (1);
   v_count_prs_import       NUMBER (10);       -- #actieve personen na import!
   v_count_prs_actual       NUMBER (10);     -- #actieve personen voor import!

   -- Verwijderen personen niet in import (voor afdeling wel in import)!
/*
   CURSOR c_del (p_afd_digit VARCHAR2)
   IS
        SELECT p.prs_perslid_key, p.prs_perslid_email
          FROM prs_v_aanwezigperslid p
         WHERE p.prs_perslid_email IS NOT NULL    -- Personen met e-mail adres
               AND p.prs_srtperslid_key = 3941 -- Personen met functie=Collega
               AND NOT EXISTS
                     (SELECT 1
                        FROM fac_imp_perslid
                       WHERE prs_perslid_email = p.prs_perslid_email)
      ORDER BY 2, 1;
*/
   CURSOR c_del (p_afd_digit VARCHAR2)
   IS
        SELECT p.prs_perslid_key, p.prs_perslid_nr
          FROM prs_v_aanwezigperslid p                     --, prs_afdeling a
         WHERE p.prs_perslid_nr IS NOT NULL             -- Personen met nummer
               AND p.prs_srtperslid_key = 3941 -- Personen met functie=Collega
               --AND p.prs_afdeling_key = a.prs_afdeling_key
               --AND SUBSTR (a.prs_afdeling_upper, 1, 1) = UPPER (p_afd_digit)
               --AND EXISTS
               --      (SELECT 1
               --         FROM fac_imp_perslid
               --        WHERE UPPER (SUBSTR (prs_afdeling_naam, 1, 1)) = UPPER (p_afd_digit))
               AND NOT EXISTS
                     (SELECT 1
                        FROM fac_imp_perslid
                       WHERE prs_perslid_nr = p.prs_perslid_nr)
      ORDER BY 2, 1;

   -- Toekennen alternatieve login!
   CURSOR c_login2
   IS
        SELECT '[' || p.prs_perslid_nr || '|' || i.prs_kenmerk2 || '] ' aanduiding,
               p.prs_perslid_key,
               i.prs_kenmerk2
          FROM fac_imp_perslid i, prs_v_aanwezigperslid p
         WHERE i.prs_kenmerk2 IS NOT NULL                            -- Login2
           AND i.prs_perslid_nr = p.prs_perslid_nr
           AND i.prs_kenmerk2 != p.prs_perslid_oslogin;
BEGIN
/*
   SELECT COUNT (DISTINCT SUBSTR (prs_afdeling_naam, 1, 1)), MIN (SUBSTR (prs_afdeling_naam, 1, 1))
     INTO v_afd_count, v_afd_digit
     FROM fac_imp_perslid;

   -- Bepaal aantal personen na import (beginnend met v_afd_digit).
   SELECT COUNT (DISTINCT prs_perslid_nr)
     INTO v_count_prs_import
     FROM fac_imp_perslid
    WHERE SUBSTR (prs_afdeling_naam, 1, 1) = v_afd_digit;

   -- Bepaal aantal personen voor import (beginnend met v_afd_digit).
   SELECT DECODE (COUNT ( * ), 0, 1, COUNT ( * ))
     INTO v_count_prs_actual
     FROM prs_v_aanwezigperslid p, prs_afdeling a
    WHERE p.prs_perslid_nr IS NOT NULL
      AND p.prs_afdeling_key = a.prs_afdeling_key
      AND SUBSTR (a.prs_afdeling_naam, 1, 1) = v_afd_digit;

   IF (v_afd_count > 1)
   THEN
      fac.imp_writelog (
         p_import_key, 'W',
         'Personen niet onder dezelfde afdeling op het hoogste niveau (VL en KC); zie specificatie!',
         'Geen personen verwijderd');
   ELSIF (TRUNC ( (v_count_prs_import / v_count_prs_actual) * 100) < (100 - c_max_delta_percentage))
   THEN
      fac.imp_writelog (
         p_import_key, 'E',
         'Verschil tussen huidig aantal en te importeren aantal personen te groot; zie specificatie!',
            '- max. verschilpercentage = [' || TO_CHAR (c_max_delta_percentage) || '%]'
         || CHR (13) || CHR (10)
         || '- #personen/import = [' || TO_CHAR (v_count_prs_import) || ']'
         || CHR (13) || CHR (10)
         || '- #personen/huidig = [' || TO_CHAR (v_count_prs_actual) || ']');
   ELSE
      -- Verwijder personen die niet meer in de import voorkomen.
      FOR rec IN c_del (v_afd_digit)
      LOOP
         prs.delete_perslid (p_import_key, rec.prs_perslid_key);
      END LOOP;

      COMMIT;

      -- Generieke update (op personeelsnummer).
      prs.update_perslid (p_import_key, 'NR', NULL);
   END IF;
*/
   -- Bepaal aantal personen na import.
   SELECT COUNT (DISTINCT prs_perslid_nr)
     INTO v_count_prs_import
     FROM fac_imp_perslid
    WHERE prs_perslid_nr IS NOT NULL;

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

   IF (TRUNC ( (v_count_prs_import / v_count_prs_actual) * 100) < (100 - c_max_delta_percentage))
   THEN
      fac.imp_writelog (
         p_import_key, 'E',
         'Verschil tussen huidig aantal en te importeren aantal personen te groot; zie specificatie!',
            '- max. verschilpercentage = [' || TO_CHAR (c_max_delta_percentage) || '%]'
         || CHR (13) || CHR (10)
         || '- #personen/import = [' || TO_CHAR (v_count_prs_import) || ']'
         || CHR (13) || CHR (10)
         || '- #personen/huidig = [' || TO_CHAR (v_count_prs_actual) || ']');
   ELSE
      -- Verwijder personen die niet meer in de import voorkomen.
      FOR rec IN c_del (v_afd_digit)
      LOOP
         prs.delete_perslid (p_import_key, rec.prs_perslid_key);
      END LOOP;

      COMMIT;

      -- Generieke update (op personeelsnummer).
      --prs.update_perslid (p_import_key, 'EMAIL', NULL); -- EENMALIG op e-mail!
      prs.update_perslid (p_import_key, 'NR', NULL);

      -- Toekennen alternatieve login!
      FOR rec IN c_login2
      LOOP
         BEGIN
            UPDATE prs_perslid
               SET prs_perslid_oslogin2 = rec.prs_kenmerk2
             WHERE prs_perslid_key = rec.prs_perslid_key;
         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.imp_writelog (p_import_key, 'E', rec.aanduiding || v_errormsg, 'Toekennen login2');
         END;
      END LOOP;
   END IF;
END vlkc_update_prs;
/

-- Import vanuit Strukton
/* Formatted on 19-12-2016 15:15:45 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE vlkc_import_opdrstat_strukton (p_import_key IN NUMBER)
AS
   c_delim                VARCHAR2 (1) := ';';
   v_newline              VARCHAR2 (4000);                       -- Input line
   v_errormsg             VARCHAR2 (1000);
   oracle_err_num         NUMBER;
   oracle_err_mes         VARCHAR2 (200);
   v_aanduiding           VARCHAR2 (1000) := '';
   header_is_valid        NUMBER := 0;
   v_count_tot            NUMBER (10) := 0;
   v_count_imp            NUMBER (10) := 0;
   v_ongeldig             NUMBER (1) := 0;
   -- De importvelden
   v_mld_opdr_key_tekst   VARCHAR2 (100);
   v_mld_opdr_key         NUMBER (10);
   v_mld_opdr_opmerking   VARCHAR2 (4000);
   v_extern_nummer        VARCHAR2 (100);
   v_status_code          VARCHAR2 (100);
   v_status               NUMBER (10);
   v_datumtijd_tekst      VARCHAR2 (100);
   v_datumtijd            DATE;
   v_status_tekst         VARCHAR2 (100);
   v_opmerking            VARCHAR2 (4000);
   v_totaal               NUMBER (8,2);
   v_totaal_str           VARCHAR2 (100);

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

   COMMIT;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_mld_opdr_key_tekst);
         fac.imp_getfield (v_newline, c_delim, v_extern_nummer);
         fac.imp_getfield (v_newline, c_delim, v_status_code);       -- typeID
         fac.imp_getfield (v_newline, c_delim, v_datumtijd_tekst);
         fac.imp_getfield (v_newline, c_delim, v_status_tekst);
         fac.imp_getfield (v_newline, c_delim, v_opmerking);
         fac.imp_getfield (v_newline, c_delim, v_totaal_str);
         v_opmerking := SUBSTR (v_opmerking, 1, 1000);
         -- Verwijder de markering voor cr/lf die in stylesheet is toegevoegd.
         v_opmerking := REPLACE (v_opmerking, '@@', CHR (13) || CHR (10));
         v_totaal := fac.safe_to_number (v_totaal_str);
         fac.imp_writelog (p_import_key, 'I',
                           'v_totaal_str:' || v_totaal_str || ' / v_totaal:' || TO_CHAR (v_totaal), '');
         v_aanduiding :=
               '['
            || v_mld_opdr_key_tekst
            || '|'
            || v_extern_nummer
            || '|'
            || v_status_code
            || '|'
            || v_datumtijd_tekst
            || '|'
            || v_status_tekst
            || '] ';

         -- 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 (TRIM (v_mld_opdr_key_tekst)) = 'REFERENCEID'
               AND UPPER (TRIM (v_extern_nummer)) = 'SERVICEREQUESTID'
               AND UPPER (TRIM (v_status_code)) = 'TYPEID'
               AND UPPER (TRIM (v_datumtijd_tekst)) = 'DATETIME'
               AND UPPER (TRIM (v_opmerking)) = 'REMARKS'
               AND UPPER (TRIM (v_totaal_str)) = 'TOTAL'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Fout bepalen opdracht';
            v_mld_opdr_key := TRIM (v_mld_opdr_key);

            BEGIN
               SELECT o.mld_opdr_key, o.mld_opdr_opmerking
                 INTO v_mld_opdr_key, v_mld_opdr_opmerking
                 FROM mld_opdr o, mld_melding m, mld_stdmelding sm, ins_tab_discipline td, ins_srtdiscipline sd
                WHERE     o.mld_melding_key = m.mld_melding_key
                      AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                      AND sm.mld_ins_discipline_key = td.ins_discipline_key
                      AND td.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                      AND sd.ins_srtdiscipline_prefix || m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr = v_mld_opdr_key_tekst;
            EXCEPTION
               WHEN OTHERS
               THEN
                  v_ongeldig := 1;
                  oracle_err_num := SQLCODE;
                  oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                  v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                  fac.writelog (p_import_key, 'W', v_aanduiding || v_errormsg, '');
            END;

            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Fout bepalen status';

               CASE
                  WHEN v_status_code = '5'
                  THEN
                     v_status := 5;                              -- uitgegeven
                  WHEN v_status_code = '10'
                  THEN
                     v_status := 8;                            -- geaccepteerd
                  WHEN v_status_code = '20'                  -- monteur gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '25'               -- specialist gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '30'                -- technisch gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  -- For future use
                  --WHEN v_status_code = '40'                     -- uitgeprijst
                  --THEN
                  --   v_status := 9;                                -- afgerond
                  WHEN v_status_code = '70'
                  THEN
                     v_status := 1;                             -- geannuleerd
                  WHEN v_status_code = '80'
                  THEN
                     v_status := 1;                               -- afgewezen
                  ELSE
                     v_status := NULL;
                     v_ongeldig := 1;                         -- nog te bezien
               END CASE;
            END IF;

            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Fout converteren datumtijd';

               IF INSTR (v_datumtijd_tekst, '.') > 0
               THEN
                  v_datumtijd := fac.safe_to_date (REPLACE (SUBSTR (v_datumtijd_tekst, 1, INSTR (v_datumtijd_tekst, '.') - 1), 'T', ' '), 'yyyy-mm-dd hh24:mi:ss');
               ELSE
                  v_datumtijd := fac.safe_to_date (v_datumtijd_tekst, 'yyyy-mm-dd hh24:mi:ss');
               END IF;
            END IF;

            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Fout aanvullen opmerking';

               -- Controleer of de opmerking is gevuld en deze opmerking niet
               -- al bij een eerdere statusovergang is gemeld.
               IF v_opmerking IS NOT NULL AND INSTR (v_mld_opdr_opmerking, v_opmerking) = 0
               THEN
                  v_opmerking := '[' || v_datumtijd_tekst || '] - ' || v_status_tekst || CHR (13) || CHR (10) || v_opmerking;
               ELSE
                  v_opmerking := '[' || v_datumtijd_tekst || '] - ' || v_status_tekst;
               END IF;
            END IF;

            -- Insert geformatteerde import record
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errormsg := 'Fout wegschrijven statusbericht';

                  INSERT INTO vlkc_imp_opdrstat_strukton (mld_opdr_key, extern_nummer, status, datumtijd, opmerking, totaal)
                      VALUES (v_mld_opdr_key, v_extern_nummer, v_status, v_datumtijd, v_opmerking, v_totaal);

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

   IF header_is_valid = 0
   THEN
      fac.imp_writelog (p_import_key, 'E',
                        'Ongeldig importbestand', 'Geen header of header niet volgens specificatie!');
   ELSE
      fac.imp_writelog (p_import_key, 'S',
                        'Inleesproces/#ingelezen statusberichten: ' || TO_CHAR (v_count_tot), '');
      fac.imp_writelog (p_import_key, 'S',
                        'Inleesproces/#ongeldige niet ingelezen statusberichten: ' || TO_CHAR (v_count_tot - v_count_imp), '');
   END IF;

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

CREATE OR REPLACE PROCEDURE vlkc_update_opdrstat_strukton (p_import_key IN NUMBER)
AS
   -- Cursor loopt - in volgorde! - over alle ingelezen statusberichten.
   CURSOR c1
   IS
        SELECT mld_opdr_key, extern_nummer, datumtijd, status, opmerking, totaal
          FROM vlkc_imp_opdrstat_strukton
      ORDER BY 1, 3;

   c_user_key              NUMBER (10) := 5;                 -- _STRUKTON-user
   c_refnr_srtkkey         NUMBER (10) := 42;            -- Refnr. Leverancier
   v_errormsg              VARCHAR2 (1000);
   oracle_err_num          NUMBER;
   oracle_err_mes          VARCHAR2 (200);
   v_aanduiding            VARCHAR2 (200);
   v_count_tot             NUMBER (10) := 0;
   v_count                 NUMBER (10) := 0;
   v_mld_key               NUMBER (10) := 0;
   v_opdr_key              NUMBER (10) := 0;
   v_opdr_status           NUMBER (10) := 0;
   v_mld_typeopdr_key      mld_typeopdr.mld_typeopdr_key%TYPE;
   v_mld_kenmerk_key       mld_kenmerk.mld_kenmerk_key%TYPE;
   v_mld_kenmerkopdr_key   mld_kenmerkopdr.mld_kenmerkopdr_key%TYPE;
BEGIN
   -- Loop over alle ingelezen Strukton-statusberichten.
   FOR rec IN c1
   LOOP
      BEGIN
         v_aanduiding :=
               '['
            || rec.mld_opdr_key
            || '|'
            || SUBSTR (rec.opmerking, 1, 100)
            || '] ';
         v_count_tot := v_count_tot + 1;

         -- Key van melding/opdracht bepalen en Refnr. bij opdracht opslaan.
         IF rec.mld_opdr_key IS NOT NULL
         THEN
            v_errormsg := 'Fout bepalen opdracht.';

            SELECT mld_melding_key, mld_opdr_key, mld_statusopdr_key, mld_typeopdr_key
              INTO v_mld_key, v_opdr_key, v_opdr_status, v_mld_typeopdr_key
              FROM mld_opdr
             WHERE mld_opdr_key = rec.mld_opdr_key;

            v_errormsg := 'Fout bepalen Refnr-kenmerk.';

            SELECT k.mld_kenmerk_key
              INTO v_mld_kenmerk_key
              FROM mld_kenmerk k
             WHERE k.mld_srtkenmerk_key = c_refnr_srtkkey
                   AND k.mld_typeopdr_key = v_mld_typeopdr_key;

            v_errormsg := 'Fout bepalen Refnr-kenmerkopdracht.';

            SELECT MAX (ko.mld_kenmerkopdr_key)
              INTO v_mld_kenmerkopdr_key
              FROM mld_kenmerkopdr ko
             WHERE ko.mld_opdr_key = v_opdr_key
                   AND v_mld_kenmerk_key = ko.mld_kenmerk_key;

            IF v_mld_kenmerkopdr_key IS NULL
            THEN
               -- Kenmerk toevoegen
               v_errormsg := 'Fout toevoegen Refnr-kenmerkopdracht.';

               INSERT INTO mld_kenmerkopdr (mld_kenmerk_key,
                                            mld_opdr_key,
                                            mld_kenmerkopdr_waarde)
                   VALUES (v_mld_kenmerk_key, v_opdr_key, rec.extern_nummer);
            ELSE
               -- Kenmerk bijwerken
               v_errormsg := 'Fout bijwerken Refnr-kenmerkopdracht.';

               UPDATE mld_kenmerkopdr
                  SET mld_kenmerkopdr_waarde = rec.extern_nummer
                WHERE mld_kenmerkopdr_key = v_mld_kenmerkopdr_key;
            END IF;

            v_errormsg := 'Fout bijwerken Opmerking (opdracht).';

            v_count := LENGTH (rec.opmerking) + 5; -- Beetje speling qua lengte!

            UPDATE mld_opdr
               SET mld_opdr_opmerking =
                      DECODE (
                         mld_opdr_opmerking,
                         NULL,
                         rec.opmerking,
                            rec.opmerking
                         || CHR (13)
                         || CHR (10)
                         || SUBSTR (mld_opdr_opmerking, 1, (4000 - v_count)))
             WHERE mld_opdr_key = v_opdr_key;

            v_errormsg := 'Fout bijwerken Status.';

            IF v_opdr_status <> rec.status
            THEN
               IF rec.status = 8 AND v_opdr_status = 5
               THEN
                  -- Accepteer opdracht als de opdracht uitgegeven was
                  MLD.setopdrachtstatus (v_opdr_key, 8, c_user_key); -- Strukton
               ELSIF rec.status = 6 AND v_opdr_status = 5
               THEN
                  -- Meld de opdracht af als deze uitgegeven was
                  MLD.setopdrachtstatus (v_opdr_key, 8, c_user_key); -- Strukton, eerst accepteren
                  MLD.setopdrachtstatus (v_opdr_key, 6, c_user_key); -- Strukton
               ELSIF rec.status = 6 AND v_opdr_status = 8
               THEN
                  -- Meld de opdracht af als deze geaccepteerd was
                  MLD.setopdrachtstatus (v_opdr_key, 6, c_user_key); -- Strukton
               ELSIF rec.status = 1 AND v_opdr_status IN (5, 8)
               THEN
                  -- Wijs de opdracht af als deze niet/wel geaccepteerd was
                  MLD.setopdrachtstatus (v_opdr_key, 1, c_user_key); -- Strukton
                  MLD.updatemeldingstatusAV (v_mld_key, 0, c_user_key, 0);
               ELSIF rec.status = 9 AND v_opdr_status = 6 -- DODE TAK; er geldt nooit rec.status = 9!
               THEN
                  -- Rond de opdracht af als deze afgemeld was
                  mld.setopdrachtstatus (v_opdr_key, 9, c_user_key); -- Strukton
               END IF;

               IF rec.status = 6 AND v_opdr_status <> 6
               THEN
-- Niet meer melding bijwerken (en afmelden was ook al niet meer)!
/*
                  v_errormsg := 'Fout bijwerken Opmerking (melding).';

                  UPDATE mld_melding m
                     SET mld_melding_opmerking =
                            DECODE (
                               mld_melding_opmerking,
                               NULL,
                               rec.opmerking,
                               rec.opmerking || CHR (13) || CHR (10)
                               || SUBSTR (mld_melding_opmerking,
                                          1,
                                          (4000 - v_count)))
                   WHERE mld_melding_key = v_mld_key
                         AND mld_melding_status IN (4, 7)
                         AND NOT EXISTS
                               ( -- Afhandeling in melding niet aanpassen voor projecten
                                SELECT  sm.mld_stdmelding_key
                                   FROM mld_stdmelding sm,
                                        ins_tab_discipline td,
                                        ins_srtdiscipline sd
                                  WHERE sm.mld_stdmelding_key = m.mld_stdmelding_key
                                        AND sm.mld_ins_discipline_key = td.ins_discipline_key
                                        AND td.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                                        AND sd.ins_srtdiscipline_prefix = 'QQQ');
*/
                  -- Sinds AADO#30922 wordt de melding niet meer automatisch afgemeld.
                  MLD.updatemeldingstatusAV (v_mld_key, 0, c_user_key, 0);
               END IF;
            END IF;
         END IF;

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

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Importproces statusberichten afgebroken!');
END;
/


-- VLKC#40719: Klantspecifieke FACTUUR-import/update die vereist dat bij VLKC
--             bestelopdrachten met een 'b' (of 'B') beginnen.
CREATE OR REPLACE PROCEDURE vlkc_import_factuur (p_import_key IN NUMBER)
AS
   v_seq_of_columns VARCHAR(255);
BEGIN
   v_seq_of_columns := '1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28';
   fac_import_factuur_body(p_import_key, v_seq_of_columns);
END;
/

CREATE OR REPLACE PROCEDURE vlkc_update_factuur (p_import_key IN NUMBER)
AS
BEGIN
   UPDATE fac_imp_factuur SET ordernr = '?' || ordernr WHERE SUBSTR (ordernr, 1, 1) BETWEEN '0' AND '9';
   UPDATE fac_imp_factuur SET ordernr = SUBSTR (ordernr, 2) WHERE UPPER (SUBSTR (ordernr, 1, 1)) = 'B' AND SUBSTR (ordernr, 2, 1) BETWEEN '0' AND '9';
   fac_update_factuur (p_import_key);
END;
/



/* VLKC#57175 Rapportage Bloemen besteld voor medewerkers VLKC  */
CREATE OR REPLACE  VIEW VLKC_V_RAP_BES_BLOEMEN
(
    OPDR_KEY,
    OPDR_NR,
    OPDR_DATUM,
    NAAM_BESTELLER,
    KOSTENPLAATS_KEY,
    KOSTENPLAATS_NR,
    KOSTENPLAATS_OMSCHR,
    ARTIKEL_PRIJS_INC,
    ARTIKEL_SOORT_KEY,
    ARTIKEL_SOORT_OMSCHRIJVING,
    VOOR_MEDEWERKER_VLKC
)
AS
    SELECT beso.BES_BESTELOPDR_KEY,
           beso.BES_BESTELOPDR_ID,
           beso.BES_BESTELOPDR_DATUM,
           pers.PRS_PERSLID_VOORNAAM || ' ' || pers.PRS_PERSLID_NAAM,
           best.PRS_KOSTENPLAATS_KEY,
           kpn.PRS_KOSTENPLAATS_NR,
           kpn.PRS_KOSTENPLAATS_OMSCHRIJVING,
           besi.BES_BESTELLING_ITEM_PRIJS,
           besd.BES_SRTDEEL_NR,
           besd.bes_srtdeel_omschrijving,
           (SELECT fac_usrdata_omschr
              FROM bes_kenmerkbestell kb, fac_usrdata
             WHERE     bes_kenmerk_key = 101
                   AND fac_usrtab_key = 61
                   AND bes_kenmerkbestell_waarde = TO_CHAR (fac_usrdata_key)
                   AND kb.BES_BESTELLING_KEY = besi.BES_BESTELLING_KEY)
               voor_mdw_vl
      FROM bes_bestelopdr       beso,
           bes_bestelopdr_item  besoi,
           bes_bestelling_item  besi,
           bes_srtdeel          besd,
           bes_srtgroep         besg,
           prs_perslid          pers,
           bes_bestelling       best,
           prs_kostenplaats     kpn
     WHERE     beso.BES_BESTELOPDR_KEY = besoi.BES_BESTELOPDR_KEY
           AND besi.BES_BESTELOPDR_ITEM_KEY = besoi.BES_BESTELOPDR_ITEM_KEY
           AND besd.BES_SRTDEEL_KEY = besi.BES_SRTDEEL_KEY
           AND besg.BES_SRTGROEP_KEY = besd.BES_SRTGROEP_KEY
           AND besg.INS_DISCIPLINE_KEY = 661
           AND pers.prs_perslid_key = beso.PRS_PERSLID_KEY
           AND best.BES_BESTELLING_KEY = besi.BES_BESTELLING_KEY
           AND best.PRS_KOSTENPLAATS_KEY = kpn.PRS_KOSTENPLAATS_KEY;






/* Formatted on 17-12-2015 15:32:28 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW vlkc_v_rap_res_maand
(
   fclt_f_maand,
   kostenplaats,
   aantal,
   totaalprijs
)
AS
     SELECT TO_CHAR (res_rsv_artikel_levering, 'yyyy-mm'),
            prs_kostenplaats_nr,
            COUNT (DISTINCT res_id),
            SUM (verw_prijs)
       FROM (SELECT x.res_rsv_artikel_levering,
                    kp.prs_kostenplaats_nr,
                    kp.prs_kostenplaats_omschrijving,
                    x.res_id,
                    x.res_discipline_key,
                    x.res_rsv_artikel_key,
                    x.res_voorziening,
                    x.aantal,
                    x.stuksprijs,
                    x.verw_prijs,
                    x.prijs
               FROM (SELECT rra.res_rsv_artikel_levering,
                            rrr.res_rsv_ruimte_host_key,
                            rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr
                               res_id,
                            ra.res_discipline_key,
                            rra.res_rsv_artikel_key,
                               LTRIM (ra.res_artikel_omschrijving)
                            || ' ('
                            || COALESCE (ra.res_artikel_eenheid, '')
                            || ')'
                               res_voorziening,
                            rra.res_rsv_artikel_aantal aantal,
                            ra.res_artikel_prijs stuksprijs,
                            rra.res_rsv_artikel_prijs verw_prijs,
                            rra.res_rsv_artikel_aantal * ra.res_artikel_prijs
                               prijs
                       FROM res_rsv_ruimte rrr,
                            res_v_aanwezigrsv_artikel rra,
                            res_artikel ra
                      WHERE     rrr.alg_ruimte_key IS NULL
                            AND rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                            AND rra.res_status_bo_key = 5
                            AND rra.res_artikel_key = ra.res_artikel_key
                     UNION ALL
                     SELECT rra.res_rsv_artikel_levering,
                            rrr.res_rsv_ruimte_host_key,
                            rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr
                               resid,
                            ra.res_discipline_key,
                            rra.res_rsv_artikel_key,
                               LTRIM (ra.res_artikel_omschrijving)
                            || ' ('
                            || COALESCE (ra.res_artikel_eenheid, '')
                            || ')'
                               res_voorziening,
                            rra.res_rsv_artikel_aantal aantal,
                            ra.res_artikel_prijs stuksprijs,
                            rra.res_rsv_artikel_prijs verw_prijs,
                            rra.res_rsv_artikel_aantal * ra.res_artikel_prijs
                               prijs
                       FROM res_rsv_ruimte rrr,
                            res_v_aanwezigrsv_artikel rra,
                            res_artikel ra
                      WHERE     rrr.res_ruimte_opstel_key IS NULL
                            AND rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                            AND rra.res_status_bo_key = 5
                            AND rra.res_artikel_key = ra.res_artikel_key) x,
                    prs_perslid p,
                    prs_afdeling a,
                    prs_kostenplaats kp
              WHERE     x.res_rsv_ruimte_host_key = p.prs_perslid_key
                    AND p.prs_afdeling_key = a.prs_afdeling_key
                    AND a.prs_kostenplaats_key = kp.prs_kostenplaats_key)
   GROUP BY TO_CHAR (res_rsv_artikel_levering, 'yyyy-mm'), prs_kostenplaats_nr;

-- VLKC#35251/VLKC#39680/VLKC#39756: Kostenplaats volgens reservering (anders
--                                   gastheer) en beperken voor alleen locatie
--                                   AMS-BEET!
/* Formatted on 20-3-2017 12:26:42 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW vlkc_v_rap_cat_doorbelasting
(
   fclt_f_jaar,
   kostenplaatscode,
   kostenplaats_oms,
   jan,
   feb,
   mrt,
   apr,
   mei,
   jun,
   jul,
   aug,
   sep,
   okt,
   nov,
   dec,
   tot
)
AS
     SELECT TO_CHAR (x.res_rsv_artikel_levering, 'yyyy') jaar,
            COALESCE (x.prs_kostenplaats_nr, kp.prs_kostenplaats_nr),
            DECODE (x.prs_kostenplaats_nr, NULL, kp.prs_kostenplaats_omschrijving, x.prs_kostenplaats_omschrijving),
            SUM(DECODE (TO_CHAR (x.res_rsv_artikel_levering, 'mm'), '01', verw_prijs, 0)) jan,
            SUM(DECODE (TO_CHAR (x.res_rsv_artikel_levering, 'mm'), '02', verw_prijs, 0)) feb,
            SUM(DECODE (TO_CHAR (x.res_rsv_artikel_levering, 'mm'), '03', verw_prijs, 0)) mrt,
            SUM(DECODE (TO_CHAR (x.res_rsv_artikel_levering, 'mm'), '04', verw_prijs, 0)) apr,
            SUM(DECODE (TO_CHAR (x.res_rsv_artikel_levering, 'mm'), '05', verw_prijs, 0)) mei,
            SUM(DECODE (TO_CHAR (x.res_rsv_artikel_levering, 'mm'), '06', verw_prijs, 0)) jun,
            SUM(DECODE (TO_CHAR (x.res_rsv_artikel_levering, 'mm'), '07', verw_prijs, 0)) jul,
            SUM(DECODE (TO_CHAR (x.res_rsv_artikel_levering, 'mm'), '08', verw_prijs, 0)) aug,
            SUM(DECODE (TO_CHAR (x.res_rsv_artikel_levering, 'mm'), '09', verw_prijs, 0)) sep,
            SUM(DECODE (TO_CHAR (x.res_rsv_artikel_levering, 'mm'), '10', verw_prijs, 0)) okt,
            SUM(DECODE (TO_CHAR (x.res_rsv_artikel_levering, 'mm'), '11', verw_prijs, 0)) nov,
            SUM(DECODE (TO_CHAR (x.res_rsv_artikel_levering, 'mm'), '12', verw_prijs, 0)) dec,
            SUM (verw_prijs) tot
       FROM (SELECT rra.res_rsv_artikel_levering,
                    rrr.res_rsv_ruimte_host_key,
                    rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr res_id,
                    ra.res_discipline_key,
                    rra.res_rsv_artikel_key,
                    LTRIM (ra.res_artikel_omschrijving) || ' (' || COALESCE (ra.res_artikel_eenheid, '') || ')' res_voorziening,
                    rra.res_rsv_artikel_aantal aantal,
                    ra.res_artikel_prijs stuksprijs,
                    rra.res_rsv_artikel_prijs verw_prijs,
                    rra.res_rsv_artikel_aantal * ra.res_artikel_prijs prijs,
                    l.alg_locatie_key,
                    kp.prs_kostenplaats_nr,
                    kp.prs_kostenplaats_omschrijving
               FROM res_rsv_ruimte rrr,
                    res_v_aanwezigrsv_artikel rra,
                    res_artikel ra,
                    res_ruimte_opstelling rro,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_v_aanwezigalg_ruimte
                     GROUP BY res_ruimte_key) rar,
                    alg_v_onrgoed_boom aob,
                    alg_locatie l,
                    prs_kostenplaats kp
              WHERE rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                    AND rra.res_status_bo_key = 5
                    AND rra.res_artikel_key = ra.res_artikel_key
                    AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)
                    AND rro.res_ruimte_key = rar.res_ruimte_key(+)
                    AND COALESCE (rrr.alg_ruimte_key, rar.alg_ruimte_key) = aob.alg_ruimte_key
                    AND aob.alg_locatie_key = l.alg_locatie_key
                    AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)) x,
            prs_perslid p,
            prs_afdeling a,
            prs_kostenplaats kp
      WHERE x.res_rsv_artikel_levering > TRUNC (ADD_MONTHS (SYSDATE, -12), 'yyyy')
            AND x.res_rsv_ruimte_host_key = p.prs_perslid_key
            AND p.prs_afdeling_key = a.prs_afdeling_key
            AND a.prs_kostenplaats_key = kp.prs_kostenplaats_key
            AND x.alg_locatie_key = 1                -- AMS-BEET (Kempen & Co)
   GROUP BY TO_CHAR (x.res_rsv_artikel_levering, 'yyyy'),
            COALESCE (x.prs_kostenplaats_nr, kp.prs_kostenplaats_nr),
            DECODE (x.prs_kostenplaats_nr, NULL, kp.prs_kostenplaats_omschrijving, x.prs_kostenplaats_omschrijving);

-- VLKC#39680: Nieuwe variant voor alle locaties van Van Lanschot (en Kempen)!
CREATE OR REPLACE VIEW vlkc_v_rap_cat_doorbelasting2
(
   fclt_f_maand,
   kostenplaatscode,
   kostenplaats_oms,
   fclt_f_locatie,
   tot
)
AS
     SELECT TO_CHAR (x.res_rsv_artikel_levering, 'yyyy-mm') maand,
            COALESCE (x.prs_kostenplaats_nr, kp.prs_kostenplaats_nr),
            DECODE (x.prs_kostenplaats_nr, NULL, kp.prs_kostenplaats_omschrijving, x.prs_kostenplaats_omschrijving),
            x.alg_locatie_omschrijving,
            SUM (verw_prijs) tot
       FROM (SELECT rra.res_rsv_artikel_levering,
                    rrr.res_rsv_ruimte_host_key,
                    rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr res_id,
                    ra.res_discipline_key,
                    rra.res_rsv_artikel_key,
                    LTRIM (ra.res_artikel_omschrijving) || ' (' || COALESCE (ra.res_artikel_eenheid, '') || ')' res_voorziening,
                    rra.res_rsv_artikel_aantal aantal,
                    ra.res_artikel_prijs stuksprijs,
                    rra.res_rsv_artikel_prijs verw_prijs,
                    rra.res_rsv_artikel_aantal * ra.res_artikel_prijs prijs,
                    l.alg_locatie_key,
                    l.alg_locatie_omschrijving,
                    kp.prs_kostenplaats_nr,
                    kp.prs_kostenplaats_omschrijving
               FROM res_rsv_ruimte rrr,
                    res_v_aanwezigrsv_artikel rra,
                    res_artikel ra,
                    res_ruimte_opstelling rro,
                    (  SELECT res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                         FROM res_v_aanwezigalg_ruimte
                     GROUP BY res_ruimte_key) rar,
                    alg_v_onrgoed_boom aob,
                    alg_locatie l,
                    prs_kostenplaats kp
              WHERE rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                    AND rra.res_status_bo_key = 5
                    AND rra.res_artikel_key = ra.res_artikel_key
                    AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)
                    AND rro.res_ruimte_key = rar.res_ruimte_key(+)
                    AND COALESCE (rrr.alg_ruimte_key, rar.alg_ruimte_key) = aob.alg_ruimte_key
                    AND aob.alg_locatie_key = l.alg_locatie_key
                    AND rrr.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)) x,
            prs_perslid p,
            prs_afdeling a,
            prs_kostenplaats kp
      WHERE x.res_rsv_artikel_levering > TRUNC (ADD_MONTHS (SYSDATE, -12), 'yyyy')
            AND x.res_rsv_ruimte_host_key = p.prs_perslid_key
            AND p.prs_afdeling_key = a.prs_afdeling_key
            AND a.prs_kostenplaats_key = kp.prs_kostenplaats_key
   GROUP BY TO_CHAR (x.res_rsv_artikel_levering, 'yyyy-mm'),
            COALESCE (x.prs_kostenplaats_nr, kp.prs_kostenplaats_nr),
            DECODE (x.prs_kostenplaats_nr, NULL, kp.prs_kostenplaats_omschrijving, x.prs_kostenplaats_omschrijving),
            x.alg_locatie_omschrijving;

-- VLKC#35252
CREATE OR REPLACE VIEW vlkc_v_rap_bez_aanmelding
(
   afspraakdatum,
   afspraaknr,
   fclt_f_contactpersoon,
   fclt_f_gastheer,
   bezoeker,
   opmerking,
   fclt_f_door,
   locatie
)
AS
   SELECT x.bez_afspraak_datum,
          TO_CHAR (x.bez_afspraak_key),
          x.contactpersoon,
          x.gastheer,
          x.bez_afspraak_naam,
          x.bez_afspraak_opmerking,
          DECODE (gg.prs_perslid_key, NULL, 'Eindgebruiker', 'Receptie'),
          l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'
     FROM (SELECT a.bez_afspraak_datum,
                  a.bez_afspraak_key,
                  a.bez_afspraak_opmerking,
                  b.bez_afspraak_naam,
                  pc.prs_perslid_naam_full contactpersoon,
                  ph.prs_perslid_naam_full gastheer,
                  t.prs_perslid_key,
                  a.alg_locatie_key
             FROM bez_afspraak a,
                  bez_bezoekers b,
                  prs_v_perslid_fullnames_all pc,
                  prs_v_perslid_fullnames_all ph,
                  fac_tracking t
            WHERE     a.bez_afspraak_key = b.bez_afspraak_key
                  AND a.bez_afspraak_contact_key = pc.prs_perslid_key
                  AND a.bez_afspraak_host_key = ph.prs_perslid_key
                  AND a.bez_afspraak_key = t.fac_tracking_refkey
                  AND t.fac_srtnotificatie_key = 26) x               -- BEZMUT
          LEFT JOIN (  SELECT bez_afspraak_key, COUNT ( * ) aantal
                         FROM bez_bezoekers
                     GROUP BY bez_afspraak_key) b
             ON x.bez_afspraak_key = b.bez_afspraak_key
          LEFT JOIN fac_gebruikersgroep gg                      -- 43=Receptie
             ON x.prs_perslid_key = gg.prs_perslid_key
                AND gg.fac_groep_key = 43
          LEFT JOIN alg_locatie l
             ON x.alg_locatie_key = l.alg_locatie_key;

-- VLKC#35749
/* Formatted on 18-7-2016 18:35:25 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW vlkc_v_rap_res_cateringrest
(
   hide_f_volgorde,
   fclt_x_lijst,
   ruimte,
   datum,
   van,
   tot,
   resnr,
   pers,
   voorzieningen_opstelling,
   opmerking_catering,
   omschrijving,
   aanvrager,
   gastheer,
   res_rsv_ruimte_key
)
AS
   SELECT    TO_CHAR (rrr.res_rsv_ruimte_van, 'yymmddhh24miss')
          || TO_CHAR (rrr.res_rsv_ruimte_tot, 'yymmddhh24miss')
          || TO_CHAR (rrr.res_rsv_ruimte_key)
          || x.res_type,
          'Cateringlijst L17 + Café',
          COALESCE (alg_ruimte_geg.alg_ruimte_aanduiding, res_ruimte_geg.res_ruimte_nr),
          x.res_reservering_van,
          x.res_reservering_van,
          x.res_reservering_tot,
          rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr,
          TO_CHAR (rrr.res_rsv_ruimte_bezoekers),
          COALESCE (x.res_voorziening, res_ruimte_geg.res_opstelling_omschrijving),
          kr.res_kenmerkreservering_waarde,
          rrr.res_rsv_ruimte_omschrijving,
          pa.prs_perslid_naam_full,
          pg.prs_perslid_naam_full,
          rrr.res_rsv_ruimte_key
     FROM (SELECT '1R' res_type,
                  rrr.res_rsv_ruimte_key,
                  rrr.res_rsv_ruimte_van res_reservering_van,
                  rrr.res_rsv_ruimte_tot res_reservering_tot,
                  --TO_NUMBER (NULL) aantal,
                  NULL res_voorziening,
                  NULL res_discipline_key,
                  rrr.res_status_bo_key
             FROM res_v_aanwezigrsv_ruimte rrr
            WHERE rrr.alg_ruimte_key IS NULL
                  AND rrr.res_rsv_ruimte_tot BETWEEN TRUNC (SYSDATE) AND TRUNC (SYSDATE + 15)
                  --AND EXISTS
                  --      (SELECT 1
                  --         FROM res_v_aanwezigrsv_artikel rra, res_artikel ra
                  --        WHERE rra.res_artikel_key = ra.res_artikel_key
                  --              AND ra.res_discipline_key IN (41, 44, 45)
                  --              AND rra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key)
           UNION ALL
           SELECT '3C' res_type,
                  rra.res_rsv_ruimte_key,
                  rra.res_rsv_artikel_levering res_reservering_van,
                  NULL res_reservering_tot,
                  --rra.res_rsv_artikel_aantal aantal aantal,
                  TO_CHAR (rra.res_rsv_artikel_aantal)
                  || ' * '
                  || LTRIM (ra.res_artikel_omschrijving)
                  || ' ('
                  || COALESCE (ra.res_artikel_eenheid, '')
                  || ')'
                     res_voorziening,
                  ra.res_discipline_key,
                  rra.res_status_bo_key
             FROM res_v_aanwezigrsv_artikel rra, res_artikel ra
            WHERE rra.res_artikel_key = ra.res_artikel_key
                  AND ra.res_discipline_key IN (41, 44, 45)
                  AND rra.res_rsv_artikel_levering BETWEEN TRUNC (SYSDATE) AND TRUNC (SYSDATE + 15)) x,
          res_v_aanwezigrsv_ruimte rrr,
          prs_v_perslid_fullnames_all pa,
          prs_v_perslid_fullnames_all pg,
          alg_v_ruimte_gegevens_all alg_ruimte_geg,
          (SELECT rro.res_ruimte_opstel_key,
                  rro.res_ruimte_opstel_default,
                  rr.res_discipline_key,
                  rr.res_ruimte_nr,
                  ro.res_opstelling_omschrijving
             FROM res_ruimte_opstelling rro, res_ruimte rr, res_opstelling ro
            WHERE rro.res_ruimte_key = rr.res_ruimte_key
                  AND rro.res_opstelling_key = ro.res_opstelling_key)
          res_ruimte_geg,
          (SELECT *
             FROM res_v_aanwezigkenmerkwaarde kr, res_kenmerk k
            WHERE kr.res_kenmerk_key = k.res_kenmerk_key
                  AND k.res_srtkenmerk_key = 1) kr       -- Opmerking Catering
    WHERE     x.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
          AND rrr.res_rsv_ruimte_contact_key = pa.prs_perslid_key
          AND rrr.res_rsv_ruimte_host_key = pg.prs_perslid_key
          AND rrr.alg_ruimte_key = alg_ruimte_geg.alg_ruimte_key(+)
          AND rrr.res_ruimte_opstel_key = res_ruimte_geg.res_ruimte_opstel_key(+)
          AND rrr.res_rsv_ruimte_key = kr.res_rsv_ruimte_key(+)
          AND res_ruimte_geg.res_discipline_key IN (21, 22, 23, 24)
   UNION ALL
   SELECT    TO_CHAR (rrr.res_rsv_ruimte_van, 'yymmddhh24miss')
          || TO_CHAR (rrr.res_rsv_ruimte_tot, 'yymmddhh24miss')
          || TO_CHAR (rrr.res_rsv_ruimte_key)
          || x.res_type,
          'Cateringlijst L4 + L15',
          COALESCE (alg_ruimte_geg.alg_ruimte_aanduiding, res_ruimte_geg.res_ruimte_nr),
          x.res_reservering_van,
          x.res_reservering_van,
          x.res_reservering_tot,
          rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr,
          TO_CHAR (rrr.res_rsv_ruimte_bezoekers),
          COALESCE (x.res_voorziening, res_ruimte_geg.res_opstelling_omschrijving),
          kr.res_kenmerkreservering_waarde,
          rrr.res_rsv_ruimte_omschrijving,
          pa.prs_perslid_naam_full,
          pg.prs_perslid_naam_full,
          rrr.res_rsv_ruimte_key
     FROM (SELECT '1R' res_type,
                  rrr.res_rsv_ruimte_key,
                  rrr.res_rsv_ruimte_van res_reservering_van,
                  rrr.res_rsv_ruimte_tot res_reservering_tot,
                  --TO_NUMBER (NULL) aantal,
                  NULL res_voorziening,
                  NULL res_discipline_key,
                  rrr.res_status_bo_key
             FROM res_v_aanwezigrsv_ruimte rrr
            WHERE rrr.alg_ruimte_key IS NULL
                  AND rrr.res_rsv_ruimte_tot BETWEEN TRUNC (SYSDATE) AND TRUNC (SYSDATE + 15)
                  --AND EXISTS
                  --      (SELECT 1
                  --         FROM res_v_aanwezigrsv_artikel rra, res_artikel ra
                  --        WHERE rra.res_artikel_key = ra.res_artikel_key
                  --              AND ra.res_discipline_key IN (42, 45)
                  --              AND rra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key)
           UNION ALL
           SELECT '3C' res_type,
                  rra.res_rsv_ruimte_key,
                  rra.res_rsv_artikel_levering res_reservering_van,
                  NULL res_reservering_tot,
                  --rra.res_rsv_artikel_aantal aantal,
                  TO_CHAR (rra.res_rsv_artikel_aantal)
                  || ' * '
                  || LTRIM (ra.res_artikel_omschrijving)
                  || ' ('
                  || COALESCE (ra.res_artikel_eenheid, '')
                  || ')'
                     res_voorziening,
                  ra.res_discipline_key,
                  rra.res_status_bo_key
             FROM res_v_aanwezigrsv_artikel rra, res_artikel ra
            WHERE rra.res_artikel_key = ra.res_artikel_key
                  AND ra.res_discipline_key IN (42, 45)
                  AND rra.res_rsv_artikel_levering BETWEEN TRUNC (SYSDATE) AND TRUNC (SYSDATE + 15)) x,
          res_v_aanwezigrsv_ruimte rrr,
          prs_v_perslid_fullnames_all pa,
          prs_v_perslid_fullnames_all pg,
          alg_v_ruimte_gegevens_all alg_ruimte_geg,
          (SELECT rro.res_ruimte_opstel_key,
                  rro.res_ruimte_opstel_default,
                  rr.res_discipline_key,
                  rr.res_ruimte_nr,
                  ro.res_opstelling_omschrijving
             FROM res_ruimte_opstelling rro, res_ruimte rr, res_opstelling ro
            WHERE rro.res_ruimte_key = rr.res_ruimte_key
                  AND rro.res_opstelling_key = ro.res_opstelling_key)
          res_ruimte_geg,
          (SELECT *
             FROM res_v_aanwezigkenmerkwaarde kr, res_kenmerk k
            WHERE kr.res_kenmerk_key = k.res_kenmerk_key
                  AND k.res_srtkenmerk_key = 1) kr       -- Opmerking Catering
    WHERE     x.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
          AND rrr.res_rsv_ruimte_contact_key = pa.prs_perslid_key
          AND rrr.res_rsv_ruimte_host_key = pg.prs_perslid_key
          AND rrr.alg_ruimte_key = alg_ruimte_geg.alg_ruimte_key(+)
          AND rrr.res_ruimte_opstel_key = res_ruimte_geg.res_ruimte_opstel_key(+)
          AND rrr.res_rsv_ruimte_key = kr.res_rsv_ruimte_key(+)
          AND res_ruimte_geg.res_discipline_key IN (22, 26, 27, 121)
   UNION ALL
   SELECT    TO_CHAR (rrr.res_rsv_ruimte_van, 'yymmddhh24miss')
          || TO_CHAR (rrr.res_rsv_ruimte_tot, 'yymmddhh24miss')
          || TO_CHAR (rrr.res_rsv_ruimte_key)
          || x.res_type,
          'Restaurantlijst',
          COALESCE (alg_ruimte_geg.alg_ruimte_aanduiding, res_ruimte_geg.res_ruimte_nr),
          x.res_reservering_van,
          x.res_reservering_van,
          x.res_reservering_tot,
          rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr,
          TO_CHAR (rrr.res_rsv_ruimte_bezoekers),
          COALESCE (x.res_voorziening, res_ruimte_geg.res_opstelling_omschrijving),
          kr.res_kenmerkreservering_waarde,
          rrr.res_rsv_ruimte_omschrijving,
          pa.prs_perslid_naam_full,
          pg.prs_perslid_naam_full,
          rrr.res_rsv_ruimte_key
     FROM (SELECT '1R' res_type,
                  rrr.res_rsv_ruimte_key,
                  rrr.res_rsv_ruimte_van res_reservering_van,
                  rrr.res_rsv_ruimte_tot res_reservering_tot,
                  --TO_NUMBER (NULL) aantal,
                  NULL res_voorziening,
                  NULL res_discipline_key,
                  rrr.res_status_bo_key
             FROM res_v_aanwezigrsv_ruimte rrr
            WHERE rrr.alg_ruimte_key IS NULL
                  AND rrr.res_rsv_ruimte_tot BETWEEN TRUNC (SYSDATE) AND TRUNC (SYSDATE + 15)
                  AND EXISTS
                        (SELECT 1
                           FROM res_v_aanwezigrsv_artikel rra, res_artikel ra
                          WHERE rra.res_artikel_key = ra.res_artikel_key
                                AND ra.res_artikel_key IN
                                         (1,
                                          2,
                                          3,
                                          4,
                                          6,
                                          12,
                                          13,
                                          14,
                                          15,
                                          16,
                                          24,
                                          28,
                                          29,
                                          30,
                                          31,
                                          32,
                                          44,
                                          61,
                                          123,
                                          142,
                                          244,
                                          261,
                                          263,
                                          264,
                                          265,
                                          268,
                                          269,
                                          281,
                                          282,
                                          284)
                                AND rra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key)
           UNION ALL
           SELECT '3C' res_type,
                  rra.res_rsv_ruimte_key,
                  rra.res_rsv_artikel_levering res_reservering_van,
                  NULL res_reservering_tot,
                  --rra.res_rsv_artikel_aantal aantal,
                  TO_CHAR (rra.res_rsv_artikel_aantal)
                  || ' * '
                  || LTRIM (ra.res_artikel_omschrijving)
                  || ' ('
                  || COALESCE (ra.res_artikel_eenheid, '')
                  || ')'
                     res_voorziening,
                  ra.res_discipline_key,
                  rra.res_status_bo_key
             FROM res_v_aanwezigrsv_artikel rra, res_artikel ra
            WHERE rra.res_artikel_key = ra.res_artikel_key
                  AND ra.res_artikel_key IN
                           (1,
                            2,
                            3,
                            4,
                            6,
                            12,
                            13,
                            14,
                            15,
                            16,
                            24,
                            28,
                            29,
                            30,
                            31,
                            32,
                            44,
                            61,
                            123,
                            142,
                            244,
                            261,
                            263,
                            264,
                            265,
                            268,
                            269,
                            281,
                            282,
                            284)
                  AND rra.res_rsv_artikel_levering BETWEEN TRUNC (SYSDATE) AND TRUNC (SYSDATE + 15)) x,
          res_v_aanwezigrsv_ruimte rrr,
          prs_v_perslid_fullnames_all pa,
          prs_v_perslid_fullnames_all pg,
          alg_v_ruimte_gegevens_all alg_ruimte_geg,
          (SELECT rro.res_ruimte_opstel_key,
                  rro.res_ruimte_opstel_default,
                  rr.res_discipline_key,
                  rr.res_ruimte_nr,
                  ro.res_opstelling_omschrijving
             FROM res_ruimte_opstelling rro, res_ruimte rr, res_opstelling ro
            WHERE rro.res_ruimte_key = rr.res_ruimte_key
                  AND rro.res_opstelling_key = ro.res_opstelling_key)
          res_ruimte_geg,
          (SELECT *
             FROM res_v_aanwezigkenmerkwaarde kr, res_kenmerk K
            WHERE kr.res_kenmerk_key = k.res_kenmerk_key
                  AND k.res_srtkenmerk_key = 1) kr       -- Opmerking Catering
    WHERE     x.res_status_bo_key = 2                         -- Geregistreerd
          AND x.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
          AND rrr.res_rsv_ruimte_contact_key = pa.prs_perslid_key
          AND rrr.res_rsv_ruimte_host_key = pg.prs_perslid_key
          AND rrr.alg_ruimte_key = alg_ruimte_geg.alg_ruimte_key(+)
          AND rrr.res_ruimte_opstel_key = res_ruimte_geg.res_ruimte_opstel_key(+)
          AND rrr.res_rsv_ruimte_key = kr.res_rsv_ruimte_key(+);

--VLKC#52091 per februari 2018: locatie toegevoegd, per april 2018: uitbreiding reserveringstypen/catalogi
/* Formatted on 21-4-2016 15:48:12 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW vlkc_v_rap_res_huismeesters
(
   hide_f_volgorde,
   ruimte,
   locatie,
   datum,
   van,
   tot,
   resnr,
   pers,
   voorzieningen_opstelling,
   opmerking_huismeester,
   omschrijving,
   aanvrager,
   gastheer,
   res_rsv_ruimte_key
)
AS
   SELECT    TO_CHAR (rrr.res_rsv_ruimte_van, 'yymmddhh24miss')
          || TO_CHAR (rrr.res_rsv_ruimte_tot, 'yymmddhh24miss')
          || TO_CHAR (rrr.res_rsv_ruimte_key)
          || x.res_type,
          COALESCE (alg_ruimte_geg.alg_ruimte_aanduiding,
                    res_ruimte_geg.res_ruimte_nr),
          (SELECT MIN (ALG_LOCATIE.ALG_LOCATIE_CODE)
             FROM ALG_LOCATIE,
                  ALG_GEBOUW,
                  ALG_VERDIEPING,
                  ALG_RUIMTE,
                  RES_ALG_RUIMTE,
                  RES_RUIMTE_OPSTELLING,
                  RES_RSV_RUIMTE
            WHERE ALG_LOCATIE.ALG_LOCATIE_KEY = ALG_GEBOUW.ALG_LOCATIE_KEY
                  AND ALG_GEBOUW.ALG_GEBOUW_KEY =
                        ALG_VERDIEPING.ALG_GEBOUW_KEY
                  AND ALG_VERDIEPING.ALG_VERDIEPING_KEY =
                        ALG_RUIMTE.ALG_VERDIEPING_KEY
                  AND ALG_RUIMTE.ALG_RUIMTE_KEY =
                        RES_ALG_RUIMTE.ALG_RUIMTE_KEY
                  AND RES_ALG_RUIMTE.RES_RUIMTE_KEY =
                        RES_RUIMTE_OPSTELLING.RES_RUIMTE_KEY
                  AND RES_RUIMTE_OPSTELLING.RES_RUIMTE_OPSTEL_KEY =
                        RES_RSV_RUIMTE.RES_RUIMTE_OPSTEL_KEY
                  AND RES_RSV_RUIMTE.RES_RSV_RUIMTE_KEY =
                        X.RES_RSV_RUIMTE_Key)
             LOCATIE,
          x.res_reservering_van,
          x.res_reservering_van,
          x.res_reservering_tot,
          rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr,
          TO_CHAR (rrr.res_rsv_ruimte_bezoekers),
          COALESCE (x.res_voorziening,
                    res_ruimte_geg.res_opstelling_omschrijving),
          kr.res_kenmerkreservering_waarde,
          rrr.res_rsv_ruimte_omschrijving,
          pa.prs_perslid_naam_full,
          pg.prs_perslid_naam_full,
          rrr.res_rsv_ruimte_key
     FROM (SELECT '1R' res_type,
                  rrr.res_rsv_ruimte_key,
                  rrr.res_rsv_ruimte_van res_reservering_van,
                  rrr.res_rsv_ruimte_tot res_reservering_tot,
                  TO_NUMBER (NULL) aantal,
                  NULL res_voorziening,
                  NULL res_discipline_key,
                  rrr.res_status_bo_key
             FROM res_v_aanwezigrsv_ruimte rrr
            WHERE rrr.alg_ruimte_key IS NULL
                  AND rrr.res_rsv_ruimte_tot BETWEEN TRUNC (SYSDATE)
                                                 AND  TRUNC (SYSDATE + 15)
                  AND (EXISTS
                          (SELECT 1
                             FROM res_v_aanwezigkenmerkwaarde kr,
                                  res_kenmerk k
                            WHERE kr.res_kenmerk_key = k.res_kenmerk_key
                                  AND k.res_srtkenmerk_key = 2 -- Opmerking Huismeester
                                  AND kr.res_rsv_ruimte_key =
                                        rrr.res_rsv_ruimte_key)
                       OR EXISTS
                            (SELECT 1
                               FROM res_v_aanwezigrsv_deel rrd, res_deel rd
                              WHERE rrd.res_deel_key = rd.res_deel_key
                                    AND rd.res_discipline_key IN (49, 50, 51, 212, 361, 362)
                                    AND rrd.res_rsv_ruimte_key =
                                          rrr.res_rsv_ruimte_key)
                       OR EXISTS
                            (SELECT 1
                               FROM res_v_aanwezigrsv_artikel rra,
                                    res_artikel ra
                              WHERE rra.res_artikel_key = ra.res_artikel_key
                                    AND ra.res_discipline_key IN (46, 81)
                                    AND rra.res_rsv_ruimte_key =
                                          rrr.res_rsv_ruimte_key)
                       OR EXISTS
                            (SELECT 1
                               FROM res_ruimte_opstelling rro, res_ruimte rru
                              WHERE rro.res_ruimte_opstel_key = rrr.res_ruimte_opstel_key
                             AND rru.res_ruimte_key = rro.res_ruimte_key
                             AND rru.res_discipline_key IN (121)))
           UNION ALL
           SELECT '2V' res_type,
                  rrd.res_rsv_ruimte_key,
                  rrd.res_rsv_deel_van res_reservering_van,
                  rrd.res_rsv_deel_tot res_reservering_tot,
                  TO_NUMBER (NULL) aantal,
                     d.ins_deel_omschrijving
                  || ' ('
                  || COALESCE (rd.res_deel_eenheid, '')
                  || ')'
                     res_voorziening,
                  rd.res_discipline_key,
                  rrd.res_status_bo_key
             FROM res_v_aanwezigrsv_deel rrd, res_deel rd, ins_deel d
            WHERE     rrd.res_deel_key = rd.res_deel_key
                  AND rd.res_ins_deel_key = d.ins_deel_key
                  AND rd.res_discipline_key IN (49, 50, 51, 212, 361, 362)
                  AND rrd.res_rsv_deel_tot BETWEEN TRUNC (SYSDATE)
                                               AND  TRUNC (SYSDATE + 15)
           UNION ALL
           SELECT '3C' res_type,
                  rra.res_rsv_ruimte_key,
                  rra.res_rsv_artikel_levering res_reservering_van,
                  NULL res_reservering_tot,
                  rra.res_rsv_artikel_aantal aantal,
                     LTRIM (ra.res_artikel_omschrijving)
                  || ' ('
                  || COALESCE (ra.res_artikel_eenheid, '')
                  || ')'
                     res_voorziening,
                  ra.res_discipline_key,
                  rra.res_status_bo_key
             FROM res_v_aanwezigrsv_artikel rra, res_artikel ra
            WHERE rra.res_artikel_key = ra.res_artikel_key
                  AND ra.res_discipline_key IN (46, 81)
                  AND rra.res_rsv_artikel_levering BETWEEN TRUNC (SYSDATE)
                                                       AND  TRUNC (
                                                               SYSDATE + 15))
          x,
          res_v_aanwezigrsv_ruimte rrr,
          prs_v_perslid_fullnames_all pa,
          prs_v_perslid_fullnames_all pg,
          alg_v_ruimte_gegevens_all alg_ruimte_geg,
          (SELECT rro.res_ruimte_opstel_key,
                  rro.res_ruimte_opstel_default,
                  rr.res_discipline_key,
                  rr.res_ruimte_nr,
                  ro.res_opstelling_omschrijving
             FROM res_ruimte_opstelling rro, res_ruimte rr, res_opstelling ro
            WHERE rro.res_ruimte_key = rr.res_ruimte_key
                  AND rro.res_opstelling_key = ro.res_opstelling_key)
          res_ruimte_geg,
          (SELECT *
             FROM res_v_aanwezigkenmerkwaarde kr, res_kenmerk k
            WHERE kr.res_kenmerk_key = k.res_kenmerk_key
                  AND k.res_srtkenmerk_key = 2) kr    -- Opmerking Huismeester
    WHERE     x.res_status_bo_key = 2                         -- Geregistreerd
          AND x.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
          AND rrr.res_rsv_ruimte_contact_key = pa.prs_perslid_key
          AND rrr.res_rsv_ruimte_host_key = pg.prs_perslid_key
          AND rrr.alg_ruimte_key = alg_ruimte_geg.alg_ruimte_key(+)
          AND rrr.res_ruimte_opstel_key =
                res_ruimte_geg.res_ruimte_opstel_key(+)
          AND rrr.res_rsv_ruimte_key = kr.res_rsv_ruimte_key(+);


-- Zonder R van BROC (in de R geeft 'vlkc_v_rap_cat_doorbelasting' inzicht)!
-- VLKC#41246: Per 2018 facturen op variabele contracten (= CV) verwerken.
-- VLKC#55659: Om contracten te kunnen sluiten, voortaan Akkoord-facturen op
--             alle contracten (CV+CF) verwerken.
--             NB. Via een eenmalig script is dat voor alle Akkoord-facturen
--             t/m 2018 gedaan (én bewust zonder tracking)!
/* Formatted on 20-1-2017 10:15:45 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW vlkc_v_coda_actual
(
   bedrijf_key,
   factuur_key,
   bes_opdr_key,
   mld_opdr_key,
   cnt_key,
   kostensoort,                                                  -- Van groep!
   doorbelasten,
   kostenplaats,                              -- Kostenplaats bij verplichting
   kosten
)
AS                                                 -- Op basis van B-facturen!
     SELECT bo.prs_bedrijf_key bedrijf_key,
            f.fin_factuur_key factuur_key,
            f.bes_bestelopdr_key bes_opdr_key,
            NULL mld_opdr_key,
            NULL cnt_key,
            x.prs_kostensoortgrp_altcode kostensoort,
            COALESCE (x.prs_kostensoort_doorbelasten, 0) doorbelasten,
            x.prs_kostenplaats_nr,
            SUM(DECODE (x.prs_kostensoort_btw,
                        1, f.fin_factuur_totaal + f.fin_factuur_totaal_btw,
                        f.fin_factuur_totaal))
               kosten
       FROM fin_factuur f,
            bes_bestelopdr bo,
            (SELECT DISTINCT boi.bes_bestelopdr_key,
                             ksg.prs_kostensoortgrp_altcode,
                             ks.prs_kostensoort_doorbelasten,
                             ks.prs_kostensoort_btw,
                             kp.prs_kostenplaats_nr
               FROM bes_bestelopdr_item boi,
                    bes_bestelling_item bi,
                    bes_srtdeel sd,
                    bes_srtgroep sg,
                    ins_tab_discipline td,
                    prs_kostensoort ks,
                    prs_kostensoortgrp ksg,
                    bes_bestelling b,
                    prs_kostenplaats kp
              WHERE boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
                    AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
                    AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
                    AND sg.ins_discipline_key = td.ins_discipline_key
                    AND td.prs_kostensoort_key = ks.prs_kostensoort_key(+)
                    AND ks.prs_kostensoortgrp_key = ksg.prs_kostensoortgrp_key(+)
                    AND bi.bes_bestelling_key = b.bes_bestelling_key
                    AND b.prs_kostenplaats_key = kp.prs_kostenplaats_key) x
      WHERE f.fin_factuur_verwijder IS NULL AND f.fin_factuur_statuses_key = 6 -- Akkoord
            AND fac.gettrackingdate ('FINFOK', f.fin_factuur_key) < TRUNC (SYSDATE)
            AND f.bes_bestelopdr_key = bo.bes_bestelopdr_key
            AND bo.bes_bestelopdr_key = x.bes_bestelopdr_key
   GROUP BY bo.prs_bedrijf_key,
            f.fin_factuur_key,
            f.bes_bestelopdr_key,
            NULL,
            NULL,
            x.prs_kostensoortgrp_altcode,
            COALESCE (x.prs_kostensoort_doorbelasten, 0),
            x.prs_kostenplaats_nr
   UNION ALL                                       -- Op basis van O-facturen!
     SELECT b.prs_bedrijf_key bedrijf_key,
            f.fin_factuur_key factuur_key,
            NULL bes_opdr_key,
            f.mld_opdr_key mld_opdr_key,
            NULL cnt_key,
            COALESCE (ksgm.prs_kostensoortgrp_altcode, ksgv.prs_kostensoortgrp_altcode, NULL)
               kostensoort,
            COALESCE (ksm.prs_kostensoort_doorbelasten, ksv.prs_kostensoort_doorbelasten, 0)
               doorbelasten,
            kp.prs_kostenplaats_nr,
            SUM(DECODE (
                   ksm.prs_kostensoort_doorbelasten,
                   1,
                   DECODE (ksm.prs_kostensoort_btw,
                           1, f.fin_factuur_totaal + f.fin_factuur_totaal_btw,
                           f.fin_factuur_totaal),
                   DECODE (ksv.prs_kostensoort_btw,
                           1, f.fin_factuur_totaal + f.fin_factuur_totaal_btw,
                           f.fin_factuur_totaal)))
               kosten
       FROM fin_factuur f,
            mld_opdr o,
            mld_melding m,
            mld_stdmelding sm,
            ins_tab_discipline td,
            prs_kostensoort ksm,
            prs_kostensoortgrp ksgm,
            prs_kostensoort ksv,
            prs_kostensoortgrp ksgv,
            prs_kostenplaats kp,
            prs_bedrijf b
      WHERE f.fin_factuur_verwijder IS NULL
            AND f.fin_factuur_statuses_key = 6                      -- Akkoord
            AND fac.gettrackingdate ('FINFOK', f.fin_factuur_key) < TRUNC (SYSDATE)
            AND f.mld_opdr_key = o.mld_opdr_key
            AND o.mld_melding_key = m.mld_melding_key
            AND m.mld_stdmelding_key = sm.mld_stdmelding_key
            AND sm.prs_kostensoort_key = ksm.prs_kostensoort_key(+)
            AND ksm.prs_kostensoortgrp_key = ksgm.prs_kostensoortgrp_key(+)
            AND sm.mld_ins_discipline_key = td.ins_discipline_key
            AND td.prs_kostensoort_key = ksv.prs_kostensoort_key(+)
            AND ksv.prs_kostensoortgrp_key = ksgv.prs_kostensoortgrp_key(+)
            AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key
            AND o.mld_uitvoerende_keys = b.prs_bedrijf_key
   GROUP BY b.prs_bedrijf_key,
            f.fin_factuur_key,
            NULL,
            f.mld_opdr_key,
            NULL,
            COALESCE (ksgm.prs_kostensoortgrp_altcode, ksgv.prs_kostensoortgrp_altcode, NULL),
            COALESCE (ksm.prs_kostensoort_doorbelasten, ksv.prs_kostensoort_doorbelasten, 0),
            kp.prs_kostenplaats_nr
   UNION ALL            -- Op basis van C-facturen op alle contracten (CV+CF)!
     SELECT c.cnt_prs_bedrijf_key bedrijf_key,
            f.fin_factuur_key factuur_key,
            NULL bes_opdr_key,
            NULL mld_opdr_key,
            f.cnt_contract_key cnt_key,
            COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL)
               kostensoort,
            COALESCE (ksc.prs_kostensoort_doorbelasten, ksd.prs_kostensoort_doorbelasten, 0)
               doorbelasten,
            kp.prs_kostenplaats_nr,
            SUM(DECODE (
                   ksc.prs_kostensoort_doorbelasten,
                   1,
                   DECODE (ksc.prs_kostensoort_btw,
                           1, f.fin_factuur_totaal + f.fin_factuur_totaal_btw,
                           f.fin_factuur_totaal),
                   DECODE (ksd.prs_kostensoort_btw,
                           1, f.fin_factuur_totaal + f.fin_factuur_totaal_btw,
                           f.fin_factuur_totaal)))
               kosten
       FROM fin_factuur f,
            cnt_v_aanwezigcontract c,
            prs_kostensoort ksc,
            prs_kostensoortgrp ksgc,
            ins_tab_discipline td,
            prs_kostensoort ksd,
            prs_kostensoortgrp ksgd,
            prs_kostenplaats kp
      WHERE f.fin_factuur_verwijder IS NULL
            AND f.fin_factuur_statuses_key = 6                      -- Akkoord
            AND fac.gettrackingdate ('FINFOK', f.fin_factuur_key) > TO_DATE ('01012018', 'ddmmyyyy')
            AND f.cnt_contract_key = c.cnt_contract_key
            AND c.prs_kostensoort_key = ksc.prs_kostensoort_key(+)
            AND ksc.prs_kostensoortgrp_key = ksgc.prs_kostensoortgrp_key(+)
            AND c.ins_discipline_key = td.ins_discipline_key
            AND (td.ins_discipline_omschrijving LIKE 'CV%' OR td.ins_discipline_omschrijving LIKE 'CF%')
            AND td.prs_kostensoort_key = ksd.prs_kostensoort_key(+)
            AND ksd.prs_kostensoortgrp_key = ksgd.prs_kostensoortgrp_key(+)
            AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key
   GROUP BY c.cnt_prs_bedrijf_key,
            f.fin_factuur_key,
            NULL,
            NULL,
            f.cnt_contract_key,
            COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL),
            COALESCE (ksc.prs_kostensoort_doorbelasten, ksd.prs_kostensoort_doorbelasten, 0),
            kp.prs_kostenplaats_nr
   UNION ALL           -- Op basis van C-termijnen op vaste contracten (= CF)!
   SELECT c.cnt_prs_bedrijf_key bedrijf_key,
          NULL factuur_key,
          NULL bes_opdr_key,
          NULL mld_opdr_key,
          c.cnt_contract_key cnt_key,
          COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL)
             kostensoort,
          COALESCE (ksc.prs_kostensoort_doorbelasten, ksd.prs_kostensoort_doorbelasten, 0)
             doorbelasten,
          kp.prs_kostenplaats_nr,
          c.cnt_contract_termijnkosten kosten
     FROM cnt_v_aanwezigcontract c,
          prs_kostensoort ksc,
          prs_kostensoortgrp ksgc,
          ins_tab_discipline td,
          prs_kostensoort ksd,
          prs_kostensoortgrp ksgd,
          prs_kostenplaats kp
    WHERE TRUNC (c.cnt_contract_looptijd_van) < TRUNC (SYSDATE, 'mm') - 1
          AND c.cnt_contract_looptijd_tot >= TRUNC (SYSDATE, 'mm') - 1
          --AND c.cnt_contract_status = 0            -- NIET Gesloten
          AND c.cnt_contract_kosten > 0
          AND c.prs_kostensoort_key = ksc.prs_kostensoort_key(+)
          AND ksc.prs_kostensoortgrp_key = ksgc.prs_kostensoortgrp_key(+)
          AND c.ins_discipline_key = td.ins_discipline_key
          AND td.ins_discipline_omschrijving LIKE 'CF%'
          AND td.prs_kostensoort_key = ksd.prs_kostensoort_key(+)
          AND ksd.prs_kostensoortgrp_key = ksgd.prs_kostensoortgrp_key(+)
          AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key;

/* Formatted on 20-1-2017 12:42:24 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE vlkc_select_coda (p_applname   IN VARCHAR2,
                                              p_applrun    IN VARCHAR2)
AS
   -- 1. Alle goedgekeurde facturen AV-en.
   -- 2. Termijn/maandbedrag van lopende vaste contracten (= CF) bevriezen in
   --    Eigen tabel met key=81.
   --[3. Achterliggende opdrachten AV-en.]
   -- Cursor loopt over een tijdelijke tabel met daarin opgebouwd alle regels
   -- van de (te bevriezen) verantwoording van kosten gebaseerd op B-facturen,
   -- O-facturen, C-facturen (CV+CF) en C-termijnen.
   CURSOR c1
   IS
        SELECT '[' || TO_CHAR (v.bedrijf_key) || '|' || TO_CHAR (v.factuur_key) || '|' || TO_CHAR (COALESCE (v.bes_opdr_key, v.mld_opdr_key, v.cnt_key)) || '] '
                  aanduiding,
               v.factuur_key,
               v.bes_opdr_key,
               v.mld_opdr_key,
               v.cnt_key,
               c.cnt_contract_nummer_intern || DECODE (c.cnt_contract_versie, NULL, '', '.' || TO_CHAR (c.cnt_contract_versie)) cnt_nr,
               cp.plaats,
               v.kosten
          FROM vlkc_v_coda_actual v,
               cnt_contract c,
               (  SELECT cnt_contract_key, COUNT ( * ) aant, MIN (pa.alg_plaatsaanduiding) plaats
                    FROM cnt_contract_plaats cp, alg_v_plaatsaanduiding_all pa
                   WHERE cp.cnt_alg_plaats_key = pa.alg_onroerendgoed_keys
                         AND cp.cnt_alg_plaats_code = pa.alg_onroerendgoed_type
                GROUP BY cnt_contract_key) cp
         WHERE v.cnt_key = c.cnt_contract_key(+)
               AND c.cnt_contract_key = cp.cnt_contract_key(+)
      ORDER BY 2, 4;

   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanduiding     VARCHAR2 (200) := '';
   v_holiday        NUMBER;
   v_line_count     NUMBER;
   v_amount_sum     NUMBER (10, 2);
BEGIN
   v_line_count := 0;
   v_amount_sum := 0;

   SELECT COUNT ( * )
     INTO v_holiday
     FROM mld_vrije_dagen
    WHERE TRUNC (mld_vrije_dagen_datum) = TRUNC (SYSDATE - 1);

   -- LET OP: CODA-export draait dagelijks na middernacht (begin van dag) en
   -- de bedragen t/m *NU* worden maandelijks alleen in de nacht na 2e werkdag
   -- van de maand doorgezet (= bevroren tbv. rapporten).
   -- IF nacht na 2e werkdag van de maand (én geen weekend én geen vrije dag)!
   -- count_work_days (d1,d2) bepaalt het #werkdagen van d1 tot d2 (als d1=d2,
   -- dan return 0); daarom bepalen tov. laatste dag van vorige maand!
   IF     FAC.count_work_days (TRUNC (SYSDATE, 'mm') - 1, SYSDATE - 1) = 2
      AND TO_CHAR (SYSDATE - 1, 'd') BETWEEN '2' AND '6'
      AND v_holiday = 0
   THEN
      FOR rec IN c1
      LOOP
         BEGIN
            v_aanduiding := rec.aanduiding;

            IF rec.bes_opdr_key IS NOT NULL                      -- B-facturen
            THEN
               v_errormsg := 'Fout verwerken B-factuur';

               UPDATE fin_factuur f
                  SET fin_factuur_statuses_key = 7                       -- AV
                WHERE f.fin_factuur_key = rec.factuur_key;

               fac.trackaction ('FINVER',
                                rec.factuur_key,
                                NULL,                       -- Dus _FACILITOR!
                                NULL,
                                NULL);
            ELSIF rec.mld_opdr_key IS NOT NULL                   -- O-facturen
            THEN
               v_errormsg := 'Fout verwerken O-factuur';

               UPDATE fin_factuur f
                  SET fin_factuur_statuses_key = 7                       -- AV
                WHERE f.fin_factuur_key = rec.factuur_key;

               fac.trackaction ('FINVER',
                                rec.factuur_key,
                                NULL,                       -- Dus _FACILITOR!
                                NULL,
                                NULL);
            ELSE                    -- C-facturen (CV+CF) óf C-termijnen (CF)!
               IF rec.factuur_key IS NOT NULL                     -- C-factuur
               THEN
                  v_errormsg := 'Fout verwerken C-factuur';

                  UPDATE fin_factuur f
                     SET fin_factuur_statuses_key = 7                    -- AV
                   WHERE f.fin_factuur_key = rec.factuur_key;

                  fac.trackaction ('FINVER',
                                   rec.factuur_key,
                                   NULL,                    -- Dus _FACILITOR!
                                   NULL,
                                   NULL);
               ELSE                                               -- C-termijn
                  v_errormsg := 'Fout verwerken C-termijn';

                  INSERT INTO fac_usrdata (fac_usrtab_key,
                                           fac_usrdata_code,
                                           fac_usrdata_omschr,
                                           fac_usrdata_aanmaak,
                                           fac_usrdata_vervaldatum,
                                           fac_usrdata_prijs)
                      VALUES (81,                            -- VasteKostenMnd
                              TO_CHAR (ADD_MONTHS (SYSDATE, -1), 'yyyy-mm') || '/' || TO_CHAR (rec.cnt_key),
                              TO_CHAR (rec.cnt_nr) || '/' || TO_CHAR (rec.plaats),
                              SYSDATE,
                              NULL,
                              rec.kosten);
               END IF;
            END IF;

            COMMIT;

            v_line_count := v_line_count + 1;
            v_amount_sum := v_amount_sum + rec.kosten;
         END;
      END LOOP;

      fac.writelog (p_applname, 'S', 'CODA-export/#regels: ' || TO_CHAR (v_line_count), TO_CHAR (v_amount_sum));
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.writelog (p_applname, 'E', v_aanduiding || v_errormsg, 'Proces CODA-export afgebroken!');
      COMMIT;
END;
/

CREATE OR REPLACE VIEW vlkc_v_rap_coda_ordexp
(
   fclt_f_periode,
   kostensoort,                                                   -- 5 cijfers
   kostenplaats,                                                  -- 4 cijfers
   valuta,                                                         -- element3
   bron,                                                           -- element4
   bedrag_debet,     -- incl. BTW en niet samen met bedrag_credit op één regel
   bedrag_credit,     -- incl. BTW en niet samen met bedrag_debet op één regel
   omschrijving,                                           -- max. 29 posities
   verplichtingnummer,
   leverancier,
   leveranciersnummer,
   factuurnummer,
   fclt_f_vlkc,
   fclt_f_opdrachttype,
   fclt_f_investering,
   melder,                                                     -- of besteller
   melder_pnr,                                                 -- of besteller
   melder_kpn,                                                 -- of besteller
   locatie
)
AS
   WITH lopendeperiode AS (SELECT COALESCE (MAX (TO_CHAR (ADD_MONTHS (fac.safe_to_date (SUBSTR (fac_usrdata_code, 1, 7), 'yyyy-mm'), 1), 'yyyy-mm')), '2017-01') maand
                             FROM fac_usrdata
                            WHERE fac_usrtab_key = 81)
   SELECT DECODE (f.fin_factuur_statuses_key,
                  7, TO_CHAR (fac.gettrackingdate ('FINVER', f.fin_factuur_key) - 10, 'yyyy-mm'),
                  lp.maand || '*')
             periode,
          x.prs_kostensoortgrp_altcode kostensoort,
          x.prs_kostenplaats_nr kostenplaats,
          'EUR' element3,
          DECODE (x.prs_kostenplaats_nr, '2216', 'Variabel', 'Eindgebruiker') element4,
          DECODE (SIGN (f.fin_factuur_totaal + f.fin_factuur_totaal_btw),
                  -1, TO_NUMBER (NULL),
                  (f.fin_factuur_totaal + f.fin_factuur_totaal_btw))
             bedrag_debet,
          DECODE (SIGN (f.fin_factuur_totaal + f.fin_factuur_totaal_btw),
                  -1, -1 * (f.fin_factuur_totaal + f.fin_factuur_totaal_btw),
                  TO_NUMBER (NULL))
             bedrag_credit,
          'B-' || x.ins_discipline_omschrijving omschrijving,
          'B' || x.bes_bestelopdr_id verplichtingnummer,
          x.prs_bedrijf_naam leverancier,
          x.prs_leverancier_nr leveranciersnummer,
          f.fin_factuur_nr factuurnummer,
          DECODE (SUBSTR (x.prs_kostenplaats_nr, 1, 1), '1', 'KC', 'VL') vlkc,
          'Bestelopdracht' opdrachttype,           -- Altijd 'Bestelopdracht'?
          DECODE (x.bes_kenmerkbestell_waarde, '1', 'Ja', 'Nee') investering,
          x.besteller,
          x.besteller_pnr,
          x.besteller_kpn,
          x.alg_locatie_code locatie              -- Soms dummy (bv. Fleurop)?
     FROM lopendeperiode lp,
          fin_factuur f,
          (SELECT DISTINCT bo.bes_bestelopdr_key,
                           bo.bes_bestelopdr_id,
                           ksg.prs_kostensoortgrp_altcode,
                           kp.prs_kostenplaats_nr,
                           td.ins_discipline_omschrijving,
                           lev.prs_bedrijf_naam,
                           lev.prs_leverancier_nr,
                           bo.bes_bestelopdr_leverdatum,
                           inv.bes_kenmerkbestell_waarde,
                           bpf.prs_perslid_naam_full besteller,
                           bp.prs_perslid_nr besteller_pnr,
                           bkp.prs_kostenplaats_nr besteller_kpn,
                           l.alg_locatie_code
             FROM bes_bestelopdr bo,
                  bes_bestelopdr_item boi,
                  bes_bestelling_item bi,
                  bes_srtdeel sd,
                  bes_srtgroep sg,
                  ins_tab_discipline td,
                  prs_kostensoort ks,
                  prs_kostensoortgrp ksg,
                  bes_bestelling b,
                  prs_kostenplaats kp,
                  prs_bedrijf lev,
                  (SELECT *
                     FROM bes_kenmerkbestell kb
                    WHERE EXISTS
                             (SELECT 1
                                FROM bes_kenmerk
                               WHERE bes_kenmerk_key = kb.bes_kenmerk_key
                                     AND bes_srtkenmerk_key = 21)) inv, -- Investeringsopdracht
                  prs_perslid bp,
                  prs_v_perslid_fullnames_all bpf,
                  prs_afdeling ba,
                  prs_kostenplaats bkp,
                  mld_adres a,
                  alg_locatie l
            WHERE bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
                  AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
                  AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
                  AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
                  AND sg.ins_discipline_key = td.ins_discipline_key
                  AND td.prs_kostensoort_key = ks.prs_kostensoort_key(+)
                  AND ks.prs_kostensoortgrp_key = ksg.prs_kostensoortgrp_key(+)
                  AND bi.bes_bestelling_key = b.bes_bestelling_key
                  AND b.prs_kostenplaats_key = kp.prs_kostenplaats_key
                  AND bo.prs_bedrijf_key = lev.prs_bedrijf_key
                  AND b.bes_bestelling_key = inv.bes_bestelling_key(+)
                  AND b.prs_perslid_key = bp.prs_perslid_key
                  AND bp.prs_perslid_key = bpf.prs_perslid_key
                  AND bp.prs_afdeling_key = ba.prs_afdeling_key
                  AND ba.prs_kostenplaats_key = bkp.prs_kostenplaats_key(+)
                  AND bo.mld_adres_key_lev = a.mld_adres_key
                  AND a.alg_locatie_key = l.alg_locatie_key(+)) x
    WHERE f.fin_factuur_statuses_key IN (6, 7)             -- Akkoord/Verwerkt
          AND f.bes_bestelopdr_key = x.bes_bestelopdr_key
   UNION ALL                                         -- Werk/Offerteopdrachten
   SELECT DECODE (f.fin_factuur_statuses_key,
                  7, TO_CHAR (fac.gettrackingdate ('FINVER', f.fin_factuur_key) - 10, 'yyyy-mm'),
                  lp.maand || '*')
             periode,
          COALESCE (ksgo.prs_kostensoortgrp_altcode, ksgm.prs_kostensoortgrp_altcode, ksgv.prs_kostensoortgrp_altcode, NULL) kostensoort,
          kp.prs_kostenplaats_nr kostenplaats,
          'EUR' element3,
          DECODE (kp.prs_kostenplaats_nr, '2216', 'Variabel', 'Eindgebruiker') element4,
          DECODE (SIGN (f.fin_factuur_totaal + f.fin_factuur_totaal_btw),
                  -1, TO_NUMBER (NULL),
                  (f.fin_factuur_totaal + f.fin_factuur_totaal_btw))
             bedrag_debet,
          DECODE (SIGN (f.fin_factuur_totaal + f.fin_factuur_totaal_btw),
                  -1, -1 * (f.fin_factuur_totaal + f.fin_factuur_totaal_btw),
                  TO_NUMBER (NULL))
             bedrag_credit,
          --COALESCE (ksgm.prs_kostensoortgrp_oms, ksgv.prs_kostensoortgrp_oms, 'ONGEDEFINEERD')
          sd.ins_srtdiscipline_prefix || '-' || sm.mld_stdmelding_omschrijving omschrijving,
          sd.ins_srtdiscipline_prefix || TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) verplichtingnummer,
          lev.prs_bedrijf_naam leverancier,
          lev.prs_leverancier_nr leveranciersnummer,
          f.fin_factuur_nr factuurnummer,
          DECODE (vlkc.mld_kenmerkopdr_waarde, '41', 'VL', '42', 'KC', NULL) vlkc,
          DECODE (o.mld_typeopdr_key, 5, 'Werkopdracht', 'Offerteopdracht') opdrachttype,
          DECODE (inv.mld_kenmerkopdr_waarde, '1', 'Ja', 'Nee') investering,
          mpf.prs_perslid_naam_full melder,
          mp.prs_perslid_nr melder_pnr,
          mkp.prs_kostenplaats_nr melder_kpn,
          l.alg_locatie_code locatie
     FROM lopendeperiode lp,
          fin_factuur f,
          mld_opdr o,
          mld_melding m,
          mld_stdmelding sm,
          prs_kostensoort ksm,
          prs_kostensoortgrp ksgm,
          prs_kostensoort kso,
          prs_kostensoortgrp ksgo,
          ins_tab_discipline td,
          prs_kostensoort ksv,
          prs_kostensoortgrp ksgv,
          ins_srtdiscipline sd,
          prs_kostenplaats kp,
          prs_bedrijf lev,
          (SELECT *
             FROM mld_v_aanwezigkenmerkopdr ko
            WHERE EXISTS
                     (SELECT 1
                        FROM mld_kenmerk
                       WHERE mld_kenmerk_key = ko.mld_kenmerk_key
                             AND mld_srtkenmerk_key = 81)) vlkc, -- Factuur/offerte naar
          (SELECT *
             FROM mld_v_aanwezigkenmerkopdr ko
            WHERE EXISTS
                     (SELECT 1
                        FROM mld_kenmerk
                       WHERE mld_kenmerk_key = ko.mld_kenmerk_key
                             AND mld_srtkenmerk_key = 181)) inv, -- Investeringsopdracht
          prs_perslid mp,
          prs_v_perslid_fullnames_all mpf,
          prs_afdeling ma,
          prs_kostenplaats mkp,
          alg_locatie l
    WHERE f.fin_factuur_statuses_key IN (6, 7)             -- Akkoord/Verwerkt
          AND f.mld_opdr_key = o.mld_opdr_key
          AND o.mld_typeopdr_key IN (5, 283)   -- Werkopdracht/Offerteopdracht
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.prs_kostensoort_key = ksm.prs_kostensoort_key(+)
          AND ksm.prs_kostensoortgrp_key = ksgm.prs_kostensoortgrp_key(+)
          AND o.prs_kostensoort_key = kso.prs_kostensoort_key(+)
          AND kso.prs_kostensoortgrp_key = ksgo.prs_kostensoortgrp_key(+)
          AND sm.mld_ins_discipline_key = td.ins_discipline_key
          AND td.prs_kostensoort_key = ksv.prs_kostensoort_key(+)
          AND ksv.prs_kostensoortgrp_key = ksgv.prs_kostensoortgrp_key(+)
          AND td.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
          AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
          AND o.mld_uitvoerende_keys = lev.prs_bedrijf_key
          AND o.mld_opdr_key = vlkc.mld_opdr_key(+)
          AND o.mld_opdr_key = inv.mld_opdr_key(+)
          AND m.prs_perslid_key = mp.prs_perslid_key
          AND mp.prs_perslid_key = mpf.prs_perslid_key
          AND mp.prs_afdeling_key = ma.prs_afdeling_key
          AND ma.prs_kostenplaats_key = mkp.prs_kostenplaats_key(+)
          AND m.mld_alg_locatie_key = l.alg_locatie_key(+);

CREATE OR REPLACE VIEW vlkc_v_rap_coda_cntexp
(
   fclt_f_periode,
   kostensoort,                                                   -- 5 cijfers
   kostenplaats,                                                  -- 4 cijfers
   valuta,                                                         -- element3
   bron,                                                           -- element4
   bedrag_debet,     -- incl. BTW en niet samen met bedrag_credit op één regel
   bedrag_credit,     -- incl. BTW en niet samen met bedrag_debet op één regel
   omschrijving,                                           -- max. 29 posities
   verplichtingnummer,
   leverancier,
   leveranciersnummer,
   factuurnummer,
   fclt_f_vlkc,
   locatie
)
AS
   WITH lopendeperiode AS (SELECT COALESCE (MAX (TO_CHAR (ADD_MONTHS (fac.safe_to_date (SUBSTR (fac_usrdata_code, 1, 7), 'yyyy-mm'), 1), 'yyyy-mm')), '2017-01') maand
                             FROM fac_usrdata
                            WHERE fac_usrtab_key = 81)
     SELECT SUBSTR (ud.fac_usrdata_code, 1, 7) periode,             -- yyyy-mm
            COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL) kostensoort,
            kp.prs_kostenplaats_nr kostenplaats,
            'EUR' valuta,
            'Vast' element4,
            ud.fac_usrdata_prijs bedrag_debet,
            TO_NUMBER (NULL) bedrag_credit,
            td.ins_discipline_omschrijving omschrijving,
            'C' || SUBSTR (ud.fac_usrdata_omschr, 1, INSTR (ud.fac_usrdata_omschr, '/') - 1) verplichtingnummer,
            lev.prs_bedrijf_naam leverancier,
            lev.prs_leverancier_nr leveranciersnummer,
            'N.v.t.' factuurnummer,
            DECODE (ab.prs_afdeling_key1, 82, 'VL', 81, 'KC', NULL) vlkc,
            LISTAGG (cp.alg_locatie_code, ',') WITHIN GROUP (ORDER BY cp.alg_locatie_code) locatie
       FROM fac_usrdata ud,
            cnt_contract c,                -- Alles, want fac_usrdata "rules"!
            prs_kostensoort ksc,
            prs_kostensoortgrp ksgc,
            ins_tab_discipline td,
            prs_kostensoort ksd,
            prs_kostensoortgrp ksgd,
            prs_kostenplaats kp,
            prs_bedrijf lev,
            prs_v_afdeling_boom ab,
            (SELECT cp.cnt_contract_key, l.alg_locatie_code
               FROM cnt_v_aanwezigcontract_plaats cp, alg_gebouw g, alg_locatie l
              WHERE cp.cnt_alg_plaats_code = 'G'
                    AND cp.cnt_alg_plaats_key = g.alg_gebouw_key
                    AND g.alg_locatie_key = l.alg_locatie_key
             UNION
             SELECT cp.cnt_contract_key, l.alg_locatie_code
               FROM cnt_v_aanwezigcontract_plaats cp, alg_locatie l
              WHERE cp.cnt_alg_plaats_code = 'L'
                    AND cp.cnt_alg_plaats_key = l.alg_locatie_key) cp
      WHERE ud.fac_usrtab_key = 81                           -- VasteKostenMnd
            AND SUBSTR (ud.fac_usrdata_code, INSTR (ud.fac_usrdata_code, '/') + 1) = TO_CHAR (c.cnt_contract_key)
            AND c.prs_kostensoort_key = ksc.prs_kostensoort_key(+)
            AND ksc.prs_kostensoortgrp_key = ksgc.prs_kostensoortgrp_key(+)
            AND c.ins_discipline_key = td.ins_discipline_key
            AND td.prs_kostensoort_key = ksd.prs_kostensoort_key(+)
            AND ksd.prs_kostensoortgrp_key = ksgd.prs_kostensoortgrp_key(+)
            AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
            AND c.cnt_prs_bedrijf_key = lev.prs_bedrijf_key
            AND c.prs_afdeling_key_eig = ab.prs_afdeling_key(+)
            AND c.cnt_contract_key = cp.cnt_contract_key(+)
   GROUP BY SUBSTR (ud.fac_usrdata_code, 1, 7),                     -- yyyy-mm
            COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL),
            kp.prs_kostenplaats_nr,
            'EUR',
            'Vast',
            ud.fac_usrdata_prijs,
            TO_NUMBER (NULL),
            td.ins_discipline_omschrijving,
            'C' || SUBSTR (ud.fac_usrdata_omschr, 1, INSTR (ud.fac_usrdata_omschr, '/') - 1),
            lev.prs_bedrijf_naam,
            lev.prs_leverancier_nr,
            'N.v.t.',
            DECODE (ab.prs_afdeling_key1, 82, 'VL', 81, 'KC', NULL)
   UNION ALL
     SELECT lp.maand || '*' periode,
            COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL) kostensoort,
            kp.prs_kostenplaats_nr kostenplaats,
            'EUR' valuta,
            'Vast' element4,
            c.cnt_contract_termijnkosten bedrag_debet,
            TO_NUMBER (NULL) bedrag_credit,
            td.ins_discipline_omschrijving omschrijving,
            'C' || c.cnt_contract_nummer_intern || DECODE (c.cnt_contract_versie, NULL, '', '.' || TO_CHAR (c.cnt_contract_versie)) verplichtingnummer,
            lev.prs_bedrijf_naam leverancier,
            lev.prs_leverancier_nr leveranciersnummer,
            'N.v.t.' factuurnummer,
            DECODE (ab.prs_afdeling_key1, 82, 'VL', 81, 'KC', NULL) vlkc,
            LISTAGG (cp.alg_locatie_code, ',') WITHIN GROUP (ORDER BY cp.alg_locatie_code) locatie
       FROM lopendeperiode lp,
            cnt_v_aanwezigcontract c, -- Alleen aanwezige vaste contracten (= CF)!
            prs_kostensoort ksc,
            prs_kostensoortgrp ksgc,
            ins_tab_discipline td,
            prs_kostensoort ksd,
            prs_kostensoortgrp ksgd,
            prs_kostenplaats kp,
            prs_bedrijf lev,
            prs_v_afdeling_boom ab,
            (SELECT cp.cnt_contract_key, l.alg_locatie_code
               FROM cnt_v_aanwezigcontract_plaats cp, alg_gebouw g, alg_locatie l
              WHERE cp.cnt_alg_plaats_code = 'G'
                    AND cp.cnt_alg_plaats_key = g.alg_gebouw_key
                    AND g.alg_locatie_key = l.alg_locatie_key
             UNION
             SELECT cp.cnt_contract_key, l.alg_locatie_code
               FROM cnt_v_aanwezigcontract_plaats cp, alg_locatie l
              WHERE cp.cnt_alg_plaats_code = 'L'
                    AND cp.cnt_alg_plaats_key = l.alg_locatie_key) cp
      WHERE TRUNC (c.cnt_contract_looptijd_van) < LAST_DAY (TO_DATE (lp.maand || '-01', 'yyyy-mm-dd'))
            AND c.cnt_contract_looptijd_tot >= LAST_DAY (TO_DATE (lp.maand || '-01', 'yyyy-mm-dd'))
            AND c.prs_kostensoort_key = ksc.prs_kostensoort_key(+)
            AND ksc.prs_kostensoortgrp_key = ksgc.prs_kostensoortgrp_key(+)
            AND c.ins_discipline_key = td.ins_discipline_key
            AND td.ins_discipline_omschrijving LIKE 'CF%'  -- TODO: Of ook CV?
            AND td.prs_kostensoort_key = ksd.prs_kostensoort_key(+)
            AND ksd.prs_kostensoortgrp_key = ksgd.prs_kostensoortgrp_key(+)
            AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
            AND c.cnt_prs_bedrijf_key = lev.prs_bedrijf_key
            AND c.prs_afdeling_key_eig = ab.prs_afdeling_key(+)
            AND c.cnt_contract_key = cp.cnt_contract_key(+)
   GROUP BY lp.maand || '*',
            COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL),
            kp.prs_kostenplaats_nr,
            'EUR',
            'Vast',
            c.cnt_contract_termijnkosten,
            TO_NUMBER (NULL),
            td.ins_discipline_omschrijving,
            'C' || c.cnt_contract_nummer_intern || DECODE (c.cnt_contract_versie, NULL, '', '.' || TO_CHAR (c.cnt_contract_versie)),
            lev.prs_leverancier_nr,
            lev.prs_bedrijf_naam,
            'N.v.t.',
            DECODE (ab.prs_afdeling_key1, 82, 'VL', 81, 'KC', NULL)
   UNION ALL
     SELECT DECODE (f.fin_factuur_statuses_key,
                    7, TO_CHAR (fac.gettrackingdate ('FINVER', f.fin_factuur_key) - 10, 'yyyy-mm'),
                    lp.maand || '*')
               periode,
            COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL) kostensoort,
            kp.prs_kostenplaats_nr kostenplaats,
            'EUR' valuta,
            'Vast' element4,
            DECODE (SIGN (f.fin_factuur_totaal + f.fin_factuur_totaal_btw),
                    -1, TO_NUMBER (NULL),
                    (f.fin_factuur_totaal + f.fin_factuur_totaal_btw))
               bedrag_debet,
            DECODE (SIGN (f.fin_factuur_totaal + f.fin_factuur_totaal_btw),
                    -1, -1 * (f.fin_factuur_totaal + f.fin_factuur_totaal_btw),
                    TO_NUMBER (NULL))
               bedrag_credit,
            td.ins_discipline_omschrijving omschrijving,
            'C' || c.cnt_contract_nummer_intern || DECODE (c.cnt_contract_versie, NULL, '', '.' || TO_CHAR (c.cnt_contract_versie)) verplichtingnummer,
            lev.prs_bedrijf_naam leverancier,
            lev.prs_leverancier_nr leveranciersnummer,
            f.fin_factuur_nr factuurnummer,
            DECODE (ab.prs_afdeling_key1, 82, 'VL', 81, 'KC', NULL) vlkc,
            LISTAGG (cp.alg_locatie_code, ',') WITHIN GROUP (ORDER BY cp.alg_locatie_code) locatie
       FROM lopendeperiode lp,
            fin_factuur f,
            cnt_v_aanwezigcontract c,     -- Alleen aanwezige (CV-)contracten!
            prs_kostensoort ksc,
            prs_kostensoortgrp ksgc,
            ins_tab_discipline td,
            prs_kostensoort ksd,
            prs_kostensoortgrp ksgd,
            prs_kostenplaats kp,
            prs_bedrijf lev,
            prs_v_afdeling_boom ab,
            (SELECT cp.cnt_contract_key, l.alg_locatie_code
               FROM cnt_v_aanwezigcontract_plaats cp, alg_gebouw g, alg_locatie l
              WHERE cp.cnt_alg_plaats_code = 'G'
                    AND cp.cnt_alg_plaats_key = g.alg_gebouw_key
                    AND g.alg_locatie_key = l.alg_locatie_key
             UNION
             SELECT cp.cnt_contract_key, l.alg_locatie_code
               FROM cnt_v_aanwezigcontract_plaats cp, alg_locatie l
              WHERE cp.cnt_alg_plaats_code = 'L'
                    AND cp.cnt_alg_plaats_key = l.alg_locatie_key) cp
      WHERE f.fin_factuur_statuses_key IN (6, 7)           -- Akkoord/Verwerkt
            AND fac.gettrackingdate ('FINFOK', f.fin_factuur_key) > TO_DATE ('01012018', 'ddmmyyyy')
            AND f.cnt_contract_key = c.cnt_contract_key
            AND c.prs_kostensoort_key = ksc.prs_kostensoort_key(+)
            AND ksc.prs_kostensoortgrp_key = ksgc.prs_kostensoortgrp_key(+)
            AND c.ins_discipline_key = td.ins_discipline_key
            AND td.ins_discipline_omschrijving LIKE 'CV%' -- Zou zo moeten zijn (nu nog tenminste)!
            AND td.prs_kostensoort_key = ksd.prs_kostensoort_key(+)
            AND ksd.prs_kostensoortgrp_key = ksgd.prs_kostensoortgrp_key(+)
            AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
            AND c.cnt_prs_bedrijf_key = lev.prs_bedrijf_key
            AND c.prs_afdeling_key_eig = ab.prs_afdeling_key(+)
            AND c.cnt_contract_key = cp.cnt_contract_key(+)
   GROUP BY DECODE (f.fin_factuur_statuses_key,
                    7, TO_CHAR (fac.gettrackingdate ('FINVER', f.fin_factuur_key) - 10, 'yyyy-mm'),
                    lp.maand || '*'),
            COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL),
            kp.prs_kostenplaats_nr,
            'EUR',
            'Vast',
            DECODE (SIGN (f.fin_factuur_totaal + f.fin_factuur_totaal_btw),
                    -1, TO_NUMBER (NULL),
                    (f.fin_factuur_totaal + f.fin_factuur_totaal_btw)),
            DECODE (SIGN (f.fin_factuur_totaal + f.fin_factuur_totaal_btw),
                    -1, -1 * (f.fin_factuur_totaal + f.fin_factuur_totaal_btw),
                    TO_NUMBER (NULL)),
            td.ins_discipline_omschrijving,
            'C' || c.cnt_contract_nummer_intern || DECODE (c.cnt_contract_versie, NULL, '', '.' || TO_CHAR (c.cnt_contract_versie)),
            lev.prs_leverancier_nr,
            lev.prs_bedrijf_naam,
            f.fin_factuur_nr,
            DECODE (ab.prs_afdeling_key1, 82, 'VL', 81, 'KC', NULL);

CREATE OR REPLACE VIEW vlkc_v_rap_coda_ordrun
(
   fclt_f_periode,
   kostensoort,                                                   -- 5 cijfers
   kostenplaats,                                                  -- 4 cijfers
   valuta,                                                         -- element3
   bron,                                                           -- element4
   bedrag_debet,     -- incl. BTW en niet samen met bedrag_credit op één regel
   bedrag_credit,     -- incl. BTW en niet samen met bedrag_debet op één regel
   omschrijving,                                           -- max. 29 posities
   verplichtingnummer,
   leverancier,
   leveranciersnummer,
   factuurnummer,
   fclt_f_vlkc,
   fclt_f_opdrachttype,
   fclt_f_investering,
   einddatum,
   locatie
)
AS                                                         -- Bestelopdrachten
   SELECT NULL periode,
          x.prs_kostensoortgrp_altcode kostensoort,
          x.prs_kostenplaats_nr kostenplaats,
          'EUR' element3,
          DECODE (x.prs_kostenplaats_nr, '2216', 'Variabel', 'Eindgebruiker') element4,
          DECODE (
             f_run.fin_factuur_key,
             NULL,                                 -- Geen ingevoerde facturen
             DECODE (SIGN (COALESCE (x.kosten, 0)),
                     -1, TO_NUMBER (NULL),
                     COALESCE (x.kosten, 0)),
             DECODE (
                SIGN (f_run.fin_factuur_totaal + f_run.fin_factuur_totaal_btw),
                -1, TO_NUMBER (NULL),
                (f_run.fin_factuur_totaal + f_run.fin_factuur_totaal_btw)))
             bedrag_debet,
          DECODE (
             f_run.fin_factuur_key,
             NULL,                                 -- Geen ingevoerde facturen
             DECODE (SIGN (COALESCE (x.kosten, 0)),
                     -1, -1 * COALESCE (x.kosten, 0),
                     TO_NUMBER (NULL)),
             DECODE (
                SIGN (f_run.fin_factuur_totaal + f_run.fin_factuur_totaal_btw),
                -1, -1 * (f_run.fin_factuur_totaal + f_run.fin_factuur_totaal_btw),
                TO_NUMBER (NULL)))
             bedrag_credit,
          'B-' || x.ins_discipline_omschrijving omschrijving,
          'B' || x.bes_bestelopdr_id verplichtingnummer,
          x.prs_bedrijf_naam leverancier,
          x.prs_leverancier_nr leveranciersnummer,
          f_run.fin_factuur_nr factuurnummer,
          DECODE (SUBSTR (x.prs_kostenplaats_nr, 1, 1), '1', 'KC', 'VL') vlkc,
          'Bestelopdracht' opdrachttype,           -- Altijd 'Bestelopdracht'?
          DECODE (x.bes_kenmerkbestell_waarde, '1', 'Ja', 'Nee') investering,
          x.bes_bestelopdr_datum einddatum,      -- VLKC#57171: Opdrachtdatum!
          x.alg_locatie_code locatie              -- Soms dummy (bv. Fleurop)?
     FROM (  SELECT bo.bes_bestelopdr_key,
                    bo.bes_bestelopdr_id,
                    ksg.prs_kostensoortgrp_altcode,
                    kp.prs_kostenplaats_nr,
                    td.ins_discipline_omschrijving,
                    lev.prs_bedrijf_naam,
                    lev.prs_leverancier_nr,
                    inv.bes_kenmerkbestell_waarde,
                    bo.bes_bestelopdr_datum,
                    l.alg_locatie_code,
                    SUM ((boi.bes_bestelopdr_item_aantal * boi.bes_bestelopdr_item_brutoprijs))
                       kosten
               FROM bes_bestelopdr bo,
                    bes_bestelopdr_item boi,
                    bes_bestelling_item bi,
                    bes_srtdeel sd,
                    bes_srtgroep sg,
                    ins_tab_discipline td,
                    prs_kostensoort ks,
                    prs_kostensoortgrp ksg,
                    bes_bestelling b,
                    prs_kostenplaats kp,
                    prs_bedrijf lev,
                    (SELECT *
                       FROM bes_kenmerkbestell kb
                      WHERE EXISTS
                               (SELECT 1
                                  FROM bes_kenmerk
                                 WHERE bes_kenmerk_key = kb.bes_kenmerk_key
                                       AND bes_srtkenmerk_key = 21)) inv, -- Investeringsopdracht
                    mld_adres a,
                    alg_locatie l
              WHERE bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
                    AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
                    AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
                    AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
                    AND sg.ins_discipline_key = td.ins_discipline_key
                    AND td.ins_discipline_key != 721 -- VLKC#53739: Anders dan Relatiegeschenken!
                    AND td.prs_kostensoort_key = ks.prs_kostensoort_key(+)
                    AND ks.prs_kostensoortgrp_key = ksg.prs_kostensoortgrp_key(+)
                    AND bi.bes_bestelling_key = b.bes_bestelling_key
                    AND b.prs_kostenplaats_key = kp.prs_kostenplaats_key
                    AND bo.prs_bedrijf_key = lev.prs_bedrijf_key
                    AND b.bes_bestelling_key = inv.bes_bestelling_key(+)
                    AND bo.mld_adres_key_lev = a.mld_adres_key
                    AND a.alg_locatie_key = l.alg_locatie_key(+)
                    AND NOT EXISTS -- Geen Bestelopdrachten met een Reden "0-order" (bij de Bestelling)!
                          (SELECT 1
                             FROM bes_kenmerkbestell kb, bes_kenmerk k
                            WHERE kb.bes_kenmerkbestell_verwijder IS NULL
                                  AND kb.bes_kenmerk_key = k.bes_kenmerk_key
                                  AND k.bes_srtkenmerk_key = 141 -- Reden "0-order"
                                  AND kb.bes_bestelling_key = b.bes_bestelling_key)
           GROUP BY bo.bes_bestelopdr_key,
                    bo.bes_bestelopdr_id,
                    ksg.prs_kostensoortgrp_altcode,
                    kp.prs_kostenplaats_nr,
                    td.ins_discipline_omschrijving,
                    lev.prs_bedrijf_naam,
                    lev.prs_leverancier_nr,
                    inv.bes_kenmerkbestell_waarde,
                    bo.bes_bestelopdr_datum,
                    l.alg_locatie_code) x
          LEFT JOIN (  SELECT bes_bestelopdr_key, COUNT ( * ) aantal
                         FROM fin_factuur
                        WHERE bes_bestelopdr_key IS NOT NULL AND fin_factuur_verwijder IS NULL
                     GROUP BY bes_bestelopdr_key) f_cnt
             ON x.bes_bestelopdr_key = f_cnt.bes_bestelopdr_key
          LEFT JOIN fin_factuur f_run
             ON x.bes_bestelopdr_key = f_run.bes_bestelopdr_key AND f_run.fin_factuur_verwijder IS NULL
    WHERE f_cnt.bes_bestelopdr_key IS NULL
          OR COALESCE (f_run.fin_factuur_statuses_key, 2) = 2     -- Ingevoerd
   UNION ALL                                                 -- Werkopdrachten
   SELECT NULL periode,
          x.kostensoort,
          x.kostenplaats,
          'EUR' element3,
          DECODE (x.kostenplaats, '2216', 'Variabel', 'Eindgebruiker') element4,
          DECODE (
             f_run.fin_factuur_key,
             NULL,                                 -- Geen ingevoerde facturen
             DECODE (SIGN (COALESCE (x.mld_opdr_kosten, 0)),
                     -1, TO_NUMBER (NULL),
                     COALESCE (x.mld_opdr_kosten, 0)),
             DECODE (
                SIGN (f_run.fin_factuur_totaal + f_run.fin_factuur_totaal_btw),
                -1, TO_NUMBER (NULL),
                (f_run.fin_factuur_totaal + f_run.fin_factuur_totaal_btw)))
             bedrag_debet,
          DECODE (
             f_run.fin_factuur_key,
             NULL,                                 -- Geen ingevoerde facturen
             DECODE (SIGN (COALESCE (x.mld_opdr_kosten, 0)),
                     -1, -1 * COALESCE (x.mld_opdr_kosten, 0),
                     TO_NUMBER (NULL)),
             DECODE (
                SIGN (f_run.fin_factuur_totaal + f_run.fin_factuur_totaal_btw),
                -1, -1 * (f_run.fin_factuur_totaal + f_run.fin_factuur_totaal_btw),
                TO_NUMBER (NULL)))
             bedrag_credit,
          x.ins_srtdiscipline_prefix || '-' || x.mld_stdmelding_omschrijving omschrijving,
          x.ins_srtdiscipline_prefix || TO_CHAR (x.mld_melding_key) || '/' || TO_CHAR (x.mld_opdr_bedrijfopdr_volgnr) verplichtingnummer,
          x.prs_bedrijf_naam leverancier,
          x.prs_leverancier_nr leveranciersnummer,
          f_run.fin_factuur_nr factuurnummer,
          DECODE (x.vlkc, '41', 'VL', '42', 'KC', NULL) vlkc,
          DECODE (x.mld_typeopdr_key, 5, 'Werkopdracht', 'Offerteopdracht') opdrachttype,
          DECODE (x.inv, '1', 'Ja', 'Nee') investering,
          x.mld_opdr_einddatum,
          x.alg_locatie_code locatie
     FROM (SELECT o.mld_opdr_key,
                  o.mld_melding_key,
                  o.mld_opdr_bedrijfopdr_volgnr,
                  COALESCE (ksgo.prs_kostensoortgrp_altcode, ksgm.prs_kostensoortgrp_altcode, ksgv.prs_kostensoortgrp_altcode, NULL) kostensoort,
                  kp.prs_kostenplaats_nr kostenplaats,
                  o.mld_opdr_kosten,
                  sd.ins_srtdiscipline_prefix,
                  sm.mld_stdmelding_omschrijving,
                  lev.prs_bedrijf_naam,
                  lev.prs_leverancier_nr,
                  vlkc.mld_kenmerkopdr_waarde vlkc,
                  o.mld_typeopdr_key,
                  inv.mld_kenmerkopdr_waarde inv,
                  o.mld_opdr_einddatum,
                  l.alg_locatie_code
             FROM mld_opdr o,
                  mld_melding m,
                  mld_stdmelding sm,
                  prs_kostensoort ksm,
                  prs_kostensoortgrp ksgm,
                  prs_kostensoort kso,
                  prs_kostensoortgrp ksgo,
                  ins_tab_discipline td,
                  prs_kostensoort ksv,
                  prs_kostensoortgrp ksgv,
                  ins_srtdiscipline sd,
                  prs_kostenplaats kp,
                  prs_bedrijf lev,
                  (SELECT *
                     FROM mld_v_aanwezigkenmerkopdr ko
                    WHERE EXISTS
                             (SELECT 1
                                FROM mld_kenmerk
                               WHERE mld_kenmerk_key = ko.mld_kenmerk_key
                                     AND mld_srtkenmerk_key = 81)) vlkc, -- Factuur/offerte naar
                  (SELECT *
                     FROM mld_v_aanwezigkenmerkopdr ko
                    WHERE EXISTS
                             (SELECT 1
                                FROM mld_kenmerk
                               WHERE mld_kenmerk_key = ko.mld_kenmerk_key
                                     AND mld_srtkenmerk_key = 181)) inv, -- Investeringsopdracht
                  alg_locatie l
            WHERE o.mld_typeopdr_key = 5                       -- Werkopdracht
                  AND o.mld_statusopdr_key NOT IN (1, 2) -- Afgewezen/Niet akkoord
                  AND o.mld_melding_key = m.mld_melding_key
                  AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                  AND sm.prs_kostensoort_key = ksm.prs_kostensoort_key(+)
                  AND ksm.prs_kostensoortgrp_key = ksgm.prs_kostensoortgrp_key(+)
                  AND o.prs_kostensoort_key = kso.prs_kostensoort_key(+)
                  AND kso.prs_kostensoortgrp_key = ksgo.prs_kostensoortgrp_key(+)
                  AND sm.mld_ins_discipline_key = td.ins_discipline_key
                  AND td.prs_kostensoort_key = ksv.prs_kostensoort_key(+)
                  AND ksv.prs_kostensoortgrp_key = ksgv.prs_kostensoortgrp_key(+)
                  AND td.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                  AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                  AND o.mld_uitvoerende_keys = lev.prs_bedrijf_key
                  AND o.mld_opdr_key = vlkc.mld_opdr_key(+)
                  AND o.mld_opdr_key = inv.mld_opdr_key(+)
                  AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
                  AND NOT EXISTS   -- Geen Werkopdrachten met Reden "0-order"!
                        (SELECT 1
                           FROM mld_v_aanwezigkenmerkopdr
                          WHERE mld_kenmerk_key = 201       -- Reden "0-order"
                                AND mld_opdr_key = o.mld_opdr_key)) x
          LEFT JOIN (  SELECT mld_opdr_key, COUNT ( * ) aantal
                         FROM fin_factuur
                        WHERE mld_opdr_key IS NOT NULL AND fin_factuur_verwijder IS NULL
                     GROUP BY mld_opdr_key) f_cnt
             ON x.mld_opdr_key = f_cnt.mld_opdr_key
          LEFT JOIN fin_factuur f_run
             ON x.mld_opdr_key = f_run.mld_opdr_key AND f_run.fin_factuur_verwijder IS NULL
    WHERE f_cnt.mld_opdr_key IS NULL
          OR COALESCE (f_run.fin_factuur_statuses_key, 2) = 2     -- Ingevoerd
   UNION ALL                                              -- Offerteopdrachten
   SELECT NULL periode,
          x.kostensoort,
          x.kostenplaats,
          'EUR' element3,
          DECODE (x.kostenplaats, '2216', 'Variabel', 'Eindgebruiker') element4,
          DECODE (
             COALESCE (f.aantal, 0),
             0,                                  -- Nog geen factuur ontvangen
             DECODE (SIGN (COALESCE (x.mld_opdr_kosten, 0)),
                     -1, TO_NUMBER (NULL),
                     COALESCE (x.mld_opdr_kosten, 0)),
             DECODE (
                SIGN(COALESCE (x.mld_opdr_kosten, 0) - COALESCE (debet.tot_incl_btw, 0) - COALESCE (credit.tot_incl_btw, 0)),
                -1, TO_NUMBER (NULL),
                COALESCE (x.mld_opdr_kosten, 0) - COALESCE (debet.tot_incl_btw, 0) - COALESCE (credit.tot_incl_btw, 0)))
             bedrag_debet,
          DECODE (
             COALESCE (f.aantal, 0),
             0,                                  -- Nog geen factuur ontvangen
             DECODE (SIGN (COALESCE (x.mld_opdr_kosten, 0)),
                     -1, -1 * COALESCE (x.mld_opdr_kosten, 0),
                     TO_NUMBER (NULL)),
             DECODE (
                SIGN(COALESCE (x.mld_opdr_kosten, 0) - COALESCE (debet.tot_incl_btw, 0) - COALESCE (credit.tot_incl_btw, 0)),
                -1, -1 * (COALESCE (x.mld_opdr_kosten, 0) - COALESCE (debet.tot_incl_btw, 0) - COALESCE (credit.tot_incl_btw, 0)),
                TO_NUMBER (NULL)))
             bedrag_credit,
          --COALESCE (ksgm.prs_kostensoortgrp_oms, ksgv.prs_kostensoortgrp_oms, 'ONGEDEFINEERD')
          x.ins_srtdiscipline_prefix || '-' || x.mld_stdmelding_omschrijving omschrijving,
          x.ins_srtdiscipline_prefix || TO_CHAR (x.mld_melding_key) || '/' || TO_CHAR (x.mld_opdr_bedrijfopdr_volgnr) verplichtingnummer,
          x.prs_bedrijf_naam leverancier,
          x.prs_leverancier_nr leveranciersnummer,
          GREATEST (debet.fin_factuur_nr, credit.fin_factuur_nr) factuurnummer,
          DECODE (x.vlkc, '41', 'VL', '42', 'KC', NULL) vlkc,
          DECODE (x.mld_typeopdr_key, 5, 'Werkopdracht', 'Offerteopdracht') opdrachttype,
          DECODE (x.inv, '1', 'Ja', 'Nee') investering,
          x.mld_opdr_einddatum,
          x.alg_locatie_code locatie
     FROM (SELECT o.mld_opdr_key,
                  o.mld_melding_key,
                  o.mld_opdr_bedrijfopdr_volgnr,
                  COALESCE (ksgo.prs_kostensoortgrp_altcode, ksgm.prs_kostensoortgrp_altcode, ksgv.prs_kostensoortgrp_altcode, NULL) kostensoort,
                  kp.prs_kostenplaats_nr kostenplaats,
                  o.mld_opdr_kosten,
                  sd.ins_srtdiscipline_prefix,
                  sm.mld_stdmelding_omschrijving,
                  lev.prs_bedrijf_naam,
                  lev.prs_leverancier_nr,
                  vlkc.mld_kenmerkopdr_waarde vlkc,
                  o.mld_typeopdr_key,
                  inv.mld_kenmerkopdr_waarde inv,
                  o.mld_opdr_einddatum,
                  l.alg_locatie_code
             FROM mld_opdr o,
                  mld_melding m,
                  mld_stdmelding sm,
                  prs_kostensoort ksm,
                  prs_kostensoortgrp ksgm,
                  prs_kostensoort kso,
                  prs_kostensoortgrp ksgo,
                  ins_tab_discipline td,
                  prs_kostensoort ksv,
                  prs_kostensoortgrp ksgv,
                  ins_srtdiscipline sd,
                  prs_kostenplaats kp,
                  prs_bedrijf lev,
                  (SELECT *
                     FROM mld_v_aanwezigkenmerkopdr ko
                    WHERE EXISTS
                             (SELECT 1
                                FROM mld_kenmerk
                               WHERE mld_kenmerk_key = ko.mld_kenmerk_key
                                     AND mld_srtkenmerk_key = 81)) vlkc, -- Factuur/offerte naar
                  (SELECT *
                     FROM mld_v_aanwezigkenmerkopdr ko
                    WHERE EXISTS
                             (SELECT 1
                                FROM mld_kenmerk
                               WHERE mld_kenmerk_key = ko.mld_kenmerk_key
                                     AND mld_srtkenmerk_key = 181)) inv, -- Investeringsopdracht
                  alg_locatie l
            WHERE o.mld_typeopdr_key = 283                  -- Offerteopdracht
                  AND o.mld_statusopdr_key NOT IN (1, 2) -- Afgewezen/Niet akkoord
                  AND o.mld_melding_key = m.mld_melding_key
                  AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                  AND sm.prs_kostensoort_key = ksm.prs_kostensoort_key(+)
                  AND ksm.prs_kostensoortgrp_key = ksgm.prs_kostensoortgrp_key(+)
                  AND o.prs_kostensoort_key = kso.prs_kostensoort_key(+)
                  AND kso.prs_kostensoortgrp_key = ksgo.prs_kostensoortgrp_key(+)
                  AND sm.mld_ins_discipline_key = td.ins_discipline_key
                  AND td.prs_kostensoort_key = ksv.prs_kostensoort_key(+)
                  AND ksv.prs_kostensoortgrp_key = ksgv.prs_kostensoortgrp_key(+)
                  AND td.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                  AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
                  AND o.mld_uitvoerende_keys = lev.prs_bedrijf_key
                  AND o.mld_opdr_key = vlkc.mld_opdr_key(+)
                  AND o.mld_opdr_key = inv.mld_opdr_key(+)
                  AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
                  AND NOT EXISTS -- Geen Offerteopdrachten met Reden "0-order"!
                        (SELECT 1
                           FROM mld_v_aanwezigkenmerkopdr
                          WHERE mld_kenmerk_key = 1101      -- Reden "0-order"
                                AND mld_opdr_key = o.mld_opdr_key)) x
          LEFT JOIN (  SELECT mld_opdr_key, COUNT ( * ) aantal
                         FROM fin_factuur
                        WHERE mld_opdr_key IS NOT NULL AND fin_factuur_verwijder IS NULL
                     GROUP BY mld_opdr_key) f
             ON x.mld_opdr_key = f.mld_opdr_key
          LEFT JOIN (  SELECT mld_opdr_key, COUNT ( * ) aantal, MAX (fin_factuur_nr) fin_factuur_nr,
                              SUM (fin_factuur_totaal + fin_factuur_totaal_btw) tot_incl_btw
                         FROM fin_factuur
                        WHERE mld_opdr_key IS NOT NULL
                              AND fin_factuur_statuses_key IN (6, 7)
                              AND (fin_factuur_totaal + fin_factuur_totaal_btw) >= 0
                     GROUP BY mld_opdr_key) debet
             ON x.mld_opdr_key = debet.mld_opdr_key
          LEFT JOIN (  SELECT mld_opdr_key, COUNT ( * ) aantal, MAX (fin_factuur_nr) fin_factuur_nr,
                              SUM (fin_factuur_totaal + fin_factuur_totaal_btw) tot_incl_btw
                         FROM fin_factuur
                        WHERE mld_opdr_key IS NOT NULL
                              AND fin_factuur_statuses_key IN (6, 7)
                              AND (fin_factuur_totaal + fin_factuur_totaal_btw) < 0
                     GROUP BY mld_opdr_key) credit
             ON x.mld_opdr_key = credit.mld_opdr_key
    WHERE ROUND ((COALESCE (x.mld_opdr_kosten, 0) - COALESCE (debet.tot_incl_btw, 0) - COALESCE (credit.tot_incl_btw, 0)), 2) != 0;

-- VLKC#40188: Hernoemen Jaarbedrag naar Contractbedrag/toevoegen Einddatum en Jaarbedrag=12xTermijnbedrag.
-- VLKC#40188: Verantwoording per jaar/hernoemen Jaarbedrag naar Jaarbedrag_heel/toevoegen Jaarbedrag_deel.
-- VLKC#56902: Uitbreiding met extra CF/CV-kolom. Tevens in de bestaande Contractnummer-kolom de variabele
--             contracten de prefix CV gegeven (en de prefix voor vaste contracten ongewijzigd C gebleven).
CREATE OR REPLACE VIEW vlkc_v_rap_cnt_verantw
(
   fclt_f_jaar,
   contractnummer,
   cf_of_cv,
   leverancier,
   leveranciersnummer,
   contractbedrag,
   reeds_gefactureerd,
   reeds_verantwoord,
   kostensoort,                                                   -- 5 cijfers
   kostenplaats,                                                  -- 4 cijfers
   fclt_x_vlkc,
   einddatum_contract,
   jaarbedrag_heel,
   jaarbedrag_deel,
   locatie
)
AS
     SELECT TO_CHAR (c.jaar, 'yyyy') jaar,
            DECODE (SUBSTR (td.ins_discipline_omschrijving, 1, 2), 'CV', 'CV', 'C') || c.cnt_contract_nummer_intern || DECODE (c.cnt_contract_versie, NULL, '', '.' || TO_CHAR (c.cnt_contract_versie)) contractnummer,
            DECODE (SUBSTR (td.ins_discipline_omschrijving, 1, 2), 'CV', 'CV', 'C') cf_of_cv,
            lev.prs_bedrijf_naam leverancier,
            lev.prs_leverancier_nr leveranciersnummer,
            c.cnt_contract_kosten contractbedrag,
            verantw.reeds_gefactureerd,
            DECODE (SUBSTR (td.ins_discipline_omschrijving, 1, 2), 'CV', verantw.reeds_verwerkt, verantw.reeds_verantwoord) reeds_verantwoord,
            COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL) kostensoort,
            kp.prs_kostenplaats_nr kostenplaats,
            DECODE (ab.prs_afdeling_key1, 82, 'VL', 81, 'KC', NULL) vlkc,
            c.cnt_contract_looptijd_tot einddatum_contract,
            12 * c.cnt_contract_termijnkosten jaar_heel, -- Termijnbedrag=Maandbedrag (ongeacht Factuurtermijn)!
            ROUND (MONTHS_BETWEEN (LEAST (TRUNC (c.cnt_contract_looptijd_tot), ADD_MONTHS (c.jaar, 12) - 1), GREATEST (TRUNC (c.cnt_contract_looptijd_van), c.jaar)), 0) * c.cnt_contract_termijnkosten jaar_deel,
            LISTAGG (cp.alg_locatie_code, ',') WITHIN GROUP (ORDER BY cp.alg_locatie_code) locatie
       FROM (SELECT TO_CHAR (p.jaar, 'yyyy') || '/' || TO_CHAR (c.cnt_contract_key) jaarkey, p.jaar, c.*
               FROM (    SELECT ADD_MONTHS (TO_DATE ('01012017', 'ddmmyyyy'), (LEVEL - 1) * 12) jaar
                           FROM DUAL
                     CONNECT BY LEVEL <= MONTHS_BETWEEN (SYSDATE, TO_DATE ('01012017', 'ddmmyyyy')) / 12 + 1) p,
                    cnt_contract c -- Alle contracten/versies (incl. verwijderde?)
              WHERE p.jaar BETWEEN TRUNC (c.cnt_contract_looptijd_van, 'yyyy') AND c.cnt_contract_looptijd_tot) c,
            (  SELECT jaarkey, SUM (reeds_gefactureerd) reeds_gefactureerd, SUM (reeds_verwerkt) reeds_verwerkt, SUM (reeds_verantwoord) reeds_verantwoord
                 FROM (SELECT TO_CHAR (DECODE (t.fac_srtnotificatie_key, 122, t.fac_tracking_datum, t.fac_tracking_datum - 10), 'yyyy') || '/' || TO_CHAR (f.cnt_contract_key) jaarkey, -- Oude bepaling boekmaand!
                              COALESCE (f.fin_factuur_totaal, 0) + COALESCE (f.fin_factuur_totaal_btw, 0) reeds_gefactureerd,
                              DECODE (f.fin_factuur_statuses_key, 6, 0, COALESCE (f.fin_factuur_totaal, 0) + COALESCE (f.fin_factuur_totaal_btw, 0)) reeds_verwerkt,
                              0 reeds_verantwoord
                         FROM fin_factuur f,
                              (  SELECT fac_tracking_refkey, MAX (fac_srtnotificatie_key) fac_srtnotificatie_key, MAX (fac_tracking_datum) fac_tracking_datum
                                   FROM fac_tracking
                                  WHERE fac_srtnotificatie_key IN (122, 128) -- FINFOK/FINVER
                               GROUP BY fac_tracking_refkey) t
                        WHERE f.cnt_contract_key IS NOT NULL
                              AND f.fin_factuur_statuses_key IN (6, 7) -- Akkoord/Verwerkt
                              AND f.fin_factuur_key = t.fac_tracking_refkey
                              AND t.fac_tracking_datum < TO_DATE ('04042018 05:05', 'ddmmyyyy hh24:mi')
                       UNION ALL
                       SELECT SUBSTR (f.fin_factuur_boekmaand, 1, 4) || '/' || TO_CHAR (f.cnt_contract_key) jaarkey, -- Nieuwe bepaling boekmaand!
                              COALESCE (f.fin_factuur_totaal, 0) + COALESCE (f.fin_factuur_totaal_btw, 0) reeds_gefactureerd,
                              DECODE (f.fin_factuur_statuses_key, 6, 0, COALESCE (f.fin_factuur_totaal, 0) + COALESCE (f.fin_factuur_totaal_btw, 0)) reeds_verwerkt,
                              0 reeds_verantwoord
                         FROM fin_factuur f,
                              (  SELECT fac_tracking_refkey, MAX (fac_srtnotificatie_key) fac_srtnotificatie_key, MAX (fac_tracking_datum) fac_tracking_datum
                                   FROM fac_tracking
                                  WHERE fac_srtnotificatie_key IN (122, 128) -- FINFOK/FINVER
                               GROUP BY fac_tracking_refkey) t
                        WHERE f.cnt_contract_key IS NOT NULL
                              AND f.fin_factuur_statuses_key IN (6, 7) -- Akkoord/Verwerkt
                              AND f.fin_factuur_key = t.fac_tracking_refkey
                              AND t.fac_tracking_datum > TO_DATE ('04042018 05:05', 'ddmmyyyy hh24:mi')
                       UNION ALL
                       SELECT SUBSTR (fac_usrdata_code, 1, 4) || SUBSTR (fac_usrdata_code, INSTR (fac_usrdata_code, '/')) jaarkey,
                              0 reeds_gefactureerd,
                              0 reeds_verwerkt,
                              COALESCE (fac_usrdata_prijs, 0) reeds_verantwoord
                         FROM fac_v_aanwezigusrdata
                        WHERE fac_usrtab_key = 81)           -- VasteKostenMnd
             GROUP BY jaarkey) verantw,
            prs_kostensoort ksc,
            prs_kostensoortgrp ksgc,
            ins_tab_discipline td,
            prs_kostensoort ksd,
            prs_kostensoortgrp ksgd,
            prs_kostenplaats kp,
            prs_bedrijf lev,
            prs_v_afdeling_boom ab,
            (SELECT cp.cnt_contract_key, l.alg_locatie_code
               FROM cnt_v_aanwezigcontract_plaats cp, alg_gebouw g, alg_locatie l
              WHERE cp.cnt_alg_plaats_code = 'G'
                    AND cp.cnt_alg_plaats_key = g.alg_gebouw_key
                    AND g.alg_locatie_key = l.alg_locatie_key
             UNION
             SELECT cp.cnt_contract_key, l.alg_locatie_code
               FROM cnt_v_aanwezigcontract_plaats cp, alg_locatie l
              WHERE cp.cnt_alg_plaats_code = 'L'
                    AND cp.cnt_alg_plaats_key = l.alg_locatie_key) cp
      WHERE c.jaarkey = verantw.jaarkey(+)
            AND c.prs_kostensoort_key = ksc.prs_kostensoort_key(+)
            AND ksc.prs_kostensoortgrp_key = ksgc.prs_kostensoortgrp_key(+)
            AND c.ins_discipline_key = td.ins_discipline_key
            AND td.prs_kostensoort_key = ksd.prs_kostensoort_key(+)
            AND ksd.prs_kostensoortgrp_key = ksgd.prs_kostensoortgrp_key(+)
            AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
            AND c.cnt_prs_bedrijf_key = lev.prs_bedrijf_key
            AND c.prs_afdeling_key_eig = ab.prs_afdeling_key(+)
            AND (c.cnt_contract_verwijder IS NULL OR COALESCE (verantw.reeds_gefactureerd, 0) <> 0 OR COALESCE (verantw.reeds_verantwoord, 0) <> 0)
            AND c.cnt_contract_key = cp.cnt_contract_key(+)
   GROUP BY TO_CHAR (c.jaar, 'yyyy'),
            DECODE (SUBSTR (td.ins_discipline_omschrijving, 1, 2), 'CV', 'CV', 'C') || c.cnt_contract_nummer_intern || DECODE (c.cnt_contract_versie, NULL, '', '.' || TO_CHAR (c.cnt_contract_versie)),
            DECODE (SUBSTR (td.ins_discipline_omschrijving, 1, 2), 'CV', 'CV', 'C'),
            lev.prs_bedrijf_naam,
            lev.prs_leverancier_nr,
            c.cnt_contract_kosten,
            verantw.reeds_gefactureerd,
            DECODE (SUBSTR (td.ins_discipline_omschrijving, 1, 2), 'CV', verantw.reeds_verwerkt, verantw.reeds_verantwoord),
            COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL),
            kp.prs_kostenplaats_nr,
            DECODE (ab.prs_afdeling_key1, 82, 'VL', 81, 'KC', NULL),
            c.cnt_contract_looptijd_tot,
            12 * c.cnt_contract_termijnkosten,
            ROUND (MONTHS_BETWEEN (LEAST (TRUNC (c.cnt_contract_looptijd_tot), ADD_MONTHS (c.jaar, 12) - 1), GREATEST (TRUNC (c.cnt_contract_looptijd_van), c.jaar)), 0) * c.cnt_contract_termijnkosten
   UNION ALL -- Facturatie/verantwoording op verlopen contracten (in jaren né cnt_contract_looptijd_tot)!
     SELECT SUBSTR (verantw.jaarkey, 1, 4) jaar,
            DECODE (SUBSTR (td.ins_discipline_omschrijving, 1, 2), 'CV', 'CV', 'C') || c.cnt_contract_nummer_intern || DECODE (c.cnt_contract_versie, NULL, '', '.' || TO_CHAR (c.cnt_contract_versie)) contractnummer,
            DECODE (SUBSTR (td.ins_discipline_omschrijving, 1, 2), 'CV', 'CV', 'C') cf_of_cv,
            lev.prs_bedrijf_naam leverancier,
            lev.prs_leverancier_nr leveranciersnummer,
            c.cnt_contract_kosten contractbedrag,
            verantw.reeds_gefactureerd,
            DECODE (SUBSTR (td.ins_discipline_omschrijving, 1, 2), 'CV', verantw.reeds_verwerkt, verantw.reeds_verantwoord) reeds_verantwoord,
            COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL) kostensoort,
            kp.prs_kostenplaats_nr kostenplaats,
            DECODE (ab.prs_afdeling_key1, 82, 'VL', 81, 'KC', NULL) vlkc,
            c.cnt_contract_looptijd_tot einddatum_contract,
            0 jaar_heel,                                 -- Contract verlopen!
            0 jaar_deel,                                 -- Contract verlopen!
            LISTAGG (cp.alg_locatie_code, ',') WITHIN GROUP (ORDER BY cp.alg_locatie_code) locatie
       FROM cnt_contract c,    -- Alle contracten/versies (incl. verwijderde?)
            (  SELECT jaarkey, SUM (reeds_gefactureerd) reeds_gefactureerd, SUM (reeds_verwerkt) reeds_verwerkt, SUM (reeds_verantwoord) reeds_verantwoord
                 FROM (SELECT TO_CHAR (DECODE (t.fac_srtnotificatie_key, 122, t.fac_tracking_datum, t.fac_tracking_datum - 10), 'yyyy') || '/' || TO_CHAR (f.cnt_contract_key) jaarkey, -- Oude bepaling boekmaand!
                              COALESCE (f.fin_factuur_totaal, 0) + COALESCE (f.fin_factuur_totaal_btw, 0) reeds_gefactureerd,
                              DECODE (f.fin_factuur_statuses_key, 6, 0, COALESCE (f.fin_factuur_totaal, 0) + COALESCE (f.fin_factuur_totaal_btw, 0)) reeds_verwerkt,
                              0 reeds_verantwoord
                         FROM fin_factuur f,
                              (  SELECT fac_tracking_refkey, MAX (fac_srtnotificatie_key) fac_srtnotificatie_key, MAX (fac_tracking_datum) fac_tracking_datum
                                   FROM fac_tracking
                                  WHERE fac_srtnotificatie_key IN (122, 128) -- FINFOK/FINVER
                               GROUP BY fac_tracking_refkey) t
                        WHERE f.cnt_contract_key IS NOT NULL
                              AND f.fin_factuur_statuses_key IN (6, 7) -- Akkoord/Verwerkt
                              AND f.fin_factuur_key = t.fac_tracking_refkey
                              AND t.fac_tracking_datum < TO_DATE ('04042018 05:05', 'ddmmyyyy hh24:mi')
                       UNION ALL
                       SELECT SUBSTR (f.fin_factuur_boekmaand, 1, 4) || '/' || TO_CHAR (f.cnt_contract_key) jaarkey, -- Nieuwe bepaling boekmaand!
                              COALESCE (f.fin_factuur_totaal, 0) + COALESCE (f.fin_factuur_totaal_btw, 0) reeds_gefactureerd,
                              DECODE (f.fin_factuur_statuses_key, 6, 0, COALESCE (f.fin_factuur_totaal, 0) + COALESCE (f.fin_factuur_totaal_btw, 0)) reeds_verwerkt,
                              0 reeds_verantwoord
                         FROM fin_factuur f,
                              (  SELECT fac_tracking_refkey, MAX (fac_srtnotificatie_key) fac_srtnotificatie_key, MAX (fac_tracking_datum) fac_tracking_datum
                                   FROM fac_tracking
                                  WHERE fac_srtnotificatie_key IN (122, 128) -- FINFOK/FINVER
                               GROUP BY fac_tracking_refkey) t
                        WHERE f.cnt_contract_key IS NOT NULL
                              AND f.fin_factuur_statuses_key IN (6, 7) -- Akkoord/Verwerkt
                              AND f.fin_factuur_key = t.fac_tracking_refkey
                              AND t.fac_tracking_datum > TO_DATE ('04042018 05:05', 'ddmmyyyy hh24:mi')
                       UNION ALL
                       SELECT SUBSTR (fac_usrdata_code, 1, 4) || SUBSTR (fac_usrdata_code, INSTR (fac_usrdata_code, '/')) jaarkey,
                              0 reeds_gefactureerd,
                              0 reeds_verwerkt,
                              COALESCE (fac_usrdata_prijs, 0) reeds_verantwoord
                         FROM fac_v_aanwezigusrdata
                        WHERE fac_usrtab_key = 81)           -- VasteKostenMnd
             GROUP BY jaarkey) verantw,
            prs_kostensoort ksc,
            prs_kostensoortgrp ksgc,
            ins_tab_discipline td,
            prs_kostensoort ksd,
            prs_kostensoortgrp ksgd,
            prs_kostenplaats kp,
            prs_bedrijf lev,
            prs_v_afdeling_boom ab,
            (SELECT cp.cnt_contract_key, l.alg_locatie_code
               FROM cnt_v_aanwezigcontract_plaats cp, alg_gebouw g, alg_locatie l
              WHERE cp.cnt_alg_plaats_code = 'G'
                    AND cp.cnt_alg_plaats_key = g.alg_gebouw_key
                    AND g.alg_locatie_key = l.alg_locatie_key
             UNION
             SELECT cp.cnt_contract_key, l.alg_locatie_code
               FROM cnt_v_aanwezigcontract_plaats cp, alg_locatie l
              WHERE cp.cnt_alg_plaats_code = 'L'
                    AND cp.cnt_alg_plaats_key = l.alg_locatie_key) cp
      WHERE TO_CHAR (c.cnt_contract_key) = SUBSTR (verantw.jaarkey, INSTR (verantw.jaarkey, '/') + 1)
            AND TO_CHAR (c.cnt_contract_looptijd_tot, 'yyyy') < SUBSTR (verantw.jaarkey, 1, 4)
            AND c.prs_kostensoort_key = ksc.prs_kostensoort_key(+)
            AND ksc.prs_kostensoortgrp_key = ksgc.prs_kostensoortgrp_key(+)
            AND c.ins_discipline_key = td.ins_discipline_key
            AND td.prs_kostensoort_key = ksd.prs_kostensoort_key(+)
            AND ksd.prs_kostensoortgrp_key = ksgd.prs_kostensoortgrp_key(+)
            AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
            AND c.cnt_prs_bedrijf_key = lev.prs_bedrijf_key
            AND c.prs_afdeling_key_eig = ab.prs_afdeling_key(+)
            AND c.cnt_contract_key = cp.cnt_contract_key(+)
   GROUP BY SUBSTR (verantw.jaarkey, 1, 4),
            DECODE (SUBSTR (td.ins_discipline_omschrijving, 1, 2), 'CV', 'CV', 'C') || c.cnt_contract_nummer_intern || DECODE (c.cnt_contract_versie, NULL, '', '.' || TO_CHAR (c.cnt_contract_versie)),
            DECODE (SUBSTR (td.ins_discipline_omschrijving, 1, 2), 'CV', 'CV', 'C'),
            lev.prs_bedrijf_naam,
            lev.prs_leverancier_nr,
            c.cnt_contract_kosten,
            verantw.reeds_gefactureerd,
            DECODE (SUBSTR (td.ins_discipline_omschrijving, 1, 2), 'CV', verantw.reeds_verwerkt, verantw.reeds_verantwoord),
            COALESCE (ksgc.prs_kostensoortgrp_altcode, ksgd.prs_kostensoortgrp_altcode, NULL),
            kp.prs_kostenplaats_nr,
            DECODE (ab.prs_afdeling_key1, 82, 'VL', 81, 'KC', NULL),
            c.cnt_contract_looptijd_tot,
            0,
            0;

-- VLKC#40302: Export van import-bestand met de kolommen:
-- '%Personeelsnummer;Loginnaam;Achternaam;Tussenvoegsel;Voorletters;Voornaam;Afdelingscode;Functie;Email;Telefoonnr;Mobiel;Stamplaats%');
/* Formatted on 31-5-2017 11:35:05 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW vlkc_v_rap_import_prs
(
   personeelsnummer,
   loginnaam,
   achternaam,
   tussenvoegsel,
   voorletters,
   voornaam,
   afdelingscode,
   functie,
   email,
   telefoonnr,
   mobiel,
   stamplaats
)
AS
   SELECT p.prs_perslid_nr,
          p.prs_perslid_oslogin,
          p.prs_perslid_naam,
          p.prs_perslid_tussenvoegsel,
          p.prs_perslid_voorletters,
          p.prs_perslid_voornaam,
          a.prs_afdeling_naam,
          sp.prs_srtperslid_omschrijving,
          p.prs_perslid_email,
          p.prs_perslid_telefoonnr,
          p.prs_perslid_mobiel,
          NULL standplaats
     FROM prs_v_aanwezigperslid p,
          prs_v_afdeling_boom ab,
          prs_afdeling a,
          prs_kostenplaats kp,
          prs_srtperslid sp
    WHERE p.prs_perslid_nr IS NOT NULL
          AND p.prs_afdeling_key = ab.prs_afdeling_key
          AND ab.prs_afdeling_key = a.prs_afdeling_key
          AND a.prs_kostenplaats_key = kp.prs_kostenplaats_key
          AND p.prs_srtperslid_key = sp.prs_srtperslid_key;


-- Dummy export NACHTWERK!
CREATE OR REPLACE PROCEDURE vlkc_select_nachtwerk (p_applname   IN VARCHAR2,
                                                   p_applrun    IN VARCHAR2)
AS
   -- Cursor loopt over alle bestelopdracht-items met status 'In bestelling';
   -- deze worden verondersteld te zijn geleverd na 'leverdagen'+'notidagen'!
   CURSOR cboi
   IS
      SELECT DISTINCT bo.bes_bestelopdr_key
        FROM bes_bestelopdr bo,
             bes_bestelopdr_item boi,
             bes_bestelling_item bi,
             bes_bestelling b,
             bes_srtdeel sd,
             bes_srtgroep sg,
             bes_disc_params bdp
       WHERE bo.bes_bestelopdr_status = 4                     -- In bestelling
             AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key
             AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key
             AND bi.bes_bestelling_key = b.bes_bestelling_key
             AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
             AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
             --AND sg.ins_discipline_key = -1
             AND sg.ins_discipline_key = bdp.bes_ins_discipline_key
             AND bdp.bes_disc_params_noti_dagen IS NOT NULL
             AND (b.bes_bestelling_datum IS NULL OR fac.datumtijdplusuitvoertijd (b.bes_bestelling_leverdatum, bdp.bes_disc_params_noti_dagen, 'DAGEN') < SYSDATE);

   -- Cursor loopt over alle bestelling-items met status 'Besteld' waarvan
   -- de bijbehorende bestelopdracht-items zijn geleverd; deze worden dan ook
   -- gesloten!
   CURSOR cbi
   IS
      SELECT DISTINCT b.bes_bestelling_key
        FROM bes_bestelling b,
             bes_bestelling_item bi,
             bes_bestelopdr_item boi
       WHERE b.bes_bestelling_status = 5                            -- Besteld
             AND b.bes_bestelling_key = bi.bes_bestelling_key
             --AND bi.bes_bestelling_item_aantal != COALESCE (bi.bes_bestelling_item_aantalontv, 0)
             AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
             AND boi.bes_bestelopdr_item_aantal = boi.bes_bestelopdr_item_aantalontv;

   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
   v_errormsg := 'Fout leveren bestelopdracht';

   FOR rec IN cboi
   LOOP
      -- Zeg dat alles geleverd is wat besteld is.
      UPDATE bes_bestelopdr_item
         SET bes_bestelopdr_item_aantalontv = bes_bestelopdr_item_aantal
       WHERE bes_bestelopdr_key = rec.bes_bestelopdr_key;

      bes.updatebestelopdrstatus (rec.bes_bestelopdr_key, NULL);
   END LOOP;

   v_errormsg := 'Fout sluiten bestelaanvraag';

   FOR rec IN cbi
   LOOP
      -- Sluit alle aanvraagregels af die nu geheel geleverd zijn.
      UPDATE bes_bestelling_item
         SET bes_bestelling_item_aantalontv = bes_bestelling_item_aantal
       WHERE bes_bestelling_key = rec.bes_bestelling_key;

      bes.updatebestellingstatus (rec.bes_bestelling_key, NULL);
   END LOOP;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.writelog (p_applname, 'E', 'Proces NACHTWERK afgebroken!', v_errormsg);
END vlkc_select_nachtwerk;
/


-- view tbv kenmerkdomein
CREATE OR REPLACE VIEW vlkc_v_alg_gebouw
(
   alg_gebouw_key,
   alg_gebouw_omschrijving,
   alg_gebouw_verw
)
AS
   SELECT alg_gebouw_key,
          alg_gebouw_omschrijving,
          COALESCE (alg_gebouw_verwijder, alg_gebouw_vervaldatum)
             alg_gebouw_verw
     FROM alg_gebouw;

-- view tbv kenmerkdomein
CREATE OR REPLACE VIEW vlkc_v_prs_dienst
(
   prs_dienst_key,
   prs_dienst_omschrijving
)
AS
   SELECT prs_dienst_key, prs_dienst_omschrijving FROM prs_dienst;

CREATE OR REPLACE VIEW vlkc_v_rap_keyvsfe
(
   soort_gebruiker,
   naam,
   loginnaam,
   laatste_login
)
AS
   SELECT DECODE (key_user, 1, 'KEY', 'FE'),
          pf.prs_perslid_naam_full,
          oslogin,
          prs_perslid_login
     FROM (SELECT *
             FROM (SELECT p.prs_perslid_key prs_key,
                          COALESCE (p.prs_perslid_oslogin,
                                    p.prs_perslid_oslogin2)
                             oslogin,
                          1 login,     -- 1=user heeft login + groep + rechten
                          DECODE (
                             SIGN(TRUNC(COALESCE (p.prs_perslid_login + 92,
                                                  SYSDATE - 1))
                                  - TRUNC (SYSDATE)),
                             -1,
                             0,
                             1)      -- 1=user heeft laatste 92 dagen ingelogd
                             recent_login
                     FROM prs_v_aanwezigperslid p
                    WHERE EXISTS       -- op basis van login + groep + rechten
                             (SELECT 1
                                FROM fac_v_webgebruiker gg
                               WHERE gg.prs_perslid_key = p.prs_perslid_key)
                          AND NOT EXISTS -- FSN#36597: WEB_FACFAC-users niet meetellen!
                                (SELECT 1
                                   FROM fac_v_webgebruiker gg, fac_functie f
                                  WHERE gg.prs_perslid_key =
                                           p.prs_perslid_key
                                        AND gg.fac_functie_key =
                                              f.fac_functie_key
                                        AND fac_functie_code = 'WEB_FACFAC')
                   UNION ALL -- FSN#24029: Soms ook personen zonder login meetellen!
                   SELECT p.prs_perslid_key,
                          NULL oslogin,
                          1 login,  -- 1=user telt mee, want allow_for_others!
                          0 recent_login -- geen login, dus nooit recent ingelogd
                     FROM prs_v_aanwezigperslid p
                    WHERE COALESCE (p.prs_perslid_oslogin,
                                    p.prs_perslid_oslogin2) IS NULL
                          AND (fac.getsetting ('mld_allow_for_others') = 1
                               OR EXISTS
                                    (SELECT 1
                                       FROM bes_disc_params dp
                                      WHERE dp.bes_disc_params_for_others = 1))
                   UNION ALL -- FSN#27315: En ook eventuele "sensorusers" meetellen!
                   SELECT NULL prs_perslid_key,
                          NULL oslogin,
                          COUNT ( * ) login, -- elke sensoruser telt mee als FE!
                          1 recent_login -- recent actief dus tellen als recent
                     FROM ins_v_aanwezigdeel d
                    WHERE ins_deel_statedate > TRUNC (SYSDATE - 30)) x
                  LEFT JOIN   -- 1=user heeft rechten op key-codes=notFE-codes
                            (SELECT DISTINCT fclt_f_login, 1 key_user
                               FROM fac_v_rap_groeprechten gr, fac_functie f
                              WHERE gr.fclt_f_funcode = f.fac_functie_code
                                    AND f.fac_functie_groep IN (1, 2)) a
                     ON x.oslogin = a.fclt_f_login
                  LEFT JOIN     -- FSN#30404: 1=user is cross-domain (xd) user
                            (SELECT p.prs_perslid_key, 1 xd_user
                               FROM prs_v_aanwezigperslid p,
                                    prs_v_afdeling_boom ab
                              WHERE p.prs_afdeling_key = ab.prs_afdeling_key
                                    AND p.prs_perslid_apikey IS NOT NULL
                                    AND ab.prs_bedrijf_key =
                                          fac.safe_to_number(fac.getsetting('xd_primary_bedrijfkey')))
                            b
                     ON x.prs_key = b.prs_perslid_key) st,
          prs_perslid p,
          prs_v_perslid_fullnames pf
    WHERE     login = 1
          AND p.prs_perslid_key = st.prs_key
          AND pf.prs_perslid_key = p.prs_perslid_key;

CREATE OR REPLACE VIEW vlkc_v_rap_cnttrack
(
   wijzig_datum,
   wijziging,
   gewijzigd_door,
   cnt_contract_key,
   contract_nummer,
   contract_nummer_extern,
   contract_versie,
   contractsoort,
   omschrijving,
   ingangsdatum,
   einddatum,
   contractbedrag,
   termijnkosten,
   beheerder,
   status,
   bedrijf,
   leveranciernr,
   kostensoort
)
AS
   SELECT fac_tracking_datum,
          REPLACE (fac_tracking_oms, 'Contract gewijzigd' || CHR (10), '')
             wijziging,
          pf2.prs_perslid_naam_full gewijzigd_door,
          cnt_contract_key,
          COALESCE (cnt_contract_nummer_intern, TO_CHAR (cnt_contract_key))
             contract_nummer,
          cnt_contract_nummer,
          cnt_contract_versie,
          cd.ins_discipline_omschrijving,
          cnt_contract_omschrijving,
          cnt_contract_looptijd_van,
          cnt_contract_looptijd_tot,
          cnt_contract_kosten,
          cnt_contract_termijnkosten,
          pf.prs_perslid_naam_full beheerder,
          cnt_contract_status,
          b.prs_bedrijf_naam,
          b.prs_leverancier_nr,
          COALESCE (cks.prs_kostensoort_omschr, sks.prs_kostensoort_omschr)
             kostensoort
     FROM cnt_contract c,
          fac_tracking ft,
          fac_srtnotificatie sn,
          prs_v_perslid_fullnames pf,
          prs_v_perslid_fullnames pf2,
          cnt_discipline cd,
          prs_bedrijf b,
          (SELECT prs_kostensoort_key,
                  prs_kostensoort_oms || '-' || prs_kostensoort_opmerking
                     prs_kostensoort_omschr
             FROM prs_kostensoort) sks,
          (SELECT prs_kostensoort_key,
                  prs_kostensoort_oms || '-' || prs_kostensoort_opmerking
                     prs_kostensoort_omschr
             FROM prs_kostensoort) cks
    WHERE     cnt_contract_verwijder IS NULL
          AND c.cnt_contract_key = ft.fac_tracking_refkey
          AND ft.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
          AND fac_srtnotificatie_xmlnode = 'contract'
          AND (   UPPER (fac_tracking_oms) LIKE '%TERMIJNBEDRAG%'
               OR UPPER (fac_tracking_oms) LIKE '%INGANGSDATUM%'
               OR UPPER (fac_tracking_oms) LIKE '%EINDDATUM%')
          AND pf.prs_perslid_key = prs_perslid_key_beh
          AND ft.prs_perslid_key = pf2.prs_perslid_key(+)
          AND cd.ins_discipline_key = c.ins_discipline_key
          AND b.prs_bedrijf_key(+) = cnt_prs_bedrijf_key
          AND cd.prs_kostensoort_key = sks.prs_kostensoort_key(+)
          AND c.prs_kostensoort_key = cks.prs_kostensoort_key(+);

-- VLKC#54894: Rapportage tbv. doorbelasting parkeerpassen!
CREATE OR REPLACE VIEW vlkc_v_rap_bez_parkeerpas
(
   afspraakmaand,
   afspraakdatum,
   afspraakdatum_van,
   afspraakdatum_tot,
   afspraaknr,                                                -- Niet gevraagd
   parkeerpasnummer,                                            -- 23-cijferig
   contactpersoon,                                            -- Niet gevraagd
   gastheer,                                                  -- Niet gevraagd
   bezoeker,
   opmerking,                                                 -- Niet gevraagd
   kostenplaats,
   kostenplaats_bezoeker,
   kostenplaats_gastheer,
   locatie,
   bez_afspraak_key
)
AS
   SELECT TO_CHAR (x.bez_afspraak_datum, 'yyyy-mm') maand,
          x.bez_afspraak_datum,
          x.bez_afspraak_datum van,
          x.bez_afspraak_eind tot,
          TO_CHAR (x.bez_afspraak_key) afspraaknr,
          pp.bez_kenmerkwaarde_waarde parkeerpasnummer,
          x.contactpersoon,
          x.gastheer,
          x.bez_afspraak_naam,
          x.bez_afspraak_opmerking,
          COALESCE (kpb.prs_kostenplaats_nr, kph.prs_kostenplaats_nr) kp,
          kpb.prs_kostenplaats_nr kp_bezoeker,
          DECODE (pb.prs_perslid_key, NULL, kph.prs_kostenplaats_nr, NULL) kp_gastheer,
          l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')',
          x.bez_afspraak_key
     FROM (SELECT a.bez_afspraak_key,
                  a.bez_afspraak_datum,
                  a.bez_afspraak_eind,
                  a.bez_afspraak_opmerking,
                  a.bez_afspraak_host_key,
                  a.alg_locatie_key,
                  b.bez_bezoekers_key,
                  b.bez_afspraak_naam,
                  b.prs_perslid_key,
                  pc.prs_perslid_naam_full contactpersoon,
                  ph.prs_perslid_naam_full gastheer
             FROM bez_afspraak a,
                  bez_bezoekers b,
                  prs_v_perslid_fullnames_all pc,
                  prs_v_perslid_fullnames_all ph
            WHERE a.bez_afspraak_key = b.bez_afspraak_key
                  AND a.bez_afspraak_contact_key = pc.prs_perslid_key
                  AND a.bez_afspraak_host_key = ph.prs_perslid_key) x
          LEFT JOIN prs_perslid pb
             ON x.prs_perslid_key = pb.prs_perslid_key
          LEFT JOIN prs_afdeling ab
             ON pb.prs_afdeling_key = ab.prs_afdeling_key
          LEFT JOIN prs_kostenplaats kpb
             ON ab.prs_kostenplaats_key = kpb.prs_kostenplaats_key
          LEFT JOIN prs_perslid ph
             ON x.bez_afspraak_host_key = ph.prs_perslid_key
          LEFT JOIN prs_afdeling ah
             ON ph.prs_afdeling_key = ah.prs_afdeling_key
          LEFT JOIN prs_kostenplaats kph
             ON ah.prs_kostenplaats_key = kph.prs_kostenplaats_key
          LEFT JOIN bez_kenmerkwaarde pp
             ON x.bez_bezoekers_key = pp.bez_bezoekers_key
                AND pp.bez_kenmerkwaarde_verwijder IS NULL
                AND pp.bez_kenmerk_key = 1040                    -- Parkeerpas
          LEFT JOIN alg_locatie l
             ON x.alg_locatie_key = l.alg_locatie_key
    WHERE x.bez_afspraak_datum > TO_DATE ('01-01-2019', 'dd-mm-yyyy')
          AND x.bez_afspraak_datum > TRUNC (ADD_MONTHS (SYSDATE, -12), 'yyyy')
          AND pp.bez_kenmerkwaarde_waarde IS NOT NULL;

CREATE OR REPLACE VIEW vlkc_v_rap_groepleden_plus
(
   prs_perslid_key,
   login,
   naam,
   bedrijf_naam,
   locatie_omschrijving,
   locatie_code,
   gebouw_omschrijving,
   gebouw_code,
   ruimte_aanduiding,
   groep,
   aantal_rechten
)
AS
   SELECT autr.prs_perslid_key,
          prs_perslid_oslogin,
          prs_perslid_naam,
          prs_bedrijf_naam,
          alg_locatie_omschrijving,
          alg_locatie_code,
          alg_gebouw_omschrijving,
          alg_gebouw_code,
          alg_ruimte_aanduiding,
          fac_groep_omschrijving,
          aantal_rechten
     FROM (  SELECT p.prs_perslid_key,
                    p.prs_perslid_naam,
                    p.prs_perslid_oslogin,
                    gr.fac_groep_omschrijving,
                    fac.safe_to_number (COUNT ( * )) aantal_rechten
               FROM fac_gebruikersgroep gg,
                    prs_v_aanwezigperslid p,
                    fac_groep gr,
                    fac_groeprechten grr
              WHERE     p.prs_perslid_key = gg.prs_perslid_key
                    AND gg.fac_groep_key = gr.fac_groep_key
                    AND gr.fac_groep_key = grr.fac_groep_key
           GROUP BY p.prs_perslid_key,
                    p.prs_perslid_naam,
                    p.prs_perslid_oslogin,
                    gr.fac_groep_omschrijving) autr,
          (SELECT prs_perslid_key, prs_bedrijf_naam
             FROM prs_contactpersoon pcp, prs_bedrijf b
            WHERE     prs_contactpersoon_verwijder IS NULL
                  AND pcp.prs_bedrijf_key = b.prs_bedrijf_key
                  AND prs_perslid_key IS NOT NULL
                  AND b.prs_bedrijf_verwijder IS NULL) cp,
          (SELECT pwp.prs_perslid_key,
                  l.alg_locatie_omschrijving,
                  l.alg_locatie_code,
                  pw.alg_gebouw_code,
                  pw.alg_gebouw_omschrijving,
                  pw.alg_ruimte_aanduiding
             FROM prs_perslidwerkplek pwp,
                  prs_v_werkplek_gegevens pw,
                  alg_locatie l
            WHERE     pwp.prs_werkplek_key = pw.prs_werkplek_key
                  AND pw.alg_locatie_key = l.alg_locatie_key
                  AND alg_locatie_verwijder IS NULL) wp
    WHERE cp.prs_perslid_key(+) = autr.prs_perslid_key
          AND wp.prs_perslid_key(+) = autr.prs_perslid_key;

-- VLKC#56903: Rapportage factuurgoedkeuring
CREATE OR REPLACE VIEW vlkc_v_rap_factuurgoedkeuring
(
   factuurdatum,
   fin_factuur_key,
   factuurnummer,
   uitvoerende,
   opdrachtnummer,
   bedrag_excl_btw,
   bedrag_incl_btw,
   status,
   verdeelperiode,
   kostensoort_code,
   kostensoort_oms,
   goedgekeurd,
   verwerkt
)
AS
   SELECT f.fin_factuur_datum,
          f.fin_factuur_key,
          f.fin_factuur_nr,
          (SELECT prs_bedrijf_naam
             FROM prs_bedrijf
            WHERE prs_bedrijf_key = COALESCE (o.mld_uitvoerende_keys, c.cnt_prs_bedrijf_key, bo.prs_bedrijf_key))
             uitvoerende,
          COALESCE (
             NVL2 (f.mld_opdr_key, sd.ins_srtdiscipline_prefix || TO_CHAR (o.mld_melding_key) || '/' || o.mld_opdr_bedrijfopdr_volgnr, NULL),
             NVL2 (f.cnt_contract_key, 'C' || c.cnt_contract_nummer_intern || NVL2 (c.cnt_contract_versie, '.' || c.cnt_contract_versie, ''), NULL),
             NVL2 (f.bes_bestelopdr_key, bo.bes_bestelopdr_id, NULL),
             NULL)
             opdrachtnr,
          f.fin_factuur_totaal bedrag_excl_btw,
          f.fin_factuur_totaal + f.fin_factuur_totaal_btw bedrag_incl_btw,
          fs.fin_factuur_statuses_omschr,
          f.fin_factuur_boekmaand,
          ks.prs_kostensoort_oms,
          ks.prs_kostensoort_opmerking,
          fac.gettrackingdate ('FINFOK', f.fin_factuur_key) goedgekeurd,
          fac.gettrackingdate ('FINVER', f.fin_factuur_key) verwerkt
     FROM fin_factuur f,
          mld_opdr o,
          mld_melding m,
          mld_discipline d,
          mld_stdmelding sm,
          ins_srtdiscipline sd,
          cnt_contract c,
          cnt_discipline cd,
          bes_bestelopdr bo,
          fin_factuur_statuses fs,
          prs_kostensoort ks
    WHERE f.fin_factuur_datum > TRUNC (ADD_MONTHS (SYSDATE, -12), 'yyyy')
          AND f.mld_opdr_key = o.mld_opdr_key(+)
          AND o.mld_melding_key = m.mld_melding_key(+)
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key(+)
          AND sm.mld_ins_discipline_key = d.ins_discipline_key(+)
          AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key(+)
          AND f.cnt_contract_key = c.cnt_contract_key(+)
          AND c.ins_discipline_key = cd.ins_discipline_key(+)
          AND f.bes_bestelopdr_key = bo.bes_bestelopdr_key(+)
          AND f.fin_factuur_statuses_key = fs.fin_factuur_statuses_key(+)
          AND f.prs_kostensoort_key = ks.prs_kostensoort_key(+);

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

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

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