--
-- $Id$
--
-- Script containing customer generic configuration sql statements for AAFM

DEFINE thisfile = 'AAXX.SQL'
DEFINE dbuser   = '^AA|^ASMS|^GULU|^NMMS|^RABO|^ZKHM'

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

@@aa_prs_pack.sql;

--=============================================================================
-- EXPORTFUNCTIES GENERIEK
-------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION aaxx_exp_escape (a VARCHAR2) RETURN VARCHAR2
AS
BEGIN
  RETURN replace(a, '"', '''');
END aaxx_exp_escape;
/

CREATE OR REPLACE FUNCTION aaxx_get_user
   RETURN VARCHAR2
AS
   v_user   VARCHAR2 (20);
BEGIN
   v_user   := SUBSTR (USER, 1, 4);
   IF v_user = 'AAAH' THEN RETURN 'AH'; END IF;
   IF v_user = 'AAAR' THEN RETURN 'ARCADIS'; END IF;
   IF v_user = 'AADO' THEN RETURN 'DOW'; END IF;
   IF v_user = 'AADB' THEN RETURN 'DBS'; END IF;
   IF v_user = 'AADS' THEN RETURN 'DSM'; END IF;
   IF v_user = 'AAEN' THEN RETURN 'ENEXIS'; END IF;
   IF v_user = 'AAES' THEN RETURN 'ESSENT'; END IF;
   IF v_user = 'AAEY' THEN RETURN 'EY'; END IF;
   IF v_user = 'AAFP' THEN RETURN 'FPC'; END IF;
   IF v_user = 'AAHU' THEN RETURN 'HUNTSMAN'; END IF;
   IF v_user = 'AAGN' THEN RETURN 'GN'; END IF;
   IF v_user = 'AAIT' THEN RETURN 'IT'; END IF;
   IF v_user = 'AALB' THEN RETURN 'LB'; END IF;
   IF v_user = 'AANS' THEN RETURN 'NS';  END IF;
   IF v_user = 'AAPM' THEN RETURN 'PM'; END IF;
   IF v_user = 'AARW' THEN RETURN 'RWS'; END IF;
   IF v_user = 'AASA' THEN RETURN 'SABIC'; END IF;
   IF v_user = 'AASI' THEN RETURN 'SITECH'; END IF;
   IF v_user = 'AAVG' THEN RETURN 'VG'; END IF;
   IF v_user = 'AAVL' THEN RETURN 'VL'; END IF;
   IF v_user = 'AAZC' THEN RETURN 'ZCN'; END IF;
   IF v_user = 'ASMS' THEN RETURN 'AMS'; END IF;
   IF v_user = 'GULU' THEN RETURN 'GUL'; END IF;
   IF v_user = 'NMMS' THEN RETURN 'NMM'; END IF;
   IF v_user = 'RABO' THEN RETURN 'RABO'; END IF;
   IF v_user = 'ZKHM' THEN RETURN 'ZKHM'; END IF;
   RETURN '';
END aaxx_get_user;
/

-- functie om geimporteerde bedragen te converteren naar getallen.
CREATE OR REPLACE FUNCTION aaxx_get_imp_float (f_float VARCHAR2)
   RETURN NUMBER
AS
   v_komma_pos    NUMBER;
   v_punt_pos     NUMBER;
   v_float_text   VARCHAR2 (100);
BEGIN
   v_punt_pos := INSTR (f_float, '.');
   v_komma_pos := INSTR (f_float, ',');

   IF v_punt_pos <> 0 AND v_komma_pos <> 0
   THEN
      IF v_punt_pos > v_komma_pos
      THEN
         v_float_text := REPLACE (f_float, ',', '');
      ELSE
         v_float_text := REPLACE (f_float, '.', '');
      END IF;
   ELSE
      v_float_text := f_float;
   END IF;

   RETURN fac.safe_to_number (REPLACE (v_float_text, ',', '.'));
END;
/


-- view met gegevens over een bestelling en bestelopdracht
CREATE OR REPLACE VIEW aaxx_v_bestelgegevens
AS
   SELECT boi.bes_bestelopdr_key,
          bes_bestelopdr_id,
          sg.ins_discipline_key,
          be.mld_adres_key_lev,
          be.bes_bestelling_leverdatum,
          bo.prs_bedrijf_key
     FROM bes_bestelling be,
          bes_bestelling_item bi,
          bes_bestelopdr bo,
          bes_bestelopdr_item boi,
          bes_srtdeel sd,
          bes_srtgroep sg
    WHERE be.bes_bestelling_key = bi.bes_bestelling_key
      AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
      AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key
      AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
      AND sd.bes_srtgroep_key = sg.bes_srtgroep_key;


-- View om de exact code van een gebouw te bepalen.
-- Dit kenmerk heeft voor de verschillende klanten een andere key.
CREATE OR REPLACE VIEW aaxx_v_exact_code_gebouw (
  alg_gebouw_key,
  exact_code)
AS
SELECT alg_onrgoed_key alg_gebouw_key,
       alg_onrgoedkenmerk_waarde exact_code
  FROM alg_onrgoedkenmerk
 WHERE alg_onrgoed_niveau = 'G'
   AND alg_kenmerk_key = DECODE(aaxx_get_user,
                                'FP', 1000,
                                'HUNTSMAN', 1040,
                                'IT', 1021,
                                'NS', 1009,
                                'SABIC', 1120,
                                'SITECH', 1200,
                                1020);

-- View om de exact code van een gebouw te bepalen op basis van een factuurkey
-- Op dit moment ondersteunen we dit alleen bij opdrachten en contracten
CREATE OR REPLACE VIEW aaxx_v_exact_code_gebouw_fac
(
   fin_factuur_key,
   exact_code
)
AS
SELECT fin_factuur_key, exact_code
  FROM fin_factuur f,
       mld_opdr o,
       mld_melding m,
       alg_v_onroerendgoed og,
       aaxx_v_exact_code_gebouw eg
 WHERE f.mld_opdr_key = o.mld_opdr_key
   AND o.mld_melding_key = m.mld_melding_key
   AND m.mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys
   AND og.alg_gebouw_key = eg.alg_gebouw_key
UNION ALL
SELECT fin_factuur_key, exact_code
  FROM fin_factuur f, cnt_contract_plaats cp, aaxx_v_exact_code_gebouw eg
 WHERE f.cnt_contract_key = cp.cnt_contract_key
   AND cp.cnt_alg_plaats_key = eg.alg_gebouw_key
   AND cp.cnt_alg_plaats_code = 'G'
UNION ALL
SELECT DISTINCT fin_factuur_key, exact_code
  FROM fin_factuur f,
       aaxx_v_bestelgegevens bg,
       mld_adres ma,
       aaxx_v_exact_code_gebouw eg,
       alg_gebouw g
 WHERE f.bes_bestelopdr_key = bg.bes_bestelopdr_key
   AND bg.mld_adres_key_lev = ma.mld_adres_key(+)
   AND ma.mld_adres_gebouw_ruimte = g.alg_gebouw_code(+)
   AND g.alg_gebouw_key = eg.alg_gebouw_key(+);

-- Functie om bij facturen met een btw tarief dat verlegd is, voor de verkoopfactuur toch een geldige
-- btw code te genereren. De klant moet namelijk wel BTW betalen.
CREATE OR REPLACE FUNCTION aaxx_get_verkoop_btw_code (p_btwtabelwaarde_key IN NUMBER) RETURN VARCHAR2
AS
   v_verlegd          NUMBER;
   v_perc             NUMBER(5,3);
   v_code             VARCHAR2(10);
   v_btwtabel_key     NUMBER;

BEGIN
   SELECT COALESCE(fin_btwtabelwaarde_verlegd,0),
          fin_btwtabelwaarde_perc,
          fin_btwtabelwaarde_code,
          fin_btwtabel_key
     INTO v_verlegd,
          v_perc,
          v_code,
          v_btwtabel_key
     FROM fin_btwtabelwaarde
    WHERE fin_btwtabelwaarde_key = p_btwtabelwaarde_key;

    IF v_verlegd = 1 THEN
       IF v_perc = 21 THEN v_code := 5; END IF;  -- Bij 21 procent staandaard code 5 teruggeven
       IF v_perc = 6 THEN v_code := 2; END IF;  -- Bij 6 procent staandaard code 2 teruggeven
    END IF;
    RETURN v_code;
END aaxx_get_verkoop_btw_code;
/

-- script om dagelijks terugkerende scripts aan te roepen. Kan aangeroepen worden vanuit de klantomgeving
-- indien er voor die klant ook specifieke zaken dagelijks geregeld moeten worden.
CREATE OR REPLACE PROCEDURE aaxx_daily_task (p_applname IN VARCHAR2, p_applrun IN VARCHAR2)
AS
BEGIN
   -- job om flexkenmerken bij projectorders in te vullen
   IF aaxx_get_user <> 'AMS' AND aaxx_get_user <> 'GUL' THEN
      aaxx_select_dwh_set_kenmerken (p_applname, p_applrun);
   END IF;

   -- job om gebruikers die recentelijk niet ingelogd zijn de rechten te ontnemen.
   -- In ieder geval niet voor: AAES, AAEN, AAVL, AAZC
   IF  --  aaxx_get_user = 'ARCADIS'  AAAR#26433
     -- OR
         aaxx_get_user = 'DOW'
      OR aaxx_get_user = 'DSM'
      OR aaxx_get_user = 'FPC'
      OR aaxx_get_user = 'HUNTSMAN'
      OR aaxx_get_user = 'LB'
  --    OR aaxx_get_user = 'NS'  AANS#25534
      OR aaxx_get_user = 'SABIC'
      OR aaxx_get_user = 'SITECH'
      OR aaxx_get_user = 'AMS'
      OR aaxx_get_user = 'GUL'
   THEN
      aaxx_delete_non_active_users (p_applname, p_applrun);
   END IF;

   -- verwijder key users met ORDBO2 rechten
   IF  --  aaxx_get_user = 'ARCADIS'  AAAR#26433
     -- OR
         aaxx_get_user = 'AH'
      OR aaxx_get_user = 'DBS'
      OR aaxx_get_user = 'DOW'
      OR aaxx_get_user = 'DSM'
      OR aaxx_get_user = 'EY'
      OR aaxx_get_user = 'LB'
  --    OR aaxx_get_user = 'NS'  AANS#25534
      OR aaxx_get_user = 'SABIC'
      OR aaxx_get_user = 'SITECH'
      OR aaxx_get_user = 'VG'
      OR aaxx_get_user = 'ZCN'
      OR aaxx_get_user = 'AMS'
      OR aaxx_get_user = 'GUL'
      OR aaxx_get_user = 'NMM'
      OR aaxx_get_user = 'RABO'
      OR aaxx_get_user = 'ZKHM'
   THEN
      aaxx_delete_non_active_key (p_applname, p_applrun);
   END IF;

   -- Haal de mensen die we zojuist de login hebben ontnomen ook uit de autorisatiegroepen.
   DELETE fac_gebruikersgroep gg
    WHERE EXISTS
             (SELECT p.prs_perslid_key
                FROM prs_perslid p
               WHERE prs_perslid_oslogin IS NULL
                 AND prs_perslid_oslogin2 IS NULL
                 AND p.prs_perslid_key = gg.prs_perslid_key);

   -- job om bij to houden welke gebruikers vandaag ingelogd zijn geweest.
   aaxx_export_login (p_applname, p_applrun);

   -- job om complimenten af te melden.
   aaxx_afmelden_complimenten (p_applname, p_applrun);

   -- job om ordercorrecties door te voeren.
   aaxx_ordercorrecties (p_applname, p_applrun);
END;
/

-- script om dagelijks terugkerende scripts aan te roepen. Indien er geen klantspecifieke versie is.
CREATE OR REPLACE PROCEDURE aaxx_select_daily_task (p_applname IN VARCHAR2, p_applrun IN VARCHAR2)
AS
BEGIN
   aaxx_daily_task (p_applname, p_applrun);
END;
/


CREATE OR REPLACE PROCEDURE aaxx_imp_writelog (
  p_import_key IN NUMBER,
  p_severity IN VARCHAR2,
  p_errormsg IN VARCHAR2,
  p_errorhint IN VARCHAR2)
AS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  fac.imp_writelog (p_import_key,
                    p_severity,
                    p_errormsg,
                    p_errorhint);
  COMMIT;
END;
/

CREATE OR REPLACE PROCEDURE aaxx_add_xml_row (
   p_bestand   IN VARCHAR2,
   p_regel     IN VARCHAR2)
AS
   v_index  NUMBER;
BEGIN
   SELECT COALESCE( MAX(fac_rapport_volgnr), 0) + 1
     INTO v_index
     FROM fac_rapport
    WHERE fac_rapport_node = p_bestand;

   INSERT INTO fac_rapport (
      fac_rapport_node,
      fac_rapport_volgnr,
      fac_rapport_regel)
   VALUES (p_bestand,
           v_index,
           p_regel);
END;
/

CREATE OR REPLACE PROCEDURE aaxx_add_xml_element (
   p_bestand   IN VARCHAR2,
   p_tag       IN VARCHAR2,
   p_value     IN VARCHAR2)
AS
BEGIN
   aaxx_add_xml_row(p_bestand,
                       '<' || p_tag || '>'
                    || xml.char_to_html(p_value)
                    || '</' || p_tag || '>');
END;
/

CREATE OR REPLACE FUNCTION aaxx_get_kenmerk (p_module        IN VARCHAR2,
                                             p_kenmerk_key   IN NUMBER,
                                             p_link_key      IN NUMBER)
   RETURN VARCHAR2
AS
   v_kenmerk_type     mld_srtkenmerk.mld_srtkenmerk_kenmerktype%TYPE;
   v_kenmerk_waarde   mld_kenmerkmelding.mld_kenmerkmelding_waarde%TYPE;
   v_kenmerkdomein_key fac_kenmerkdomein.fac_kenmerkdomein_key%TYPE;
   v_kenmerk_niveau   ins_kenmerk.ins_kenmerk_niveau%TYPE;
BEGIN
   CASE p_module
      WHEN 'MLD'
      THEN
         SELECT mld_srtkenmerk_kenmerktype,
                sk.fac_kenmerkdomein_key,
                km.mld_kenmerkmelding_waarde
           INTO v_kenmerk_type,
                v_kenmerkdomein_key,
                v_kenmerk_waarde
           FROM mld_v_aanwezigkenmerkmelding km,
                mld_kenmerk k,
                mld_srtkenmerk sk
          WHERE km.mld_melding_key = p_link_key
            AND km.mld_kenmerk_key = p_kenmerk_key
            AND km.mld_kenmerk_key = k.mld_kenmerk_key
            AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key;
      WHEN 'CNT'
      THEN
         SELECT cnt_srtkenmerk_kenmerktype,
                sk.fac_kenmerkdomein_key,
                kc.cnt_kenmerkcontract_waarde
           INTO v_kenmerk_type,
                v_kenmerkdomein_key,
                v_kenmerk_waarde
           FROM cnt_kenmerkcontract kc,
                cnt_kenmerk k,
                cnt_srtkenmerk sk
          WHERE kc.cnt_contract_key = p_link_key
            AND kc.cnt_kenmerk_key = p_kenmerk_key
            AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key
            AND k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key;
      WHEN 'ALG'
      THEN
         SELECT alg_kenmerk_kenmerktype,
                k.fac_kenmerkdomein_key,
                aogk.alg_onrgoedkenmerk_waarde
           INTO v_kenmerk_type,
                v_kenmerkdomein_key,
                v_kenmerk_waarde
           FROM alg_onrgoedkenmerk aogk, alg_kenmerk k
          WHERE aogk.alg_onrgoed_key = p_link_key
            AND aogk.alg_kenmerk_key = p_kenmerk_key
            AND aogk.alg_kenmerk_key = k.alg_kenmerk_key;
      WHEN 'INS'
      THEN
         SELECT k.ins_kenmerk_niveau
           INTO v_kenmerk_niveau
           FROM ins_kenmerk k
          WHERE ins_kenmerk_key = p_kenmerk_key;

         IF v_kenmerk_niveau = 'C' THEN
            SELECT sk.ins_srtkenmerk_kenmerktype,
                   sk.fac_kenmerkdomein_key,
                   ikds.ins_kmdeelsrtcontr_waarde
              INTO v_kenmerk_type,
                   v_kenmerkdomein_key,
                   v_kenmerk_waarde
              FROM ins_kmdeelsrtcontr ikds, ins_kenmerk k, ins_srtkenmerk sk
             WHERE ikds.ins_kmdeelsrtcontr_key = p_link_key
               AND ikds.ins_kmdeelsrtcontr_verwijder IS NULL
               AND ikds.ins_kenmerk_key = p_kenmerk_key
               AND ikds.ins_kenmerk_key = k.ins_kenmerk_key
               AND k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key;
         ELSE
            SELECT sk.ins_srtkenmerk_kenmerktype,
                   sk.fac_kenmerkdomein_key,
                   ikd.ins_kenmerkdeel_waarde
              INTO v_kenmerk_type,
                   v_kenmerkdomein_key,
                   v_kenmerk_waarde
              FROM ins_kenmerkdeel ikd, ins_kenmerk k, ins_srtkenmerk sk
             WHERE ikd.ins_deel_key = p_link_key
               AND ikd.ins_kenmerkdeel_verwijder IS NULL
               AND ikd.ins_kenmerk_key = p_kenmerk_key
               AND ikd.ins_kenmerk_key = k.ins_kenmerk_key
               AND k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key;
         END IF;
   END CASE;

   RETURN aaxx_get_kenmerkwaarde (v_kenmerk_type,
                                  v_kenmerkdomein_key,
                                  v_kenmerk_waarde);
END;
/


CREATE OR REPLACE FUNCTION aaxx_get_kenmerkwaarde (
   p_kenmerk_type VARCHAR2,
   p_kenmerkdomein_key NUMBER,
   p_kenmerk_waarde VARCHAR2)
   RETURN VARCHAR2
AS
   v_result VARCHAR2(4000);
BEGIN
	IF p_kenmerk_type = 'R' OR p_kenmerk_type = 'S' THEN
    v_result := fac.getdomeinwaarde (p_kenmerkdomein_key,
                   p_kenmerk_waarde);
  ELSIF p_kenmerk_type = 'D' THEN
    v_result := TO_CHAR (fac.safe_to_date (p_kenmerk_waarde, 'dd-mm-yyyy'), 'yyyy-mm-dd');
  ELSE
    v_result := p_kenmerk_waarde;
  END IF;
  return v_result;
END aaxx_get_kenmerkwaarde;
/

CREATE OR REPLACE PROCEDURE aaxx_set_kenmerk(p_module           IN VARCHAR2,
                                             p_kenmerk_key      IN NUMBER,
                                             p_link_key         IN NUMBER,
                                             p_kenmerk_waarde   IN VARCHAR2,
                                             p_history          IN NUMBER)
AS
   v_count          NUMBER;
   v_niveau         VARCHAR2 (1);
BEGIN
   CASE p_module
   WHEN 'PRS'
   THEN
      -- niveau van prs_kenmerk ophalen, omdat deze ook in prs_kenmerklink wordt
      -- opgeslagen (da's dus redundant..?)
      SELECT prs_kenmerk_niveau
        INTO v_niveau
        FROM prs_kenmerk
       WHERE prs_kenmerk_key = p_kenmerk_key;

      SELECT COUNT ( * )
        INTO v_count
        FROM prs_kenmerklink
       WHERE     prs_link_key = p_link_key
             AND prs_kenmerk_key = p_kenmerk_key
             AND prs_kenmerklink_verwijder IS NULL;

      IF v_count = 1
      THEN
         IF p_kenmerk_waarde IS NULL
         THEN
            DELETE prs_kenmerklink
             WHERE     prs_link_key = p_link_key
                   AND prs_kenmerk_key = p_kenmerk_key
                   AND prs_kenmerklink_verwijder IS NULL;
         ELSE
            UPDATE prs_kenmerklink
               SET prs_kenmerklink_waarde = p_kenmerk_waarde
             WHERE     prs_link_key = p_link_key
                   AND prs_kenmerk_key = p_kenmerk_key
                   AND prs_kenmerklink_verwijder IS NULL;
         END IF;
      ELSE
         IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
         THEN
            INSERT INTO prs_kenmerklink (prs_kenmerk_key,
                                         prs_link_key,
                                         prs_kenmerklink_niveau,
                                         prs_kenmerklink_waarde)
                VALUES (p_kenmerk_key,
                        p_link_key,
                        v_niveau,
                        p_kenmerk_waarde);
         END IF;
      END IF;

   WHEN 'ALG'
   THEN
      -- niveau van prs_kenmerk ophalen, omdat deze ook in prs_kenmerklink wordt
      -- opgeslagen (da's dus redundant..?)
      SELECT alg_kenmerk_niveau
        INTO v_niveau
        FROM alg_kenmerk
       WHERE alg_kenmerk_key = p_kenmerk_key;

      SELECT COUNT ( * )
        INTO v_count
        FROM alg_onrgoedkenmerk
       WHERE     alg_onrgoed_key = p_link_key
             AND alg_kenmerk_key = p_kenmerk_key
             AND alg_onrgoedkenmerk_verwijder IS NULL;

      IF v_count = 1
      THEN
         IF p_kenmerk_waarde IS NULL
         THEN
            DELETE alg_onrgoedkenmerk
             WHERE     alg_onrgoed_key = p_link_key
                   AND alg_kenmerk_key = p_kenmerk_key
                   AND alg_onrgoedkenmerk_verwijder IS NULL;
         ELSE
            UPDATE alg_onrgoedkenmerk
               SET alg_onrgoedkenmerk_waarde = p_kenmerk_waarde
             WHERE     alg_onrgoed_key = p_link_key
                   AND alg_kenmerk_key = p_kenmerk_key
                   AND alg_onrgoedkenmerk_verwijder IS NULL;
         END IF;
      ELSE
         IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
         THEN
            INSERT INTO alg_onrgoedkenmerk (alg_kenmerk_key,
                                            alg_onrgoed_key,
                                            alg_onrgoed_niveau,
                                            alg_onrgoedkenmerk_waarde)
                VALUES (p_kenmerk_key,
                        p_link_key,
                        v_niveau,
                        p_kenmerk_waarde);
         END IF;
      END IF;

   WHEN 'MLD'
   THEN
      -- melding- of opdrachtkenmerk?
      SELECT mld_kenmerk_niveau
        INTO v_niveau
        FROM mld_kenmerk
       WHERE mld_kenmerk_key = p_kenmerk_key;

      CASE v_niveau
      WHEN 'O'
      THEN
         SELECT COUNT ( * )
           INTO v_count
           FROM mld_kenmerkopdr
          WHERE     mld_opdr_key = p_link_key
                AND mld_kenmerk_key = p_kenmerk_key
                AND mld_kenmerkopdr_verwijder IS NULL;

         IF v_count = 1
         THEN
            IF p_kenmerk_waarde IS NULL
            THEN
               DELETE mld_kenmerkopdr
                WHERE     mld_opdr_key = p_link_key
                      AND mld_kenmerk_key = p_kenmerk_key
                      AND mld_kenmerkopdr_verwijder IS NULL;
            ELSE
               UPDATE mld_kenmerkopdr
                  SET mld_kenmerkopdr_waarde = p_kenmerk_waarde
                WHERE     mld_opdr_key = p_link_key
                      AND mld_kenmerk_key = p_kenmerk_key
                      AND mld_kenmerkopdr_verwijder IS NULL;
            END IF;
         ELSE
            IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
            THEN
               INSERT INTO mld_kenmerkopdr (mld_kenmerk_key,
                                            mld_opdr_key,
                                            mld_kenmerkopdr_waarde)
                   VALUES (p_kenmerk_key,
                           p_link_key,
                           p_kenmerk_waarde);
            END IF;
         END IF;
      WHEN 'S'
      THEN
         SELECT COUNT ( * )
           INTO v_count
           FROM mld_kenmerkmelding
          WHERE     mld_melding_key = p_link_key
                AND mld_kenmerk_key = p_kenmerk_key
                AND mld_kenmerkmelding_verwijder IS NULL;

         IF v_count = 1
         THEN
            IF p_kenmerk_waarde IS NULL
            THEN
               DELETE mld_kenmerkmelding
                WHERE     mld_melding_key = p_link_key
                      AND mld_kenmerk_key = p_kenmerk_key
                      AND mld_kenmerkmelding_verwijder IS NULL;
            ELSE
               UPDATE mld_kenmerkmelding
                  SET mld_kenmerkmelding_waarde = p_kenmerk_waarde
                WHERE     mld_melding_key = p_link_key
                      AND mld_kenmerk_key = p_kenmerk_key
                      AND mld_kenmerkmelding_verwijder IS NULL;
            END IF;
         ELSE
            IF p_kenmerk_key IS NOT NULL AND p_kenmerk_waarde IS NOT NULL
            THEN
               INSERT INTO mld_kenmerkmelding (mld_kenmerk_key,
                                               mld_melding_key,
                                               mld_kenmerkmelding_waarde)
                   VALUES (p_kenmerk_key,
                           p_link_key,
                           p_kenmerk_waarde);
            END IF;
         END IF;
      END CASE;
   END CASE;
END;
/


CREATE OR REPLACE FUNCTION aaxx_get_cnt_cont_plaats_index (p_contract_plaats_key number
)
   RETURN NUMBER
AS
   CURSOR c (c_cnt_contract_key number)
   IS
      SELECT cnt_contract_plaats_key
      FROM cnt_contract_plaats
      WHERE cnt_contract_key = c_cnt_contract_key
      ORDER BY cnt_contract_plaats_key;

   v_contract_key   NUMBER (10);
   v_index          NUMBER (10);
BEGIN
   v_index   := 1;

   SELECT cnt_contract_key
   INTO v_contract_key
   FROM cnt_contract_plaats
   WHERE cnt_contract_plaats_key = p_contract_plaats_key;

   FOR rec IN c(v_contract_key)
   LOOP
      IF rec.cnt_contract_plaats_key = p_contract_plaats_key
      THEN
         RETURN (v_index);
      END IF;

      v_index   := v_index + 1;
   END LOOP;
END;
/

CREATE OR REPLACE FUNCTION aaxx_get_dep_code (p_prs_kostenplaats_nr VARCHAR2) RETURN VARCHAR2
AS
   v_result   VARCHAR2(100);
BEGIN
   v_result := 'Onbekend - ' || p_prs_kostenplaats_nr;
   BEGIN
      SELECT prs_afdeling_upper
        INTO v_result
        FROM prs_v_aanwezigafdeling a, prs_kostenplaats k
       WHERE niveau = 1
         AND a.prs_kostenplaats_key = k.prs_kostenplaats_key
         AND k.prs_kostenplaats_nr = p_prs_kostenplaats_nr;
      RETURN v_result;
   EXCEPTION WHEN NO_DATA_FOUND
   THEN
      BEGIN
         SELECT prs_afdeling_upper
           INTO v_result
           FROM prs_v_aanwezigafdeling a, prs_kostenplaats k
          WHERE niveau = 2
            AND a.prs_kostenplaats_key = k.prs_kostenplaats_key
            AND k.prs_kostenplaats_nr = p_prs_kostenplaats_nr;
         RETURN v_result;
      EXCEPTION WHEN OTHERS
      THEN
         RETURN v_result;
      END;
   END;
END aaxx_get_dep_code;
/

-- zoek naar de afdelingscode van het hoogste niveau afdeling
CREATE OR REPLACE FUNCTION aaxx_get_top_dep_code (p_prs_kostenplaats_nr VARCHAR2) RETURN VARCHAR2
AS
   CURSOR c IS
       SELECT ta.prs_afdeling_naam
        FROM prs_kostenplaats kp,
             prs_afdeling a,
             prs_v_afdeling_boom ab,
             prs_afdeling ta
       WHERE kp.prs_kostenplaats_key = a.prs_kostenplaats_key
         AND a.prs_afdeling_key = ab.prs_afdeling_key
         AND ab.prs_afdeling_key1 = ta.prs_afdeling_key
         AND kp.prs_kostenplaats_nr = p_prs_kostenplaats_nr
       ORDER BY COALESCE(a.prs_afdeling_verwijder, sysdate) DESC;
   v_result   VARCHAR2(100);

BEGIN
   v_result := 'Onbekend - ' || p_prs_kostenplaats_nr;
   BEGIN
      FOR rec IN C
      LOOP
         BEGIN
            RETURN rec.prs_afdeling_naam;
         END;
      END LOOP;
      RETURN v_result;
   EXCEPTION WHEN OTHERS THEN
      RETURN v_result;
   END;
END aaxx_get_top_dep_code;
/

-- zoek naar de afdelingscode van het één na hoogste niveau afdeling
CREATE OR REPLACE FUNCTION aaxx_get_lev2_dep_code (p_prs_kostenplaats_nr VARCHAR2) RETURN VARCHAR2
AS
   v_result   VARCHAR2(100);
BEGIN
   v_result := 'Onbekend - ' || p_prs_kostenplaats_nr;
   BEGIN
      SELECT ta.prs_afdeling_naam
        INTO v_result
        FROM prs_kostenplaats kp,
             prs_afdeling a,
             prs_v_afdeling_boom ab,
             prs_afdeling ta
       WHERE kp.prs_kostenplaats_key = a.prs_kostenplaats_key
         AND a.prs_afdeling_key = ab.prs_afdeling_key
         AND ab.prs_afdeling_key2 = ta.prs_afdeling_key
         AND kp.prs_kostenplaats_nr = p_prs_kostenplaats_nr;
      RETURN v_result;
   EXCEPTION WHEN OTHERS THEN
      RETURN v_result;
   END;
END aaxx_get_lev2_dep_code;
/

CREATE OR REPLACE FUNCTION aaxx_bestelling_items (bes_key IN NUMBER)
   RETURN VARCHAR2
IS
   lret     VARCHAR2 (512);
   lfirst   NUMBER;
   llast    NUMBER;

   CURSOR items
   IS
      SELECT    TO_CHAR (bi.bes_bestelling_item_aantal)
             || 'x '
             || s.bes_srtdeel_omschrijving      /* lcl.x()?*/
             || ' ('
             || s.bes_srtdeel_eenheid
             || ') ' besitemdsc
        FROM bes_bestelling_item bi, bes_srtdeel s
       WHERE bi.bes_srtdeel_key = s.bes_srtdeel_key
         AND bi.bes_bestelling_key = bes_key;
BEGIN
   lret := NULL;
   lfirst := 0;
   llast := 0;

   FOR besitem_rec IN items
   LOOP
      IF lfirst = 0
      THEN
         BEGIN
            lret := besitem_rec.besitemdsc;
            lfirst := 1;
         END;
      ELSE
         IF llast = 0
         THEN
            IF LENGTH (lret) + LENGTH (besitem_rec.besitemdsc) < (512 - 5)
            THEN
               lret := lret || CHR (10) || besitem_rec.besitemdsc;
            ELSE
               lret := lret || CHR (10) || '...';
               llast := 1;
            END IF;
         END IF;
      END IF;
   END LOOP;

   RETURN lret;
END;
/

CREATE OR REPLACE PROCEDURE aaxx_delete_non_active_users (p_applname IN VARCHAR2, p_applrun IN VARCHAR2)
AS
BEGIN
   UPDATE prs_perslid p
      SET prs_perslid_oslogin = NULL,
          prs_perslid_oslogin2 = NULL
   WHERE     prs_perslid_verwijder IS NULL
          AND (prs_perslid_oslogin IS NOT NULL OR prs_perslid_oslogin2 IS NOT NULL)
          AND (     SYSDATE - prs_perslid_aanmaak > 90
                AND (   prs_perslid_login IS NULL
                     OR SYSDATE - prs_perslid_login > 90
                    )
              )
          AND NOT EXISTS
            (  SELECT fac_tracking_refkey
                FROM fac_tracking t, fac_srtnotificatie sn
                WHERE fac_tracking_refkey = p.prs_perslid_key
                  AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                  AND sn.fac_srtnotificatie_code = 'PRSUPD'
                  AND SYSDATE - t.fac_tracking_datum < 90)
          AND NOT EXISTS
            (  SELECT prs_afdeling_key
                 FROM prs_afdeling a
                WHERE a.prs_afdeling_key = p.prs_afdeling_key
                  AND a.prs_afdeling_omschrijving = 'AAFM')
          AND SUBSTR(COALESCE(prs_perslid_oslogin, 'Q'), 1, 1) <> '_';
END;
/

CREATE OR REPLACE PROCEDURE aaxx_delete_non_active_key (p_applname IN VARCHAR2, p_applrun IN VARCHAR2)
AS
BEGIN
   UPDATE prs_perslid p
      SET prs_perslid_oslogin = NULL,
          prs_perslid_oslogin2 = NULL
   WHERE     prs_perslid_verwijder IS NULL
          AND (prs_perslid_oslogin IS NOT NULL OR prs_perslid_oslogin2 IS NOT NULL)
          AND (     SYSDATE - prs_perslid_aanmaak > 30
                AND (   prs_perslid_login IS NULL
                     OR SYSDATE - prs_perslid_login > 30
                    )
              )
          AND EXISTS
            (  SELECT gg.fac_groep_key
                 FROM fac_gebruikersgroep gg, fac_groeprechten gr, fac_functie f
                WHERE f.fac_functie_key = gr.fac_functie_key
                  AND f.fac_functie_code = 'WEB_ORDBO2'
                  AND gr.fac_groep_key = gg.fac_groep_key
                  AND gg.prs_perslid_key = p.prs_perslid_key)
          AND NOT EXISTS
            (  SELECT fac_tracking_refkey
                FROM fac_tracking t, fac_srtnotificatie sn
                WHERE fac_tracking_refkey = p.prs_perslid_key
                  AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                  AND sn.fac_srtnotificatie_code = 'PRSUPD'
                  AND SYSDATE - t.fac_tracking_datum < 30)
          AND NOT EXISTS
            (  SELECT prs_afdeling_key
                 FROM prs_afdeling a
                WHERE a.prs_afdeling_key = p.prs_afdeling_key
                  AND a.prs_afdeling_omschrijving = 'AAFM')
          AND SUBSTR(COALESCE(prs_perslid_oslogin, 'Q'), 1, 1) <> '_';
END;
/

CREATE OR REPLACE VIEW aaxx_v_noti_non_active_users
(
   sender,
   receiver,
   text,
   code,
   fac_srtnotificatie_key,
   key,
   xkey,
   xemail,
   xmobile
)
AS
   SELECT NULL sender,
          prs_perslid_key receiver,
          'Uw account voor FACILITOR is bijna verlopen. ' text,
          'CUST05' code,
          NULL fac_srtnotificatie_key,
          p.prs_perslid_key key,
          NULL xkey,
          NULL xemail,
          NULL xmobile
     FROM prs_perslid p
    WHERE p.prs_perslid_email IS NOT NULL
      AND p.prs_perslid_verwijder IS NULL
      AND TRUNC (p.prs_perslid_login) = TRUNC (SYSDATE - 90 + 7)
      AND NOT EXISTS
             (SELECT prs_afdeling_key
                FROM prs_afdeling a
               WHERE a.prs_afdeling_key = p.prs_afdeling_key
                 AND a.prs_afdeling_omschrijving = 'AAFM')
      AND SUBSTR (prs_perslid_oslogin, 1, 1) <> '_';

CREATE OR REPLACE PROCEDURE aaxx_export_login (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
BEGIN

  INSERT INTO aaxx_perslid_login
              (prs_perslid_key, login_datum)
     (SELECT prs_perslid_key, prs_perslid_login
        FROM prs_perslid
       WHERE TRUNC (prs_perslid_login) = TRUNC (SYSDATE));

END;
/

-- Job om meldingen onder de vakgroeptype AA Complimenten binnen de SLA automatisch af te melden
-- Hierbij wordt in de afhandeling de afmeldtekst gebruikt die standaard geconfigureerd staat.
CREATE OR REPLACE PROCEDURE aaxx_afmelden_complimenten (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
   CURSOR c
   IS
      SELECT m.*, a.mld_afmeldtekst_omschrijving
        FROM mld_melding m,
             mld_stdmelding std,
             ins_tab_discipline d,
             ins_srtdiscipline sd,
             mld_afmeldtekst a
       WHERE m.mld_stdmelding_key = std.mld_stdmelding_key
         AND std.mld_ins_discipline_key = d.ins_discipline_key
         AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
         AND sd.ins_srtdiscipline_prefix = 'AA'
         AND a.mld_ins_discipline_key = std.mld_ins_discipline_key
         AND a.mld_stdmelding_key IS NULL
         AND m.mld_melding_status IN (2, 3, 4)
         AND m.mld_melding_einddatum_std < SYSDATE + 1;
BEGIN

   FOR rec in c
   LOOP
      BEGIN
         UPDATE mld_melding
            SET mld_melding_opmerking = rec.mld_afmeldtekst_omschrijving
          WHERE mld_melding_key = rec.mld_melding_key;

         -- Als status is nieuw of te accepteren dan eerst op geaccepteerd zetten.
         IF rec.mld_melding_status = 2 OR rec.mld_melding_status = 3
         THEN
            mld.setmeldingstatus(rec.mld_melding_key, 4, NULL);
         END IF;

         -- nu de status op afgemeld zetten.
         mld.setmeldingstatus(rec.mld_melding_key, 5, NULL);
      END;
   END LOOP;
END;
/


-- Correcties op meldingen/opdrachten/facturen bestaan uit aanpassingen in de kostenplaats
-- of standaardmelding (kostensoort). De originele opdracht is dan al verwerkt en naar Exact
-- gehaald. Daar willen we niet aan gaan zitten knutselen.
-- Daarom kan aan een melding die ingelegd is op een verkeerde stdmelding of kostenplaats
-- een vervolgmelding (Ordercorrectie) gekoppeld worden. Deze ordercorrectiemelding heeft
-- flexvelden voor de nieuwe kostenplaats en nieuwe stdmelding. Onderstaande procedure
-- maakt nu een nieuwe structuur van melding/opdrach(en)/factuur(en) aan die gelijk is aan
-- de structuur van de originele melding maar met de tegenboeking (negatieve bedragen). Als
-- tweede wordt dezelfde structuur nog een keer aangemaakt voor de correctiemelding. Deze
-- structuur bevat de originele bedragen maar bevat de nieuwe kostenplaats en/of stdmelding.
-- Correctiemeldingen worden pas uitgevoerd op het moment dat ze afgemeld zijn. Aan het
-- einde van deze procedure wordt de correctiemelding op afgerond gezet zodat deze niet
-- nogmaals uitgevoerd wordt.
CREATE OR REPLACE PROCEDURE aaxx_ordercorrecties (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2
)
AS
   CURSOR c
   IS
      SELECT m.mld_melding_start_key,
             m.mld_melding_key,
             COALESCE (
                (SELECT fac.safe_to_number (km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km,
                        mld_kenmerk k,
                        mld_srtkenmerk sk
                  WHERE km.mld_kenmerk_key = k.mld_kenmerk_key
                    AND km.mld_melding_key = m.mld_melding_key
                    AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
                    AND sk.mld_srtkenmerk_upper = 'NIEUWE KOSTENPLAATS'),
                m_org.prs_kostenplaats_key)
                nieuwe_kostenplaats,
             COALESCE (
                (SELECT fac.safe_to_number (km.mld_kenmerkmelding_waarde)
                   FROM mld_kenmerkmelding km,
                        mld_kenmerk k,
                        mld_srtkenmerk sk
                  WHERE km.mld_kenmerk_key = k.mld_kenmerk_key
                    AND km.mld_melding_key = m.mld_melding_key
                    AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
                    AND sk.mld_srtkenmerk_upper = 'NIEUWE MELDING'),
                m_org.prs_kostenplaats_key)
                nieuwe_melding
        FROM mld_melding m, mld_stdmelding std, mld_melding m_org
       WHERE m.mld_stdmelding_key = std.mld_stdmelding_key
         AND std.mld_stdmelding_omschrijving = 'Ordercorrectie'
         AND m.mld_melding_start_key = m_org.mld_melding_key
         AND m.mld_melding_status = 5
         AND m.mld_melding_afgerond = 0;

   CURSOR c_o (c_melding_key NUMBER)
   IS
      SELECT *
        FROM mld_opdr
       WHERE mld_melding_key = c_melding_key;

   CURSOR c_f (c_opdr_key NUMBER)
   IS
      SELECT *
        FROM fin_factuur
       WHERE mld_opdr_key = c_opdr_key AND fin_factuur_verwijder IS NULL;

   CURSOR c_fr (c_factuur_key NUMBER)
   IS
      SELECT *
        FROM fin_factuurregel
       WHERE fin_factuur_key = c_factuur_key;

   v_melding_tegenb_key        NUMBER;
   v_opdr_tegenb_key           NUMBER;
   v_factuur_tegenb_key        NUMBER;
   v_factuurregel_tegenb_key   NUMBER;
   v_melding_cor_key        NUMBER;
   v_opdr_cor_key           NUMBER;
   v_factuur_cor_key        NUMBER;
   v_factuurregel_cor_key   NUMBER;
BEGIN
   FOR rec IN c
   LOOP
      BEGIN
         -- Maak een tegenboeking aan met dezelfde stdmelding/kostenplaats
         SELECT mld_s_mld_melding_key.NEXTVAL
           INTO v_melding_tegenb_key
           FROM DUAL;

         INSERT INTO mld_melding (mld_melding_key,
                                  mld_melding_module,
                                  mld_meldbron_key,
                                  mld_alg_locatie_key,
                                  mld_alg_onroerendgoed_keys,
                                  mld_melding_datum,
                                  mld_melding_omschrijving,
                                  mld_melding_opmerking,
                                  mld_stdmelding_key,
                                  mld_melding_status,
                                  mld_kosten_klant,
                                  mld_melding_document,
                                  prs_kostenplaats_key,
                                  prs_perslid_key,
                                  mld_adres_key,
                                  mld_melding_ordernr,
                                  mld_melding_spoed,
                                  mld_melding_onderwerp,
                                  mld_melding_start_key)
            SELECT v_melding_tegenb_key,
                   mld_melding_module,
                   mld_meldbron_key,
                   mld_alg_locatie_key,
                   mld_alg_onroerendgoed_keys,
                   mld_melding_datum,
                   SUBSTR (
                         'Tegenboeking'
                      || CHR (10)
                      || mld_melding_omschrijving,
                      1,
                      4000),
              SUBSTR (
                   'Tegenboeking'
                   || CHR (10)
                    || mld_melding_opmerking,
                      1,
                      4000),
                   mld_stdmelding_key,
                   2,
                   mld_kosten_klant,
                   mld_melding_document,
                   prs_kostenplaats_key,
                   prs_perslid_key,
                   mld_adres_key,
                   mld_melding_ordernr,
                   mld_melding_spoed,
                   SUBSTR ('Tegenboeking: ' || mld_melding_onderwerp, 1, 60),
                   mld_melding_key
              FROM mld_melding
             WHERE mld_melding_key = rec.mld_melding_start_key;

         fac.trackaction ('MLDNEW',
                          v_melding_tegenb_key,
                          NULL,
                          NULL,
                          NULL);

         mld.setmeldingstatus (v_melding_tegenb_key, 4, NULL);

         -- Maak een correctie melding aan met de nieuwe stdmelding en nieuwe kostenplaats
         SELECT mld_s_mld_melding_key.NEXTVAL
           INTO v_melding_cor_key
           FROM DUAL;

         INSERT INTO mld_melding (mld_melding_key,
                                  mld_melding_module,
                                  mld_meldbron_key,
                                  mld_alg_locatie_key,
                                  mld_alg_onroerendgoed_keys,
                                  mld_melding_datum,
                                  mld_melding_omschrijving,
                                  mld_melding_opmerking,
                                  mld_stdmelding_key,
                                  mld_melding_status,
                                  mld_kosten_klant,
                                  mld_melding_document,
                                  prs_kostenplaats_key,
                                  prs_perslid_key,
                                  mld_adres_key,
                                  mld_melding_ordernr,
                                  mld_melding_spoed,
                                  mld_melding_onderwerp,
                                  mld_melding_start_key)
            SELECT v_melding_cor_key,
                   mld_melding_module,
                   mld_meldbron_key,
                   mld_alg_locatie_key,
                   mld_alg_onroerendgoed_keys,
                   mld_melding_datum,
                   SUBSTR (
                         'Correctie melding'
                      || CHR (10)
                      || mld_melding_omschrijving,
                      1,
                      4000),
                   SUBSTR (
                   'Correctie melding'
                   || CHR (10)
                    || mld_melding_opmerking,
                      1,
                      4000),
                   rec.nieuwe_melding,
                   2,
                   mld_kosten_klant,
                   mld_melding_document,
                   rec.nieuwe_kostenplaats,
                   prs_perslid_key,
                   mld_adres_key,
                   mld_melding_ordernr,
                   mld_melding_spoed,
                   SUBSTR ('Correctie: ' || mld_melding_onderwerp, 1, 60),
                   mld_melding_key
              FROM mld_melding
             WHERE mld_melding_key = rec.mld_melding_start_key;

         fac.trackaction ('MLDNEW',
                          v_melding_cor_key,
                          NULL,
                          NULL,
                          NULL);

         mld.setmeldingstatus (v_melding_cor_key, 4, NULL);



         DBMS_OUTPUT.put_line (
            'Originele melding_key:' || rec.mld_melding_start_key);

         FOR rec_o IN c_o (rec.mld_melding_start_key)
         LOOP
            BEGIN
               DBMS_OUTPUT.put_line (
                  'Originele opdracht_key:' || rec_o.mld_opdr_key);

               -- Maak voor iedere opdracht onder de originele melding een tegenboekingsopdracht aan.
               SELECT mld_s_mld_opdr_key.NEXTVAL
                 INTO v_opdr_tegenb_key
                 FROM DUAL;

               DBMS_OUTPUT.put_line (
                  'Tegenboeking opdracht_key:' || v_opdr_tegenb_key);

               INSERT INTO mld_opdr (mld_opdr_key,
                                     mld_opdr_module,
                                     mld_melding_key,
                                     mld_alg_locatie_key,
                                     mld_alg_onroerendgoed_keys,
                                     mld_uitvoerende_keys,
                                     mld_typeopdr_key,
                                     mld_statusopdr_key,
                                     mld_standaardopdr_key,
                                     mld_opdr_omschrijving,
                                     mld_opdr_datumbegin,
                                     mld_opdr_dagen,
                                     mld_opdr_einddatum,
                                     mld_opdr_werkzaamheden,
                                     mld_opdr_uren,
                                     mld_opdr_materiaal,
                                     mld_opdr_kosten,
                                     prs_kostenplaats_key,
                                     mld_opdr_ordernr,
                                     mld_opdr_contactpersoon,
                                     mld_opdr_bedrijfopdr_volgnr,
                                     mld_opdr_teverzenden,
                                     mld_opdr_uurloon,
                                     prs_perslid_key,
                                     prs_contactpersoon_key,
                                     mld_opdr_opmerking_fiat,
                                     fac_activiteit_key,
                                     mld_opdr_opmerking,
                                     cnt_contract_key,
                                     cnt_contract_dienst_key,
                                     mld_opdr_plandatum,
                                     mld_opdr_id)
                  SELECT v_opdr_tegenb_key,
                         mld_opdr_module,
                         v_melding_tegenb_key,
                         mld_alg_locatie_key,
                         mld_alg_onroerendgoed_keys,
                         mld_uitvoerende_keys,
                         mld_typeopdr_key,
                         5,                                       -- toegekend
                         mld_standaardopdr_key,
                         mld_opdr_omschrijving,
                         mld_opdr_datumbegin,
                         mld_opdr_dagen,
                         mld_opdr_einddatum,
                         mld_opdr_werkzaamheden,
                         0,
                         0,
                         -1 * mld_opdr_kosten,
                         prs_kostenplaats_key,
                         mld_opdr_ordernr,
                         mld_opdr_contactpersoon,
                         mld_opdr_bedrijfopdr_volgnr,
                         NULL,                         -- mld_opdr_teverzenden
                         mld_opdr_uurloon,
                         prs_perslid_key,
                         prs_contactpersoon_key,
                         mld_opdr_opmerking_fiat,
                         fac_activiteit_key,
                                       SUBSTR (
                   'Tegenboeking'
                   || CHR (10)
                    || mld_opdr_opmerking,
                      1,
                      4000),
                         cnt_contract_key,
                         cnt_contract_dienst_key,
                         mld_opdr_plandatum,
                         mld_opdr_id
                    FROM mld_opdr
                   WHERE mld_opdr_key = rec_o.mld_opdr_key;

         fac.trackaction ('ORDNEW',
                          v_opdr_tegenb_key,
                          NULL,
                          NULL,
                          NULL);

               -- Maak voor iedere opdracht onder de originele melding een correctieopdracht aan.
               SELECT mld_s_mld_opdr_key.NEXTVAL
                 INTO v_opdr_cor_key
                 FROM DUAL;

               DBMS_OUTPUT.put_line (
                  'Correctie opdracht_key:' || v_opdr_cor_key);

               INSERT INTO mld_opdr (mld_opdr_key,
                                     mld_opdr_module,
                                     mld_melding_key,
                                     mld_alg_locatie_key,
                                     mld_alg_onroerendgoed_keys,
                                     mld_uitvoerende_keys,
                                     mld_typeopdr_key,
                                     mld_statusopdr_key,
                                     mld_standaardopdr_key,
                                     mld_opdr_omschrijving,
                                     mld_opdr_datumbegin,
                                     mld_opdr_dagen,
                                     mld_opdr_einddatum,
                                     mld_opdr_werkzaamheden,
                                     mld_opdr_uren,
                                     mld_opdr_materiaal,
                                     mld_opdr_kosten,
                                     prs_kostenplaats_key,
                                     mld_opdr_ordernr,
                                     mld_opdr_contactpersoon,
                                     mld_opdr_bedrijfopdr_volgnr,
                                     mld_opdr_teverzenden,
                                     mld_opdr_uurloon,
                                     prs_perslid_key,
                                     prs_contactpersoon_key,
                                     mld_opdr_opmerking_fiat,
                                     fac_activiteit_key,
                                     mld_opdr_opmerking,
                                     cnt_contract_key,
                                     cnt_contract_dienst_key,
                                     mld_opdr_plandatum,
                                     mld_opdr_id)
                  SELECT v_opdr_cor_key,
                         mld_opdr_module,
                         v_melding_cor_key,
                         mld_alg_locatie_key,
                         mld_alg_onroerendgoed_keys,
                         mld_uitvoerende_keys,
                         mld_typeopdr_key,
                         5,                                       -- toegekend
                         mld_standaardopdr_key,
                         mld_opdr_omschrijving,
                         mld_opdr_datumbegin,
                         mld_opdr_dagen,
                         mld_opdr_einddatum,
                         mld_opdr_werkzaamheden,
                         mld_opdr_uren,
                         mld_opdr_materiaal,
                         mld_opdr_kosten,
                         rec.nieuwe_kostenplaats,
                         mld_opdr_ordernr,
                         mld_opdr_contactpersoon,
                         mld_opdr_bedrijfopdr_volgnr,
                         NULL,                         -- mld_opdr_teverzenden
                         mld_opdr_uurloon,
                         prs_perslid_key,
                         prs_contactpersoon_key,
                         mld_opdr_opmerking_fiat,
                         fac_activiteit_key,
                                      SUBSTR (
                   'Correctie'
                   || CHR (10)
                    || mld_opdr_opmerking,
                      1,
                      4000),
                         cnt_contract_key,
                         cnt_contract_dienst_key,
                         mld_opdr_plandatum,
                         mld_opdr_id
                    FROM mld_opdr
                   WHERE mld_opdr_key = rec_o.mld_opdr_key;

         fac.trackaction ('ORDNEW',
                          v_opdr_cor_key,
                          NULL,
                          NULL,
                          NULL);

               FOR rec_f IN c_f (rec_o.mld_opdr_key)
               LOOP
                  BEGIN
                     DBMS_OUTPUT.put_line (
                        'Originele factuur_key:' || rec_f.fin_factuur_key);

                     -- Maak voor iedere factuur onder de originele opdracht een tegenboekingsfactuur aan.
                     SELECT fin_s_fin_factuur_key.NEXTVAL
                       INTO v_factuur_tegenb_key
                       FROM DUAL;

                     DBMS_OUTPUT.put_line (
                        'Tegenboekingsfactuur_key:' || v_factuur_tegenb_key);

                     INSERT INTO fin_factuur (fin_factuur_key,
                                              mld_opdr_key,
                                              fin_factuur_nr,
                                              fin_factuur_totaal,
                                              fin_factuur_totaal_btw,
                                              prs_perslid_key_user,
                                              fin_factuur_datum,
                                              fin_factuur_boekmaand,
                                              fin_factuur_debiteur_nr,
                                              prs_kostensoort_key,
                                              fin_factuur_opmerking,
                                              fin_factuur_statuses_key)
                        SELECT v_factuur_tegenb_key,
                               v_opdr_tegenb_key,
                               fin_factuur_nr,
                               -1 * fin_factuur_totaal,
                               -1 * fin_factuur_totaal_btw,
                               prs_perslid_key_user,
                               fin_factuur_datum,
                               fin_factuur_boekmaand,
                               fin_factuur_debiteur_nr,
                               prs_kostensoort_key,
                                             SUBSTR (
                   'Tegenboeking'
                   || CHR (10)
                    || fin_factuur_opmerking,
                      1,
                      4000),
                               6                                -- goedgekeurd
                          FROM fin_factuur
                         WHERE fin_factuur_key = rec_f.fin_factuur_key;

                     INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde)
                        SELECT v_factuur_tegenb_key,
                               fin_kenmerk_key,
                               fin_kenmerkfactuur_waarde
                          FROM fin_kenmerkfactuur
                         WHERE fin_factuur_key = rec_f.fin_factuur_key;

         fac.trackaction ('FINNEW',
                          v_factuur_tegenb_key,
                          NULL,
                          NULL,
                          NULL);

                     -- Maak voor iedere factuur onder de originele opdracht een correctiefactuur aan.
                     SELECT fin_s_fin_factuur_key.NEXTVAL
                       INTO v_factuur_cor_key
                       FROM DUAL;

                     DBMS_OUTPUT.put_line (
                        'Correctie factuur_key:' || v_factuur_cor_key);

                     INSERT INTO fin_factuur (fin_factuur_key,
                                              mld_opdr_key,
                                              fin_factuur_nr,
                                              fin_factuur_totaal,
                                              fin_factuur_totaal_btw,
                                              prs_perslid_key_user,
                                              fin_factuur_datum,
                                              fin_factuur_boekmaand,
                                              fin_factuur_debiteur_nr,
                                              prs_kostensoort_key,
                                              fin_factuur_opmerking,
                                              fin_factuur_statuses_key)
                        SELECT v_factuur_cor_key,
                               v_opdr_cor_key,
                               fin_factuur_nr,
                               fin_factuur_totaal,
                               fin_factuur_totaal_btw,
                               prs_perslid_key_user,
                               fin_factuur_datum,
                               fin_factuur_boekmaand,
                               fin_factuur_debiteur_nr,
                               (SELECT COALESCE (std.prs_kostensoort_key,
                                                 d.prs_kostensoort_key)
                                  FROM mld_stdmelding std,
                                       ins_tab_discipline d
                                 WHERE std.mld_ins_discipline_key =
                                          d.ins_discipline_key
                                   AND std.mld_stdmelding_key =
                                          rec.nieuwe_melding),
                                             SUBSTR (
                   'Correctie'
                   || CHR (10)
                    || fin_factuur_opmerking,
                      1,
                      4000),
                               6                                -- goedgekeurd
                          FROM fin_factuur
                         WHERE fin_factuur_key = rec_f.fin_factuur_key;

         fac.trackaction ('FINNEW',
                          v_factuur_cor_key,
                          NULL,
                          NULL,
                          NULL);

                     INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde)
                        SELECT v_factuur_cor_key,
                               fin_kenmerk_key,
                               fin_kenmerkfactuur_waarde
                          FROM fin_kenmerkfactuur
                         WHERE fin_factuur_key = rec_f.fin_factuur_key;

                     FOR rec_fr IN c_fr (rec_f.fin_factuur_key)
                     LOOP
                        BEGIN
                           DBMS_OUTPUT.put_line('Originele factuurregel_key:'
                                                || rec_fr.fin_factuurregel_key);

                           -- Maak voor iedere factuurregel onder de originele factuur een tegenboekings factuurregel aan.
                           SELECT fin_s_fin_factuurregel_key.NEXTVAL
                             INTO v_factuurregel_tegenb_key
                             FROM DUAL;

                           DBMS_OUTPUT.put_line('Tegenboekings factuurregel_key:'
                                                || v_factuurregel_tegenb_key);

                           INSERT INTO fin_factuurregel (fin_factuurregel_key,
                                                         fin_factuur_key,
                                                         fin_factuurregel_nr,
                                                         fin_factuurregel_totaal,
                                                         fin_factuurregel_btw,
                                                         fin_factuurregel_omschrijving,
                                                         fin_factuurregel_referentie,
                                                         fin_btwtabelwaarde_key,
                                                         prs_kostensoort_key)
                              SELECT v_factuurregel_tegenb_key,
                                     v_factuur_tegenb_key,
                                     fin_factuurregel_nr,
                                     -1 * fin_factuurregel_totaal,
                                     -1 * fin_factuurregel_btw,
                                     fin_factuurregel_omschrijving,
                                     fin_factuurregel_referentie,
                                     fin_btwtabelwaarde_key,
                                     prs_kostensoort_key
                                FROM fin_factuurregel
                               WHERE fin_factuurregel_key =
                                        rec_fr.fin_factuurregel_key;


                           -- Maak voor iedere factuurregel onder de originele factuur een correctie factuurregel aan.
                           SELECT fin_s_fin_factuurregel_key.NEXTVAL
                             INTO v_factuurregel_cor_key
                             FROM DUAL;

                           DBMS_OUTPUT.put_line('Correctie factuurregel_key:'
                                                || v_factuurregel_cor_key);

                           INSERT INTO fin_factuurregel (fin_factuurregel_key,
                                                         fin_factuur_key,
                                                         fin_factuurregel_nr,
                                                         fin_factuurregel_totaal,
                                                         fin_factuurregel_btw,
                                                         fin_factuurregel_omschrijving,
                                                         fin_factuurregel_referentie,
                                                         fin_btwtabelwaarde_key,
                                                         prs_kostensoort_key)
                              SELECT v_factuurregel_cor_key,
                                     v_factuur_cor_key,
                                     fin_factuurregel_nr,
                                     fin_factuurregel_totaal,
                                     fin_factuurregel_btw,
                                     fin_factuurregel_omschrijving,
                                     fin_factuurregel_referentie,
                                     fin_btwtabelwaarde_key,
                                     (SELECT COALESCE (
                                                std.prs_kostensoort_key,
                                                d.prs_kostensoort_key)
                                        FROM mld_stdmelding std,
                                             ins_tab_discipline d
                                       WHERE std.mld_ins_discipline_key =
                                                d.ins_discipline_key
                                         AND std.mld_stdmelding_key =
                                                rec.nieuwe_melding)
                                FROM fin_factuurregel
                               WHERE fin_factuurregel_key =
                                        rec_fr.fin_factuurregel_key;
                        END;
                     END LOOP;
                  END;
               END LOOP;

               -- set opdrachtstatus op technisch gereed
               mld.setopdrachtstatus (v_opdr_tegenb_key, 6, NULL);
               mld.setopdrachtstatus (v_opdr_cor_key, 6, NULL);
            END;
         END LOOP;
         -- zet meldingstatus op technisch gereed
         mld.updatemeldingstatus (v_melding_tegenb_key, 1, NULL);
         mld.updatemeldingstatus (v_melding_cor_key, 1, NULL);

         -- zet de status van de correctiemelding op afgerond zodat deze niet opnieuw verwerkt wordt.
         UPDATE mld_melding
             SET mld_melding_afgerond = 1
             WHERE mld_melding_key = rec.mld_melding_key;
      END;
   END LOOP;
END;
/

-- view om stdmeldingen als suggest bij kenmerk te tonen.
CREATE OR REPLACE VIEW aaxx_v_stdmelding_gegevens
AS
   SELECT sd.ins_srtdiscipline_key,
          ins_srtdiscipline_prefix,
          ins_srtdiscipline_omschrijving,
          ins_discipline_key,
          ins_discipline_omschrijving,
          mld_stdmelding_key,
          mld_stdmelding_omschrijving,
          ins_discipline_omschrijving || '/' || mld_stdmelding_omschrijving
             discstd,
          mld_stdmelding_verwijder
     FROM ins_tab_discipline d, ins_srtdiscipline sd, mld_stdmelding std
    WHERE sd.ins_srtdiscipline_key = d.ins_srtdiscipline_key
      AND d.ins_discipline_key = std.mld_ins_discipline_key;

--=============================================================================
-- EXPORTFUNCTIES Reserveringen NoShow.
-- Exportfunctie moet voor de putorders van de betreffende klant gescheduled worden.
--   10 minuten na aanvang wordt bij no_show een noshow reminder gestuurd
--   15 minuten na aanvang wordt de reservering als noshow aangemerkt en
--      wordt de ruimte vrijgegeven.
-------------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE aaxx_select_noshow_reminder (
   p_applname   IN VARCHAR2,
   p_applrun    IN VARCHAR2)
AS
   CURSOR c (
      c_srtnotificatie_key NUMBER)
   IS
      SELECT DISTINCT rrr.res_rsv_ruimte_host_key,
                      rr.res_ruimte_nr,
                      pf.prs_perslid_naam_full,
                      rrr.res_reservering_key,
                      rrr.res_rsv_ruimte_key
        FROM cad_v_thema_srtruimtesensor s,
             res_v_rsv_ruimte_2_alg_ruimte r2a,
             res_rsv_ruimte rrr,
             res_ruimte rr,
             prs_v_perslid_fullnames pf
       WHERE waarde = 'NoShow'
         AND res_rsv_ruimte_host_key = pf.prs_perslid_key
         AND s.alg_ruimte_key = r2a.alg_ruimte_key
         AND r2a.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
         AND r2a.res_ruimte_key = rr.res_ruimte_key
         AND SYSDATE BETWEEN rrr.res_rsv_ruimte_van
                         AND  rrr.res_rsv_ruimte_tot
         AND rrr.res_rsv_ruimte_van < SYSDATE - 1 / (24 * 6) -- verder dan tien minuten
         AND rrr.res_rsv_ruimte_van > SYSDATE - 2 / (24 * 6) -- niet verder dan twintig minuten
         AND NOT EXISTS
                (SELECT fac_tracking_key
                   FROM fac_tracking t
                  WHERE t.fac_srtnotificatie_key = c_srtnotificatie_key
                    AND fac_tracking_refkey = rrr.res_rsv_ruimte_key);

   CURSOR c2 (
      c_srtnotificatie_key NUMBER)
   IS
      SELECT DISTINCT r2a.res_rsv_ruimte_key
        FROM cad_v_thema_srtruimtesensor s, res_v_rsv_ruimte_2_alg_ruimte r2a
       WHERE waarde = 'NoShow' AND s.alg_ruimte_key = r2a.alg_ruimte_key
         AND SYSDATE BETWEEN r2a.res_rsv_ruimte_van
                         AND  r2a.res_rsv_ruimte_tot
         AND r2a.res_rsv_ruimte_van < SYSDATE - 1 / (24 * 4) -- verder dan een kwartier
         AND r2a.res_rsv_ruimte_van > SYSDATE - 2 / (24 * 4) -- niet verder dan een half uur
         AND EXISTS
                (SELECT fac_tracking_key
                   FROM fac_tracking t
                  WHERE t.fac_srtnotificatie_key = c_srtnotificatie_key
                    AND fac_tracking_refkey = r2a.res_rsv_ruimte_key);

   v_srtnotificatie_key   NUMBER;
BEGIN
   SELECT fac_srtnotificatie_key
     INTO v_srtnotificatie_key
     FROM fac_srtnotificatie
    WHERE fac_srtnotificatie_code = 'CUST06';            -- herinnering noshow

   FOR rec IN c (v_srtnotificatie_key)
   LOOP
      BEGIN
         fac.putnotificationsrtprio (
            NULL,
            rec.res_rsv_ruimte_host_key,
            'CUST06',
            rec.res_reservering_key,
            'No-show waarschuwing reservering ' || rec.res_ruimte_nr,
            2,                                                         -- mail
            NULL,                                 -- geen specifiek mail adres
            NULL,                              -- geen specifiek mobile nummer
            rec.res_rsv_ruimte_key,
            1,                                              -- hoge prioriteit
            NULL);

         fac.trackaction (
            '#CUST06',
            rec.res_rsv_ruimte_key,
            NULL,
            NULL,
            'No-show waarschuwing verzonden naar: '
            || rec.prs_perslid_naam_full);
      END;
   END LOOP;

   FOR rec IN c2 (v_srtnotificatie_key)
   LOOP
      BEGIN
         UPDATE res_rsv_ruimte
            SET res_rsv_ruimte_bezoekers_shown = 0,
                res_rsv_ruimte_tot =
                   GREATEST (
                      res_rsv_ruimte_van,
                      LEAST (res_rsv_ruimte_tot, TRUNC (SYSDATE, 'MI')))
          WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

         UPDATE res_rsv_deel
            SET res_rsv_deel_tot =
                   LEAST (
                      res_rsv_deel_tot,
                      (SELECT res_rsv_ruimte_tot
                         FROM res_rsv_ruimte
                        WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key))
          WHERE res_rsv_ruimte_key = rec.res_rsv_ruimte_key;

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

   COMMIT;
END;
/

--=============================================================================
-- EXPORTFUNCTIES EXACT
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - Export exact
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_aanwezigfactuur
(
   FIN_FACTUUR_KEY,
   FIN_FACTUUR_NR,
   FIN_FACTUUR_TOTAAL,
   FIN_FACTUUR_TOTAAL_BTW,
   MLD_OPDR_KEY,
   CNT_CONTRACT_KEY,
   BES_BESTELOPDR_KEY,
   PRS_PERSLID_KEY_USER,
   FIN_FACTUUR_DATUM,
   FIN_FACTUUR_BOEKMAAND,
   FIN_FACTUUR_DEBITEUR_NR,
   PRS_KOSTENSOORT_KEY,
   FIN_FACTUUR_OPMERKING,
   FIN_FACTUUR_STATUSES_KEY,
   FIN_FACTUUR_VERWIJDER
)
AS
   SELECT FIN_FACTUUR_KEY,
          FIN_FACTUUR_NR,
          FIN_FACTUUR_TOTAAL,
          FIN_FACTUUR_TOTAAL_BTW,
          MLD_OPDR_KEY,
          CNT_CONTRACT_KEY,
          BES_BESTELOPDR_KEY,
          PRS_PERSLID_KEY_USER,
          FIN_FACTUUR_DATUM,
          FIN_FACTUUR_BOEKMAAND,
          FIN_FACTUUR_DEBITEUR_NR,
          PRS_KOSTENSOORT_KEY,
          FIN_FACTUUR_OPMERKING,
          FIN_FACTUUR_STATUSES_KEY,
          FIN_FACTUUR_VERWIJDER
     FROM fin_factuur
    WHERE fin_factuur_verwijder IS NULL AND fin_factuur_statuses_key > 1;


-- fin_kenmerk_key 2 is de keuze of dit de laatste factuur van de opdracht is.
CREATE OR REPLACE VIEW aaxx_v_factuur_gegevens (
   fin_factuur_key,
   opdracht_id,
   fin_factuur_datum,
   fin_factuur_nr,
   prs_bedrijf_key,
   fin_factuurregel_totaal,
   fin_factuurregel_btw,
   fin_btwtabelwaarde_code,
   fin_btwtabelwaarde_key,
   fin_factuurregel_nr,
   fin_factuur_debiteur_nr,
   fin_factuur_opmerking,
   fin_factuur_boekmaand,
   opdr_datum,
   laatste_factuur,
   project_nummer,
   project_naam,
   prs_kostensoort_oms,
   prs_kostensoort_refcode,
   vk_prs_kostensoort_refcode,
   prs_kostensoort_key,
   prs_kostenplaats_key,
   mld_opdr_key,
   cnt_contract_key,
   bes_bestelopdr_key,
   fin_factuur_statuses_key,
   lev_kpn
   )
AS
    SELECT f.fin_factuur_key,
              DECODE (c.cnt_contract_key, null,
                 DECODE (bo.bes_bestelopdr_key, null,
                           (SELECT    sd.ins_srtdiscipline_prefix
                                   || m.mld_melding_key
                                   || '/'
                                   || o.mld_opdr_bedrijfopdr_volgnr
                            FROM mld_melding m,
                                 mld_stdmelding std,
                                 ins_tab_discipline d,
                                 ins_srtdiscipline sd
                            WHERE     m.mld_melding_key = o.mld_melding_key
                                  AND m.mld_stdmelding_key = std.mld_stdmelding_key
                                  AND std.mld_ins_discipline_key = d.ins_discipline_key
                                  AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key)
                         , bo.bes_bestelopdr_id)
                      , 'C' || TO_CHAR (cnt_contract_nummer_intern)
              )
              opdracht_id,
           DECODE (to_char(f.fin_factuur_datum, 'yyyy'),
                   '2010', to_date('20110102', 'YYYYMMDD'),
                   '2011', to_date('20120102', 'YYYYMMDD'),
                   f.fin_factuur_datum),
           f.fin_factuur_nr,
           COALESCE (b_c.prs_bedrijf_key, COALESCE(b_o.prs_bedrijf_key, b_b.prs_bedrijf_key)) prs_bedrijf_key,
           fr.fin_factuurregel_totaal,
           round(fr.fin_factuurregel_totaal* DECODE(btw.fin_btwtabelwaarde_verlegd, 1, 0, btw.fin_btwtabelwaarde_perc/100),2) fin_factuurregel_btw,
           btw.fin_btwtabelwaarde_code,
           btw.fin_btwtabelwaarde_key,
           fr.fin_factuurregel_nr,
           f.fin_factuur_debiteur_nr,
           f.fin_factuur_opmerking,
           f.fin_factuur_boekmaand,
           coalesce (o.mld_opdr_datumbegin, coalesce(c.cnt_contract_looptijd_tot, bo.bes_bestelopdr_datum)),
           COALESCE ( (SELECT fac.safe_to_number (fac_usrdata_code)
                       FROM fin_kenmerkfactuur fk, fac_usrdata ud
                       WHERE fk.fin_factuur_key = f.fin_factuur_key
                             AND fk.fin_kenmerk_key = 2
                             AND fac.safe_to_number (fin_kenmerkfactuur_waarde) =
                                   fac_usrdata_key),
                     1
           ),
           TO_CHAR (DECODE (ot.mld_typeopdr_omschrijving,
                       'Projectorder', ( (SELECT    sd.ins_srtdiscipline_prefix
                                                 || m.mld_melding_key
                                          FROM mld_melding m,
                                               mld_stdmelding std,
                                               ins_tab_discipline d,
                                               ins_srtdiscipline sd
                                          WHERE m.mld_melding_key =
                                                   o.mld_melding_key
                                                AND m.mld_stdmelding_key = std.mld_stdmelding_key
                                                AND std.mld_ins_discipline_key =
                                                      d.ins_discipline_key
                                                AND d.ins_srtdiscipline_key =
                                                      sd.ins_srtdiscipline_key)),
                       NULL)
           )
              projectnummer,
           TO_CHAR ((SELECT DISTINCT COALESCE(mld_kenmerkmelding_waarde, '')
                      FROM mld_kenmerkmelding km,
                           mld_kenmerk k,
                           mld_srtkenmerk sk
                     WHERE km.mld_melding_key = o.mld_melding_key
                           AND k.mld_kenmerk_key = km.mld_kenmerk_key
                           AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
                           AND sk.mld_srtkenmerk_omschrijving = 'Projectnaam')
           )
              projectnaam,
           prs_kostensoort_oms,
           DECODE (aaxx_get_user,
                'DOW',     DECODE (coalesce (to_char(o.mld_opdr_datumbegin, 'yyyy'), coalesce(to_char(c.cnt_contract_looptijd_tot,'yyyy'), to_char(bo.bes_bestelopdr_datum, 'yyyy'))),
                                   '2017', k.prs_kostensoort_refcode,
                                           DECODE (substr(k.prs_kostensoort_upper,1,2), 'CO', DECODE (substr(k.prs_kostensoort_upper,1,7), 'COR VAR', '1350823', '1350822'),
                                                                                        'NC', DECODE (substr(k.prs_kostensoort_upper,1,5), 'NC P ', '1350817', '1350824'),
                                                                                              'Onbekend')
                                  ),
                'ENEXIS',  DECODE (coalesce (to_char(o.mld_opdr_datumbegin, 'yyyy'), coalesce(to_char(c.cnt_contract_looptijd_tot,'yyyy'), to_char(bo.bes_bestelopdr_datum, 'yyyy'))),
                                   '2017', k.prs_kostensoort_refcode,
                                           DECODE (substr(k.prs_kostensoort_upper,1,3), 'CF ', '1350822',
                                                                                        'CV ', '1350823',
                                                                                        'CVE', '1350824',
                                                                                        'NC ', '1350817',
                                                                                               'Onbekend')
                                  ),
                'EY',      DECODE (fac.safe_to_number(substr(fin_factuur_boekmaand, 1,4)) - fac.safe_to_number(to_char(sysdate, 'yyyy')),
                                   1, '1350400',                      -- boekmaand ligt in de toekomst in verband met gebroken boekjaar
                                   0, k.prs_kostensoort_refcode,      -- boekmaand ligt in huidig jaar
                                      -- boekmaand ligt in het verleden, dus bedragen mogen naar balansrekening.
                                      DECODE (substr(k.prs_kostensoort_upper,1,3), 'CF ', '1350822',
                                                                                   'CV ', '1350823',
                                                                                   'NC ', '1350824',
                                                                                          'Onbekend')
                                  ),
                -- Gul kent een andere methode. Deze gaat niet mee in de jaarafsluiting. Met GULU#38855 is
                -- bepaald dat de kosten vanaf 2017 op andere rekeningnummers komen dan de kosten uit voorafgaande
                -- jaren.
                'GUL',     DECODE (coalesce (to_char(o.mld_opdr_datumbegin, 'yyyy'), coalesce(to_char(c.cnt_contract_looptijd_tot,'yyyy'), to_char(bo.bes_bestelopdr_datum, 'yyyy'))),
                                   '2017', k.prs_kostensoort_refcode,
                                           DECODE (substr(k.prs_kostensoort_upper,1,2), 'CF', '1350822',
                                                                                        'CV', '1350823',
                                                                                              'Onbekend')
                                  ),
                'IT',      DECODE (coalesce (to_char(o.mld_opdr_datumbegin, 'yyyy'), coalesce(to_char(c.cnt_contract_looptijd_tot,'yyyy'), to_char(bo.bes_bestelopdr_datum, 'yyyy'))),
                                   '2017', k.prs_kostensoort_refcode,
                                           DECODE (substr(k.prs_kostensoort_upper,1,2), 'CF', '1350822',
                                                                                        'CV', '1350823',
                                                                                        'NC', DECODE (substr(k.prs_kostensoort_upper,1,7), 'NC PROJ', '1350817', '1350824'),
                                                                                              k.prs_kostensoort_refcode)
                                  ),
                'LB',      DECODE (coalesce (to_char(o.mld_opdr_datumbegin, 'yyyy'), coalesce(to_char(c.cnt_contract_looptijd_tot,'yyyy'), to_char(bo.bes_bestelopdr_datum, 'yyyy'))),
                                   '2017', k.prs_kostensoort_refcode,
                                           DECODE (substr(k.prs_kostensoort_upper,1,2), 'CO', '1350822',  -- Geen CF
                                                                                        'CF', '1350822',
                                                                                        'C ', '1350822',  -- Geen CF
                                                                                        'CV', '1350823',
                                                                                        'NC', DECODE (substr(k.prs_kostensoort_upper,1,7), 'NC PROJ', '1350817', '1350824'),
                                                                                              'Onbekend')
                                  ),
                'PM',      DECODE (coalesce (to_char(o.mld_opdr_datumbegin, 'yyyy'), coalesce(to_char(c.cnt_contract_looptijd_tot,'yyyy'), to_char(bo.bes_bestelopdr_datum, 'yyyy'))),
                                   '2017', k.prs_kostensoort_refcode,
                                           DECODE (substr(k.prs_kostensoort_upper,1,5), 'NC PR', '1350817',  -- Geen NC PROJ
                                                                                                 'Onbekend')
                                  ),
                'SITECH',  DECODE (coalesce (to_char(o.mld_opdr_datumbegin, 'yyyy'), coalesce(to_char(c.cnt_contract_looptijd_tot,'yyyy'), to_char(bo.bes_bestelopdr_datum, 'yyyy'))),
                                   '2017', k.prs_kostensoort_refcode,
                                           DECODE (substr(k.prs_kostensoort_upper,1,3), 'ST ', '1350822',
                                                                                        'STB', '1350822',
                                                                                        'AS ', '1350822',
                                                                                        'AE ', DECODE (substr(k.prs_kostensoort_upper,1,7), 'AE PROJ', '1350817', '1350824'),
                                                                                               'Onbekend')
                                  ),
                           -- standaard keuze werkt voor de meeste accounts.
                           DECODE (coalesce (to_char(o.mld_opdr_datumbegin, 'yyyy'), coalesce(to_char(c.cnt_contract_looptijd_tot,'yyyy'), to_char(bo.bes_bestelopdr_datum, 'yyyy'))),
                                   '2017', k.prs_kostensoort_refcode,
                                           DECODE (substr(k.prs_kostensoort_upper,1,3), 'CF ', '1350822',
                                                                                        'CFE', '1350822',
                                                                                        'CV ', '1350823',
                                                                                        'CVE', '1350824',
                                                                                        'NC ', DECODE (substr(k.prs_kostensoort_upper,1,7),  'NC PROJ', '1350817', '1350824'),
                                                                                              'Onbekend')
                                  )
                ),
           '' vk_prs_kostensoort_refcode,
           k.prs_kostensoort_key,
           COALESCE(o.prs_kostenplaats_key,
              COALESCE(c.prs_kostenplaats_key,
                      (SELECT DISTINCT b.prs_kostenplaats_key
                         FROM bes_bestelling b,
                              bes_bestelopdr_item boi,
                              bes_bestelling_item bi
                        WHERE 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)
                      )
                   ),
           o.mld_opdr_key,
           c.cnt_contract_key,
           bo.bes_bestelopdr_key,
           ( -- status van de factuur is ingevoerd als er facturen van dezelfde leverancier en nummer zijn
             -- met status ingevoerd, afgewezen of incompleet
             SELECT DECODE(count(*), 0, f.fin_factuur_statuses_key, 2)
               FROM fin_factuur f_t, cnt_contract c_t, bes_bestelopdr b_t, mld_opdr o_t
              WHERE f_t.fin_factuur_verwijder is null
                AND f_t.mld_opdr_key = o_t.mld_opdr_key(+)
                AND f_t.cnt_contract_key = c_t.cnt_contract_key(+)
                AND f_t.bes_bestelopdr_key = b_t.bes_bestelopdr_key(+)
                AND COALESCE(o_t.mld_uitvoerende_keys, COALESCE(b_t.prs_bedrijf_key, c_t.cnt_prs_bedrijf_key))
                  = COALESCE(o.mld_uitvoerende_keys, COALESCE(bo.prs_bedrijf_key, c.cnt_prs_bedrijf_key))
                AND f.fin_factuur_nr = f_t.fin_factuur_nr
                AND f_t.fin_factuur_statuses_key in (1,2,3)
                AND f.fin_factuur_statuses_key = 6) fin_factuur_statuses_key,
           lk.prs_kostenplaats_nr lev_kpn
    FROM fin_factuur f,
         fin_factuurregel fr,
         fin_btwtabelwaarde btw,
         mld_opdr o,
         mld_typeopdr ot,
         cnt_contract c,
         bes_bestelopdr bo,
         prs_bedrijf b_o,
         prs_bedrijf b_c,
         prs_bedrijf b_b,
         prs_kostensoort k,
         prs_kostensoortgrp kg,
         prs_kostenplaats lk
    WHERE     f.fin_factuur_key = fr.fin_factuur_key
          AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key
          AND f.mld_opdr_key = o.mld_opdr_key(+)
          AND o.mld_typeopdr_key = ot.mld_typeopdr_key(+)
          AND f.cnt_contract_key = c.cnt_contract_key(+)
          AND f.bes_bestelopdr_key = bo.bes_bestelopdr_key(+)
          AND bo.prs_bedrijf_key = b_b.prs_bedrijf_key(+)
          AND o.mld_uitvoerende_keys = b_o.prs_bedrijf_key(+)
          AND c.cnt_prs_bedrijf_key = b_c.prs_bedrijf_key(+)
          AND f.prs_kostensoort_key = k.prs_kostensoort_key(+)
          AND k.prs_kostenplaats_key = lk.prs_kostenplaats_key(+)
          AND k.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key(+)
          AND f.fin_factuur_verwijder IS NULL;


CREATE OR REPLACE VIEW aaxx_v_export_exact_xml (
   result,
   result_order
   )
AS
   SELECT fac_rapport_regel, fac_rapport_volgnr
   FROM fac_rapport
   WHERE fac_rapport_node = 'EXACT';

/* nieuwe view om oude aaxx_v_export_exact_xml view op termijn te vervangen. Door gebruik te maken
   van de nieuwe view hoeft er per klant geen specifieke export in de cust.sql. De prefix in de
   export tabel staat dan op AAXX */
CREATE OR REPLACE VIEW aaxx_v_export_exact (
   result,
   result_order
   )
AS
   SELECT result, result_order
   FROM aaxx_v_export_exact_xml;

CREATE OR REPLACE VIEW aaxx_v_bron_export_exact_xml
(
   fin_factuur_key,
   oms25,
   opdracht_id,
   datum,
   crdnr,
   projectnr,
   projectnaam,
   bedrag_txt,
   bedrag,
   bedrag_incl,
   betaalref,
   itemcode,
   reknr,
   kstplcode,
   kstdrcode,
   btw_code,
   lev_kpn
)
AS
   SELECT fin_factuur_key,
             opdracht_id
          || ' - '
          || REPLACE (SUBSTR (fin_factuur_opmerking, 1, 30), ',', '')
             oms25,
          opdracht_id,
          TO_CHAR (fin_factuur_datum, 'yyyy-mm-dd') datum,
          (SELECT prs_leverancier_nr
             FROM prs_bedrijf b
            WHERE b.prs_bedrijf_key = fg.prs_bedrijf_key)
             crdnr,
          project_nummer,
          project_naam,
          REPLACE (TO_CHAR (bedrag), ',', '.') bedrag_txt,
          bedrag,
          bedrag_incl,
          fin_factuur_nr || '/' || fin_factuur_debiteur_nr betaalref,
          prs_kostensoort_oms itemcode,
          prs_kostensoort_refcode reknr,
          DECODE (
             aaxx_get_user,
                   'IT', DECODE (lev_kpn,
                                    '2000700', '00100001',
                                    (SELECT DECODE (SUBSTR (PRS_KOSTENPLAATS_NR, 1, 1),
                                              '2', '999999',
                                              PRS_KOSTENPLAATS_NR)
                                       FROM prs_kostenplaats kp
                                      WHERE kp.prs_kostenplaats_key = fg.prs_kostenplaats_key
                                     )
                                ),
                   'LB',
                   '02610001',
                   'FPC',
                   '00780164',
                   'GUL',
                   (select exact_code from aaxx_v_exact_code_gebouw_fac ecgf where ecgf.fin_factuur_key = fg.fin_factuur_key),
                   'ARCADIS',
                   DECODE (cnt_contract_key, NULL,
                   (select exact_code from aaxx_v_exact_code_gebouw_fac ecgf where ecgf.fin_factuur_key = fg.fin_factuur_key),
                   '999999'),
                   '999999'
                 ) kstplcode,
          (  SELECT prs_kostenplaats_nr
               FROM prs_kostenplaats kp
              WHERE kp.prs_kostenplaats_key = fg.prs_kostenplaats_key ) kstdrcode,
          fin_btwtabelwaarde_code btw_code,
          lev_kpn
     FROM (  SELECT fin_factuur_key,
                    opdracht_id,
                    project_nummer,
                    project_naam,
                    fin_factuur_datum,
                    fin_factuur_nr,
                    prs_bedrijf_key,
                    fin_factuur_debiteur_nr,
                    fin_factuur_opmerking,
                    SUM (fin_factuurregel_totaal) bedrag,
                    SUM (fin_factuurregel_totaal + fin_factuurregel_btw) bedrag_incl,
                    fin_btwtabelwaarde_code,
                    prs_kostensoort_oms,
                    prs_kostensoort_refcode,
                    mld_opdr_key,
                    cnt_contract_key,
                    prs_kostenplaats_key,
                    lev_kpn
               FROM aaxx_v_factuur_gegevens g
              WHERE fin_factuur_statuses_key = 6
           GROUP BY fin_factuur_key,
                    opdracht_id,
                    project_nummer,
                    project_naam,
                    fin_factuur_datum,
                    fin_factuur_nr,
                    prs_bedrijf_key,
                    fin_factuur_debiteur_nr,
                    fin_factuur_opmerking,
                    fin_btwtabelwaarde_code,
                    prs_kostensoort_oms,
                    prs_kostensoort_refcode,
                    mld_opdr_key,
                    cnt_contract_key,
                    prs_kostenplaats_key,
                    lev_kpn) fg;

-- Procedure om alle facturen te exporteren naar exact.
CREATE OR REPLACE PROCEDURE aaxx_select_exact_xml (p_applname IN VARCHAR2,
                                                   p_applrun IN VARCHAR2
)
AS
   CURSOR c
   IS
       SELECT fin_factuur_key, oms25, datum
         FROM aaxx_v_bron_export_exact_xml
        GROUP BY fin_factuur_key, oms25, datum;

   CURSOR c_sub (c_factuur_key NUMBER)
   IS
       SELECT *
         FROM aaxx_v_bron_export_exact_xml
        WHERE fin_factuur_key = c_factuur_key;

   v_order_count     NUMBER;
   v_amount_sum      NUMBER(10,2);
   v_amount_sum_incl NUMBER(10,2);
   v_count           NUMBER;
   v_sub_count       NUMBER;
   v_bestand         VARCHAR2(12);
   v_boekstuknummer  NUMBER;

BEGIN

   v_order_count     := 0;
   v_amount_sum      := 0;
   v_amount_sum_incl := 0;
   v_count           := 0;
   v_bestand         := SUBSTR(p_applname, 1, 12);

   -- Eerst opruiming
   DELETE FROM imp_log
    WHERE imp_log_applicatie = p_applname;

   DELETE fac_rapport
    WHERE fac_rapport_node = v_bestand;

   -- Verwijder het kenmerk boekstuknummer van de facturen die niet op verwerkt staan
   -- ## AAIT#36589
   DELETE fin_kenmerkfactuur kf
    WHERE fin_kenmerk_key = 3
      AND fin_factuur_key IN (SELECT fin_factuur_key
                                FROM fin_factuur
                               WHERE fin_factuur_statuses_key <> 7);

   -- Bewaar de factuur keys in een tijdelijke tabel zodat bij het verwerken (nieuwe export)
   -- deze keys gebruikt kunnen worden.
   DELETE aaxx_exp_factuur;

   INSERT INTO aaxx_exp_factuur (fin_factuur_key)
   ( SELECT DISTINCT fin_factuur_key
       FROM aaxx_v_factuur_gegevens
      WHERE fin_factuur_statuses_key = 6
        AND fin_factuur_datum > SYSDATE - (5 * 365)  -- Check op geldige factuurdatum:
        AND fin_factuur_datum < SYSDATE + 365        -- facturen mogen niet ouder zijn dan 5 jaar of meer dan één jaar in de toekomst.
   );

   -- Bepaal het boekstuknummer (key 3) met het hoogste nummer van dit jaar
   -- ## AAIT#36589

   SELECT MAX(fin_kenmerkfactuur_waarde)+1
     INTO v_boekstuknummer
     FROM fin_kenmerkfactuur
    WHERE fin_kenmerk_key = 3
      AND SUBSTR(fin_kenmerkfactuur_waarde,1,2) = TO_CHAR(SYSDATE, 'YY');

   IF v_boekstuknummer IS NULL
   THEN
      v_boekstuknummer := FAC.safe_to_number(TO_CHAR(SYSDATE, 'YY') || '000000');
   END IF;

   -- header
   aaxx_add_xml_row (v_bestand, '<?xml version="1.0" encoding="windows-1252"?>');
   aaxx_add_xml_row (v_bestand, '<eExact>');
   aaxx_add_xml_row (v_bestand, '<GLEntries>');

   FOR rec IN c
   LOOP
      BEGIN
         -- controleer of de factuur in de aaxx_exp_tabel staat. Anders mag deze niet geexporteerd worden.
         SELECT count(*)
           INTO v_count
           FROM aaxx_exp_factuur
          WHERE fin_factuur_key = rec.fin_factuur_key;

         IF v_count <> 0
         THEN
            -- Eerst maar even een kenmerk voor het boestuknummer aanmaken
            INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde)
                   VALUES (rec.fin_factuur_key, 3, v_boekstuknummer);

            aaxx_add_xml_row (v_bestand, '<GLEntry status="E" entry="' || xml.char_to_html(v_boekstuknummer) || '">');
               aaxx_add_xml_element (v_bestand, 'Description', rec.oms25);
               aaxx_add_xml_element (v_bestand, 'Date', rec.datum);
               aaxx_add_xml_element (v_bestand, 'DocumentDate', TO_CHAR(SYSDATE, 'YYYY-MM-DD') );
               aaxx_add_xml_row (v_bestand, '<Journal type="I" code="42"/>');
                  v_sub_count := 1;
                  FOR rec1 IN c_sub (rec.fin_factuur_key)
                  LOOP
                     BEGIN
                        aaxx_add_xml_row (v_bestand, '<FinEntryLine number="' || v_sub_count || '" subtype="T" type="N">');
                           aaxx_add_xml_element (v_bestand, 'Date', rec1.datum);
                           aaxx_add_xml_row (v_bestand, '<GLAccount code="' || xml.char_to_html(rec1.reknr) || '"/>');
                           -- Meldingnummer alleen vermelden voor opdrachten met type 'Projectorder'
                           IF (rec1.projectnr IS NOT NULL)
                           THEN
                              aaxx_add_xml_element (v_bestand, 'Description', rec.oms25);
                              aaxx_add_xml_row (v_bestand, '<Project code="' || rec1.projectnr || '" type="I" status="A">');
                              aaxx_add_xml_element (v_bestand, 'Description', rec1.projectnaam);
                              aaxx_add_xml_row (v_bestand, '</Project>');
                           ELSE
                              aaxx_add_xml_element (v_bestand, 'Description', rec1.oms25);
                           END IF;
                           aaxx_add_xml_row (v_bestand, '<Costcenter code="' || xml.char_to_html(rec1.kstplcode) || '"/>');
                           IF aaxx_get_user = 'IT' AND rec1.lev_kpn = '2000700'
                           THEN
                              aaxx_add_xml_row (v_bestand, '<Costunit code="C0000014"/>');  -- afwijkend voor AAIT facilitaire kosten AAIT#25528.
                           ELSIF aaxx_get_user = 'AMS' OR aaxx_get_user = 'GUL' OR aaxx_get_user = 'ZCN' OR aaxx_get_user = 'ARCADIS'
                           THEN
                              aaxx_add_xml_row (v_bestand, '<Costunit code="' || xml.char_to_html(rec1.kstdrcode) || '"/>');
                           ELSE
                              aaxx_add_xml_row (v_bestand, '<Costunit code="KD999999"/>');
                           END IF;
                           aaxx_add_xml_row (v_bestand, '<Creditor number="' || xml.char_to_html(rec1.crdnr) || '"/>');
                           -- AAIT#23838: kostensoort niet opnemen voor inkoopfacturen IT
                           IF ( NOT(aaxx_get_user = 'IT' AND COALESCE(rec1.lev_kpn, 'GEEN') <> '2000700') )
                           THEN
                              aaxx_add_xml_row (v_bestand, '<Item code="' || xml.char_to_html(rec1.itemcode) || '"/>');
                           END IF;
                           aaxx_add_xml_row (v_bestand, '<Amount>');
                              aaxx_add_xml_element (v_bestand, 'Debit', rec1.bedrag_txt);
                              aaxx_add_xml_row (v_bestand, '<VAT code="' || xml.char_to_html(rec1.btw_code) || '"/>');
                           aaxx_add_xml_row (v_bestand, '</Amount>');
                           aaxx_add_xml_row (v_bestand, '<Payment>');
                              aaxx_add_xml_element (v_bestand, 'Reference', rec1.betaalref);
                              aaxx_add_xml_element (v_bestand, 'InvoiceNumber', rec1.fin_factuur_key); -- of moet dit v_boekstuknummer worden????
                           aaxx_add_xml_row (v_bestand, '</Payment>');
                           aaxx_add_xml_row (v_bestand, '<FinReferences>');
                              aaxx_add_xml_element (v_bestand, 'YourRef', rec1.betaalref);
                              aaxx_add_xml_element (v_bestand, 'DocumentDate', TO_CHAR(SYSDATE, 'YYYY-MM-DD') );
                           aaxx_add_xml_row (v_bestand, '</FinReferences>');
                           aaxx_add_xml_row (v_bestand, '<FreeFields>');
                              aaxx_add_xml_row (v_bestand, '<FreeTexts>');
                                 aaxx_add_xml_row (v_bestand, '<FreeText number="3">' || rec1.opdracht_id || '</FreeText>');
                              aaxx_add_xml_row (v_bestand, '</FreeTexts>');
                           aaxx_add_xml_row (v_bestand, '</FreeFields>');
                        aaxx_add_xml_row (v_bestand, '</FinEntryLine>');
                        v_sub_count := v_sub_count + 1;
                        v_amount_sum   := v_amount_sum + rec1.bedrag;
                        v_amount_sum_incl   := v_amount_sum_incl + rec1.bedrag_incl;
                     END;
                  END LOOP;
            aaxx_add_xml_row (v_bestand, '</GLEntry>');
            v_order_count  := v_order_count + 1;
            v_boekstuknummer := v_boekstuknummer + 1;
         END IF;
      END;
   END LOOP;

   aaxx_add_xml_row (v_bestand, '</GLEntries>');
   aaxx_add_xml_row (v_bestand, '</eExact>');
   fac.writelog (p_applname, 'S', 'Exact export uitgevoerd. Aantal regels: ' || v_order_count || ' Totaal bedrag: ' || v_amount_sum || ' Totaal bedrag (incl): ' || v_amount_sum_incl, '');

END;
/

/* nieuwe procedure om oude aaxx_select_exact_xml procedure op termijn te vervangen. Door gebruik te maken
   van de nieuwe procedure hoeft er per klant geen specifieke export in de cust.sql. De prefix in de
   export tabel staat dan op AAXX */
CREATE OR REPLACE PROCEDURE aaxx_select_exact (p_applname IN VARCHAR2,
                                               p_applrun IN VARCHAR2
)
AS
BEGIN
   aaxx_select_exact_xml (p_applname, p_applrun);
END;
/

-- Procedure om alle facturen te exporteren naar exact.
CREATE OR REPLACE PROCEDURE aaxx_export_exact (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
   v_errormsg       VARCHAR (200);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
BEGIN
   -- functionaliteit verplaatst naar aaxx_select_exact_xml procedure om er zeker van te zijn dat
   -- de aaxx_exp_factuur tabel eerst gevuld wordt alvorens de XML gegenereerd wordt. AAVL#27120 en AAEN#26362
   NULL;
END;
/



-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - Export exact verwerk
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_export_verwerk_exact (
   result,
   result_order
   )
AS
SELECT REPLACE(REPLACE(f.fin_factuur_key
       || ';'
       || opdracht_id
       || ';'
       || fin_factuur_datum
       || ';'
       || fin_factuur_nr
       || ';'
       || prs_bedrijf_key
       || ';'
       || fin_factuurregel_totaal
       || ';'
       || fin_factuurregel_btw
       || ';'
       || fin_factuurregel_nr
       || ';'
       || fin_factuur_debiteur_nr
       || ';'
       || project_nummer
       || ';'
       || prs_kostensoort_refcode
       || ';'
       || mld_opdr_key
       || ';'
       || cnt_contract_key
      ,CHR (13), ''), CHR (10), '<ret>'), f.fin_factuur_key
  FROM aaxx_exp_factuur f,
       aaxx_v_factuur_gegevens fg
 WHERE f.fin_factuur_key = fg.fin_factuur_key
   AND fg.fin_factuur_statuses_key = 6;


-- Procedure om alle geexporteerde facturen naar status verwerkt te zetten.
-- Gebruik verkoopfactuur:
--          fin_verkoopfactuur_id         datum + referentie
--          fin_verkoopfactuur_xmlnode    opdracht / contract / bestelopdr / opdr_uren
--          fin_verkoopfactuur_refkey     key naar het record
--          fin_verkoopfactuur_aanmaak    sysdate
--          prs_kostenplaats_nr           kostenplaatsnr
--          prs_debiteur_naam             debiteurnummer
--          prs_kostensoort_oms           kostensoort
--          prs_kostensoort_opmerking     kostensoort_opmerking wordt niet gebruikt voor verkoopfacturen
--          prs_kostensoort_refcode       grootboekrekening
--          prs_kostensoortgrp_oms        referentie
--          fin_verkoopfactuur_omschr     omschrijving subregel
--          fin_verkoopfactuur_bedrag
--          fin_btwtabelwaarde_code
--          fin_verkoopfactuur_maand      jaar in verband met boekingen op balansrekening als op vorige jaren
--          fin_verkoopfactuur_c1         Exact code van het gebouw. Is kenmerk van gebouw
--          fin_verkoopfactuur_c2         Groepering van de kopregel van de factuur.
--          fin_verkoopfactuur_c3         Volgorde van de subregels van de factuur.
--          fin_verkoopfactuur_c4         Kenmerk ordernummer klant (DBS special).



   -- module, export_datum, prs_kostenplaats_nr, debiteur, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, omschrijving, bedrag, btw, fin_btwtabelwaarde_code, opdr_jaar, exact_code_gebouw, groepering, subregelvolgorde
      fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3

CREATE OR REPLACE PROCEDURE aaxx_export_verwerk_exact (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
   CURSOR c_fact
   IS
     SELECT f.fin_factuur_key
       FROM aaxx_exp_factuur f
          , aaxx_v_factuur_gegevens fg
      WHERE f.fin_factuur_key = fg.fin_factuur_key
        AND fg.fin_factuur_statuses_key = 6;

   CURSOR c_opdr
   IS
     SELECT distinct fg.mld_opdr_key, mld_statusopdr_key, m.mld_melding_status, m.mld_melding_key
       FROM aaxx_exp_factuur f
          , aaxx_v_factuur_gegevens fg
          , mld_opdr o
          , mld_melding m
      WHERE f.fin_factuur_key = fg.fin_factuur_key
        AND fg.mld_opdr_key = o.mld_opdr_key
        AND o.mld_melding_key = m.mld_melding_key
        AND laatste_factuur = 1
        AND fg.fin_factuur_statuses_key = 6;

   CURSOR c_bes
   IS
     SELECT bo.*
       FROM aaxx_exp_factuur f
          , aaxx_v_factuur_gegevens fg
          , bes_bestelopdr bo
      WHERE f.fin_factuur_key = fg.fin_factuur_key
        AND fg.bes_bestelopdr_key = bo.bes_bestelopdr_key
        AND laatste_factuur = 1
        AND fg.fin_factuur_statuses_key = 6;

/* Wacht op release 2016.3 AAIT#37411
   -- pas de bedragen in het factuurschema aan als de laatste factuur ontvangen is.
   CURSOR c_cnt
   IS
     SELECT DISTINCT fg.cnt_contract_key, fs.cnt_factuurschema_key
       FROM aaxx_exp_factuur f,
            aaxx_v_factuur_gegevens fg,
            cnt_contract c,
            cnt_factuurschema fs
      WHERE f.fin_factuur_key = fg.fin_factuur_key
        AND fg.cnt_contract_key = c.cnt_contract_key
        AND c.cnt_contract_key = fs.cnt_contract_key
        AND fg.fin_factuur_boekmaand = fs.cnt_factuurschema_boekmaand
        AND laatste_factuur = 1
        AND fg.fin_factuur_statuses_key = 6;
*/

    CURSOR c_sync_kostensoort
    IS
      SELECT COALESCE (kstd.prs_kostensoort_key, kvg.prs_kostensoort_key)
                std_kostensoort_key,
             f.prs_kostensoort_key fac_kostensoort_key,
             f.fin_factuur_key
        FROM fin_factuur f,
             aaxx_exp_factuur ef,
             mld_opdr o,
             mld_melding m,
             mld_stdmelding std,
             ins_tab_discipline md,
             prs_kostensoort kstd,
             prs_kostensoort kvg
       WHERE f.fin_factuur_key = ef.fin_factuur_key
         AND f.mld_opdr_key = o.mld_opdr_key
         AND m.mld_melding_key = o.mld_melding_key
         AND m.mld_stdmelding_key = std.mld_stdmelding_key
         AND std.mld_ins_discipline_key = md.ins_discipline_key
         AND std.prs_kostensoort_key = kstd.prs_kostensoort_key(+)
         AND md.prs_kostensoort_key = kvg.prs_kostensoort_key(+);

   v_errormsg       VARCHAR (200);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanvrager      NUMBER;
   v_bestelling_key NUMBER;
   v_logdate        DATE;
BEGIN
   v_errormsg := 'Geen akties';

-- Facilitor user
  IF aaxx_get_user = 'SITECH'
  THEN
     v_aanvrager := 6524;
  ELSE
     v_aanvrager := 4;
  END IF;

   -- AAIT#34097 aanpassen kostensoort bij factuur. Soms wordt de stdmelding aangepast terwijl
   -- er al een factuur geboekt is. Door bij het verwerken van de factuur deze kostensoort nog
   -- aan te passen wordt voorkomen dat hier verschillen gaan ontstaan.
   -- AAIT#36442 AAIT niet meenemen in dit mechanisme omdat bij AAIT de kostensoort uit de opdracht
   -- gehaald wordt.
   IF aaxx_get_user <> 'IT'
   THEN
      v_errormsg := 'Aanpassen kostensoort';
      FOR reck IN c_sync_kostensoort
      LOOP
         BEGIN
            IF reck.fac_kostensoort_key <> reck.std_kostensoort_key
            THEN
               UPDATE fin_factuur
                  SET prs_kostensoort_key = reck.std_kostensoort_key
                WHERE fin_factuur_key = reck.fin_factuur_key;

               -- Pas de login aan
               INSERT INTO fac_tracking (fac_tracking_refkey, fac_srtnotificatie_key, fac_tracking_oms)
                 SELECT reck.fin_factuur_key, fac_srtnotificatie_key, 'Kostensoort aangepast in factuur export'
                   FROM fac_srtnotificatie
                  WHERE fac_srtnotificatie_code = 'FINUPD';
            END IF;
         END;
      END LOOP;
   END IF;

   -- Verkoopinterface

   v_logdate := SYSDATE;
   -- voeg SA en ST opdrachten toe aan de fin_verkoopfacturen (vh. verkoopbuffer)
   -- BTW tarief in verkoopbuffer is altijd 19 procent (AADS#18338)
   INSERT INTO fin_verkoopfactuur
   (
      -- module, export_datum, prs_kostenplaats_nr, debiteur, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, omschrijving, bedrag, btw, fin_btwtabelwaarde_code, opdr_jaar, exact_code_gebouw, groepering, subregelvolgorde
       fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_bedrijf_key, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3, fin_verkoopfactuur_n1
   )
   SELECT substr(to_char(v_logdate, 'dd-mm-yyyy') || ' - ' || sd.ins_srtdiscipline_prefix || m.mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr, 1,30 ),
          'opdracht',
          o.mld_opdr_key,
          v_logdate,
          DECODE (aaxx_get_user, 'AH',  aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                                 'DBS', DECODE (ks.prs_kostensoort_upper, 'CV EIG BOUW PL', '913757',
                                                                          'CV EIG INST PL', '913757',
                                                                          substr(aaxx_get_lev2_dep_code(k.prs_kostenplaats_nr),1,6)),
                                 'DOW', k.prs_kostenplaats_nr,
                                 'DSM', DECODE (SUBSTR(ks.prs_kostensoort_upper,1,3) , 'CV ', '520',
                                                                                       'CVE', aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                                 'SITECH', aaxx_get_dep_code(k.prs_kostenplaats_nr),
                                 'ESSENT', '912001',
                                 'LB',  exact_code,
                                 'NMM',  'MGB',
                                 'SABIC', DECODE (to_char(opdr_datum, 'YYYY'), '2012', k.prs_kostenplaats_nr,
                                                                               '2013', k.prs_kostenplaats_nr,
                                                                                       aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                                 'VL',  aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                                        SUBSTR (prs_kostenplaats_nr, 1, 30)) prs_kostenplaats_nr,
          DECODE (aaxx_get_user, 'AH',  aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                                 'DBS', DECODE (ks.prs_kostensoort_upper, 'CV EIG BOUW PL', '913757',
                                                                          'CV EIG INST PL', '913757',
                                                                          substr(aaxx_get_lev2_dep_code(k.prs_kostenplaats_nr),1,6)),
                                 'DOW', substr(aaxx_get_top_dep_code(k.prs_kostenplaats_nr),1,6),
                                 'DSM', DECODE (SUBSTR(ks.prs_kostensoort_upper,1,3) , 'CV ', '520',
                                                                                       'CVE', aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                                 'SITECH', aaxx_get_dep_code(k.prs_kostenplaats_nr),
                                 'ESSENT', '912001',
                                 'LB',  DECODE(g.alg_locatie_key,
                                               1, '911928',   -- Worldwide Headquarters
                                               2, '911927',   -- Maasvlakte
                                               3, '911930',   -- Botlek
                                               4, '911929'    -- Moerdijk
                                              ),
                                 'NMM',  DECODE(k.prs_kostenplaats_nr,
                                                '0001', '913799',   -- Heijmans
                                                '0002', '913810',   -- Vermaat
                                                '0003', '913766',   -- Defensie
                                                '0004', '913776',   -- Stichting Nationaal Militair Museum
                                                        'Onbekend'
                                               ),
                                 'RABO', aaxx_get_dep_code(k.prs_kostenplaats_nr),
                                 'SABIC', DECODE (to_char(opdr_datum, 'YYYY'), '2012', aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                                                                               '2013', aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                                                                                       (SELECT distinct prs_leverancier_nr FROM prs_bedrijf b, prs_afdeling a
                                                                                         WHERE b.prs_bedrijf_key = a.prs_bedrijf_key
                                                                                           AND b.prs_bedrijf_verwijder IS NULL
                                                                                           AND a.prs_afdeling_verwijder IS NULL
                                                                                           AND a.prs_afdeling_naam = aaxx_get_top_dep_code(k.prs_kostenplaats_nr))),
                                 'VL',  aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                                 'ZCN', '913815',
                                 'ZKHM', '913816',
                                        SUBSTR (prs_kostenplaats_nr, 1, 30)) debiteur,
          b.prs_bedrijf_key,
          ks.prs_kostensoort_oms || DECODE(TO_CHAR(opdr_datum,'YYYY'), TO_CHAR(TO_NUMBER(TO_CHAR(SYSDATE, 'yyyy'))-1), ' VJ','') ,
          ks.prs_kostensoort_opmerking,
          vk_prs_kostensoort_refcode,
          SUBSTR(DECODE (aaxx_get_user,
                         'AH',  DECODE(SUBSTR(ks.prs_kostensoort_upper,1,2), 'CV', ksg.prs_kostensoortgrp_oms,
                                                                                   sd.ins_srtdiscipline_prefix || m.mld_melding_key),
                         'DBS', DECODE(ks.prs_kostensoortgrp_key, 3, 'Projecten', 'Core Variable'),
                         'DOW', 'Service Charges',
                         'RABO', 'Servicekosten ' || aaxx_get_dep_code(k.prs_kostenplaats_nr),
                         'VL', 'Core Variabel',
                         'ZCN', DECODE(sd.ins_srtdiscipline_prefix, 'PR',  'Projecten',
                                                                    DECODE(aaxx_get_top_dep_code(prs_kostenplaats_nr), 'SN', 'Servicekosten',
                                                                                                                       'KL', 'Klantvragen',
                                                                                                                       '')),
                         'ZKHM', DECODE(sd.ins_srtdiscipline_prefix, 'PR',  'Projecten',
                                                                     DECODE(aaxx_get_top_dep_code(prs_kostenplaats_nr), 'SN', 'Servicekosten',
                                                                                                                        'KL', 'Klantvragen',
                                                                                                                        '')),
                         ksg.prs_kostensoortgrp_oms || DECODE (aaxx_get_user, 'LB', ' ' || Exact_code,
                                                                              'SABIC', ' ' || DECODE (to_char(opdr_datum, 'YYYY'), '2012', k.prs_kostenplaats_nr,
                                                                                                                                   '2013', k.prs_kostenplaats_nr,
                                                                                                                                           aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                                                                              'DSM', DECODE (SUBSTR(ks.prs_kostensoort_upper,1,3) , 'CV ', ' ' || l.alg_locatie_code),
                                                                              'NMM', DECODE(k.prs_kostenplaats_nr, '0001', ' Heijmans',
                                                                                                                   '0002', ' Vermaat',
                                                                                                                   '0003', ' Defensie',
                                                                                                                   '0004', ' NMM',
                                                                                                                           ' Onbekend')
                                                              )
                        )
                 , 1, 60) prs_kostensoortgrp_oms,
          sd.ins_srtdiscipline_prefix
          || m.mld_melding_key
          || '/'
          || mld_opdr_bedrijfopdr_volgnr
          || ' '
          || d.ins_discipline_omschrijving
          || ' ('
          || (SELECT MAX(mld_kenmerkmelding_waarde)
              FROM mld_kenmerkmelding km, mld_kenmerk k
              WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                    AND (   ( aaxx_get_user <> 'DBS' AND k.mld_srtkenmerk_key = 143)              -- opdrachtnummer
                         OR ( aaxx_get_user = 'DBS' AND k.mld_srtkenmerk_key = 55)                -- projectnaam
                        )
                    AND km.mld_melding_key = m.mld_melding_key)
          || ')'
             omschrijving,
          ROUND (fg.bedrag
                 * COALESCE ( (SELECT u.uplift
                               FROM aaxx_imp_uplift u
                               WHERE u.prs_leverancier_nr = b.prs_leverancier_nr
                                     AND UPPER(soort_order) = 'WO'
                                     AND UPPER (u.prs_kostensoort_oms) =
                                           ks.prs_kostensoort_upper
                                     AND fg.fin_factuur_boekmaand =
                                              u.jaar
                                           || '-'
                                           || LTRIM (TO_CHAR (u.maand, '00'))),
                             DECODE (aaxx_get_user, 'NMM', 1.1, 1)
                   ),
                 2
          ),
          DECODE (aaxx_get_user,
                  'SITECH', DECODE (fg.prs_kostensoort_refcode, '4321006', fin_btwtabelwaarde_code, 5), --AADS#21168
                  fin_btwtabelwaarde_code) fin_btwtabelwaarde_code,
          to_char(opdr_datum, 'YYYY'),
          DECODE (aaxx_get_user,
                  'LB', l.alg_locatie_code,
                  'NMM', 'MGB',
                  COALESCE(exact_code, alg_gebouw_code)),  -- C1
          SUBSTR (
             DECODE (aaxx_get_user, 'AH',  DECODE(SUBSTR(ks.prs_kostensoort_upper,1,2), 'CV', ksg.prs_kostensoortgrp_oms,
                                                                                              sd.ins_srtdiscipline_prefix || m.mld_melding_key),
                                    'DBS', DECODE (ks.prs_kostensoort_upper, 'NC PROJ', '913757' || m.mld_melding_key,
                                                                             'CV EIG BOUW PL', '913757',
                                                                             'CV EIG INST PL', '913757',
                                                                             'CVE GEB NIET PLAN', aaxx_get_lev2_dep_code(k.prs_kostenplaats_nr) || m.mld_melding_key,
                                                                             'CVE INSTAL NIET PLAN', aaxx_get_lev2_dep_code(k.prs_kostenplaats_nr) || m.mld_melding_key,
                                                                                        aaxx_get_lev2_dep_code(k.prs_kostenplaats_nr)),
                                    'SITECH', (SELECT fac_usrdata_omschr
                                              FROM alg_onrgoedkenmerk, fac_usrdata ud
                                             WHERE     alg_onrgoed_key = g.alg_gebouw_key
                                                   AND alg_kenmerk_key = 1060   -- rema contract
                                                   AND ud.fac_usrdata_key =
                                                         fac.safe_to_number (alg_onrgoedkenmerk_waarde)
                                                   AND (   ks.prs_kostensoort_upper LIKE 'ST ONDH%'
                                                        OR ks.prs_kostensoort_upper LIKE 'STB ONDH%')),
                                    'DOW', substr(aaxx_get_top_dep_code(k.prs_kostenplaats_nr),1,8) ||
                                           DECODE(substr(aaxx_get_top_dep_code(k.prs_kostenplaats_nr),1,3),
                                              '911', DECODE(SUBSTR(ks.prs_kostensoort_upper, 1,5), 'NC P ', 'PR', 'NC/CV'),
                                              '912', 'CV/NC/PR',
                                              '913', DECODE(SUBSTR(ks.prs_kostensoort_upper, 1,7), 'COR VAR', 'CV', 'NC/PR'),
                                              'Onbekend') ||
                                           substr(aaxx_get_top_dep_code(k.prs_kostenplaats_nr),1,8),
                                    'DSM', DECODE (SUBSTR(ks.prs_kostensoort_upper,1,3) , 'CV ', ksg.prs_kostensoortgrp_oms || ' ' || l.alg_locatie_code,
                                                                                          'CVE', aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                                    'RABO', aaxx_get_dep_code(k.prs_kostenplaats_nr),
                                    'SABIC', DECODE (to_char(opdr_datum, 'YYYY'), '2012', '',
                                                                                  '2013', '',
                                                                                          aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                                    'ZCN', DECODE(sd.ins_srtdiscipline_prefix, 'PR', to_char(m.mld_melding_key),
                                                                               aaxx_get_top_dep_code(prs_kostenplaats_nr)),
                                    'ZKHM', DECODE(sd.ins_srtdiscipline_prefix, 'PR', to_char(m.mld_melding_key),
                                                                                aaxx_get_top_dep_code(prs_kostenplaats_nr)),
                                    '')
             , 1, 12) groepering,   -- C2
          DECODE (aaxx_get_user, 'LB', prs_kostensoort_oms || '1',
                                 'DOW', 'A' || prs_kostensoort_oms,
                                 'ESSENT', (SELECT uplift
                                              FROM aaxx_imp_uplift u
                                             WHERE u.prs_kostensoort_oms = ks.prs_kostensoort_oms),
                                 '') subregelvolgorde,  -- C3
          l.alg_locatie_key    -- N1
   FROM mld_opdr o,
        mld_typeopdr ot,
        prs_bedrijf b,
        prs_kostenplaats k,
        mld_melding m,
        mld_stdmelding std,
        ins_tab_discipline d,
        ins_srtdiscipline sd,
        prs_kostensoort ks,
        prs_kostensoortgrp ksg,
        aaxx_exp_factuur f,
        alg_gebouw g,
        alg_locatie l,
        alg_v_onroerendgoed og,
        aaxx_v_exact_code_gebouw exact,
        (SELECT fin_factuur_key,
                mld_opdr_key,
                SUM (fin_factuurregel_totaal) bedrag,
                aaxx_get_verkoop_btw_code (fin_btwtabelwaarde_key) fin_btwtabelwaarde_code,
                prs_kostenplaats_key,
                prs_kostensoort_key,
                prs_kostensoort_refcode,
                vk_prs_kostensoort_refcode,
                fin_factuur_boekmaand,
                opdr_datum,
                fin_factuur_datum
         FROM aaxx_v_factuur_gegevens
         WHERE fin_factuur_statuses_key = 6
         GROUP BY fin_factuur_key,
                  fin_btwtabelwaarde_key,
                  mld_opdr_key,
                  prs_kostenplaats_key,
                  prs_kostensoort_key,
                  fin_factuur_boekmaand,
                  opdr_datum,
                  fin_factuur_datum,
                  fin_factuurregel_btw,
                  fin_btwtabelwaarde_code,
                  vk_prs_kostensoort_refcode,
                  prs_kostensoort_refcode,
                  fin_factuurregel_totaal) fg
   WHERE     fg.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
         AND o.mld_typeopdr_key = ot.mld_typeopdr_key
         AND fg.mld_opdr_key = o.mld_opdr_key
         AND m.mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys(+)
         AND og.alg_gebouw_key = g.alg_gebouw_key(+)
         AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
         AND og.alg_gebouw_key = exact.alg_gebouw_key(+)
         AND fg.fin_factuur_key = f.fin_factuur_key
         AND o.mld_melding_key = m.mld_melding_key
         AND o.mld_uitvoerende_keys = b.prs_bedrijf_key
         AND fg.prs_kostensoort_key = ks.prs_kostensoort_key(+)
         AND ks.prs_kostensoortgrp_key = ksg.prs_kostensoortgrp_key(+)
         AND m.mld_stdmelding_key = std.mld_stdmelding_key
         AND std.mld_ins_discipline_key = d.ins_discipline_key
         AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
         AND ((       sd.ins_srtdiscipline_prefix = 'SA'
                  AND aaxx_get_user <> 'VL'
                  AND aaxx_get_user <> 'AH'
                  AND aaxx_get_user <> 'DSM'
                  AND aaxx_get_user <> 'SABIC'
                  AND aaxx_get_user <> 'ZCN'
                  AND aaxx_get_user <> 'ZKHM'
                  AND aaxx_get_user <> 'DOW'
                  AND aaxx_get_user <> 'LB'
                  AND aaxx_get_user <> 'NMM'
                  AND aaxx_get_user <> 'RABO'
                  AND aaxx_get_user <> 'DBS'
                  AND aaxx_get_user <> 'ESSENT')
              OR (     aaxx_get_user = 'SITECH'
                  AND (   ks.prs_kostensoort_upper LIKE 'ST ONDH%'
                       OR ks.prs_kostensoort_upper LIKE 'STB ONDH%')
                  AND ot.mld_typeopdr_omschrijving = 'Workorder'
                 )
              OR (     aaxx_get_user = 'AH'
                  AND (   ks.prs_kostensoort_upper LIKE 'CV%'
                       OR ks.prs_kostensoort_upper LIKE 'NC PROJ%')
                 )
              OR (     aaxx_get_user = 'DBS'
                  AND  ks.prs_kostensoort_upper IN (
                               'CV AFVAL REST',
                               'CV OND',
                               'CV GEB NIET PLAN',
                               'CV INSTAL NIET PLAN',
                               'CV TERR VERHARD',
                               'CV TERR NIET PL',
                               'CV OND TERR',
                               'CV TERR OVR',
                               'CV CONS REST',
                               'CV CONS SERV',
                               'CV CONS OVR',
                               'CV CONS AUT',
                               'CV BEWAK',
                               'CV PREV CAL',
                               'CV BEWAK OVR',
                               'CV SCH',
                               'CV SCH GLAS',
                               'CV SCH OVR',
                               'CV VGM',
                               'CV GROEN',
                               'CV EIG BOUW PL',
                               'CV EIG INST PL',
                               'NC PROJ',
                               'CVE INSTAL NIET PLAN',
                               'CVE GEB NIET PLAN')
                 )
              OR (     aaxx_get_user = 'DOW'
                   AND (    ot.mld_typeopdr_omschrijving = 'Workorder'
                        OR  ot.mld_typeopdr_omschrijving = 'Projectorder')
                   AND (    ks.prs_kostensoort_upper LIKE 'NC %'
                         OR ks.prs_kostensoort_upper LIKE 'NC P %'
                         OR ks.prs_kostensoort_upper = 'COR VAR MAIL SERVICES'
                         OR ks.prs_kostensoort_upper = 'COR VAR VENDING'
                         OR ks.prs_kostensoort_upper = 'COR VAR MAIN HANDYMAN'
                         OR ks.prs_kostensoort_upper = 'COR VAR GEN TEN SERV'
                       )
                 )
              OR (     aaxx_get_user = 'DSM'
                  AND  SUBSTR(ks.prs_kostensoort_upper,1,3) IN (
                               'CV ',
                               'CVE')
                 )
              OR (     aaxx_get_user = 'ESSENT'
                   AND ks.prs_kostensoort_upper LIKE 'CVE%'
                   AND ot.mld_typeopdr_omschrijving = 'Workorder'
                 )
              OR (     aaxx_get_user = 'LB'
                   AND ks.prs_kostensoort_upper LIKE 'NC%'
                   AND ks.prs_kostensoort_upper <> 'NC DERDEN'
                   AND ks.prs_kostensoort_upper <> 'NC PROJ'
                 )
              OR (     aaxx_get_user = 'NMM'
                   AND ks.prs_kostensoort_upper LIKE 'CV%'
                 )
              OR (     aaxx_get_user = 'RABO'
                  AND  ot.mld_typeopdr_omschrijving = 'Workorder'
                 )
              OR (     aaxx_get_user = 'SABIC'
                   AND (  (     o.mld_opdr_datumbegin < to_date ('20140101', 'yyyymmdd') --  Voor sabic geldt in 2014 een ander mechanisme (AASA#28673)
                            AND ks.prs_kostensoort_upper LIKE '%NC'
                            AND ot.mld_typeopdr_omschrijving = 'Workorder'
                          )
                       OR (     o.mld_opdr_datumbegin > to_date ('20140101', 'yyyymmdd') --  Voor sabic geldt voor 2014 een ander mechanisme (AASA#28673)
                            AND ks.prs_kostensoort_upper LIKE 'CV %'
                            AND ks.prs_kostensoort_upper <> 'CV CHIP'
                            AND (    o.mld_opdr_datumbegin > to_date ('20150101', 'yyyymmdd') --  Voor sabic geldt voor 2015 een ander mechanisme (AASA#31618)
                                  OR (      ks.prs_kostensoort_upper <> 'CV CONS REST'
                                        AND ks.prs_kostensoort_upper <> 'CV CONS AUT'
                                        AND ks.prs_kostensoort_upper <> 'CV SCH OVR'
                                        AND ks.prs_kostensoort_upper <> 'CV DOC POST'
                                        AND ks.prs_kostensoort_upper <> 'CV AFVAL REST'
                                     )
                                )
                            AND ( ks.prs_kostensoort_upper <> 'CV EIG BOUW PL' OR ot.mld_typeopdr_omschrijving = 'Workorder')
                          )
                       )
                 )
              OR (     aaxx_get_user = 'VL'
                   AND ( (     o.mld_opdr_datumbegin < to_date ('20160101', 'yyyymmdd') --  Voor VL geldt in 2016 een ander mechanisme (AAVL#34856)
                           AND ks.prs_kostensoort_upper IN (
                                    'CV OND',
                                    'CV TERR OVR',
                                    'CV BEWAK OVR',
                                    'CV BOUW PLAN',
                                    'CV CONS REST',
                                    'CV CONS OVR',
                                    'CV SCH',
                                    'CV WP',
                                    'CV GEB NIET PLAN',
                                    'CV CONS SERV',
                                    'CV SCH GLAS',
                                    'CV KART',
                                    'CV INSTAL PLAN',
                                    'CV BEWAK',
                                    'CV VERH',
                                    'CV GROEN',
                                    'CV INSTAL NIET PLAN',
                                    'CV PREV CAL',
                                    'CV DOC POST',
                                    'CV BEW',
                                    'CV TERR VERHARD',
                                    'CV REC',
                                    'CV DOC REP',
                                    'CV VERV PERS',
                                    'CV OND TERR',
                                    'CV ACHT OND',
                                    'CV EIG INST PL',
                                    'CV EIG BOUW PL',
                                    'NC ACHT OND',
                                    'NC INV BOUW',
                                    'NC INV WP',
                                    'NC INV INST')
                         )
                         OR
                         (     o.mld_opdr_datumbegin >= to_date ('20160101', 'yyyymmdd') --  Voor VL geldt in 2016 een ander mechanisme (AAVL#34856)
                           AND ( ks.prs_kostensoort_upper LIKE 'CVE %' OR ks.prs_kostensoort_upper LIKE 'NC %')
                         )
                       )
                 )
              OR (     aaxx_get_user = 'ZCN'
                   AND (   sd.ins_srtdiscipline_prefix = 'PR'
                        OR aaxx_get_top_dep_code(prs_kostenplaats_nr) = 'SN'
                        OR aaxx_get_top_dep_code(prs_kostenplaats_nr) = 'KL'
                       )
                 )
              OR (     aaxx_get_user = 'ZKHM'
                   AND (   sd.ins_srtdiscipline_prefix = 'PR'
                        OR aaxx_get_top_dep_code(prs_kostenplaats_nr) = 'SN'
                        OR aaxx_get_top_dep_code(prs_kostenplaats_nr) = 'KL'
                       )
                 )
             );


   -- voeg contract orders toe aan de verkoopbuffer
   -- bij SITECH wordt gegroepeerd op REMA contract
   IF aaxx_get_user = 'SITECH' THEN
     INSERT INTO fin_verkoopfactuur
     (
      -- module, export_datum, prs_kostenplaats_nr, debiteur, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, omschrijving, bedrag, btw, fin_btwtabelwaarde_code, opdr_jaar, exact_code_gebouw, groepering, subregelvolgorde
       fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3, fin_verkoopfactuur_n1
     )
      SELECT substr(to_char(v_logdate, 'dd-mm-yyyy') || ' - ' || 'C' || cnt_contract_nummer_intern || DECODE (cnt_contract_versie, NULL, '', '.' || cnt_contract_versie), 1,30 ),
             'contract',
             c.cnt_contract_key,
             v_logdate,
             aaxx_get_dep_code (k.prs_kostenplaats_nr),
             aaxx_get_dep_code (k.prs_kostenplaats_nr),
             ks.prs_kostensoort_oms || DECODE(TO_CHAR(opdr_datum,'YYYY'), TO_CHAR(TO_NUMBER(TO_CHAR(SYSDATE, 'yyyy'))-1), ' VJ','') ,
             ks.prs_kostensoort_opmerking,
             vk_prs_kostensoort_refcode,
             (SELECT prs_kostensoortgrp_oms
              FROM prs_kostensoortgrp ksg
              WHERE ksg.prs_kostensoortgrp_key = ks.prs_kostensoortgrp_key),
                'C'
             || cnt_contract_nummer_intern
             || DECODE (cnt_contract_versie, NULL, '', '.' || cnt_contract_versie)
                omschrijving,
             COALESCE((SELECT ROUND (COALESCE(cp.gewicht,1) * fg.bedrag * u.uplift, 2)
                         FROM aaxx_imp_uplift u
                        WHERE u.prs_leverancier_nr = b.prs_leverancier_nr
                          AND UPPER (soort_order) = 'CO'
                          AND UPPER (u.prs_kostensoort_oms) = ks.prs_kostensoort_upper
                          AND fg.fin_factuur_boekmaand =
                              TO_CHAR (u.jaar) || '-' || LTRIM (TO_CHAR (u.maand, '00'))), ROUND ((cp.gewicht * fg.bedrag), 2)),
             5, -- AADS#21168 , AADS#26856
             to_char(opdr_datum, 'YYYY'),
             cp.alg_gebouw_code,
             cp.rema,
             '',
             ''
      FROM cnt_contract c,
           prs_bedrijf b,
           prs_kostenplaats k,
           ins_tab_discipline d,
           prs_kostensoort ks,
           aaxx_exp_factuur f,
           (SELECT fin_factuur_key,
                   cnt_contract_key,
                   SUM (fin_factuurregel_totaal) bedrag,
                   fin_factuurregel_btw btw,
                   aaxx_get_verkoop_btw_code (fin_btwtabelwaarde_key) fin_btwtabelwaarde_code,
                   prs_kostenplaats_key,
                   prs_kostensoort_key,
                   vk_prs_kostensoort_refcode,
                   fin_factuur_boekmaand,
                   opdr_datum,
                   fin_factuur_datum
            FROM aaxx_v_factuur_gegevens
            WHERE fin_factuur_statuses_key = 6
            GROUP BY fin_factuur_key,
                     cnt_contract_key,
                     prs_kostenplaats_key,
                     prs_kostensoort_key,
                     fin_factuur_boekmaand,
                     opdr_datum,
                     fin_factuur_datum,
                     fin_factuurregel_btw,
                     fin_btwtabelwaarde_key,
                     fin_btwtabelwaarde_code,
                     vk_prs_kostensoort_refcode,
                     fin_factuurregel_totaal) fg,
           (SELECT cnt_contract_key,
                   alg_gebouw_code,
                   rema.fac_usrdata_omschr rema,
                   cp.cnt_contract_plaats_gewicht
                   / (  SELECT DECODE (SUM (cp2.cnt_contract_plaats_gewicht),
                                       0, 1,
                                       SUM (cp2.cnt_contract_plaats_gewicht))
                          FROM cnt_contract_plaats cp2
                         WHERE cp2.cnt_contract_key = cp.cnt_contract_key
                               AND cp2.cnt_contract_plaats_verwijder IS NULL
                      GROUP BY cp.cnt_contract_key)
                      gewicht
              FROM cnt_contract_plaats cp,
                   alg_gebouw g,
                   (SELECT k.alg_onrgoed_key, ud.fac_usrdata_omschr
                      FROM alg_onrgoedkenmerk k, fac_usrdata ud
                     WHERE k.alg_kenmerk_key = 1060
                           AND fac.safe_to_number (alg_onrgoedkenmerk_waarde) =
                                 fac_usrdata_key) rema
             WHERE     cp.cnt_contract_plaats_verwijder IS NULL
                   AND cp.cnt_alg_plaats_key = g.alg_gebouw_key
                   AND g.alg_gebouw_key = rema.alg_onrgoed_key(+)) cp
      WHERE     fg.prs_kostenplaats_key = k.prs_kostenplaats_key
            AND fg.cnt_contract_key = c.cnt_contract_key
            AND c.cnt_contract_key = cp.cnt_contract_key(+)
            AND fg.fin_factuur_key = f.fin_factuur_key
            AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
            AND c.ins_discipline_key = d.ins_discipline_key
            AND fg.prs_kostensoort_key = ks.prs_kostensoort_key
            AND aaxx_get_user = 'SITECH'
            AND (   ks.prs_kostensoort_upper LIKE 'AE%'
                 OR ks.prs_kostensoort_upper LIKE 'AS ONDH%'
                 OR ks.prs_kostensoort_upper LIKE 'ST ONDH%'
                 OR ks.prs_kostensoort_upper LIKE 'STB ONDH%'
                );
   ELSE
     INSERT INTO fin_verkoopfactuur
     (
      -- module, export_datum, prs_kostenplaats_nr, debiteur, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, omschrijving, bedrag, btw, fin_btwtabelwaarde_code, opdr_jaar, exact_code_gebouw, groepering, subregelvolgorde
         fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_bedrijf_key, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3, fin_verkoopfactuur_n1
     )
      SELECT substr(to_char(v_logdate, 'dd-mm-yyyy') || ' - ' || 'C' || cnt_contract_nummer_intern || DECODE (cnt_contract_versie, NULL, '', '.' || cnt_contract_versie), 1,30 ),
             'contract',
             c.cnt_contract_key,
             v_logdate,
             DECODE (aaxx_get_user,
                     'AH',  aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                     'DBS', DECODE (ks.prs_kostensoort_upper, 'CV EIG BOUW PL', '913757',
                                                              'CV EIG INST PL', '913757',
                                                                                 substr(aaxx_get_lev2_dep_code(k.prs_kostenplaats_nr),1,6)),
                     'LB',  exact_code,
                     'NMM',  exact_code,
                     'DOW', k.prs_kostenplaats_nr,
                     'DSM', DECODE (SUBSTR(ks.prs_kostensoort_upper,1,3) , 'CV ', '520',
                                                                           'CVE', aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                     'NS',  SUBSTR (prs_kostenplaats_nr, 1, 30),
                     'SABIC', aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                     'VL',  aaxx_get_top_dep_code(k.prs_kostenplaats_nr)
             ) prs_kostenplaats_nr,
             DECODE (aaxx_get_user,
                     'AH',  aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                     'DBS', DECODE (ks.prs_kostensoort_upper, 'CV EIG BOUW PL', '913757',
                                                              'CV EIG INST PL', '913757',
                                                                                 substr(aaxx_get_lev2_dep_code(k.prs_kostenplaats_nr),1,6)),
                     'LB',  DECODE(g.alg_locatie_key,
                                   1, '911928',   -- Worldwide Headquarters
                                   2, '911927',   -- Maasvlakte
                                   3, '911930',   -- Botlek
                                   4, '911929'    -- Moerdijk
                                  ),
                     'NMM',  DECODE(k.prs_kostenplaats_nr,
                                    '0001', '913799',   -- Heijmans
                                    '0002', '913810',   -- Vermaat
                                    '0003', '913766',   -- Defensie
                                    '0004', '913776',   -- Stichting Nationaal Militair Museum
                                            'Onbekend'
                                   ),
                     'DOW', substr(aaxx_get_top_dep_code(k.prs_kostenplaats_nr),1,6),
                     'DSM', DECODE (SUBSTR(ks.prs_kostensoort_upper,1,3) , 'CV ', '520',
                                                                           'CVE', aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                     'NS',  SUBSTR (prs_kostenplaats_nr, 1, 30),
                     'SABIC', (SELECT distinct prs_leverancier_nr FROM prs_bedrijf b, prs_afdeling a
                                WHERE b.prs_bedrijf_key = a.prs_bedrijf_key
                                  AND b.prs_bedrijf_verwijder IS NULL
                                  AND a.prs_afdeling_verwijder IS NULL
                                  AND a.prs_afdeling_naam = aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                     'VL',  aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                     'ZCN', '913815',
                     'ZCN', '913816'
             ) debiteur,
             b.prs_bedrijf_key,
             ks.prs_kostensoort_oms || DECODE(TO_CHAR(opdr_datum,'YYYY'), TO_CHAR(TO_NUMBER(TO_CHAR(SYSDATE, 'yyyy'))-1), ' VJ','') ,
             ks.prs_kostensoort_opmerking,
             vk_prs_kostensoort_refcode,
             DECODE (aaxx_get_user,
                        'DBS', DECODE(ks.prs_kostensoortgrp_key, 3, 'Projecten', 'Core Variable'),
                        'DOW', 'Service Charges',
                        'ZCN', DECODE(aaxx_get_top_dep_code(k.prs_kostenplaats_nr), 'SN', 'Servicekosten',
                                                                                    'KL', 'Klantvragen',
                                                                                    ''),
                        'ZKHM', DECODE(aaxx_get_top_dep_code(k.prs_kostenplaats_nr), 'SN', 'Servicekosten',
                                                                                     'KL', 'Klantvragen',
                                                                                     ''),
                        ksg.prs_kostensoortgrp_oms || DECODE (aaxx_get_user, 'DSM', DECODE (SUBSTR(ks.prs_kostensoort_upper,1,3) , 'CV ', ' ' || l.alg_locatie_code),
                                                                             'LB', ' ' || exact_code,
                                                                             'SABIC', ' ' || aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                                                                             'NMM', DECODE(k.prs_kostenplaats_nr, '0001', ' Heijmans',
                                                                                                                  '0002', ' Vermaat',
                                                                                                                  '0003', ' Defensie',
                                                                                                                  '0004', ' NMM',
                                                                                                                          ' Onbekend'))
                    ) prs_kostensoortgrp_oms,
                'C'
             || cnt_contract_nummer_intern
             || DECODE (cnt_contract_versie, NULL, '', '.' || cnt_contract_versie)
                omschrijving,
             DECODE (aaxx_get_user,
                     'NMM', ROUND (fg.bedrag * 1.1,2),
                     fg.bedrag),
             fin_btwtabelwaarde_code,
             to_char(opdr_datum, 'YYYY'),
             DECODE (aaxx_get_user, 'LB', l.alg_locatie_code,
                                    COALESCE(exact_code, alg_gebouw_code)) exact_code,
             SUBSTR (
                DECODE (aaxx_get_user, 'AH', ksg.prs_kostensoortgrp_oms,
                                       'DBS', DECODE (ks.prs_kostensoort_upper, 'CV EIG BOUW PL', '913757',
                                                                                'CV EIG INST PL', '913757',
                                                                                                  aaxx_get_lev2_dep_code(k.prs_kostenplaats_nr)),
                                       'DOW', substr(aaxx_get_top_dep_code(k.prs_kostenplaats_nr),1,8) ||
                                              DECODE(substr(aaxx_get_top_dep_code(k.prs_kostenplaats_nr),1,3),
                                                 '911', DECODE(SUBSTR(ks.prs_kostensoort_upper, 1,5), 'NC P ', 'PR', 'NC/CV'),
                                                 '912', 'CV/NC/PR',
                                                 '913', DECODE(SUBSTR(ks.prs_kostensoort_upper, 1,7), 'COR VAR', 'CV', 'NC/PR'),
                                                 'Onbekend') ||
                                              substr(aaxx_get_top_dep_code(k.prs_kostenplaats_nr),1,8),
                                       'DSM', DECODE (SUBSTR(ks.prs_kostensoort_upper,1,3) , 'CV ', ksg.prs_kostensoortgrp_oms || ' ' || l.alg_locatie_code,
                                                                                             'CVE', aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                                       'SABIC', aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                                       'ZCN', aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                                       'ZKHM', aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                                       '')
                ,1,12) groepering,
             DECODE (aaxx_get_user, 'LB', prs_kostensoort_oms || '1',
                                    'DOW', 'A' || prs_kostensoort_oms, '') subregelvolgorde,
             l.alg_locatie_key  -- N1
      FROM cnt_contract c,
           prs_bedrijf b,
           prs_kostenplaats k,
           ins_tab_discipline d,
           prs_kostensoort ks,
           prs_kostensoortgrp ksg,
           aaxx_exp_factuur f,
           alg_locatie l,
           (SELECT cnt_contract_key, alg_gebouw_code, exact_code, ag.alg_gebouw_key, ag.alg_locatie_key
              FROM
               (SELECT cnt_contract_key, MIN (cp.cnt_alg_plaats_key) cnt_alg_plaats_key
                  FROM cnt_contract_plaats cp
                 WHERE     cp.cnt_contract_plaats_verwijder IS NULL
                       AND cp.cnt_alg_plaats_code = 'G'
                 GROUP BY cnt_contract_key) cp,
               alg_gebouw ag,
               aaxx_v_exact_code_gebouw ae
            WHERE  cp.cnt_alg_plaats_key = ag.alg_gebouw_key
              AND  cp.cnt_alg_plaats_key = ae.alg_gebouw_key) g,
           (SELECT fin_factuur_key,
                   cnt_contract_key,
                   SUM (fin_factuurregel_totaal) bedrag,
                   fin_factuurregel_btw btw,
                   aaxx_get_verkoop_btw_code (fin_btwtabelwaarde_key) fin_btwtabelwaarde_code,
                   prs_kostenplaats_key,
                   prs_kostensoort_key,
                   vk_prs_kostensoort_refcode,
                   fin_factuur_boekmaand,
                   opdr_datum,
                   fin_factuur_datum
            FROM aaxx_v_factuur_gegevens
            WHERE fin_factuur_statuses_key = 6
            GROUP BY fin_factuur_key,
                     cnt_contract_key,
                     prs_kostenplaats_key,
                     prs_kostensoort_key,
                     fin_factuur_boekmaand,
                     opdr_datum,
                     fin_factuur_datum,
                     fin_factuurregel_btw,
                     fin_btwtabelwaarde_key,
                     fin_btwtabelwaarde_code,
                     vk_prs_kostensoort_refcode,
                     fin_factuurregel_totaal) fg
      WHERE     fg.prs_kostenplaats_key = k.prs_kostenplaats_key
            AND fg.cnt_contract_key = c.cnt_contract_key
            AND fg.fin_factuur_key = f.fin_factuur_key
            AND g.alg_locatie_key = l.alg_locatie_key
            AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
            AND c.ins_discipline_key = d.ins_discipline_key
            AND c.cnt_contract_key = g.cnt_contract_key(+)
            AND fg.prs_kostensoort_key = ks.prs_kostensoort_key(+)
            AND ks.prs_kostensoortgrp_key = ksg.prs_kostensoortgrp_key(+)
            AND ( (     aaxx_get_user = 'AH'
                    AND ks.prs_kostensoort_upper LIKE 'CV %'
                  )
                  OR
                  (     aaxx_get_user = 'LB'
                    AND ks.prs_kostensoort_upper LIKE 'NC%'                         --  LyondellBasell
                    AND ks.prs_kostensoort_upper <> 'NC DERDEN'
                    AND ks.prs_kostensoort_upper <> 'NC PROJ'
                  )
                  OR
                  (     aaxx_get_user = 'DBS'
                    AND ks.prs_kostensoort_upper IN (
                               'CV AFVAL REST',
                               'CV OND',
                               'CV GEB NIET PLAN',
                               'CV INSTAL NIET PLAN',
                               'CV TERR VERHARD',
                               'CV TERR NIET PL',
                               'CV OND TERR',
                               'CV TERR OVR',
                               'CV CONS REST',
                               'CV CONS SERV',
                               'CV CONS OVR',
                               'CV CONS AUT',
                               'CV BEWAK',
                               'CV PREV CAL',
                               'CV BEWAK OVR',
                               'CV SCH',
                               'CV SCH GLAS',
                               'CV SCH OVR',
                               'CV VGM',
                               'CV GROEN',
                               'CV EIG BOUW PL',
                               'CV EIG INST PL',
                               'NC PROJ',
                               'CVE INSTAL NIET PLAN',
                               'CVE GEB NIET PLAN')
                  )
                  OR
                  (     aaxx_get_user = 'DOW'
                    AND (    ks.prs_kostensoort_upper = 'COR VAR CATE COFFE'
                          OR ks.prs_kostensoort_upper = 'COR VAR IND CLO'
                          OR ks.prs_kostensoort_upper = 'COR VAR MAIL SERVICES'
                          OR ks.prs_kostensoort_upper = 'COR VAR VENDING'
                          OR ks.prs_kostensoort_upper = 'COR VAR MAIN HANDYMAN'
                          OR ks.prs_kostensoort_upper = 'COR VAR GEN TEN SERV'
                          OR ks.prs_kostensoort_upper = 'COR VAR HVAC'
                          OR ks.prs_kostensoort_upper = 'COR VAR CLEA BUILDING SAN'
                          OR ks.prs_kostensoort_upper = 'COR VAR CLEA VSR KMS')
                  )
                  OR
                  (     aaxx_get_user = 'DSM'
                    AND SUBSTR(ks.prs_kostensoort_upper,1,3) IN (
                                   'CV ',
                                   'CVE')
                  )
                  OR
                  (     aaxx_get_user = 'NMM'
                    AND ks.prs_kostensoort_upper LIKE 'CV%'
                  )
                  OR
                  (     aaxx_get_user = 'SABIC'
                    AND c.cnt_contract_looptijd_van >= to_date ('20140101', 'yyyymmdd') --  Voor sabic geldt voor 2014 een ander mechanisme (AASA#28673)
                    AND ks.prs_kostensoort_upper LIKE 'CV %'
                    AND ks.prs_kostensoort_upper <> 'CV CHIP'
                    AND (    c.cnt_contract_looptijd_van >= to_date ('20150101', 'yyyymmdd') --  Voor sabic geldt voor 2015 een ander mechanisme (AASA#31618)
                          OR (      ks.prs_kostensoort_upper <> 'CV CONS REST'
                                AND ks.prs_kostensoort_upper <> 'CV CONS AUT'
                                AND ks.prs_kostensoort_upper <> 'CV SCH OVR'
                                AND ks.prs_kostensoort_upper <> 'CV DOC POST'
                                AND ks.prs_kostensoort_upper <> 'CV AFVAL REST'
                              )
                        )
                  )
                  OR
                  (     aaxx_get_user = 'VL'
                    AND c.cnt_contract_looptijd_van < to_date ('20160101', 'yyyymmdd') --  Voor VL geldt voor 2016 een ander mechanisme (AAVL#34856)
                    AND ks.prs_kostensoort_upper IN (
                                    'CV OND',
                                    'CV TERR OVR',
                                    'CV BEWAK OVR',
                                    'CV BOUW PLAN',
                                    'CV CONS REST',
                                    'CV CONS OVR',
                                    'CV SCH',
                                    'CV WP',
                                    'CV GEB NIET PLAN',
                                    'CV CONS SERV',
                                    'CV SCH GLAS',
                                    'CV KART',
                                    'CV INSTAL PLAN',
                                    'CV BEWAK',
                                    'CV VERH',
                                    'CV GROEN',
                                    'CV INSTAL NIET PLAN',
                                    'CV PREV CAL',
                                    'CV DOC POST',
                                    'CV BEW',
                                    'CV TERR VERHARD',
                                    'CV REC',
                                    'CV DOC REP',
                                    'CV VERV PERS',
                                    'CV OND TERR',
                                    'CV ACHT OND',
                                    'NC ACHT OND',
                                    'CV EIG INST PL',
                                    'CV EIG BOUW PL',
                                    'NC INV BOUW',
                                    'NC INV WP',
                                    'NC INV INST')
                  )
                  OR
                  (     aaxx_get_user = 'ZCN'
                    AND (   aaxx_get_top_dep_code(k.prs_kostenplaats_nr) = 'SN'
                         OR aaxx_get_top_dep_code(k.prs_kostenplaats_nr) = 'KL')
                  )
                  OR
                  (     aaxx_get_user = 'ZKHM'
                    AND (   aaxx_get_top_dep_code(k.prs_kostenplaats_nr) = 'SN'
                         OR aaxx_get_top_dep_code(k.prs_kostenplaats_nr) = 'KL')
                  )
                );
   END IF;
   -- voeg bestelorders toe aan de verkoopbuffer
   INSERT INTO fin_verkoopfactuur
   (
    -- module, export_datum, prs_kostenplaats_nr, debiteur, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, omschrijving, bedrag, btw, fin_btwtabelwaarde_code, opdr_jaar, exact_code_gebouw, groepering, subregelvolgorde
       fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_bedrijf_key, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3, fin_verkoopfactuur_n1
   )
    SELECT substr(to_char(v_logdate, 'dd-mm-yyyy') || ' - ' || bestel.bes_bestelopdr_id, 1,30 ),
           'bestelopdr',
           bestel.bes_bestelopdr_key,
           v_logdate,
           DECODE (aaxx_get_user,
                   'AH',  aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                   'DOW', '911791',
                   'DSM', DECODE (SUBSTR(ks.prs_kostensoort_upper,1,3) , 'CV ', '520',
                                                                         'CVE', aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                   'SITECH', aaxx_get_dep_code (k.prs_kostenplaats_nr),
                   'LB', exact_code,
                   'VL',  aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                   SUBSTR (prs_kostenplaats_nr, 1, 30)),
           DECODE (aaxx_get_user,
                   'AH',  aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                   'DOW', '911791',
                   'DSM', DECODE (SUBSTR(ks.prs_kostensoort_upper,1,3) , 'CV ', '520',
                                                                         'CVE', aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                   'SITECH', aaxx_get_dep_code (k.prs_kostenplaats_nr),
                   'LB',  DECODE(g.alg_locatie_key,
                                 1, '911928',   -- Worldwide Headquarters
                                 2, '911927',   -- Maasvlakte
                                 3, '911930',   -- Botlek
                                 4, '911929'    -- Moerdijk
                                ),
                   'VL',  aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                   'ZCN', '913815',
                   'ZKHM', '913816',
                   SUBSTR (prs_kostenplaats_nr, 1, 30)),
           bestel.prs_bedrijf_key,
           ks.prs_kostensoort_oms
           || DECODE (TO_CHAR (opdr_datum, 'YYYY'),
                      TO_CHAR (TO_NUMBER (TO_CHAR (SYSDATE, 'yyyy')) - 1), ' VJ',
                      ''),
           ks.prs_kostensoort_opmerking,
           vk_prs_kostensoort_refcode,
           prs_kostensoortgrp_oms || DECODE (aaxx_get_user, 'DSM', DECODE (SUBSTR(ks.prs_kostensoort_upper,1,3) , 'CV ', ' ' || l.alg_locatie_code),
                                                            'LB', ' ' || exact_code,
                                                            'SABIC', ' ' || k.prs_kostenplaats_nr,
                                                            'ZCN', DECODE(aaxx_get_top_dep_code(k.prs_kostenplaats_nr), 'SN', 'Servicekosten',
                                                                                                                        'KL', 'Klantvragen',
                                                                                                                        ''),
                                                            'ZKHM', DECODE(aaxx_get_top_dep_code(k.prs_kostenplaats_nr), 'SN', 'Servicekosten',
                                                                                                                        'KL', 'Klantvragen',
                                                                                                                        '')
                                            ),
           bestel.bes_bestelopdr_id || ' ' || d.ins_discipline_omschrijving
              omschrijving,
           fin_factuurregel_totaal,
           DECODE (aaxx_get_user, 'SITECH', 5,
                                  fin_btwtabelwaarde_code) fin_btwtabelwaarde_code,
           TO_CHAR (opdr_datum, 'YYYY'),
           DECODE (aaxx_get_user,
                  'LB', alg_locatie_code,
                  COALESCE(exact_code, alg_gebouw_code)),
           DECODE (aaxx_get_user,
                   'AH',  ksg.prs_kostensoortgrp_oms,
                   'DSM', DECODE (SUBSTR(ks.prs_kostensoort_upper,1,3) , 'CV ', ksg.prs_kostensoortgrp_oms || ' ' || l.alg_locatie_code,
                                                                         'CVE', aaxx_get_top_dep_code(k.prs_kostenplaats_nr)),
                   'DOW', DECODE(SUBSTR(ks.prs_kostensoort_upper, 1,5), 'NC P ', 'NCP', 'NC/CV') ||
                          substr(aaxx_get_top_dep_code(k.prs_kostenplaats_nr),1,6),
                   'ZCN', aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                   'ZKHM', aaxx_get_top_dep_code(k.prs_kostenplaats_nr),
                   '') groepering, -- c2
           DECODE (aaxx_get_user, 'LB', prs_kostensoort_oms || '1', '') subregelvolgorde, -- c3
           l.alg_locatie_key   -- N1
      FROM (  SELECT *
                FROM aaxx_v_bestelgegevens
            GROUP BY bes_bestelopdr_key,
                     bes_bestelopdr_id,
                     ins_discipline_key,
                     mld_adres_key_lev,
                     bes_bestelling_leverdatum,
                     prs_bedrijf_key) bestel,
           mld_adres ad,
           prs_kostenplaats k,
           ins_tab_discipline d,
           prs_kostensoort ks,
           prs_kostensoortgrp ksg,
           aaxx_exp_factuur f,
           alg_gebouw g,
           alg_locatie l,
           aaxx_v_exact_code_gebouw exact,
           (  SELECT fin_factuur_key,
                     bes_bestelopdr_key,
                     prs_kostenplaats_key,
                     prs_kostensoort_key,
                     vk_prs_kostensoort_refcode,
                     fin_factuur_boekmaand,
                     opdr_datum,
                     fin_factuur_datum,
                     aaxx_get_verkoop_btw_code (fin_btwtabelwaarde_key) fin_btwtabelwaarde_code,
                     sum(fin_factuurregel_totaal) fin_factuurregel_totaal
                FROM aaxx_v_factuur_gegevens
               WHERE fin_factuur_statuses_key = 6
                     AND bes_bestelopdr_key IS NOT NULL
            GROUP BY fin_factuur_key,
                     bes_bestelopdr_key,
                     prs_kostenplaats_key,
                     prs_kostensoort_key,
                     fin_factuur_boekmaand,
                     fin_btwtabelwaarde_key,
                     opdr_datum,
                     fin_factuur_datum,
                     vk_prs_kostensoort_refcode,
                     fin_btwtabelwaarde_code) fg
     WHERE     fg.bes_bestelopdr_key = bestel.bes_bestelopdr_key
           AND fg.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
           AND bestel.ins_discipline_key = d.ins_discipline_key
           AND bestel.mld_adres_key_lev = ad.mld_adres_key(+)
           AND ad.mld_adres_gebouw_ruimte = g.alg_gebouw_code(+)
           AND g.alg_gebouw_key = exact.alg_gebouw_key(+)
           AND g.alg_locatie_key = l.alg_locatie_key
           AND fg.fin_factuur_key = f.fin_factuur_key
           AND fg.prs_kostensoort_key = ks.prs_kostensoort_key(+)
           AND ks.prs_kostensoortgrp_key = ksg.prs_kostensoortgrp_key(+)
           AND (  (     aaxx_get_user = 'AH'
                    AND ks.prs_kostensoort_upper LIKE 'CV%'
                  )
                  OR
                  (     aaxx_get_user = 'SITECH'
                    AND ks.prs_kostensoort_upper LIKE 'AE%'                         --  SITECH
                  )
                  OR
                  (     aaxx_get_user = 'DSM'
                    AND SUBSTR(ks.prs_kostensoort_upper,1,3) IN (
                                  'CV ',
                                  'CVE')
                  )
                  OR
                  (     aaxx_get_user = 'LB'
                    AND ks.prs_kostensoort_upper LIKE 'NC%'                         --  LyondellBasell
                    AND ks.prs_kostensoort_upper <> 'NC DERDEN'
                    AND ks.prs_kostensoort_upper <> 'NC PROJ'
                  )
                  OR
                  (     aaxx_get_user = 'VL'
                    AND (  (    bes_bestelling_leverdatum < to_date('20160101', 'yyyymmdd') --  Voor VL geldt voor 2016 een ander mechanisme (AAVL#34856)
                            AND ks.prs_kostensoort_upper LIKE 'CV %')
                           OR
                           (    bes_bestelling_leverdatum >= to_date('20160101', 'yyyymmdd') --  Voor VL geldt voor 2016 een ander mechanisme (AAVL#34856)
                            AND ks.prs_kostensoort_upper LIKE 'CVE %')
                        )
                  )
                  OR
                  (     aaxx_get_user = 'ZCN'
                    AND (   aaxx_get_top_dep_code(k.prs_kostenplaats_nr) = 'SN'
                         OR aaxx_get_top_dep_code(k.prs_kostenplaats_nr) = 'KL')
                  )
                  OR
                  (     aaxx_get_user = 'ZKHM'
                    AND (   aaxx_get_top_dep_code(k.prs_kostenplaats_nr) = 'SN'
                         OR aaxx_get_top_dep_code(k.prs_kostenplaats_nr) = 'KL')
                  )
               );

   -- bereken per klant de FEE over de omzet.
   IF aaxx_get_user = 'DBS' THEN
      INSERT INTO fin_verkoopfactuur
      (
      -- module, export_datum, prs_kostenplaats_nr, debiteur, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, omschrijving, bedrag, btw, fin_btwtabelwaarde_code, opdr_jaar, exact_code_gebouw, groepering, subregelvolgorde
         fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3, fin_verkoopfactuur_c4
      )
      SELECT fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, '', prs_debiteur_naam, 'FEE' || DECODE (INSTR(prs_kostensoort_oms, ' VJ'), 0 , '', ' VJ'), '', '8110550', prs_kostensoortgrp_oms, 'FEE' , ROUND(fin_verkoopfactuur_bedrag * ma.marge, 2), fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, 'X', fin_verkoopfactuur_c2, 'X', ok.ordernummer
        FROM fin_verkoopfactuur v, mld_opdr o,
             (SELECT km.mld_melding_key, fac.safe_to_number (fac_usrdata_code) marge
                FROM fac_usrdata ud,
                     mld_kenmerkmelding km,
                     mld_kenmerk k,
                     mld_srtkenmerk sk
               WHERE sk.mld_srtkenmerk_omschrijving = 'Marge'
                 AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
                 AND k.mld_kenmerk_key = km.mld_kenmerk_key
                 AND fac.safe_to_number (mld_kenmerkmelding_waarde) = fac_usrdata_key) ma,
             (SELECT km.mld_melding_key, mld_kenmerkmelding_waarde ordernummer
                FROM mld_kenmerkmelding km,
                     mld_kenmerk k,
                     mld_srtkenmerk sk
               WHERE sk.mld_srtkenmerk_omschrijving = 'Ordernummer klant'
                 AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
                 AND k.mld_kenmerk_key = km.mld_kenmerk_key) ok
       WHERE fin_verkoopfactuur_aanmaak = v_logdate
         AND fin_verkoopfactuur_xmlnode = 'opdracht'
         AND fin_verkoopfactuur_refkey = o.mld_opdr_key
         AND o.mld_melding_key = ma.mld_melding_key
         AND o.mld_melding_key = ok.mld_melding_key
         AND (v.prs_kostensoort_oms = 'NC PROJ' OR v.prs_kostensoort_oms LIKE 'CVE%');
      -- GROUP BY fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_debiteur_naam, DECODE (INSTR(prs_kostensoort_oms, ' VJ'), 0 , '', ' VJ'), prs_kostensoortgrp_oms, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, prs_debiteur_naam || 'FEE', fin_verkoopfactuur_c2, ma.marge;
   END IF;

   IF aaxx_get_user = 'DOW' THEN
      INSERT INTO fin_verkoopfactuur
      (
      -- module, export_datum, prs_kostenplaats_nr, debiteur, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, omschrijving, bedrag, btw, fin_btwtabelwaarde_code, opdr_jaar, exact_code_gebouw, groepering, subregelvolgorde
         fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3
      )
      SELECT fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, '', prs_debiteur_naam, 'BASE FEE' || DECODE (INSTR(prs_kostensoort_oms, ' VJ'), 0 , '', ' VJ'), '', decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210511', '1033313'), prs_kostensoortgrp_oms, 'BASE FEE' , ROUND(SUM(fin_verkoopfactuur_bedrag) * 0.04, 2), fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, 'X', fin_verkoopfactuur_c2, 'X'
        FROM fin_verkoopfactuur v
       WHERE fin_verkoopfactuur_aanmaak = v_logdate
       GROUP BY fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_debiteur_naam, DECODE (INSTR(prs_kostensoort_oms, ' VJ'), 0 , '', ' VJ'), prs_kostensoortgrp_oms, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c2, decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210511', '1033313');
   END IF;

   IF aaxx_get_user = 'DSM' THEN
      -- CVE
      -- Fee: De fee over dit CVE gedeelte wordt apart doorbelast aan de klant en moet in een separate factuur worden gezet.
      -- Deze factuur moet standaard naar debiteurencode 520.
      -- Per factuur dient een fee berekend te worden van 0% of 3%.
      -- Hierbij geldt als uitgangspunt dat voor alle MA contracten 0% geldt, en voor alle CP 3%.
      -- Deze fee dient als totaalbedrag geboekt te worden op 1 regel per BTW percentage op de kostensoort FEE.
      -- Extra verzoek hierover is om wel per locatie één regel te maken (dus Sittard, Urmond, Campus,etc).
      -- Misschien dat we dit kunnen doen door artikelcode FEE te gebruiken, maar omschrijving Fee Sittard, Fee Urmond, etc?
      INSERT INTO fin_verkoopfactuur
      (
         fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3
      )
      SELECT fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, '', '520', 'CVE FEE'  || DECODE (INSTR(prs_kostensoort_oms, ' VJ'), 0 , '', ' VJ'), '', decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210511', '1033313'), prs_kostensoortgrp_oms, 'FEE ' || l.alg_locatie_code, SUM(ROUND(fin_verkoopfactuur_bedrag * 0.03, 2)), fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, 'X', 'FEE' || '520', 'X'
        FROM fin_verkoopfactuur v, prs_relatietype r, alg_locatie l, prs_bedrijf b
       WHERE fin_verkoopfactuur_aanmaak = v_logdate
         AND v.prs_bedrijf_key = b.prs_bedrijf_key
         AND b.prs_relatietype_key = r.prs_relatietype_key
         AND r.prs_relatietype_omschrijving = 'Contracting party'
         AND v.fin_verkoopfactuur_n1 = l.alg_locatie_key
         AND prs_kostensoort_oms LIKE 'CVE%'
       GROUP BY fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, l.alg_locatie_code, prs_debiteur_naam, DECODE (INSTR(prs_kostensoort_oms, ' VJ'), 0 , '', ' VJ'), prs_kostensoortgrp_oms, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c2, decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210511', '1033313');

      -- CV
      -- Fee: Er wordt een fee van 0% of 3% berekend over deze factuur.
      -- Het percentage is afhankelijk van het contracttype van de leverancier.
      -- Bij alle Managing Agent (MA) geldt 0%, voor alle Contracting Party (CP) geldt 3%.
      -- Deze fee dient als totaalbedrag geboekt te worden op 1 regel per BTW percentage op de kostensoort FEE.
      INSERT INTO fin_verkoopfactuur
      (
         fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3
      )
      SELECT fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, '', '520', 'CV FEE' || DECODE (INSTR(prs_kostensoort_oms, ' VJ'), 0 , '', ' VJ'), '', decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210511', '1033313'), prs_kostensoortgrp_oms, 'FEE' , SUM(ROUND(fin_verkoopfactuur_bedrag * 0.03, 2)), fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, 'X', fin_verkoopfactuur_c2, 'X'
        FROM fin_verkoopfactuur v, prs_relatietype r, alg_locatie l, prs_bedrijf b
       WHERE fin_verkoopfactuur_aanmaak = v_logdate
         AND v.prs_bedrijf_key = b.prs_bedrijf_key
         AND b.prs_relatietype_key = r.prs_relatietype_key
         AND r.prs_relatietype_omschrijving = 'Contracting party'
         AND prs_kostensoort_oms LIKE 'CV %'
       GROUP BY fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_debiteur_naam, DECODE (INSTR(prs_kostensoort_oms, ' VJ'), 0 , '', ' VJ'), prs_kostensoortgrp_oms, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c2, decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210511', '1033313');
   END IF;

   IF aaxx_get_user = 'ESSENT' THEN
      INSERT INTO fin_verkoopfactuur
      (
      -- module, export_datum, prs_kostenplaats_nr, debiteur, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, omschrijving, bedrag, btw, fin_btwtabelwaarde_code, opdr_jaar, exact_code_gebouw, groepering, subregelvolgorde
         fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3
      )
      SELECT fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, 'BASE FEE ' || to_char(u.uplift) || '%' || DECODE (INSTR(v.prs_kostensoort_oms, ' VJ'), 0 , '', ' VJ'), '', decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210511', '1033313'), prs_kostensoortgrp_oms, 'BASE FEE ' || TO_CHAR(u.uplift) || '%' , ROUND(SUM(fin_verkoopfactuur_bedrag) * (u.uplift/100),2), 5, fin_verkoopfactuur_maand, 'X', 'X', u.uplift || 'X'
        FROM fin_verkoopfactuur v, aaxx_imp_uplift u
       WHERE REPLACE(v.prs_kostensoort_oms, ' VJ', '') = u.prs_kostensoort_oms
         AND fin_verkoopfactuur_aanmaak = v_logdate
       GROUP BY fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, instr(v.prs_kostensoort_oms, ' VJ'), prs_kostensoortgrp_oms, uplift, fin_verkoopfactuur_maand, decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210511', '1033313');
   END IF;

   IF aaxx_get_user = 'LB' THEN
      INSERT INTO fin_verkoopfactuur
      (
      -- module, export_datum, prs_kostenplaats_nr, debiteur, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, omschrijving, bedrag, btw, fin_btwtabelwaarde_code, opdr_jaar, exact_code_gebouw, groepering, subregelvolgorde
         fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3
      )
      SELECT fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, 'BASE FEE' || DECODE (instr(prs_kostensoort_oms, ' VJ'), 0 , '', ' VJ'), prs_kostensoort_opmerking, decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210511', '1033313'), prs_kostensoortgrp_oms, 'FEE ' || prs_kostensoort_oms, ROUND(SUM(fin_verkoopfactuur_bedrag)*0.075,2), fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, 'X', 'X',  prs_kostensoort_oms || '2'
        FROM fin_verkoopfactuur
       WHERE fin_verkoopfactuur_aanmaak = v_logdate
       GROUP BY fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoortgrp_oms, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210511', '1033313');
   END IF;

   -- NMM
   -- Pas het bedrag van de bewaking aan. Opdrachten aan stdmelding 1121 moeten een bedrag krijgen van het aantal uren uit de opdracht maal het uurtarief dat
   -- In een eigentabel opgeslagen wordt. De entries in de eigen tabel kunnen verschillende tarieven met een vervaldatum bevatten.
   IF aaxx_get_user = 'NMM' THEN
      UPDATE fin_verkoopfactuur vk
         SET fin_verkoopfactuur_bedrag = (SELECT o.mld_opdr_uren * ud.fac_usrdata_prijs
                                            FROM mld_opdr o, fac_usrdata ud
                                           WHERE vk.fin_verkoopfactuur_refkey = o.mld_opdr_key
                                             AND vk.fin_verkoopfactuur_xmlnode = 'opdracht'
                                             AND ud.fac_usrtab_key = DECODE (TO_CHAR (COALESCE(mld_opdr_plandatum, mld_opdr_datumbegin), 'D'), 1, 141, 7, 141, 122)   -- Uurtarief bewaking (141 tabel weekend, 122 tabel weekdagen)
                                             AND ud.fac_usrdata_verwijder IS NULL
                                             AND o.mld_opdr_datumbegin < COALESCE(ud.fac_usrdata_vervaldatum, SYSDATE)
                                             AND NOT EXISTS (SELECT ud2.fac_usrdata_key
                                                               FROM fac_usrdata ud2
                                                              WHERE ud2.fac_usrtab_key = DECODE (TO_CHAR (COALESCE(mld_opdr_plandatum, mld_opdr_datumbegin), 'D'), 1, 141, 7, 141, 122)   -- Uurtarief bewaking (141 tabel weekend, 122 tabel weekdagen)
                                                                AND o.mld_opdr_datumbegin < COALESCE(ud2.fac_usrdata_vervaldatum, SYSDATE)
                                                                AND ud2.fac_usrdata_verwijder IS NULL
                                                                AND COALESCE(ud2.fac_usrdata_vervaldatum, SYSDATE) <
                                                                     COALESCE(ud.fac_usrdata_vervaldatum, SYSDATE)
                                                              )
                                         )
       WHERE EXISTS (SELECT mld_opdr_key
                       FROM mld_opdr o, mld_melding m
                      WHERE vk.fin_verkoopfactuur_refkey = o.mld_opdr_key
                        AND vk.fin_verkoopfactuur_xmlnode = 'opdracht'
                        AND o.mld_melding_key = m.mld_melding_key
                        AND m.mld_stdmelding_key = 1121 -- Aanvraag beveiligingsdienst(en) tbv evenementen
                    )
         AND fin_verkoopfactuur_aanmaak = v_logdate;
   END IF;

   IF aaxx_get_user = 'RABO' THEN  --  RABO#37283
      INSERT INTO fin_verkoopfactuur
      (
          fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3
      )
      SELECT fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, 'FEE' || DECODE (INSTR(prs_kostensoort_oms, ' VJ'), 0 , '', ' VJ'), '', decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210511', '1033313'), prs_kostensoortgrp_oms, 'FEE' , ROUND(SUM(fin_verkoopfactuur_bedrag) * DECODE(prs_kostensoort_key, 121, 7, 5.5) / 100, 2), fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, 'X', fin_verkoopfactuur_c2, 'X'
        FROM fin_verkoopfactuur v,
             mld_opdr o,
             mld_melding m,
             mld_stdmelding std
       WHERE v.fin_verkoopfactuur_refkey = o.mld_opdr_key
         AND o.mld_melding_key = m.mld_melding_key
         AND m.mld_stdmelding_key = std.mld_stdmelding_key
         AND fin_verkoopfactuur_aanmaak = v_logdate
       GROUP BY fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoortgrp_oms, prs_kostensoort_key, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c2, 'X', decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210511', '1033313');
   END IF;

   IF aaxx_get_user = 'VL' THEN
      INSERT INTO fin_verkoopfactuur
      (
      -- module, export_datum, prs_kostenplaats_nr, debiteur, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, omschrijving, bedrag, btw, fin_btwtabelwaarde_code, opdr_jaar, exact_code_gebouw, groepering, subregelvolgorde
         fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3
      )
      SELECT fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, 'FEE' || DECODE (INSTR(prs_kostensoort_oms, ' VJ'), 0 , '', ' VJ'), prs_kostensoort_opmerking, decode(substr(prs_kostensoort_refcode, 1,1), '8', '8210513', '1033313'), prs_kostensoortgrp_oms, 'FEE', ROUND(fin_verkoopfactuur_bedrag*0.025,2), fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, 'X', 'X', 'X'
        FROM fin_verkoopfactuur
       WHERE     prs_kostensoort_oms = 'NC ACHT OND'
             AND fin_verkoopfactuur_aanmaak = v_logdate;
   END IF;

   FOR rec1 IN c_bes
   LOOP
      BEGIN
        -- indien nog niet afgemeld, dan maar even afmelden.
        IF rec1.bes_bestelopdr_status = 3 THEN -- in behandeling
           UPDATE bes_bestelopdr
              SET bes_bestelopdr_status = 4
            WHERE bes_bestelopdr_key= rec1.bes_bestelopdr_key
              AND bes_bestelopdr_status = 3;
        END IF;

        IF rec1.bes_bestelopdr_status = 5    -- bevestigd
          OR rec1.bes_bestelopdr_status = 4  -- in bestelling
          OR rec1.bes_bestelopdr_status = 3 THEN

          UPDATE bes_bestelopdr_item B
             SET bes_bestelopdr_item_aantalontv = COALESCE(bes_bestelopdr_item_aantal, 0),
                 bes_bestelopdr_item_ontvangen = SYSDATE
           WHERE b.bes_bestelopdr_key = rec1.bes_bestelopdr_key;

          UPDATE bes_bestelling_item bi
             SET bes_bestelling_item_aantalontv = COALESCE(bes_bestelling_item_aantal, 0)
           WHERE EXISTS (SELECT bes_bestelopdr_key
                           FROM bes_bestelopdr_item boi
                          WHERE bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
                            AND bes_bestelopdr_key = rec1.bes_bestelopdr_key);

          SELECT distinct bes_bestelling_key
            INTO v_bestelling_key
            FROM bes_bestelling_item bi, bes_bestelopdr_item boi
           WHERE bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key
             AND bes_bestelopdr_key = rec1.bes_bestelopdr_key;

          bes.updatebestelopdrstatus(rec1.bes_bestelopdr_key, v_aanvrager);
		 			bes.updatebestellingstatus(v_bestelling_key, v_aanvrager);

        END IF;
      END;
   END LOOP;

   -- set de status van de opdracht en neem de kosten over van de factuur.
   FOR rec1 IN c_opdr
   LOOP
      BEGIN
        -- indien nog niet afgemeld, dan maar even afmelden.
        IF rec1.mld_statusopdr_key <> 6 AND rec1.mld_statusopdr_key <> 7 AND rec1.mld_statusopdr_key <> 9 THEN
          mld.setopdrachtstatus (rec1.mld_opdr_key, 6, v_aanvrager);
          mld.setopdrachtstatus (rec1.mld_opdr_key, 9, v_aanvrager);
        END IF;

        UPDATE mld_opdr o
           SET mld_opdr_kosten   =
                (SELECT SUM (fin_factuurregel_totaal)
                   FROM aaxx_v_aanwezigfactuur f
                      , fin_factuurregel fr
                  WHERE f.fin_factuur_key = fr.fin_factuur_key
                    AND f.mld_opdr_key = o.mld_opdr_key
                    AND f.fin_factuur_statuses_key >= 6)
         WHERE o.mld_opdr_key = rec1.mld_opdr_key
           AND rec1.mld_melding_status IN (4, 5, 7);  -- anders faalt de trigger sowieso

         -- update meldingstatus
         mld.updatemeldingstatusAV (rec1.mld_melding_key, 0, v_aanvrager, 0);
         -- zet de status naar verwerkt (user is facilitor)
         mld.setopdrachtstatus (rec1.mld_opdr_key, 7, v_aanvrager);
      END;
   END LOOP;

/* Wacht op release 2016.3 AAIT#37411
   -- Neem de kosten van de factuur over in het termijnbedrag
   FOR rec1 IN c_cnt
   LOOP
      BEGIN

        UPDATE cnt_factuurschema fs
           SET (cnt_factuurschema_opmerking,
                   cnt_factuurschema_bedrag) =
                (SELECT SUBSTR(DECODE(cnt_factuurschema_opmerking, NULL, '', cnt_factuurschema_opmerking || CHR(10)) || 'Bedrag na verwerken facturen ' || TO_CHAR(SYSDATE, 'DD-MM-YYYY') || ' aangepast van ' || cnt_factuurschema_bedrag || ' naar ' ||  SUM (fin_factuurregel_totaal),1,1,320) opmerking,
                        SUM (fin_factuurregel_totaal) totaal
                   FROM aaxx_v_aanwezigfactuur f
                      , fin_factuurregel fr
                  WHERE f.fin_factuur_key = fr.fin_factuur_key
                    AND f.cnt_contract_key = fs.cnt_contract_key
                    AND f.fin_factuur_boekmaand = fs.cnt_factuurschema_boekmaand
                    AND f.fin_factuur_statuses_key >= 6)
         WHERE fs.cnt_factuurschema_key = rec1.cnt_factuurschema_key;

      END;
   END LOOP;
*/

   FOR rec1 IN c_fact
   LOOP
      BEGIN
         UPDATE fin_factuur f
            SET fin_factuur_statuses_key = 7
          WHERE f.fin_factuur_key = rec1.fin_factuur_key;

         fac.trackaction ('FINVER', rec1.fin_factuur_key, v_aanvrager, NULL, NULL);
      END;
   END LOOP;
   -- verwijder de enties uit de tijdelijke tabel. (AAEY#29465)
   DELETE aaxx_exp_factuur;
END;
/


--=============================================================================
-- EXPORTFUNCTIES VERKOOPFACTUREN

--  Uitleg van de kolommen zoals ze naar Exact gaan:
--  01	Regelnummer	           Vaste waarde 0
--  02	Factuurcode	           Vaste waarde 3
--  03	Debiteurnummer	       Kostenplaatsnummer
--  04	Referentie	           “Hospitality” plus de eerste drie posities van de maand voor catering en kostensoortgroep omschrijving voor opdrachten
--  05	Referentie 1	         Leeg (ordernummer klant voor DBS)
--  06	Referentie 2	         Leeg
--  07	Referentie 3	         Leeg
--  08	Ordernummer	           Leeg
--  09	Orderdatum	           Datum van de export.
--  10	Magazijn	             1
--  11	Extra artikel omschrijving	Leeg
--  12	Vertegenwoordigers	   Leeg
--  13	Kostenplaats	         Exact_code van het gebouw
--  14	Selectiecode	         Leeg
--  15	Bedrag in vreemde valuta	Leeg
--  16	Netto prijs	           Leeg
--  17	Valutacode	           EUR
--  18	Wisselkoers	           Leeg
--  19	Betalingsconditie	     E6
--  20	Leveringswijze	       1
--  21	Vrachtkosten	         Leeg
--  22	Orderkosten	           Leeg
--  23	Faktuurkorting	       Leeg
--  24	Totaal bedrag	         Leeg
--  25	Colli	                 0
--  26	Bruto gewicht	         0
--  27	Netto gewicht	         0
--  28	Afleverdatum	         Leeg
--  29	-	                     Leeg
--  30	-	                     Leeg
--  31	Bruto/Netto	           Leeg
--  32	-	                     Leeg
--  33	-	                     Leeg
--  34	-	                     Leeg
--  35	-	                     Leeg
--  36	-	                     Leeg
--  37	-	                     Leeg
--  38	-	                     Leeg
--  39	-	                     Leeg
--  40	-	                     Leeg
--  41	-	                     Leeg
--  42	Faktuursoort	         V
--  43	Orderdebiteur is faktuurdebiteur	Leeg
--  44	Debiteur type	         Leeg
--  45	Gefiatteerd	           N
--  46	Faktuurdebiteur	       Kostenplaatsnummer
--  47	-	                     Leeg
--  48	Facktuurnummer	       Leeg
-------------------------------------------------------------------------------
-- btw code is 19 procent als percentage is 19 of 0;
CREATE OR REPLACE VIEW aaxx_v_export_exact_verkoop_t (
   result,
   opdr_jaar,
   result_order
   )
AS
   SELECT '0' || ',' || DECODE(aaxx_get_user, 'RABO', '2', '3') || ',' || prs_debiteur_naam
          || ','
          || DECODE(aaxx_get_user, 'ENEXIS', 'Diensten derden PR', 'DSM', replace(prs_kostensoortgrp_oms, ',', '') || ' ' || to_char(SYSDATE, 'MON') , replace(prs_kostensoortgrp_oms, ',', '')) -- AAEN#26838
          || ','
          || DECODE(aaxx_get_user, 'ENEXIS', replace(prs_kostensoortgrp_oms, ',', ''), '')  -- AAEN#26838
          || ','
          || MAX(fin_verkoopfactuur_c4)  -- AADB#34431
          || ','
          || ''
          || ','
          || ''
          || ','
          || TO_CHAR (SYSDATE, 'ddmmyyyy')
          || ','
          || '1'
          || ','
          || ''
          || ','
          || ''
          || ','
          || DECODE(aaxx_get_user, 'DBS', '', 'AH', '', 'LB', '02610001', 'DOW', '02510001', 'SITECH', '02210001', 'NS',fin_verkoopfactuur_c1)  -- exact code gebouw
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || 'EUR'
          || ','
          || ''
          || ','
          || DECODE(aaxx_get_user, 'LB', '60', 'DOW', '60', 'SITECH', 'E9', 'NS','E6')
          || ','
          || '1'
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || TO_CHAR (0)
          || ','
          || TO_CHAR (0)
          || ','
          || TO_CHAR (0)
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || 'V'
          || ','
          || ''
          || ','
          || ''
          || ','
          || 'N'
          || ','
          || prs_debiteur_naam
          || ','
          || ''
          || ','
          || '',
          fin_verkoopfactuur_maand,
          fin_verkoopfactuur_c2 || replace(prs_kostensoortgrp_oms, ',', '') || DECODE(aaxx_get_user, 'DBS', '', 'NMM', '', 'ZCN', '', 'ZKHM', '', 'DOW', '', 'DSM', '', 'RABO', '', prs_kostenplaats_nr) || '0'
   FROM fin_verkoopfactuur
  WHERE fin_verkoopfactuur_datum IS NULL
  GROUP BY replace(prs_kostensoortgrp_oms, ',', ''), prs_debiteur_naam, DECODE(aaxx_get_user, 'DBS', '', 'NMM', '', 'ZCN', '', 'ZKHM', '', 'DOW', '', 'DSM', '', 'RABO', '', prs_kostenplaats_nr),  fin_verkoopfactuur_c2, DECODE(aaxx_get_user, 'DBS', '', 'AH', '', 'LB', '02610001', 'DOW', '02510001', 'SITECH', '02210001', 'NS',fin_verkoopfactuur_c1), fin_verkoopfactuur_maand
   UNION ALL
-- Uitleg subregel:
-- 01	Regelnummer 	           Vaste waarde 1
-- 02	- 	                     Vaste waarde 5
-- 03	-	                       Leeg
-- 04	-	                       Leeg
-- 05	-	                       Leeg
-- 06	-	                       Leeg
-- 07	-	                       Leeg
-- 08	-	                       Leeg
-- 09	-	                       Leeg
-- 10	Magazijn	               1
-- 11	-	                       Leeg
-- 12	-	                       Leeg
-- 13	-	                       Leeg
-- 14	-	                       Leeg
-- 15	-	                       Leeg
-- 16	-	                       Leeg
-- 17	-	                       Leeg
-- 18	-	                       Leeg
-- 19	-	                       Leeg
-- 20	-	                       Leeg
-- 21	-	                       Leeg
-- 22	-	                       Leeg
-- 23	-	                       Leeg
-- 24	-	                       Leeg
-- 25	-	                       Leeg
-- 26	-	                       Leeg
-- 27	-	                       Leeg
-- 28	Afleverdatum 	           Leeg
-- 29	Afleverweek 	           Leeg
-- 30	Artikelcode 	           Kostensoortcode
-- 31	Artikelsoort 	           V
-- 32	Omschrijving	           “Hospitality services” voor catering en “SA### vakgroep opdrachtnummer(kenmerk)” voor meerwerk
-- 33	Hoeveelheid	             1
-- 34	BTW code 	               4
-- 35	Prijslijst 	             Leeg
-- 36	Korting	                 0
-- 37	Prijs	                   Bedrag
-- 38	Nettoprijs 	             Leeg
-- 39	Kostenplaats 	           Kostenplaats
-- 40	Tekst voor tekstregels 	 Leeg
-- 41	Grootboek rekening 	     V
-- 42	-	                       Leeg
-- 43	-	                       Leeg
-- 44	-	                       Leeg
-- 45	-	                       Leeg
-- 46	-	                       Leeg
-- 47	Kostenplaats 	           Exact_code van het gebouw (bij contractorders wordt het eerste gebouw uit het contract geselecteerd) .
-- 48	-	                       Leeg
   SELECT    '1'
          || ','
          || DECODE(aaxx_get_user, 'RABO', '2', '3')
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || '1'
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ' '
          || prs_kostensoort_oms
          || ','
          || 'V'
          || ','
          || replace(fin_verkoopfactuur_omschr, ',', '')
          || ','
          || '1'
          || ','
          || fin_btwtabelwaarde_code
          || ','
          || ''
          || ','
          || '0'
          || ','
          || REPLACE (TO_CHAR (sum(fin_verkoopfactuur_bedrag)), ',', '.')
          || ','
          || ''
          || ','
          || DECODE (aaxx_get_user, 'SITECH', substr(prs_kostensoort_oms, 1, instr(prs_kostensoort_oms, ' ')-1)||prs_kostenplaats_nr,
                                    'DOW', DECODE (fin_verkoopfactuur_omschr, 'BASE FEE 3%', '999999',  prs_kostenplaats_nr),
                                    prs_kostenplaats_nr)
          || ','
          || ''
          || ','
          || prs_kostensoort_refcode
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || ''
          || ','
          || DECODE (aaxx_get_user, 'LB',     '02600013',
                                    'ENEXIS', '02110001',
                                              fin_verkoopfactuur_c1)  -- exact code gebouw
          || ','
          || '',
          fin_verkoopfactuur_maand,
          fin_verkoopfactuur_c2 || replace(prs_kostensoortgrp_oms, ',', '') || DECODE(aaxx_get_user, 'DBS', '', 'ZCN', '', 'ZKHM', '', 'DOW', '', 'DSM', '', prs_kostenplaats_nr)|| '1' || fin_verkoopfactuur_c3 || replace(fin_verkoopfactuur_omschr, ',', '')
   FROM fin_verkoopfactuur
  WHERE fin_verkoopfactuur_datum IS NULL
  GROUP BY fin_verkoopfactuur_c3, replace(prs_kostensoortgrp_oms, ',', ''), fin_verkoopfactuur_omschr, replace(fin_verkoopfactuur_omschr, ',', ''), prs_kostenplaats_nr, fin_verkoopfactuur_c2, fin_verkoopfactuur_c1, prs_kostensoort_oms, fin_btwtabelwaarde_code, prs_kostensoort_refcode, fin_verkoopfactuur_maand;

CREATE OR REPLACE VIEW aaxx_v_export_exact_verkoop (
   result,
   result_order
   )
AS
   SELECT result,
          result_order
     FROM aaxx_exp_exact_verkoop;



-- Voordat de verkoopfacturen naar Exact geexporteerd wordt moet de volgorde van de subregels gecorrigeerd worden
CREATE OR REPLACE PROCEDURE aaxx_select_exact_verkoop (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_opdr_jaar  IN   VARCHAR2
)
AS
   CURSOR c1 IS
      SELECT result, result_order
        FROM aaxx_v_export_exact_verkoop_t
       WHERE opdr_jaar = p_opdr_jaar
       ORDER BY result_order;
   v_first NUMBER;
   v_count NUMBER;
BEGIN
   v_count := 0;
   DELETE aaxx_exp_exact_verkoop;
   FOR rec IN c1
   LOOP
      BEGIN
         v_first := substr(rec.result, 1,1);
         IF v_first = 0 THEN
            v_count := 0;
         ELSE
            v_count := v_count + 1;
         END IF;

         INSERT INTO aaxx_exp_exact_verkoop (
            result,
            result_order)
         VALUES (
            v_count || substr (rec.result, 2),
            rec.result_order||to_char(1000+v_count));  -- forceer sortering bij count > 9
      END;
   END LOOP;
END;
/

-- Na dat de verkoopfacturen naar Exact geexporteerd zijn wordt de timestamp gezet.
CREATE OR REPLACE PROCEDURE aaxx_export_exact_verkoop (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2,
   p_opdr_jaar  IN   VARCHAR2
)
AS
   v_timestamp DATE;
   v_verkoopfactuurkop_key NUMBER(10);
BEGIN

  v_timestamp := SYSDATE;
  INSERT INTO fin_verkoopfactuurkop (fin_verkoopfactuurkop_id)
                             VALUES (p_opdr_jaar || ' - ' || TO_CHAR(v_timestamp, 'yyyy-mm-dd hh24:mi:ss'))
     RETURNING fin_verkoopfactuurkop_key
          INTO v_verkoopfactuurkop_key;

  UPDATE fin_verkoopfactuur
     SET fin_verkoopfactuur_datum = v_timestamp
       , fin_verkoopfactuurkop_key = v_verkoopfactuurkop_key
   WHERE fin_verkoopfactuur_datum IS NULL
     AND fin_verkoopfactuur_maand = p_opdr_jaar;

  INSERT INTO imp_schedule (imp_schedule_name) VALUES ('EXACT_VERKOOP_VJ');
END;
/

--=============================================================================
-- EXPORTFUNCTIES PROJECTUREN
--=============================================================================
-- Basisgegevens van door te belasten opdrachturen
-- (uurtarief van opdracht, anders van persoon)
-- Keys:   7 (Project) uren    (opdrachttype)
--        14 Type project      (eigen tabel)
--        15 Rekening courant  (eigen tabel)
--        55 Projectnaam       (kenmerksoort)
--       186 Type project      (flex opdracht)
--       187 Verrekenen met    (flex opdracht)
--       188 Uurtarief         (flex opdracht)
--       189 ProjectKPN uit AD (flex opdracht)
--         2 ProjectKPN uit AD (flex perslid)
--         3 AAFM Personeelsnummber (flex perslid)
CREATE OR REPLACE VIEW aaxx_v_exact_uren_gegevens
AS
   SELECT m.mld_melding_key,
          o.mld_opdr_key,
          o.mld_opdr_bedrijfopdr_volgnr,
          vt.ins_srtdiscipline_prefix,
          vt.ins_srtdiscipline_prefix || m.mld_melding_key meldingnr,
          vt.ins_srtdiscipline_prefix || m.mld_melding_key || '/'
                || o.mld_opdr_bedrijfopdr_volgnr opdrachtnr,
          pn.mld_kenmerkmelding_waarde projectnaam,
          tp.fac_usrdata_code projecttype_code,
          tp.fac_usrdata_omschr projecttype_omschr,
          kpn.prs_kostenplaats_nr,
          kpo.mld_kenmerkopdr_waarde projectkpn_opdr,
          kpp.prs_kenmerklink_waarde projectkpn_perslid,
          rc.fac_usrdata_code rek_courant,
          o.mld_statusopdr_key,
          so.mld_statusopdr_omschrijving,
          ap.prs_perslid_key,
          DECODE (aaxx_get_user,
                  'IT', prs_perslid_nr,
               pnp.prs_kenmerklink_waarde)
             aafm_perslid_nr,
          akpn.prs_kostenplaats_nr afdkpn,
          o.mld_opdr_uren,
          ou.mld_opdr_uren_key,
          ou.mld_opdr_uren_datum,
          ou.mld_opdr_uren_status,
          lx.fac_locale_xsl_tekst uren_status_tekst,
          ou.mld_opdr_uren_besteed,
          ou.mld_opdr_uren_opmerking,
          fac.safe_To_Number(ut.mld_kenmerkopdr_waarde) uurtarief_opdr,
          ap.prs_perslid_uurloon uurtarief_perslid
     FROM mld_melding m,
          mld_stdmelding sm,
          mld_discipline vg,
          ins_srtdiscipline vt,
          prs_kostenplaats kpn,
          mld_opdr o,
          mld_statusopdr so,
          prs_perslid ap,
          prs_v_aanwezigafdeling aa,
          prs_kostenplaats akpn,
          mld_opdr_uren ou,
          (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key IN
              (SELECT mld_kenmerk_key FROM mld_kenmerk
               WHERE mld_srtkenmerk_key = 55) ) pn,                            -- projectnaam
          (SELECT * FROM mld_kenmerkopdr WHERE mld_kenmerk_key = 187) vm,      -- verrekenen met
          (SELECT * FROM fac_usrdata WHERE fac_usrtab_key = 15) rc,            -- rekening courant
          (SELECT * FROM mld_kenmerkopdr WHERE mld_kenmerk_key = 186) ep,      -- type project
          (SELECT * FROM fac_usrdata WHERE fac_usrtab_key = 14) tp,            -- type project
          (SELECT * FROM mld_kenmerkopdr WHERE mld_kenmerk_key = 189) kpo,     -- projectkpn (opdr)
          (SELECT * FROM prs_kenmerklink WHERE prs_kenmerk_key = 2) kpp,       -- projectkpn (perslid)
          (SELECT * FROM mld_kenmerkopdr WHERE mld_kenmerk_key = 188) ut,      -- uurtarief (opdracht)
          (SELECT * FROM fac_locale_xsl WHERE fac_locale_xsl_lang = 'NL') lx,  -- locale-strings
          (SELECT * FROM prs_kenmerklink WHERE prs_kenmerk_key = 3) pnp        -- personeelsnummer (perslid)
    WHERE     o.mld_typeopdr_key = 7
          AND m.mld_melding_key = o.mld_melding_key
          AND sm.mld_stdmelding_key = m.mld_stdmelding_key
          AND vg.ins_discipline_key = sm.mld_ins_discipline_key
          AND vt.ins_srtdiscipline_key = vg.ins_srtdiscipline_key
          AND pn.mld_melding_key(+) = m.mld_melding_key
          AND so.mld_statusopdr_key = o.mld_statusopdr_key
          AND kpn.prs_kostenplaats_key = o.prs_kostenplaats_key
          AND vm.mld_opdr_key(+) = o.mld_opdr_key
          AND rc.fac_usrdata_key(+) = fac.safe_To_Number(vm.mld_kenmerkopdr_waarde)
          AND ep.mld_opdr_key(+) = o.mld_opdr_key
          AND tp.fac_usrdata_key(+) = fac.safe_To_Number(ep.mld_kenmerkopdr_waarde)
          AND kpo.mld_opdr_key(+) = o.mld_opdr_key
          AND kpp.prs_link_key(+) = o.mld_uitvoerende_keys
          AND pnp.prs_link_key(+) = o.mld_uitvoerende_keys
          AND ut.mld_opdr_key(+) = o.mld_opdr_key
          AND ap.prs_perslid_key = o.mld_uitvoerende_keys
          AND aa.prs_afdeling_key = ap.prs_afdeling_key
          AND akpn.prs_kostenplaats_key(+) = aa.prs_kostenplaats_key
          AND ou.mld_opdr_key = o.mld_opdr_key
          AND lx.fac_locale_xsl_label = 'lcl_mld_uren_status_'||ou.mld_opdr_uren_status;

-- Van fac_rapport naar exportbestand (XML)
CREATE OR REPLACE VIEW aaxx_v_export_exact_uren_xml (
   result,
   result_order
   )
AS
   SELECT fac_rapport_regel, fac_rapport_volgnr
     FROM fac_rapport
    WHERE fac_rapport_node = SUBSTR ('EXACT_UREN', 1, 12);

-- Exportregels (XML-structuur) in fac_rapport
CREATE OR REPLACE PROCEDURE aaxx_select_exact_uren_xml (
   p_applname IN VARCHAR2,
   p_applrun IN VARCHAR2,
   p_kpnprefix IN VARCHAR2
)
AS
   -- Status 3 = Goedgekeurd
   CURSOR c
   IS
        SELECT *
          FROM aaxx_v_exact_uren_gegevens
         WHERE mld_opdr_uren_status = 3
           AND prs_kostenplaats_nr LIKE p_kpnprefix||'%'
           AND (aaxx_get_user <> 'IT' OR ins_srtdiscipline_prefix = 'PR')
      ORDER BY mld_opdr_uren_datum, opdrachtnr;

   v_order_count NUMBER;
   v_amount_sum  NUMBER(10,2);
   v_count       NUMBER;
   v_bestand     VARCHAR2(12);
BEGIN

   v_order_count  := 0;
   v_amount_sum   := 0;
   v_count        := 0;
   v_bestand      := SUBSTR(p_applname, 1, 12);

   -- Eerst opruiming
   DELETE FROM imp_log
    WHERE imp_log_applicatie = p_applname;

   DELETE fac_rapport
    WHERE fac_rapport_node = v_bestand;

   DELETE aaxx_exp_uren
    WHERE COALESCE(administratie, 'GEEN') = COALESCE(p_kpnprefix, 'GEEN');

   -- header
   aaxx_add_xml_row (v_bestand, '<?xml version="1.0" encoding="windows-1252"?>');
   aaxx_add_xml_row (v_bestand, '<eExact>');
   aaxx_add_xml_row (v_bestand, '<GLEntries>');

   FOR rec IN c
   LOOP
      BEGIN
         aaxx_add_xml_row (v_bestand, '<GLEntry>');
            aaxx_add_xml_row (v_bestand, '<Journal code="24" type="M"/>');
            aaxx_add_xml_row (v_bestand, '<FinEntryLine>');
               aaxx_add_xml_element (v_bestand, 'Date', TO_CHAR(rec.mld_opdr_uren_datum, 'yyyy-mm-dd') );
               aaxx_add_xml_row (v_bestand, '<GLAccount code="' || rec.projecttype_code || '"/>');
               aaxx_add_xml_element (v_bestand, 'Description', rec.projectnaam);
               aaxx_add_xml_row (v_bestand, '<Costcenter code="' || rec.prs_kostenplaats_nr || '"/>');
               aaxx_add_xml_row (v_bestand, '<Resource number="'|| rec.aafm_perslid_nr ||'"/>');
               aaxx_add_xml_row (v_bestand, '<Project code="' || rec.meldingnr || '" type="I" status="A">');
                  aaxx_add_xml_element (v_bestand, 'Description', rec.projectnaam);
               aaxx_add_xml_row (v_bestand, '</Project>');
               aaxx_add_xml_element (v_bestand, 'Quantity', TO_CHAR(rec.mld_opdr_uren_besteed) );
               aaxx_add_xml_row (v_bestand, '<Amount>');
                  aaxx_add_xml_row (v_bestand, '<Currency code="EUR"/>');
                  aaxx_add_xml_element (v_bestand, 'Debit', TO_CHAR(rec.mld_opdr_uren_besteed*COALESCE(rec.uurtarief_opdr, rec.uurtarief_perslid) ) );
                  aaxx_add_xml_element (v_bestand, 'Credit', '0');
               aaxx_add_xml_row (v_bestand, '</Amount>');
               aaxx_add_xml_row (v_bestand, '<FinReferences>');
                  aaxx_add_xml_element (v_bestand, 'DocumentDate', TO_CHAR(SYSDATE, 'YYYY-MM-DD') );
               aaxx_add_xml_row (v_bestand, '</FinReferences>');
            aaxx_add_xml_row (v_bestand, '</FinEntryLine>');
            IF COALESCE(rec.uurtarief_opdr, rec.uurtarief_perslid) IS NULL
            THEN
               fac.writelog (p_applname, 'W', 'Geen uurtarief voor persoon nr ' || rec.aafm_perslid_nr, '');
            END IF;
            v_amount_sum := v_amount_sum + rec.mld_opdr_uren_besteed*COALESCE(rec.uurtarief_opdr, COALESCE(rec.uurtarief_perslid, 0));
            aaxx_add_xml_row (v_bestand, '<FinEntryLine>');
               aaxx_add_xml_row (v_bestand, '<GLAccount code="'||rec.rek_courant||'"/>');
               aaxx_add_xml_element (v_bestand, 'Description', rec.projectnaam);
               --aaxx_add_xml_row (v_bestand, '<Costcenter code="' || coalesce(rec.projectkpn_opdr, rec.projectkpn_perslid) || '"/>');
IF (SUBSTR (rec.rek_courant, 1, 1) = '2') -- Begint met '2'!
THEN
               aaxx_add_xml_row (v_bestand, '<Costcenter code="' || rec.prs_kostenplaats_nr || '"/>');
ELSE
               aaxx_add_xml_row (v_bestand, '<Costcenter code="' || coalesce(rec.projectkpn_opdr, rec.projectkpn_perslid) || '"/>');
END IF;
               aaxx_add_xml_row (v_bestand, '<Resource number="'|| rec.aafm_perslid_nr ||'"/>');
               aaxx_add_xml_row (v_bestand, '<Project code="' || rec.meldingnr || '" type="I" status="A">');
                  aaxx_add_xml_element (v_bestand, 'Description', rec.projectnaam);
               aaxx_add_xml_row (v_bestand, '</Project>');
               aaxx_add_xml_element (v_bestand, 'Quantity', '-'||TO_CHAR(rec.mld_opdr_uren_besteed) );
               aaxx_add_xml_row (v_bestand, '<Amount>');
                  aaxx_add_xml_row (v_bestand, '<Currency code="EUR"/>');
                  aaxx_add_xml_element (v_bestand, 'Debit', '0');
                  aaxx_add_xml_element (v_bestand, 'Credit', TO_CHAR(rec.mld_opdr_uren_besteed*COALESCE(rec.uurtarief_opdr, rec.uurtarief_perslid)) );
               aaxx_add_xml_row (v_bestand, '</Amount>');
               aaxx_add_xml_row (v_bestand, '<FinReferences>');
                  aaxx_add_xml_element (v_bestand, 'DocumentDate', SYSDATE);
               aaxx_add_xml_row (v_bestand, '</FinReferences>');
            aaxx_add_xml_row (v_bestand, '</FinEntryLine>');
         aaxx_add_xml_row (v_bestand, '</GLEntry>');
      END;

      INSERT INTO aaxx_exp_uren
         (mld_opdr_uren_key, administratie)
      VALUES
         (rec.mld_opdr_uren_key, p_kpnprefix);

      v_order_count  := v_order_count + 1;
   END LOOP;

   aaxx_add_xml_row (v_bestand, '</GLEntries>');
   aaxx_add_xml_row (v_bestand, '</eExact>');
   fac.writelog (p_applname, 'S', 'Exact export uitgevoerd. Aantal regels: ' || v_order_count || ' Totaal bedrag: ' || v_amount_sum, '');

END;
/

-- AAIT#22483: kenmerken van urenopdrachten vullen vanuit personeelsgegevens,
-- t.b.v. DWH-views
CREATE OR REPLACE PROCEDURE aaxx_select_dwh_set_kenmerken (
   p_applname IN VARCHAR2,
   p_applrun IN VARCHAR2
)
AS
   oracle_err_num    NUMBER;
   oracle_err_mes    VARCHAR2 (200);
   v_errormsg        VARCHAR2 (200);
   v_aanduiding      VARCHAR2 (100);

   CURSOR c_flex
   IS
      SELECT 'PR'||o.mld_melding_key||'/'||o.mld_opdr_bedrijfopdr_volgnr opdrachtnr,
             o.mld_opdr_key,
             kpo.mld_kenmerkopdr_waarde projectkpn_opdr,
             kpp.prs_kenmerklink_waarde projectkpn_perslid,
             ut.mld_kenmerkopdr_waarde uurtarief_opdr,
             ap.prs_perslid_uurloon uurtarief_perslid
        FROM mld_opdr o,
             prs_v_aanwezigperslid ap,
             (SELECT *
                FROM mld_kenmerkopdr
               WHERE mld_kenmerk_key = 189) kpo,          -- projectkpn (opdr)
             (SELECT *
                FROM prs_kenmerklink
               WHERE prs_kenmerk_key = 2) kpp,            -- projectkpn (perslid)
             (SELECT *
                FROM mld_kenmerkopdr
               WHERE mld_kenmerk_key = 188) ut            -- uurtarief (opdracht)
       WHERE     o.mld_typeopdr_key = 7                   -- (Project) uren
             AND kpo.mld_opdr_key(+) = o.mld_opdr_key
             AND ut.mld_opdr_key(+) = o.mld_opdr_key
             AND kpp.prs_link_key = o.mld_uitvoerende_keys
             AND ap.prs_perslid_key = o.mld_uitvoerende_keys;
BEGIN
   -- Project-KPN en uurtarief vastleggen
   FOR rec IN c_flex
   LOOP
      BEGIN
         v_aanduiding := rec.opdrachtnr;

         IF (rec.projectkpn_opdr IS NULL)
         THEN
            IF (rec.projectkpn_perslid IS NULL)
            THEN
               fac.writelog (p_applname,
                             'W',
                             v_aanduiding||': Geen project-KPN bekend!',
                             '');
            ELSE
               aaxx_set_kenmerk('MLD', 189, rec.mld_opdr_key, rec.projectkpn_perslid, 0);
            END IF;
         END IF;

         IF (rec.uurtarief_opdr IS NULL)
         THEN
            IF(rec.uurtarief_perslid IS NULL)
            THEN
               fac.writelog (p_applname,
                             'W',
                             v_aanduiding||': Geen uurtarief bekend!',
                             '');
            ELSE
               aaxx_set_kenmerk('MLD', 188, rec.mld_opdr_key, rec.uurtarief_perslid, 0);
            END IF;
         END IF;

      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg := 'OTHERS (error '||oracle_err_num||'/'||oracle_err_mes||')';
            fac.writelog (p_applname,
                          'E',
                          v_aanduiding || ': ' || v_errormsg,
                          '');
      END;
   END LOOP;
END aaxx_select_dwh_set_kenmerken;
/

-- Geëxporteerde uren op Verwerkt zetten en uurtarief + kostenplaats vastleggen bij
-- opdracht (kopiëren van perslid).
-- AAIT#26399: Naast het op Verwerkt zetten van de kostenboekingen tevens voor
-- AAIT#35694: ALLEEN de uren op '5130976', '5101200', '4130976', '4370901', '4370904', '0100024' en '4130990') de tegenboeking
--             aanmaken/opslaan!
/* Formatted on 24-9-2013 16:42:55 (QP5 v5.115.810.9015) */
CREATE OR REPLACE PROCEDURE aaxx_export_verwerk_exact_uren (
   p_applname    IN VARCHAR2,
   p_applrun     IN VARCHAR2,
   p_filedir     IN VARCHAR2,
   p_filename    IN VARCHAR2,
   p_kpnprefix   IN VARCHAR2
)
AS
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_errormsg       VARCHAR2 (200);
   v_count          NUMBER;
   v_logdate        DATE;
BEGIN
   v_logdate := SYSDATE;

   -- Goedgekeurde en geëxporteerde urenregistraties op verwerkt zetten.
   -- Status 4 = Verwerkt
   UPDATE   mld_opdr_uren
      SET   mld_opdr_uren_status = 4
    WHERE   mld_opdr_uren_key IN
                  (SELECT   mld_opdr_uren_key
                     FROM   aaxx_exp_uren
                    WHERE   COALESCE (administratie, 'GEEN') =
                               COALESCE (p_kpnprefix, 'GEEN'));

   -- Goedgekeurde improductieve uren op verwerkt zetten.
   -- Status 3 = Goedgekeurd
   -- Status 4 = Verwerkt
   UPDATE   mld_opdr_uren
      SET   mld_opdr_uren_status = 4
    WHERE   mld_impropdr_key IS NOT NULL AND mld_opdr_uren_status = 3;

   COMMIT;

   -- AAIT#26399: Van de hierboven verwerkte/geexporteerde uren wordt voor de
   --             regels op gedefinieerde projecten (hardgecodeerd!) tot slot
   --             nog een dekkingsregel aangemaakt.
   --             Het leverende account wordt bepaald door het gedeelte achter
   --             de slash ('/') in de 'Rek. Courant'-eigen tabel!
   INSERT INTO aaxx_exp_uren_dekking (aanmaak,
                                      mld_opdr_uren_key,
                                      mld_opdr_uren_datum,
                                      projecttype,
                                      rek_courant,
                                      kostenplaats,
                                      perslid_nr,
                                      projectcode,
                                      projectnaam,
                                      uren_besteed,
                                      uurtarief,
                                      lev_account)
      SELECT   SYSDATE,
               ug.mld_opdr_uren_key,
               ug.mld_opdr_uren_datum,
               SUBSTR (ug.projecttype_code, 1, 10),
               SUBSTR (ug.rek_courant, 1, 10),
               SUBSTR (COALESCE (ug.projectkpn_opdr, ug.projectkpn_perslid), 1 , 30),
               SUBSTR (ug.aafm_perslid_nr, 1, 30),
               SUBSTR (ug.meldingnr, 1, 20),
               SUBSTR (ug.projectnaam, 1, 30),
               ug.mld_opdr_uren_besteed,
               COALESCE (ug.uurtarief_opdr, ug.uurtarief_perslid),
               COALESCE (
                  SUBSTR (
                     TRIM(SUBSTR (ud.fac_usrdata_omschr,
                                  INSTR (ud.fac_usrdata_omschr, '/') + 1)),
                     1,
                     30
                  ),
                  'XXX'
               )
        FROM   aaxx_exp_uren u, aaxx_v_exact_uren_gegevens ug, fac_usrdata ud
       WHERE   COALESCE (u.administratie, 'GEEN') =
                  COALESCE (p_kpnprefix, 'GEEN')
               AND u.mld_opdr_uren_key = ug.mld_opdr_uren_key
               AND ug.projecttype_code IN ('5130976', '5101200', '4130976', '4370901', '4370904', '0100024', '4130990')
               AND TRIM (ug.rek_courant) = TRIM (ud.fac_usrdata_code)
               AND ud.fac_usrtab_key = 15                -- Rek. Courant-tabel
               AND SUBSTR (ud.fac_usrdata_code, 1, 1) = '2' -- Begint met '2'!
               AND ud.fac_usrdata_verwijder IS NULL
               AND NOT EXISTS
                     (SELECT   1
                        FROM   aaxx_exp_uren_dekking
                       WHERE   mld_opdr_uren_key = ug.mld_opdr_uren_key);

   -- AAZC#34483 projecturen ook doorbelasten
   INSERT INTO fin_verkoopfactuur
   (
       fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3, fin_verkoopfactuur_n1
   )
   SELECT substr(to_char(v_logdate, 'dd-mm-yyyy') || ' - ' || sd.ins_srtdiscipline_prefix || m.mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr, 1,30 ),
          'uren',
          ou.mld_opdr_uren_key,
          v_logdate,
          SUBSTR (prs_kostenplaats_nr, 1, 30) prs_kostenplaats_nr,
          DECODE (aaxx_get_user, 'ZCN', '913815',
                                 'ZKHM', '913816',
                                 '') debiteur,
          'UREN' || DECODE(TO_CHAR(mld_opdr_uren_datum,'YYYY'), TO_CHAR(TO_NUMBER(TO_CHAR(SYSDATE, 'yyyy'))-1), ' VJ','') ,
          SUBSTR(DECODE (aaxx_get_user,
                         'ZCN', 'Projecten',
                         'ZKHM', 'Projecten',
                         '')
                 , 1, 60) prs_kostensoortgrp_oms,
          sd.ins_srtdiscipline_prefix || m.mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr || ' ' || d.ins_discipline_omschrijving
          || ' ('
          || (SELECT MAX(mld_kenmerkmelding_waarde)
              FROM mld_kenmerkmelding km, mld_kenmerk k
              WHERE     km.mld_kenmerk_key = k.mld_kenmerk_key
                    AND k.mld_srtkenmerk_key = 143                -- projectnaam
                    AND km.mld_melding_key = m.mld_melding_key)
          || ')'
             omschrijving,
          ROUND (ou.mld_opdr_uren_besteed *
            (SELECT fac.safe_to_number(mld_kenmerkopdr_waarde)
               FROM mld_kenmerkopdr ko, mld_kenmerk k
              WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                    AND k.mld_srtkenmerk_key = DECODE(aaxx_get_user, 'ZCN', 53, 'ZKHM', 53)                -- intern uurtarief
                    AND ko.mld_opdr_key = o.mld_opdr_key), 2),
          (SELECT fin_btwtabelwaarde_code
             FROM fin_btwtabelwaarde
            WHERE fin_btwtabelwaarde_perc = 21
              AND COALESCE(fin_btwtabelwaarde_verlegd,0) = 0
              AND fin_btwtabelwaarde_verwijder IS NULL
              AND mld_opdr_uren_datum BETWEEN COALESCE(fin_btwtabelwaarde_van, mld_opdr_uren_datum - 1)
                                          AND COALESCE(fin_btwtabelwaarde_tot, mld_opdr_uren_datum + 1)) fin_btwtabelwaarde_code,
          to_char(mld_opdr_uren_datum, 'YYYY'),
          COALESCE(exact_code, alg_gebouw_code),  -- C1
          SUBSTR (
             DECODE (aaxx_get_user, 'ZCN', m.mld_melding_key,
                                    'ZKHM', m.mld_melding_key,
                                    '')
             , 1, 12) groepering,   -- C2
          NULL, -- C3
          l.alg_locatie_key    -- N1
   FROM mld_opdr o,
        mld_opdr_uren ou,
        prs_perslid p,
        mld_typeopdr ot,
        prs_kostenplaats k,
        mld_melding m,
        mld_stdmelding std,
        ins_tab_discipline d,
        ins_srtdiscipline sd,
        aaxx_exp_uren u,
        alg_gebouw g,
        alg_locatie l,
        alg_v_onroerendgoed og,
        aaxx_v_exact_code_gebouw exact
   WHERE     o.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
         AND o.mld_typeopdr_key = ot.mld_typeopdr_key
         AND u.mld_opdr_uren_key = ou.mld_opdr_uren_key
         AND ou.mld_opdr_key = o.mld_opdr_key
         AND ou.prs_perslid_key = p.prs_perslid_key
         AND m.mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys(+)
         AND og.alg_gebouw_key = g.alg_gebouw_key(+)
         AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
         AND og.alg_gebouw_key = exact.alg_gebouw_key(+)
         AND o.mld_melding_key = m.mld_melding_key
         AND m.mld_stdmelding_key = std.mld_stdmelding_key
         AND std.mld_ins_discipline_key = d.ins_discipline_key
         AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
         AND ((    aaxx_get_user = 'ZCN'
                   AND (   sd.ins_srtdiscipline_prefix = 'PR')
                 )
              OR
              (    aaxx_get_user = 'ZKHM'
                   AND (   sd.ins_srtdiscipline_prefix = 'PR')
                 )
             );

   --	1 regel met de fee op projecturen, deze moet als volgt worden berekend: verwerkte uren * (extern-intern
   --  tarief). Deze fee moet op FEE UREN

  INSERT INTO fin_verkoopfactuur
   (
       fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3, fin_verkoopfactuur_n1
   )
   SELECT fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, 'FEE ' || prs_kostensoort_oms, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, ROUND(ut.ext_uurtarief * ou.mld_opdr_uren_besteed, 2) - fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3, fin_verkoopfactuur_n1
     FROM fin_verkoopfactuur vk,
          mld_opdr_uren ou,
          (SELECT ko.mld_opdr_key, fac.safe_to_number(mld_kenmerkopdr_waarde) ext_uurtarief
             FROM mld_kenmerkopdr ko, mld_kenmerk k
            WHERE     ko.mld_kenmerk_key = k.mld_kenmerk_key
                  AND k.mld_srtkenmerk_key = DECODE(aaxx_get_user, 'ZCN', 281, 'ZKHM', 281)                -- extern uurtarief
          ) ut
    WHERE vk.fin_verkoopfactuur_refkey = ou.mld_opdr_uren_key
        AND ou.mld_opdr_key = ut.mld_opdr_key
        AND fin_verkoopfactuur_aanmaak = v_logdate;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
         'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.writelog ('UREN',
                    'E',
                    v_errormsg,
                    '');
END;
/

--=============================================================================
-- EXPORTFUNCTIES BUNDEL_CATERING
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_export_bundel_catering (
   result,
   result_order
   )
AS
SELECT REPLACE(REPLACE('RES'
       || ';'
       || SYSDATE
       || ';'
       || SUBSTR (prs_kostenplaats_nr, 1, 30)
       || ';'
       || SUBSTR (prs_kostenplaats_omschrijving, 1, 60)
       || ';'
       || SUBSTR (prs_kostensoort_oms, 1, 60)
       || ';'
       || rra.res_rsv_artikel_aantal || ' * ' || ra.res_artikel_omschrijving
       || ';'
       || to_char(rra.res_rsv_artikel_prijs)
       || ';'
       || to_char(ra.res_artikel_inkoopprijs)
       || ';'
       || rra.res_rsv_artikel_key
      ,CHR (13), ''), CHR (10), '<ret>'), res_rsv_artikel_key
FROM res_rsv_ruimte rrr,
     res_rsv_artikel rra,
     res_artikel ra,
     ins_tab_discipline d,
     prs_kostensoort ks,
     prs_kostenplaats k
WHERE     rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
      AND rra.res_rsv_artikel_verwijder IS NULL
      AND rra.res_status_bo_key = 5
      AND rra.res_artikel_key = ra.res_artikel_key
      AND ra.res_discipline_key = d.ins_discipline_key
      AND d.prs_kostensoort_key = ks.prs_kostensoort_key(+)
      AND rrr.prs_kostenplaats_key = k.prs_kostenplaats_key
      AND NVL (rra.res_rsv_artikel_levering,
               TO_DATE ('20070101', 'yyyymmdd')
         ) <
            TO_DATE (   TO_CHAR (SYSDATE, 'yyyy')
                     || TO_CHAR (SYSDATE, 'mm')
                     || '01',
                     'yyyymmdd'
            );

-- Procedure om alle geexporteerde facturen naar status verwerkt te zetten.
CREATE OR REPLACE PROCEDURE aaxx_export_bundel_catering (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
   c_catmld_uitvoertijd          mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE := MLD_T_UITVOERTIJD(2, 'D');
   v_errormsg                    VARCHAR (200);
   oracle_err_num                NUMBER;
   oracle_err_mes                VARCHAR2 (200);
   v_laatste_export              DATE;
   v_mld_melding_key             NUMBER;
   v_prs_bedrijf_key             NUMBER;
   v_prs_kostenplaats_key        NUMBER;
   v_mld_opdr_bedrijfopdr_volgnr NUMBER;
   v_aanvrager                   NUMBER;
   v_mld_workorder_key           NUMBER;
BEGIN

  IF aaxx_get_user = 'SITECH' THEN
    -- SITECH: Sodexo BV
    v_prs_bedrijf_key := 10442;
    -- SITECH: Servicedesk AA
    v_aanvrager := 6524;
    -- SITECH: Arcadis Aqumen
    v_prs_kostenplaats_key := 209;
    -- key van opdrachttype workorder
    v_mld_workorder_key := 167;
  END IF;

  IF aaxx_get_user = 'NS' THEN
    -- NS: Eurest catering
    v_prs_bedrijf_key := 1581;
    -- NS: xxx
    v_aanvrager := 4;
    -- NS: xxx
    v_prs_kostenplaats_key := 0;
    -- key van opdrachttype workorder
    v_mld_workorder_key := 121;
  END IF;

  v_errormsg := 'Controle exportdatum';
  SELECT max(fin_verkoopfactuur_aanmaak)
    INTO v_laatste_export
    FROM fin_verkoopfactuur
   WHERE fin_verkoopfactuur_xmlnode = 'reservering';

  IF v_laatste_export IS NOT NULL AND v_laatste_export >
            TO_DATE (   TO_CHAR (SYSDATE, 'yyyy')
                     || TO_CHAR (SYSDATE, 'mm')
                     || '01',
                     'yyyymmdd') THEN
     -- foutmelding bundeling voor deze maand heeft al plaatsgevonden op v_laatste_export
     fac.writelog (p_applname, 'E', 'bundeling voor deze maand heeft al plaatsgevonden op: ' || v_laatste_export, '');
     RETURN;
  END IF;

  v_errormsg := 'Aanmaken catering melding';
  BEGIN
    INSERT INTO mld_melding
    (
        mld_melding_omschrijving,
        mld_kosten_klant,
        prs_perslid_key,
        prs_kostenplaats_key,
        mld_stdmelding_key,
        mld_alg_locatie_key,
        mld_melding_einddatum,
        mld_melding_datum,
        mld_melding_t_uitvoertijd,
        mld_meldbron_key,
        mld_melding_module,
        mld_melding_spoed
    )
    VALUES (
              'Hospitality maand:' || TO_CHAR (TO_DATE (   '01'
                                       || TO_CHAR (SYSDATE, 'mm')
                                       || TO_CHAR (SYSDATE, 'yyyy'),
                                       'ddmmyyyy'
                              )
                              - 1,
                              'Mon'
                     ),
              1,
              v_aanvrager,
              v_prs_kostenplaats_key,
              DECODE (aaxx_get_user, 'SITECH', 603, 'NS', 641),
              DECODE (aaxx_get_user, 'SITECH', 1, 'NS', 0), -- alg_locatie
              sysdate + 14,
              sysdate,
              c_catmld_uitvoertijd,
              5,
              'MLD',
              3
           ) RETURNING mld_melding_key INTO v_mld_melding_key;

    BEGIN mld.setmeldingstatus(v_mld_melding_key, 2, v_aanvrager); END;
    BEGIN mld.setmeldingstatus(v_mld_melding_key, 4, v_aanvrager); END;
    UPDATE mld_melding SET mld_melding_behandelaar_key= v_aanvrager WHERE mld_melding_key = v_mld_melding_key ;
  END;

  v_errormsg := 'Voeg catering to aan fin_verkoopfactuur (vh verkoopbuffer)';
  -- rra.res_status_bo_key = 5 is afgemeld
  INSERT INTO fin_verkoopfactuur
  (
   -- module, export_datum, prs_kostenplaats_nr, debiteur, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, omschrijving, bedrag, btw, fin_btwtabelwaarde_code, opdr_jaar, exact_code_gebouw, groepering, subregelvolgorde
      fin_verkoopfactuur_id, fin_verkoopfactuur_xmlnode, fin_verkoopfactuur_refkey, fin_verkoopfactuur_aanmaak, prs_kostenplaats_nr, prs_debiteur_naam, prs_kostensoort_oms, prs_kostensoort_opmerking, prs_kostensoort_refcode, prs_kostensoortgrp_oms, fin_verkoopfactuur_omschr, fin_verkoopfactuur_bedrag, fin_btwtabelwaarde_code, fin_verkoopfactuur_maand, fin_verkoopfactuur_c1, fin_verkoopfactuur_c2, fin_verkoopfactuur_c3
  )
  SELECT substr(to_char(SYSDATE, 'dd-mm-yyyy') || ' - ' || rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr, 1,30 ),
          'reservering',
          rrr.res_rsv_ruimte_key,
          SYSDATE,
          DECODE (aaxx_get_user, 'SITECH', aaxx_get_dep_code(k.prs_kostenplaats_nr), 'NS', SUBSTR (prs_kostenplaats_nr, 1, 30)),
          DECODE (aaxx_get_user, 'SITECH', aaxx_get_dep_code(k.prs_kostenplaats_nr), 'NS', SUBSTR (prs_kostenplaats_nr, 1, 30)),
          SUBSTR (prs_kostensoort_oms, 1, 60),
          SUBSTR (prs_kostensoort_opmerking, 1, 255),
          SUBSTR (prs_kostensoort_refcode, 1, 255),
          (SELECT SUBSTR(prs_kostensoortgrp_oms,1,60) FROM prs_kostensoortgrp ksg WHERE ksg.prs_kostensoortgrp_key = ks.prs_kostensoortgrp_key),
          SUBSTR ('Hospitality' || ' '
                  || TO_CHAR (TO_DATE (   '01'
                                       || TO_CHAR (SYSDATE, 'mm')
                                       || TO_CHAR (SYSDATE, 'yyyy'),
                                       'ddmmyyyy'
                              )
                              - 1,
                              'Mon'
                     ),
                  1,
                  100
          ),
          SUM (rra.res_rsv_artikel_prijs),
          DECODE (res_artikel_btw, 19, '4', 6, '2', 0, '4', '-1'),
          to_char(add_months(sysdate, -1),'yyyy'),
          COALESCE(exact_code, alg_gebouw_code),
          'X', 'X'  -- groepering , subregelvolgorde
   FROM res_rsv_ruimte rrr,
        res_rsv_artikel rra,
        alg_ruimte r,
        alg_verdieping v,
        alg_gebouw g,
        res_artikel ra,
        ins_tab_discipline d,
        prs_kostensoort ks,
        prs_kostenplaats k,
        aaxx_v_exact_code_gebouw exact,
        (SELECT COALESCE (MAX (ir2a.alg_ruimte_key), irrr.alg_ruimte_key)
                   alg_ruimte_key,
                irrr.res_rsv_ruimte_key
         FROM res_rsv_ruimte irrr, res_v_rsv_ruimte_2_alg_ruimte ir2a
         WHERE irrr.res_rsv_ruimte_key = ir2a.res_rsv_ruimte_key(+)
         GROUP BY irrr.res_rsv_ruimte_key, irrr.alg_ruimte_key) r2a
   WHERE     rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
         AND r2a.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
         AND r2a.alg_ruimte_key = r.alg_ruimte_key
         AND r.alg_verdieping_key = v.alg_verdieping_key
         AND v.alg_gebouw_key = exact.alg_gebouw_key(+)
         AND v.alg_gebouw_key = g.alg_gebouw_key
         AND rra.res_rsv_artikel_verwijder IS NULL
         AND rra.res_status_bo_key = 5
         AND rra.res_artikel_key = ra.res_artikel_key
         AND ra.res_discipline_key = d.ins_discipline_key
         AND d.prs_kostensoort_key = ks.prs_kostensoort_key(+)
         AND rrr.prs_kostenplaats_key = k.prs_kostenplaats_key
         AND rra.res_rsv_artikel_levering <
               TO_DATE (   TO_CHAR (SYSDATE, 'yyyy')
                        || TO_CHAR (SYSDATE, 'mm')
                        || '01',
                        'yyyymmdd'
               )
   GROUP BY prs_kostenplaats_nr,
            prs_kostenplaats_omschrijving,
            k.prs_kostenplaats_key,
            prs_kostensoort_oms,
            prs_kostensoort_opmerking,
            prs_kostensoort_refcode,
            ks.prs_kostensoortgrp_key,
            res_artikel_btw,
            alg_gebouw_code,
            exact_code;

    v_errormsg := 'Meld de catering af die zojuist in de verkoopbuffer geplaatst zijn';
    -- pas alle cateringartikelen aan die hierboven in de verkoopbuffer geplaatst zijn
    -- res_status_bo_key = 6 is verwerkt
    UPDATE res_rsv_artikel
    SET res_rsv_artikel_verwerkt = SYSDATE, res_status_bo_key = 6
    WHERE res_rsv_artikel_key IN
                (SELECT res_rsv_artikel_key
                 FROM res_rsv_ruimte rrr,
                      res_rsv_artikel rra,
                      res_artikel ra,
                      ins_tab_discipline d,
                      prs_kostenplaats k
                 WHERE     rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
                       AND rra.res_rsv_artikel_verwijder IS NULL
                       AND rra.res_status_bo_key = 5
                       AND rra.res_artikel_key = ra.res_artikel_key
                       AND ra.res_discipline_key = d.ins_discipline_key
                       AND rrr.prs_kostenplaats_key = k.prs_kostenplaats_key
                       AND NVL (rra.res_rsv_artikel_levering,
                                TO_DATE ('20070101', 'yyyymmdd')
                          ) <
                             TO_DATE (   TO_CHAR (SYSDATE, 'yyyy')
                                      || TO_CHAR (SYSDATE, 'mm')
                                      || '01',
                                      'yyyymmdd'
                             ));

    v_errormsg := 'Zoek kostenplaats';
    SELECT prs_kostenplaats_key
      INTO v_prs_kostenplaats_key
      FROM mld_melding
     WHERE mld_melding_key = v_mld_melding_key;

    v_mld_opdr_bedrijfopdr_volgnr := mld.BepaalOpdrMeldingVolgnr (v_mld_melding_key);

    v_errormsg := 'Maak opdracht aan om factuur van cateraar te matchen';
    -- maak opdracht aan om cateringfactuur van leverancier te matchen
    -- de cateraar hoeft de opslag van 6,5% niet te ontvangen
    INSERT INTO mld_opdr (mld_melding_key
                        , prs_kostenplaats_key
                        , mld_statusopdr_key
                        , mld_typeopdr_key
                        , prs_perslid_key
                        , mld_uitvoerende_keys
                        , mld_opdr_datumbegin
                        , mld_opdr_einddatum
                        , mld_opdr_module
                        , mld_opdr_omschrijving
                        , mld_opdr_materiaal
                        , mld_opdr_kosten
                        , mld_opdr_bedrijfopdr_volgnr)
    ( SELECT v_mld_melding_key
           , v_prs_kostenplaats_key
           , 5                             -- uitgegeven
           , v_mld_workorder_key
           , v_aanvrager
           , v_prs_bedrijf_key
           , sysdate
           , FAC.DatumTijdPlusUitvoerTijd(sysdate, 1, 'DAGEN')
           , 'MLD'
           , max(fin_verkoopfactuur_omschr)
           , round((sum(fin_verkoopfactuur_bedrag)/1.065),2)
           , round((sum(fin_verkoopfactuur_bedrag)/1.065),2)
           , v_mld_opdr_bedrijfopdr_volgnr
        FROM fin_verkoopfactuur
       WHERE fin_verkoopfactuur_xmlnode = 'reservering'
         AND trunc(fin_verkoopfactuur_aanmaak) = trunc(sysdate));

    v_errormsg := 'Update melding status';
    MLD.updatemeldingstatusAV (v_mld_melding_key, 0, v_aanvrager, 0);       -- Facilitor


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

--=============================================================================
-- EXPORTFUNCTIES BUDGET TRACKER
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_export_budget_tracker (result, result_order)
AS
SELECT '"nummer";' ||
       '"datum";' ||
       '"status";' ||
       '"laatste_actie";' ||
       '"vakgroeptype";' ||
       '"vakgroep";' ||
       '"kostensoort_code";' ||
       '"kostensoort_omschrijving";' ||
       '"financiele_waarde";' ||
       '"kostensoortgroep_omschrijving";' ||
       '"melding";' ||
       '"omschrijving";' ||
       '"organisatie";' ||
       '"naam";' ||
       '"kostenplaats";' ||
       '"kostenplaats_omschrijving";' ||
       '"plaats";' ||
       '"locatie";' ||
       '"gebouw";' ||
       '"code_exact";' ||
       '"opdracht_status";' ||
       '"uitvoerende";' ||
       '"contactpersoon";' ||
       '"uren";' ||
       '"uurloon";' ||
       '"materiaal";' ||
       '"kosten";' ||
       '"gefactureerd"', 0
       FROM dual
UNION ALL
SELECT REPLACE(REPLACE(   '"'
       || nummer
       || '";"'
       || datum
       || '";"'
       || status
       || '";"'
       || laatste_actie
       || '";"'
       || vakgroeptype
       || '";"'
       || vakgroep
       || '";"'
       || kostensoort_code
       || '";"'
       || kostensoort_omschrijving
       || '";"'
       || financiele_waarde
       || '";"'
       || kostensoortgroep_omschrijving
       || '";"'
       || melding
       || '";"'
       || aaxx_exp_escape (omschrijving)
       || '";"'
       || organisatie
       || '";"'
       || naam
       || '";"'
       || kostenplaats
       || '";"'
       || kostenplaats_omschrijving
       || '";"'
       || plaats
       || '";"'
       || locatie
       || '";"'
       || gebouw
       || '";"'
       || code_exact
       || '";"'
       || opdracht_status
       || '";"'
       || uitvoerende
       || '";"'
       || contactpersoon
       || '";"'
       || uren
       || '";"'
       || uurloon
       || '";"'
       || materiaal
       || '";"'
       || kosten
       || '";"'
       || gefactureerd
       || '"',CHR (13), ''), CHR (10), '<ret>'),
       1
FROM (SELECT m.mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr nummer,
             TO_CHAR (o.mld_opdr_datumbegin, 'DD-MM-YYYY HH24:MI') datum,
             (SELECT mld_statusopdr_omschrijving
              FROM mld_statusopdr s
              WHERE o.mld_statusopdr_key = s.mld_statusopdr_key)
                status,
             TO_CHAR (mld.getopdrachtstatusdate (o.mld_opdr_key, mld_statusopdr_key)
                      , 'DD-MM-YYYY HH24:MI'
             )
                laatste_actie,
             sd.ins_srtdiscipline_prefix vakgroeptype,
             md.ins_discipline_omschrijving vakgroep,
             COALESCE (kstd.prs_kostensoort_oms, kvg.prs_kostensoort_oms)
                kostensoort_code,
             COALESCE (kstd.prs_kostensoort_opmerking,
                       kvg.prs_kostensoort_opmerking
             )
                kostensoort_omschrijving,
             COALESCE (kstd.prs_kostensoort_refcode,
                       kvg.prs_kostensoort_refcode
             )
                financiele_waarde,
             (SELECT prs_kostensoortgrp_oms FROM prs_kostensoortgrp ksg
               WHERE ksg.prs_kostensoortgrp_key = COALESCE (kstd.prs_kostensoortgrp_key, kvg.prs_kostensoortgrp_key)) kostensoortgroep_omschrijving,
             std.mld_stdmelding_omschrijving melding,
             SUBSTR (REPLACE (mld_melding_omschrijving,
                              CHR (13) || CHR (10),
                              '<ret>'
                     ),
                     1,
                     2000
             )
                omschrijving,
             (SELECT d.prs_afdeling_naam
              FROM prs_v_afdeling d
              WHERE p.prs_afdeling_key = d.prs_afdeling_key)
                organisatie,
             p.prs_perslid_naam
             || DECODE (NVL (p.prs_perslid_voorletters, ''),
                   '', '',
                   ', ' || p.prs_perslid_voorletters)
             || DECODE (NVL (p.prs_perslid_tussenvoegsel, ''),
                   '', '',
                   ' ' || p.prs_perslid_tussenvoegsel)
             || DECODE (NVL (p.prs_perslid_voornaam, ''),
                   '', '',
                   ' (' || p.prs_perslid_voornaam || ')')
                naam,
             (SELECT k.prs_kostenplaats_nr
              FROM prs_kostenplaats k
              WHERE k.prs_kostenplaats_key = o.prs_kostenplaats_key)
                kostenplaats,
             (SELECT k.prs_kostenplaats_omschrijving
              FROM prs_kostenplaats k
              WHERE k.prs_kostenplaats_key = o.prs_kostenplaats_key)
                kostenplaats_omschrijving,
             (SELECT alg_locatie_code
              FROM alg_locatie l
              WHERE m.mld_alg_locatie_key = l.alg_locatie_key)
             || (SELECT CASE COALESCE(G.alg_gebouw_code, '')
                           WHEN '' THEN '' ELSE '-' || G.alg_gebouw_code
                        END
                     || CASE COALESCE(G.alg_verdieping_code, '')
                           WHEN '' THEN '' ELSE '-' || G.alg_verdieping_code
                        END
                     || CASE COALESCE(G.alg_ruimte_nr, '')
                           WHEN '' THEN '' ELSE '-' || G.alg_ruimte_nr
                        END
                 FROM alg_v_allonrgoed_gegevens g
                 WHERE m.mld_alg_onroerendgoed_keys = g.alg_onroerendgoed_keys) plaats,
             alg_locatie_code locatie,
             alg_gebouw_code gebouw,
             COALESCE ((SELECT exact_code
                          FROM aaxx_v_exact_code_gebouw ogk
                         WHERE ogk.alg_gebouw_key = v.alg_gebouw_key)
                       , v.alg_gebouw_code)
                code_exact,
             (SELECT mld_statusopdr_omschrijving
              FROM mld_statusopdr so
              WHERE o.mld_statusopdr_key = so.mld_statusopdr_key)
                opdracht_status,
             COALESCE ( (SELECT prs_bedrijf_naam
                         FROM prs_bedrijf b
                         WHERE o.mld_uitvoerende_keys = prs_bedrijf_key),
                       (SELECT prs_perslid_naam_full
                        FROM prs_v_perslid_fullnames_all
                        WHERE o.mld_uitvoerende_keys = prs_perslid_key)
             )
                uitvoerende,
             (SELECT prs_perslid_naam_full
              FROM prs_v_perslid_fullnames_all pf
              WHERE o.prs_perslid_key = pf.prs_perslid_key)
                contactpersoon,
             replace(to_char (o.mld_opdr_uren, '999999990.99'), '.', ',') uren,
             replace(to_char (o.mld_opdr_uurloon, '999999990.99'), '.', ',') uurloon,
             replace(to_char (o.mld_opdr_materiaal, '999999990.99'), '.', ',') materiaal,
             replace(to_char (o.mld_opdr_kosten, '999999990.99'), '.', ',') kosten,
             COALESCE ( (SELECT trim(to_char (SUM (f.fin_factuur_totaal), '999999990.99'))
                         FROM aaxx_v_aanwezigfactuur f
                         WHERE f.mld_opdr_key = o.mld_opdr_key), '0'
             )
                gefactureerd
      FROM mld_melding m,
           mld_discipline md,
           ins_srtdiscipline sd,
           alg_v_allonrgoed_gegevens v,
           alg_locatie l,
           alg_district di,
           prs_perslid p,
           mld_opdr o,
           mld_stdmelding std,
           prs_kostensoort kstd,
           prs_kostensoort kvg
      WHERE     m.mld_alg_locatie_key = l.alg_locatie_key(+)
            AND l.alg_district_key = di.alg_district_key(+)
            AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key(+)
            AND m.mld_alg_onroerendgoed_keys = v.alg_onroerendgoed_keys(+)
            AND m.prs_perslid_key = p.prs_perslid_key
            AND m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_ins_discipline_key = md.ins_discipline_key
            AND m.mld_melding_key = o.mld_melding_key
            AND std.prs_kostensoort_key = kstd.prs_kostensoort_key(+)
            AND md.prs_kostensoort_key = kvg.prs_kostensoort_key(+)
UNION ALL
SELECT cnt_contract_nummer_intern,
       TO_CHAR (c.cnt_contract_looptijd_van, 'DD-MM-YYYY HH24:MI') datum,
       DECODE (SIGN (cnt_contract_looptijd_van - SYSDATE),
               1,
               'Toekomst',
               -1,
               DECODE (SIGN (cnt_contract_looptijd_tot - SYSDATE),
                       1,
                       'Actueel',
                       -1,
                       'Verlopen'
               )
       )
          status,
       TO_CHAR (c.cnt_contract_looptijd_tot, 'DD-MM-YYYY HH24:MI')
          laatste_actie,
       'Contract' vakgroeptype,
       d.ins_discipline_omschrijving vakgroep,
       k.prs_kostensoort_oms kostensoort_code,
       k.prs_kostensoort_opmerking kostensoort_omschrijving,
       k.prs_kostensoort_refcode financiele_waarde,
       (SELECT prs_kostensoortgrp_oms FROM prs_kostensoortgrp ksg
               WHERE ksg.prs_kostensoortgrp_key = k.prs_kostensoortgrp_key) kostensoortgroep_omschrijving,
       c.cnt_contract_omschrijving melding,
       SUBSTR (REPLACE (cnt_contract_document, CHR (13) || CHR (10), '<ret>'),
               1,
               2000
       )
          omschrijving,
       prs_afdeling_naam organisatie,
       p.prs_perslid_naam
       || DECODE (NVL (p.prs_perslid_voorletters, ''),
             '', '',
             ', ' || p.prs_perslid_voorletters)
       || DECODE (NVL (p.prs_perslid_tussenvoegsel, ''),
             '', '',
             ' ' || p.prs_perslid_tussenvoegsel)
       || DECODE (NVL (p.prs_perslid_voornaam, ''),
             '', '',
             ' (' || p.prs_perslid_voornaam || ')')
          naam,
       kp.prs_kostenplaats_nr kostenplaats,
       kp.prs_kostenplaats_omschrijving kostenplaats_omschrijving,
       alg_locatie_code || '-' || alg_gebouw_code plaats,
       alg_locatie_code locatie,
       alg_gebouw_code gebouw,
       COALESCE ((SELECT exact_code
                    FROM aaxx_v_exact_code_gebouw ogk
                   WHERE ogk.alg_gebouw_key = g.alg_gebouw_key)
                 , g.alg_gebouw_code)
          code_exact,
       '-' opdracht_status,
       prs_bedrijf_naam uitvoerende,
       '-' contactpersoon,
       '0' uren,
       '0' uurloon,
       '0' materiaal,
       COALESCE ( trim(to_char (DECODE (cnt_gew.cnt_contract_plaats_gewicht,
                                                               0,
                                                               1,
                                                               (cp.cnt_contract_plaats_gewicht
                                                                / cnt_gew.cnt_contract_plaats_gewicht)
                          * c.cnt_contract_kosten), '999999990.99'))
                   ,
                 '0'
       )
          kosten,
       COALESCE ( trim(to_char (DECODE (cnt_gew.cnt_contract_plaats_gewicht,
                                                               0,
                                                               1,
                                                               (cp.cnt_contract_plaats_gewicht
                                                                / cnt_gew.cnt_contract_plaats_gewicht)
                          * (SELECT SUM(fin_factuur_totaal)
                               FROM aaxx_v_aanwezigfactuur f
                              WHERE f.cnt_contract_key = c.cnt_contract_key
                            )), '999999990.99'))
                   ,
                 '0'
       )
          gefactureerd
FROM cnt_contract c,
     cnt_discipline d,
     cnt_contract_plaats cp,
     prs_bedrijf b,
     prs_kostensoort k,
     prs_kostenplaats kp,
     prs_afdeling a,
     prs_perslid p,
     alg_locatie l,
     alg_gebouw g,
     prs_contactpersoon cop,
    (SELECT cnt_contract_key,
            SUM (cnt_contract_plaats_gewicht) cnt_contract_plaats_gewicht
      FROM cnt_contract_plaats
      GROUP BY cnt_contract_key) cnt_gew,
     (SELECT cp.cnt_contract_plaats_key, alg_locatie_key, alg_gebouw_key
      FROM alg_v_allonroerendgoed aog, cnt_contract_plaats cp
      WHERE aog.alg_type = cp.cnt_alg_plaats_code
            AND aog.alg_onroerendgoed_keys = cp.cnt_alg_plaats_key) cog
WHERE     c.cnt_contract_key = cp.cnt_contract_key(+)
      AND c.cnt_contract_key = cnt_gew.cnt_contract_key(+)
      AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
      AND c.ins_discipline_key = d.ins_discipline_key
      AND d.prs_kostensoort_key = k.prs_kostensoort_key(+)
      AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
      AND c.prs_afdeling_key_eig = a.prs_afdeling_key
      AND c.prs_perslid_key_beh = p.prs_perslid_key
      AND cp.cnt_contract_plaats_key = cog.cnt_contract_plaats_key(+)
      AND c.prs_contactpersoon_key = cop.prs_contactpersoon_key(+)
      AND cog.alg_locatie_key = l.alg_locatie_key(+)
      AND cog.alg_gebouw_key = g.alg_gebouw_key(+)
      AND cnt_contract_verwijder IS NULL
      );



--=============================================================================
-- EXPORTFUNCTIES DATAWAREHOUSE
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_PRS_BEDRIJF
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_prs_bedrijf
(
   prs_bedrijf_key,
   prs_bedrijf_naam,
   prs_bedrijf_naam_upper,
   prs_bedrijf_post_adres,
   prs_bedrijf_post_postcode,
   prs_bedrijf_post_plaats,
   prs_bedrijf_post_land,
   prs_bedrijf_bezoek_adres,
   prs_bedrijf_bezoek_postcode,
   prs_bedrijf_bezoek_plaats,
   prs_bedrijf_bezoek_land,
   prs_bedrijf_telefoon,
   prs_bedrijf_fax,
   prs_bedrijf_telefoon2,
   prs_bedrijf_contact_persoon,
   prs_bedrijf_contact_telefoon,
   prs_bedrijf_contact_fax,
   prs_bedrijf_opmerking,
   prs_bedrijf_opmerking2,
   prs_bedrijf_uurloon,
   prs_leverancier_nr,
   prs_overeenkomst_nr,
   prs_overeenkomst_datum,
   prs_bedrijf_aanmaak,
   prs_bedrijf_verwijder,
   prs_bedrijf_leverancier,
   prs_bedrijf_uitvoerende,
   prs_bedrijf_contract,
   prs_bedrijf_intern,
   prs_bedrijf_huurder,
   prs_bedrijf_email,
   prs_bedrijf_ingids,
   prs_relatietype
)
AS
   SELECT prs_bedrijf_key,
          prs_bedrijf_naam,
          prs_bedrijf_naam_upper,
          prs_bedrijf_post_adres,
          prs_bedrijf_post_postcode,
          prs_bedrijf_post_plaats,
          prs_bedrijf_post_land,
          prs_bedrijf_bezoek_adres,
          prs_bedrijf_bezoek_postcode,
          prs_bedrijf_bezoek_plaats,
          prs_bedrijf_bezoek_land,
          prs_bedrijf_telefoon,
          prs_bedrijf_fax,
          prs_bedrijf_telefoon2,
          prs_bedrijf_contact_persoon,
          prs_bedrijf_contact_telefoon,
          prs_bedrijf_contact_fax,
          prs_bedrijf_opmerking,
          prs_bedrijf_opmerking2,
          prs_bedrijf_uurloon,
          prs_leverancier_nr,
          prs_overeenkomst_nr,
          prs_overeenkomst_datum,
          prs_bedrijf_aanmaak,
          prs_bedrijf_verwijder,
          prs_bedrijf_leverancier,
          prs_bedrijf_uitvoerende,
          prs_bedrijf_contract,
          prs_bedrijf_intern,
          prs_bedrijf_huurder,
          prs_bedrijf_email,
          prs_bedrijf_ingids,
          prs_relatietype_omschrijving
     FROM prs_bedrijf b, prs_relatietype rt
    WHERE prs_bedrijf_verwijder IS NULL
      AND b.prs_relatietype_key = rt.prs_relatietype_key(+);

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_PRS_BEDRIJFADRES
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_prs_bedrijfadres
(
   prs_bedrijf_key,
   prs_bedrijfadres_type,
   opdrachttype,
   prs_bedrijfadres_url,
   prs_bedrijfadres_ordermode,
   prs_bedrijfadres_certificate,
   prs_bedrijfadres_xsl,
   prs_fixed_attach,
   prs_send_flex
)
AS
   SELECT prs_bedrijf_key,
          DECODE (prs_bedrijfadres_type,
                  'C', 'Contracten',
                  'O', 'Opdrachten',
                  'B', 'Bestellingen',
                  'Anders?')
             TYPE,
          DECODE (
             prs_bedrijfadres_type,
             'O',
             COALESCE (t.mld_typeopdr_omschrijving,
                       'Geen/Overige opdrachten'),
             'N.v.t'
          )
             Opdrachttype,
          prs_bedrijfadres_url,
          prs_bedrijfadres_ordermode,
          prs_bedrijfadres_certificate,
          prs_bedrijfadres_xsl,
          prs_bedrijfadres_attachfile prs_fixed_attach,
          DECODE (
             prs_bedrijfadres_flexfiles,
             0,
             DECODE (
                (SELECT COALESCE (fac_setting_pvalue, fac_setting_default)
                   FROM fac_setting
                  WHERE LOWER (fac_setting_name) = 'puo_order_flexfiles'),
                0,
                'Nee',
                'Ja'
             ),
             1,
             'Ja',
             'Nee'
          )
             prs_send_flex
     FROM prs_bedrijfadres ba, mld_typeopdr t
    WHERE t.mld_typeopdr_key(+) = ba.mld_typeopdr_key;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_PRS_AFDELING
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_prs_afdeling
(
   prs_afdeling_parent_naam,
   prs_afdeling_naam,
   prs_afdeling_omschrijving,
   prs_kostenplaats_nr,
   prs_afdeling_verwijder,
   prs_bedrijf_naam,
   niveau
)
AS
   SELECT ap.prs_afdeling_naam,
          a.prs_afdeling_naam,
          a.prs_afdeling_omschrijving,
          k.prs_kostenplaats_nr,
          a.prs_afdeling_verwijder,
          prs_bedrijf_naam,
          niveau
     FROM prs_v_afdeling a,
          prs_kostenplaats k,
          prs_bedrijf b,
          prs_afdeling ap
    WHERE a.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
      AND a.prs_bedrijf_key = b.prs_bedrijf_key(+)
      AND a.prs_afdeling_parentkey = ap.prs_afdeling_key(+);

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_PRS_PERSOON
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_prs_perslid
(
   prs_perslid_key,
   prs_afdeling_naam,
   prs_perslid_naam,
   prs_perslid_tussenvoegsel,
   prs_perslid_voornaam,
   prs_perslid_full,
   prs_perslid_login,
   prs_perslid_nr,
   prs_perslid_telefoon,
   prs_perslid_email,
   prs_perslid_lastlogin,
   prs_perslid_aanmaak,
   prs_perslid_verwijder,
   prs_perslid_laatstgezien,
   prs_perslid_bezetdatum
)
AS
   SELECT   p.prs_perslid_key,
            a.prs_afdeling_naam,
            p.prs_perslid_naam,
            p.prs_perslid_tussenvoegsel,
            p.prs_perslid_voornaam,
            pf.prs_perslid_naam_full,
            p.prs_perslid_oslogin,
            p.prs_perslid_nr,
            p.prs_perslid_telefoonnr,
            p.prs_perslid_email,
            p.prs_perslid_login,
            p.prs_perslid_aanmaak,
            p.prs_perslid_verwijder,
            CASE
               WHEN (   p.alg_onroerendgoed_type = 'G'
                     OR p.alg_onroerendgoed_type = 'V'
                     OR p.alg_onroerendgoed_type = 'R')
               THEN
                  (SELECT   og.alg_gebouw_naam
                     FROM   alg_v_allonrgoed_gegevens og
                    WHERE   og.alg_onroerendgoed_keys =
                               p.alg_onroerendgoed_keys)
               WHEN (p.alg_onroerendgoed_type = 'L')
               THEN
                  (SELECT   alg_locatie_omschrijving
                     FROM   alg_locatie
                    WHERE   alg_locatie_key = alg_onroerendgoed_keys)
            END
               laatst_gezien,
            p.prs_perslid_bezetdatum
     FROM   prs_perslid p, prs_afdeling a, prs_v_perslid_fullnames_all pf
    WHERE   a.prs_afdeling_key = p.prs_afdeling_key
            AND p.prs_perslid_key = pf.prs_perslid_key;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_FAC_GROEPRECHTEN
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_fac_groeprechten
(
   prs_perslid_naam,
   prs_perslid_key,
   prs_perslid_login,
   fac_functie_code,
   fac_functie_omschrijving,
   fac_functie_module,
   ins_discipline_omschrijving,
   fac_groep_omschrijving,
   orgr,
   orgw,
   algr,
   algw
)
AS
   SELECT                                           -- GROEPEN MET DISCIPLINES
         p.prs_perslid_naam,
          gg.prs_perslid_key,
          p.prs_perslid_oslogin,
          f.fac_functie_code,
          f.fac_functie_omschrijving,
          f.fac_functie_module,
          (CASE
              WHEN ins_srtdiscipline_prefix IS NULL THEN ''
              ELSE ins_srtdiscipline_prefix || '-'
           END)
          || ins_discipline_omschrijving
             omschrijving,
          gr.fac_groep_omschrijving,
          g.fac_gebruiker_prs_level_read orgr,
          g.fac_gebruiker_prs_level_write orgw,
          g.fac_gebruiker_alg_level_read algr,
          g.fac_gebruiker_alg_level_write algw
     FROM fac_groeprechten g,
          fac_gebruikersgroep gg,
          prs_v_aanwezigperslid p,
          fac_functie f,
          ins_srtdiscipline isd,
          ins_tab_discipline a,
          fac_groep gr
    WHERE g.ins_discipline_key = a.ins_discipline_key
      AND g.fac_groep_key = gr.fac_groep_key
      AND p.prs_perslid_key = gg.prs_perslid_key
      AND gg.fac_groep_key = gr.fac_groep_key
      AND isd.ins_srtdiscipline_key(+) = a.ins_srtdiscipline_key
      AND f.fac_functie_key = g.fac_functie_key
      AND f.fac_functie_discipline = 1
      AND ins_discipline_verwijder IS NULL
   UNION ALL                                     -- GROEPEN ZONDER DISCIPLINES
   SELECT p.prs_perslid_naam,
          p.prs_perslid_key,
          p.prs_perslid_oslogin,
          f.fac_functie_code,
          f.fac_functie_omschrijving,
          f.fac_functie_module,
          NULL,
          gr.fac_groep_omschrijving,
          g.fac_gebruiker_prs_level_read orgr,
          g.fac_gebruiker_prs_level_write orgw,
          g.fac_gebruiker_alg_level_read algr,
          g.fac_gebruiker_alg_level_write algw
     FROM fac_groeprechten g,
          fac_functie f,
          fac_gebruikersgroep gg,
          prs_v_aanwezigperslid p,
          fac_groep gr
    WHERE fac_functie_module <> 'LAN'
      AND fac_functie_discipline = 0
      AND g.fac_functie_key = f.fac_functie_key
      AND g.fac_groep_key = gg.fac_groep_key
      AND gg.fac_groep_key = gr.fac_groep_key
      AND p.prs_perslid_key = gg.prs_perslid_key;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_PRS_KOSTENPLAATS
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_prs_kostenplaats
(
   prs_kostenplaats_nr,
   prs_kostenplaats_omschrijving,
   prs_kostenplaats_budgethouder,
   prs_kostenplaats_aanmaak,
   prs_kostenplaats_verwijder
)
AS
   SELECT k.prs_kostenplaats_nr,
          k.prs_kostenplaats_omschrijving,
          pf.prs_perslid_naam_full,
          k.prs_kostenplaats_aanmaak,
          k.prs_kostenplaats_verwijder
     FROM prs_kostenplaats k, prs_v_perslid_fullnames_all pf
    WHERE k.prs_perslid_key = pf.prs_perslid_key(+);

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_PRS_KOSTENSOORT
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_prs_kostensoort
(
   prs_kostensoort_code,
   prs_kostensoort_omschrijving,
   prs_kostensoort_fin_waarde,
   prs_kostensoortgroep,
   prs_kostensoort_aanmaak,
   prs_kostensoort_altcode
)
AS
   SELECT   k.prs_kostensoort_oms,
            k.prs_kostensoort_opmerking,
            k.prs_kostensoort_refcode,
            (SELECT   prs_kostensoortgrp_oms
               FROM   prs_kostensoortgrp ksg
              WHERE   ksg.prs_kostensoortgrp_key = k.prs_kostensoortgrp_key),
            k.prs_kostensoort_aanmaak,
            k.prs_kostensoort_altcode
     FROM   prs_kostensoort k;


-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_PRS_KENMERK_PRS
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_kenmerk_prs
(
   prs_link_key,
   prs_kenmerk_niveau,
   prs_kenmerk_omschrijving,
   prs_kenmerk_waarde
)
AS
   SELECT prs_link_key,
          prs_kenmerk_niveau,
          prs_kenmerk_omschrijving,
          aaxx_get_kenmerkwaarde (k.prs_kenmerk_kenmerktype,
                                  k.fac_kenmerkdomein_key,
                                  kl.prs_kenmerklink_waarde)
     FROM prs_kenmerklink kl, prs_kenmerk k
    WHERE kl.prs_kenmerk_key = k.prs_kenmerk_key;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_CNT_ALGEMEEN
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_cnt_contract
(
   internnr,
   externnr,
   mantelcontract_key,
   beschrijving,
   contractsoort,
   typecontract,
   versie,
   status,
   ingangsdatum,
   rappeldatum,
   opzegdatum,
   einddatum,
   aanmaakdatum,
   verwijderdatum,
   eigenaar,
   beheerder,
   uitvoerder,
   kostenplaats,
   termijnbedrag,
   contractbedrag,
   volgnummer,
   locatie_code,
   gebouw_code,
   gebouw_kosten,
   gebouw_gefactureerd,
   gebouw_gefactureerd_incl,
   gebouw_gefactureerdverwerkt
)
AS
   SELECT    cnt_contract_nummer_intern
          || '.'
          || COALESCE (cnt_contract_versie, '0'),
          cnt_contract_nummer,
          cnt_contract_mantel_key,
          cnt_contract_omschrijving,
          d.ins_discipline_omschrijving,
          tc.cnt_typecontract_omschrijving,
          COALESCE (c.cnt_contract_versie, '0'),
          DECODE (c.cnt_contract_status, '1', 'Gesloten', 'Open'),
          cnt_contract_looptijd_van,
          cnt.cnt_getrappeldatum (c.cnt_contract_key),
          cnt.cnt_getopzegdatum (c.cnt_contract_key),
          c.cnt_contract_looptijd_tot,
          c.cnt_contract_aanmaak,
          c.cnt_contract_verwijder,
          a.prs_afdeling_naam,
          prs_perslid_naam_full,
          prs_bedrijf_naam,
          kp.prs_kostenplaats_nr,
          coalesce (cnt_contract_termijnkosten, 0),
          cnt_contract_kosten,
          aaxx_get_cnt_cont_plaats_index (cp.cnt_contract_plaats_key),
          alg_locatie_code,
          g.alg_gebouw_code,
          ROUND (
             DECODE (
                cnt_gew.cnt_contract_plaats_gewicht,
                0,
                0,
                COALESCE (
                   (cp.cnt_contract_plaats_gewicht
                    / cnt_gew.cnt_contract_plaats_gewicht)
                   * c.cnt_contract_kosten,
                   0)),
             2),
          ROUND (
             COALESCE (
                DECODE (
                   cnt_gew.cnt_contract_plaats_gewicht,
                   0,
                   1,
                   (cp.cnt_contract_plaats_gewicht
                    / cnt_gew.cnt_contract_plaats_gewicht))
                * fin.fin_factuur_totaal,
                0),
             2) gg,
          ROUND (
             COALESCE (
                DECODE (
                   cnt_gew.cnt_contract_plaats_gewicht,
                   0,
                   1,
                   (cp.cnt_contract_plaats_gewicht
                    / cnt_gew.cnt_contract_plaats_gewicht))
                * (fin.fin_factuur_totaal + fin.fin_factuur_totaal_incl),
                0),
             2) ggib,
          ROUND (
             COALESCE (
                DECODE (
                   cnt_gew.cnt_contract_plaats_gewicht,
                   0,
                   1,
                   (cp.cnt_contract_plaats_gewicht
                    / cnt_gew.cnt_contract_plaats_gewicht))
                * finv.fin_factuur_totaal,
                0),
             2)
     FROM cnt_contract c,
          cnt_discipline d,
          cnt_disc_params cd,
          cnt_typecontract tc,
          (SELECT cnt_contract_plaats_gewicht,
                  cnt_contract_plaats_key,
                  cnt_contract_key,
                  cnt_alg_plaats_key,
                  cnt_alg_plaats_code
             FROM cnt_contract_plaats
            WHERE cnt_contract_plaats_verwijder IS NULL) cp,
          prs_bedrijf b,
          prs_kostensoort k,
          prs_kostenplaats kp,
          prs_afdeling a,
          prs_v_perslid_fullnames_all pf,
          alg_locatie l,
          alg_gebouw g,
          (  SELECT cnt_contract_key,
                    SUM (fin_factuurregel_totaal) fin_factuur_totaal, SUM(fin_factuurregel_btw) fin_factuur_totaal_incl
               FROM aaxx_v_aanwezigfactuur f, fin_factuurregel fr
              WHERE f.fin_factuur_key = fr.fin_factuur_key
           GROUP BY cnt_contract_key) fin,
          (  SELECT cnt_contract_key,
                    SUM (fin_factuurregel_totaal) fin_factuur_totaal
               FROM aaxx_v_aanwezigfactuur f, fin_factuurregel fr
              WHERE f.fin_factuur_key = fr.fin_factuur_key
                AND f.fin_factuur_statuses_key = 7  -- verwerkt
           GROUP BY cnt_contract_key) finv,
          (  SELECT cnt_contract_key,
                    SUM (cnt_contract_plaats_gewicht)
                       cnt_contract_plaats_gewicht
               FROM cnt_contract_plaats
              WHERE cnt_contract_plaats_verwijder IS NULL
           GROUP BY cnt_contract_key) cnt_gew,
          (SELECT cp.cnt_contract_plaats_key, alg_locatie_key, alg_gebouw_key
             FROM alg_v_allonroerendgoed aog, cnt_contract_plaats cp
            WHERE aog.alg_type = cp.cnt_alg_plaats_code
              AND aog.alg_onroerendgoed_keys = cp.cnt_alg_plaats_key) cog
    WHERE c.cnt_contract_key = cp.cnt_contract_key(+)
      AND c.cnt_contract_key = cnt_gew.cnt_contract_key(+)
      AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
      AND c.ins_discipline_key = d.ins_discipline_key
      AND d.ins_discipline_key = cd.cnt_ins_discipline_key
      AND cd.cnt_srtcontract_type = tc.cnt_typecontract_key
      AND cd.cnt_srtcontract_type <> 6                               -- Mantelcontracten worden (vooralsnog) uitgesloten AALB#28095
      AND d.prs_kostensoort_key = k.prs_kostensoort_key(+)
      AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
      AND c.prs_afdeling_key_eig = a.prs_afdeling_key
      AND c.prs_perslid_key_beh = pf.prs_perslid_key
      AND cp.cnt_contract_plaats_key = cog.cnt_contract_plaats_key(+)
      AND cog.alg_locatie_key = l.alg_locatie_key(+)
      AND cog.alg_gebouw_key = g.alg_gebouw_key(+)
      AND c.cnt_contract_key = fin.cnt_contract_key(+)
      AND c.cnt_contract_key = finv.cnt_contract_key(+);


CREATE OR REPLACE VIEW aaxx_v_dwh_cnt_contract_scope
(
   cnt_contract_plaats_key,
   cnt_contract_key,
   externnr,
   internnr,
   fin_factuur_key,
   gebouw_code,
   gebouw_bedrag,
   gebouw_gefactureerd_incl,
   gebouw_gefactureerdverwerkt
)
AS
   SELECT cp.cnt_contract_plaats_key,
          c.cnt_contract_key,
          cnt_contract_nummer externnr,
          cnt_contract_nummer_intern || '.' || COALESCE (cnt_contract_versie, '0') internnr,
          f.fin_factuur_key,
          gc.alg_gebouw_code,
          ROUND (
             cp.cnt_contract_plaats_gewicht
             / (SELECT DECODE (SUM (cp2.cnt_contract_plaats_gewicht),
                               0, 1,
                               SUM (cp2.cnt_contract_plaats_gewicht))
                  FROM cnt_contract_plaats cp2
                 WHERE cp2.cnt_contract_key = cp.cnt_contract_key)
             * fin_factuurregel_totaal,
             4)
             gebouw_bedrag,
          ROUND (
             COALESCE (
                DECODE (cnt_gew.cnt_contract_plaats_gewicht,
                        0, 1,
                        (cp.cnt_contract_plaats_gewicht / cnt_gew.cnt_contract_plaats_gewicht))
                * (fin.fin_factuur_totaal + fin.fin_factuur_totaal_incl),
                0),
             4)
             gebouw_gefactureerd_incl,
          ROUND (
             COALESCE (
                DECODE (cnt_gew.cnt_contract_plaats_gewicht,
                        0, 1,
                        (cp.cnt_contract_plaats_gewicht / cnt_gew.cnt_contract_plaats_gewicht))
                * finv.fin_factuur_totaal,
                0),
             4)
             gebouw_gefactureerdverwerkt
     FROM fin_factuur f,
          fin_factuurregel fr,
          fin_btwtabelwaarde btw,
          cnt_contract c,
          (SELECT *
             FROM cnt_contract_plaats
            WHERE cnt_alg_plaats_code = 'G') cp,
          alg_gebouw gc,
          (  SELECT cnt_contract_key, SUM (cnt_contract_plaats_gewicht) cnt_contract_plaats_gewicht
               FROM cnt_contract_plaats
              WHERE cnt_contract_plaats_verwijder IS NULL
           GROUP BY cnt_contract_key) cnt_gew,
          (  SELECT cnt_contract_key, SUM (fin_factuurregel_totaal) fin_factuur_totaal
               FROM aaxx_v_aanwezigfactuur f, fin_factuurregel fr
              WHERE f.fin_factuur_key = fr.fin_factuur_key AND f.fin_factuur_statuses_key = 7 -- verwerkt
           GROUP BY cnt_contract_key) finv,
          (  SELECT cnt_contract_key,
                    SUM (fin_factuurregel_totaal) fin_factuur_totaal,
                    SUM (fin_factuurregel_btw) fin_factuur_totaal_incl
               FROM aaxx_v_aanwezigfactuur f, fin_factuurregel fr
              WHERE f.fin_factuur_key = fr.fin_factuur_key
           GROUP BY cnt_contract_key) fin
    WHERE f.fin_factuur_key = fr.fin_factuur_key
      AND f.cnt_contract_key = cp.cnt_contract_key
      AND f.cnt_contract_key = c.cnt_contract_key
      AND cp.cnt_alg_plaats_key = gc.alg_gebouw_key(+)
      AND f.cnt_contract_key = cnt_gew.cnt_contract_key
      AND f.cnt_contract_key = finv.cnt_contract_key(+)
      AND f.cnt_contract_key = fin.cnt_contract_key(+)
      AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key(+);


CREATE OR REPLACE VIEW aaxx_v_dwh_cnt_contract_mantel
(
   cnt_contract_key,
   internnr,
   externnr,
   beschrijving,
   contractsoort,
   typecontract,
   versie,
   status,
   ingangsdatum,
   rappeldatum,
   opzegdatum,
   einddatum,
   aanmaakdatum,
   verwijderdatum,
   eigenaar,
   beheerder,
   beheerder_key,
   uitvoerder,
   kostenplaats,
   termijnbedrag,
   contractbedrag,
   soort_overeenkomst,
   omvang_contractduur,
   commodity,
   omschrijving_optie_verlenging,
   tijdstip_facturatie,
   indexering_tijdens_periode,
   datum_van_indexering,
   kortingsafspraken,
   kortingsafspraak,
   opmerking_cm_bijzonderheden,
   contract_met_leverancier,
   contracteigenaar,
   indexeringsformule_afspraak,
   besparing,
   betalingsafspraak,
   betalingstermijn,
   link_contract,
   omvang_contract_pj,
   max_indexering,
   link_prijzenblad,
   pct_besparing_pj,
   rappeltermijn_indexering,
   link_overig
)
AS
   SELECT cnt_contract_key,
             cnt_contract_nummer_intern
          || '.'
          || COALESCE (cnt_contract_versie, '0'),
          cnt_contract_nummer,
          cnt_contract_omschrijving,
          d.ins_discipline_omschrijving,
          tc.cnt_typecontract_omschrijving,
          COALESCE (c.cnt_contract_versie, '0'),
          DECODE (c.cnt_contract_status, '1', 'Gesloten', 'Open'),
          cnt_contract_looptijd_van,
          cnt.cnt_getrappeldatum (c.cnt_contract_key),
          cnt.cnt_getopzegdatum (c.cnt_contract_key),
          c.cnt_contract_looptijd_tot,
          c.cnt_contract_aanmaak,
          c.cnt_contract_verwijder,
          a.prs_afdeling_naam,
          prs_perslid_naam_full,
          pf.prs_perslid_key,
          prs_bedrijf_naam,
          kp.prs_kostenplaats_nr,
          cnt_contract_termijnkosten,
          cnt_contract_kosten,
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'SOORT OVEREENKOMST'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'OMVANG CONTRACTDUUR'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'COMMODITY'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper =
                        'OMSCHRIJVING OPTIE CONTRACTVERLENGING'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'TIJDSTIP FACTURATIE'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper =
                        'INDEXERING TIJDENS CONTRACTPERIODE'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'DATUM VAN INDEXERING'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'KORTINGSAFSPRAKEN'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'KORTINGSAFSPRAAK'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'OPMERKING CM/ BIJZONDERHEDEN'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'CONTRACT MET LEVERANCIER'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'CONTRACTEIGENAAR'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper =
                        'INDEXERINGSFORMULE/ -AFSPRAAK'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'BESPARING'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'BETALINGSAFSPRAAK'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'BETALINGSTERMIJN'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'LINK CONTRACT'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'OMVANG CONTRACT P/J'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'MAX. INDEXERING'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'LINK PRIJZENBLAD'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = '% BESPARING P/J'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'RAPPELTERMIJN INDEXERING'),
             c.cnt_contract_key),
          aaxx_get_kenmerk (
             'CNT',
             (SELECT MAX (cnt_kenmerk_key)
                FROM cnt_kenmerk k, cnt_srtkenmerk sk
               WHERE k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
                 AND sk.cnt_srtkenmerk_upper = 'LINK OVERIG'),
             c.cnt_contract_key)
     FROM cnt_contract c,
          cnt_discipline d,
          cnt_disc_params cd,
          cnt_typecontract tc,
          prs_bedrijf b,
          prs_kostensoort k,
          prs_kostenplaats kp,
          prs_afdeling a,
          prs_v_perslid_fullnames_all pf
    WHERE c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
      AND c.ins_discipline_key = d.ins_discipline_key
      AND d.ins_discipline_key = cd.cnt_ins_discipline_key
      AND cd.cnt_srtcontract_type = tc.cnt_typecontract_key
      AND d.prs_kostensoort_key = k.prs_kostensoort_key(+)
      AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
      AND c.prs_afdeling_key_eig = a.prs_afdeling_key
      AND c.prs_perslid_key_beh = pf.prs_perslid_key
      AND tc.cnt_typecontract_key = 6;

CREATE OR REPLACE VIEW aaxx_v_dwh_kenmerk_contract
(
   CNT_CONTRACT_KEY,
   CNT_KENMERK_OMSCHRIJVING,
   CNT_KENMERK_WAARDE
)
AS
   SELECT   cnt_contract_key,
            sk.cnt_srtkenmerk_omschrijving,
            aaxx_get_kenmerkwaarde (sk.cnt_srtkenmerk_kenmerktype,
                                    sk.fac_kenmerkdomein_key,
                                    kc.cnt_kenmerkcontract_waarde)
     FROM   cnt_kenmerk k, cnt_srtkenmerk sk, cnt_kenmerkcontract kc
    WHERE   k.cnt_srtkenmerk_key = sk.cnt_srtkenmerk_key
            AND kc.cnt_kenmerk_key = k.cnt_kenmerk_key;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_FIN_FACTUUR
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_fin_factuur
(
   fin_factuur_key,
   fin_factuur_nr,
   fin_factuur_totaal_btw,
   opdr_id,
   contract_id,
   bestel_id,
   fin_factuur_datum,
   fin_factuur_boekmaand,
   fin_factuur_debiteur_nr,
   kostensoort,
   fin_factuur_datumfiat_ok,
   fin_factuur_datumfiat_nok,
   fin_factuur_fiat_user,
   fin_factuur_opmerking,
   fin_factuur_datum_export,
   fin_factuur_status,
   fin_factuur_aanmaak,
   fin_factuur_verwerkt,
   fin_factuur_verwijder,
   fin_factuur_badgeid,
   invoerder,
   invoerder_key,
   fin_factuurregel_nr,
   fin_factuurregel_totaal,
   fin_factuurregel_btw,
   fin_factuurregel_btw_perc,
   uplift,
   incl_uplift,
   fin_factuurregel_omschrijving,
   fin_factuurregel_referentie,
   fin_btwtabelwaarde_code,
   fin_btwtabelwaarde_oms
)
AS
   SELECT   f.fin_factuur_key,
            f.fin_factuur_nr,
            f.fin_factuur_totaal_btw,
            (SELECT   mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr
               FROM   mld_opdr
              WHERE   mld_opdr_key = f.mld_opdr_key),
            (SELECT      cc.cnt_contract_nummer_intern
                      || '.'
                      || COALESCE (cc.cnt_contract_versie, '0')
               FROM   cnt_contract cc
              WHERE   cc.cnt_contract_key = f.cnt_contract_key),
            (SELECT   bes_bestelopdr_id
               FROM   bes_bestelopdr
              WHERE   bes_bestelopdr_key = f.bes_bestelopdr_key),
            f.fin_factuur_datum,
            f.fin_factuur_boekmaand,
            f.fin_factuur_debiteur_nr,
            (SELECT   prs_kostensoort_oms
               FROM   prs_kostensoort
              WHERE   prs_kostensoort_key = f.prs_kostensoort_key),
            fac.gettrackingdate ('FINFOK', f.fin_factuur_key),
            fac.gettrackingdate ('FINFNO', f.fin_factuur_key),
            (SELECT   prs_perslid_naam_full
               FROM   prs_v_perslid_fullnames_all pf
              WHERE   pf.prs_perslid_key =
                         fac.gettrackinguserkey ('FINFOK', f.fin_factuur_key)),
            f.fin_factuur_opmerking,
            fac.gettrackingdate ('FINVER', f.fin_factuur_key),
            (SELECT   fin_factuur_statuses_omschr
               FROM   fin_factuur_statuses s
              WHERE   s.fin_factuur_statuses_key = f.fin_factuur_statuses_key),
            COALESCE (fac.gettrackingdate ('FINNEW', f.fin_factuur_key),
                      fin_factuur_datum),
            fac.gettrackingdate ('FINVER', f.fin_factuur_key),
            fin_factuur_verwijder,
            TO_CHAR (fac.gettrackingdate ('FINVER', f.fin_factuur_key),
                     'yyyymmdd'),
            fac.gettrackinguserkey ('FINNEW', f.fin_factuur_key) invoerder,
            (SELECT   prs_perslid_naam_full
               FROM   prs_v_perslid_fullnames_all pf
              WHERE   pf.prs_perslid_key =
                         fac.gettrackinguserkey ('FINNEW', f.fin_factuur_key))
               invoerder_key,
            fr.fin_factuurregel_nr,
            fr.fin_factuurregel_totaal,
            ROUND (fr.fin_factuurregel_btw, 2),
            btw.fin_btwtabelwaarde_perc,
            uplift,
            uplift * fr.fin_factuurregel_totaal,
            fr.fin_factuurregel_omschrijving,
            fr.fin_factuurregel_referentie,
            btw.fin_btwtabelwaarde_code,
            btw.fin_btwtabelwaarde_oms
     FROM   fin_factuur f,
            fin_factuurregel fr,
            fin_btwtabelwaarde btw,
            (SELECT   f2.fin_factuur_key, uplift
               FROM   aaxx_imp_uplift u,
                      prs_bedrijf b,
                      prs_kostensoort ks,
                      fin_factuur f2,
                      mld_opdr o,
                      cnt_contract c
              WHERE       u.prs_leverancier_nr = b.prs_leverancier_nr
                      AND f2.mld_opdr_key = o.mld_opdr_key(+)
                      AND f2.cnt_contract_key = c.cnt_contract_key(+)
                      AND COALESCE (o.mld_uitvoerende_keys,
                                    c.cnt_prs_bedrijf_key) =
                            b.prs_bedrijf_key
                      AND UPPER (u.prs_kostensoort_oms) =
                            ks.prs_kostensoort_upper
                      AND f2.prs_kostensoort_key = ks.prs_kostensoort_key
                      AND soort_order =
                            DECODE (o.mld_opdr_key, NULL, 'CO', 'WO')
                      AND f2.fin_factuur_boekmaand =
                            u.jaar || '-' || LTRIM (TO_CHAR (u.maand, '00')))
            UP
    WHERE       f.fin_factuur_key = fr.fin_factuur_key
            AND f.fin_factuur_key = UP.fin_factuur_key(+)
            AND fr.fin_btwtabelwaarde_key = btw.fin_btwtabelwaarde_key(+);

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_MLD_ALGEMEEN
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_mld_melding
(
   mld_melding_key,
   meldingnummer,
   meldbron,
   mld_melding_start_key,
   alg_district_omschrijving,
   locatie,
   locatie_omschrijving,
   alg_locatie_key,
   onrgoed_key,
   gebouw,
   gebouw_naam,
   gebouw_key,
   verdieping,
   verdieping_key,
   ruimtenr,
   ruimte_omschrijving,
   ruimte_key,
   melding_ordernr,
   kostensoortgroep,
   kostensoort,
   kostenplaats,
   kostenplaats_oms,
   melder,
   prs_perslid_key,
   afdeling,
   afdeling_omschrijving,
   prs_bedrijf_key,
   invoerder,
   invoerder_key,
   behandelaar,
   behandelaar_key,
   soortmelding,
   ins_discipline_key,
   ins_srtdiscipline_prefix,
   productgroep,
   subproductgroep,
   subproductgroepgroep,
   status,
   sla_werkdgn,
   plan_uitvoertijd,
   datum,
   plan_einddatum,
   prioriteit,
   ingezien,
   geaccepteerd,
   afgemeld,
   verwerkt,                                                          -- nieuw
   doorlooptijd_werkdgn,
   acceptoptijd,
   uitvoeringoptijd_sla,
   uitvoeringoptijd_afspraak,
   omschrijving,
   opmerking,
   mld_melding_parentkey,
   tevredenheid,
   tevredenheid_opm,
   object_omschrijving,
   geplande_actie,
   opdracht_key,
   opdracht_volgnummer,
   opdracht_type,
   opdracht_status,
   opdracht_duur_gepland,
   opdracht_datum,
   opdracht_einddatum,
   opdracht_plandatum,
   opdracht_verzonden,
   opdracht_geaccepteerd,
   opdracht_afgemeld,
   opdracht_verwerkt,                                                 -- nieuw
   opdracht_doorlooptijd,
   opdracht_omschrijving,
   opdracht_opmerking,
   opdracht_uitvoerende,
   opdracht_contract,
   opdracht_behandelaar,
   opdracht_behandelaar_key,
   opdracht_uren,
   opdracht_uren_besteed,
   opdracht_correctie,
   opdracht_materiaal,
   opdracht_uurtarief,
   opdracht_kosten,
   opdracht_kostenplaats,
   opdracht_kostenplaats_oms
)
AS
   SELECT   m.mld_melding_key,
            TO_CHAR (m.mld_melding_key) meldingnummer,
            mld_meldbron_omschrijving meldbron,
            m.mld_melding_start_key,
            alg_district_omschrijving,
            alg_locatie_code locatie,
            alg_locatie_omschrijving locatie_omschrijving,
            l.alg_locatie_key,
            m.mld_alg_onroerendgoed_keys,
            og.alg_gebouw_code gebouw,
            og.alg_gebouw_naam gebouw_naam,
            og.alg_gebouw_key,
            og.alg_verdieping_code verdieping,
            og.alg_verdieping_key,
            og.alg_ruimte_nr ruimte,
            og.alg_ruimte_omschrijving ruimte_omschrijving,
            og.alg_ruimte_key,
            m.mld_melding_ordernr melding_ordernr,
            (SELECT   ksg.prs_kostensoortgrp_oms
               FROM   prs_kostensoortgrp ksg, prs_kostensoort ks
              WHERE   ksg.prs_kostensoortgrp_key = ks.prs_kostensoortgrp_key
                      AND ks.prs_kostensoort_key =
                            (SELECT   COALESCE (sm.prs_kostensoort_key,
                                                disc.prs_kostensoort_key)
                               FROM   mld_stdmelding sm, mld_discipline disc
                              WHERE   sm.mld_ins_discipline_key =
                                         disc.ins_discipline_key
                                      AND sm.mld_stdmelding_key =
                                            s.mld_stdmelding_key))
               kostensoortgroep,
            (SELECT   ks.prs_kostensoort_oms
               FROM   prs_kostensoort ks
              WHERE   ks.prs_kostensoort_key =
                         (SELECT   COALESCE (sm.prs_kostensoort_key,
                                             disc.prs_kostensoort_key)
                            FROM   mld_stdmelding sm, mld_discipline disc
                           WHERE   sm.mld_ins_discipline_key =
                                      disc.ins_discipline_key
                                   AND sm.mld_stdmelding_key =
                                         s.mld_stdmelding_key))
               kostensoort,
            (SELECT   k.prs_kostenplaats_nr
               FROM   prs_kostenplaats k
              WHERE   k.prs_kostenplaats_key = m.prs_kostenplaats_key)
               kostenplaats,
            (SELECT   k.prs_kostenplaats_omschrijving
               FROM   prs_kostenplaats k
              WHERE   k.prs_kostenplaats_key = m.prs_kostenplaats_key)
               kostenplaats_oms,
            (SELECT   prs_perslid_naam_full
               FROM   prs_v_perslid_fullnames_all pf
              WHERE   pf.prs_perslid_key = m.prs_perslid_key)
               melder,
            m.prs_perslid_key,
            (SELECT   prs_afdeling_naam
               FROM   prs_afdeling afd, prs_perslid pp
              WHERE   afd.prs_afdeling_key = pp.prs_afdeling_key
                      AND pp.prs_perslid_key = m.prs_perslid_key)
               afdeling,
            (SELECT   prs_afdeling_omschrijving
               FROM   prs_afdeling afd, prs_perslid pp
              WHERE   afd.prs_afdeling_key = pp.prs_afdeling_key
                      AND pp.prs_perslid_key = m.prs_perslid_key)
               afdeling_omschrijving,
            (SELECT   prs_bedrijf_key
               FROM   prs_v_afdeling pva, prs_perslid pp
              WHERE   pva.prs_afdeling_key = pp.prs_afdeling_key
                      AND pp.prs_perslid_key = m.prs_perslid_key)
               prs_bedrijf_key,
            (SELECT   prs_perslid_naam_full
               FROM   prs_v_perslid_fullnames_all pf
              WHERE   pf.prs_perslid_key =
                         mld.getmeldinguser (m.mld_melding_key))
               invoerder,
            fac.gettrackinguserkey ('MLDNEW', m.mld_melding_key),
            (SELECT   prs_perslid_naam_full
               FROM   prs_v_perslid_fullnames_all
              WHERE   prs_perslid_key = m.mld_melding_behandelaar_key),
            m.mld_melding_behandelaar_key,
            sd.ins_srtdiscipline_omschrijving soortmelding,
            md.ins_discipline_key ins_discipline_key,
            ins_srtdiscipline_prefix ins_srtdiscipline_prefix,
            md.ins_discipline_omschrijving productgroep,
            s.mld_stdmelding_omschrijving subproductgroep,
            (SELECT   smg.mld_stdmeldinggroep_naam
               FROM   mld_stdmeldinggroep smg
              WHERE   smg.mld_stdmeldinggroep_key = s.mld_stdmeldinggroep_key)
               subproductgroepgroep,
            (SELECT   DECODE (
                         COALESCE (par.mld_melding_status,
                                   m.mld_melding_status),
                         4,
                         DECODE (o.mld_opdr_key,
                                 NULL, mld_statuses_omschrijving,
                                 'Niet opgelost'),
                         mld_statuses_omschrijving
                      )
               FROM   mld_statuses sta
              WHERE   sta.mld_statuses_key =
                         COALESCE (par.mld_melding_status,
                                   m.mld_melding_status))
               status,
            COALESCE (
               par.sla_werkdgn,
               aaxx.count_work_days (m.mld_melding_datum,
                                     m.mld_melding_einddatum)
            )
               sla_werkdgn,
            COALESCE (
               par.plan_uitvoertijd,
               DECODE (m.mld_melding_t_uitvoertijd.eenheid,
                       'U', TO_NUMBER (NULL),
                       m.mld_melding_t_uitvoertijd.tijdsduur)
            )
               plan_uitvoertijd,              -- Altijd in dagen; anders NULL!
            COALESCE (par.mld_melding_datum, m.mld_melding_datum) datum,
            COALESCE (par.mld_melding_einddatum, m.mld_melding_einddatum)
               plan_einddatum,
            DECODE(mld_melding_spoed, 1, 'Kritiek', 2, 'Hoog', 3, 'Normaal', 4, 'Laag', 'Onbekend') prioritieit,
            mld.getmeldingstatusdate (m.mld_melding_key, 3) ingezien,
            mld.getmeldingstatusdate (m.mld_melding_key, 4) geaccepteerd,
            COALESCE (mld.getmeldingstatusdate (m.mld_melding_key, 5),
                      mld.getmeldingstatusdate (m.mld_melding_key, 1))
               afgemeld,
            fac.gettrackingdate ('MLDVER', m.mld_melding_key) verwerkt,
            aaxx.count_work_days_incltime (
               m.mld_melding_datum,
               COALESCE (mld.getmeldingstatusdate (m.mld_melding_key, 5),
                         mld.getmeldingstatusdate (m.mld_melding_key, 1),
                         SYSDATE)
            )
               doorlooptijd_werkdgn,
            CASE
               WHEN mld_melding_acceptdatum_std <
                       COALESCE (
                          fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                          COALESCE (
                             fac.gettrackingdate ('MLDACP',
                                                  m.mld_melding_key),
                             SYSDATE
                          )
                       )
               THEN
                  0
               ELSE
                  1
            END
               acceptoptijd,
            CASE
               WHEN s.mld_stdmelding_slabewaken = 0
                    OR m.mld_melding_indult = 1
               THEN
                  NULL
               WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NOT NULL
               THEN
                  1
               ELSE
                  CASE
                     -- vooralsnog             WHEN mld.getactualuitvoer(m.mld_melding_key).tijdsduur <
                     -- te traag                          m.mld_melding_t_uitvoertijd.tijdsduur + m.mld_melding_t_respijt.tijdsduur
                  WHEN m.mld_melding_einddatum_std >
                          COALESCE (
                             fac.gettrackingdate ('MLDAFM',
                                                  m.mld_melding_key),
                             SYSDATE
                          )
                     THEN
                        1
                     ELSE
                        0
                  END
            END
               uitvoeringoptijd_sla,
            CASE
               WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NOT NULL
               THEN
                  1
               ELSE
                  CASE
                     WHEN m.mld_melding_einddatum >
                             COALESCE (
                                fac.gettrackingdate ('MLDAFM',
                                                     m.mld_melding_key),
                                SYSDATE
                             )
                     THEN
                        1
                     ELSE
                        0
                  END
            END
               uitvoeringoptijd_afspraak,
            m.mld_melding_omschrijving omschrijving,
            m.mld_melding_opmerking opmerking,
            m.mld_melding_parentkey,
            m.mld_melding_satisfaction,
            m.mld_melding_satisfaction_op,
            (SELECT   MAX (ins_deel_omschrijving)
               FROM   ins_deel id, mld_melding_object mo
              WHERE   mo.mld_melding_key = m.mld_melding_key
                      AND mo.ins_deel_key = id.ins_deel_key)
               object_omschrijving,
            DECODE (
               INSTR (mld_melding_opmerking, 'Automatisch gegenereerd door'),
               1,
               'yes',
               'no')
               geplande_actie,
            o.mld_opdr_key,
            o.mld_opdr_bedrijfopdr_volgnr opdracht_volgnummer,
            (SELECT   mld_typeopdr_omschrijving
               FROM   mld_typeopdr t
              WHERE   o.mld_typeopdr_key = t.mld_typeopdr_key)
               opdracht_type,
            (SELECT   REPLACE (mld_statusopdr_omschrijving,
                               'Uitgegeven',
                               'Toegekend')
                         mld_statusopdr_omschrijving
               FROM   mld_statusopdr sta
              WHERE   sta.mld_statusopdr_key = o.mld_statusopdr_key)
               opdracht_status,
            aaxx.count_work_days (o.mld_opdr_datumbegin,
                                  o.mld_opdr_einddatum)
               opdracht_duur_gepland,
            o.mld_opdr_datumbegin opdracht_datum,
            o.mld_opdr_einddatum opdracht_einddatum,
            o.mld_opdr_plandatum opdracht_plandatum,
            o.mld_opdr_verzonden opdracht_verzonden,
            fac.gettrackingdate ('ORDACP', o.mld_opdr_key)
               opdracht_geaccepteerd,
            mld.getopdrachtstatusdate (o.mld_opdr_key, 6) opdracht_afgemeld,
            fac.gettrackingdate ('ORDVER', mld_opdr_key) opdracht_verwerkt,
            aaxx.count_work_days (
               o.mld_opdr_datumbegin,
               mld.getopdrachtstatusdate (o.mld_opdr_key, 6)
            )
               opdracht_doorlooptijd,
            o.mld_opdr_omschrijving opdracht_omschrijving,
            o.mld_opdr_opmerking opdracht_opmerking,
            (SELECT   naam
               FROM   mld_v_uitvoerende u
              WHERE   u.mld_uitvoerende_key = o.mld_uitvoerende_keys)
               opdracht_uitvoerende,
            NULL opdracht_contract,
            (SELECT   prs_perslid_naam_full
               FROM   prs_v_perslid_fullnames_all
              WHERE   prs_perslid_key = o.prs_perslid_key)
               behandelaar,
            o.prs_perslid_key opdracht_contactpersoon,
            DECODE (mld_statusopdr_key, 1, 0, 2, 0, -- afgewezen, niet akkoord
                                                   o.mld_opdr_uren)
               opdracht_uren,
            (SELECT   COUNT (mld_opdr_uren_besteed)
               FROM   mld_opdr_uren ou
              WHERE   ou.mld_opdr_key = o.mld_opdr_key
                      AND mld_opdr_uren_status IN (3,           -- goedgekeurd
                                                     4)            -- verwerkt
                                                       )
               uren_besteed,
            DECODE (
               mld_statusopdr_key,
               1,
               0,
               2,
               0,
                 o.mld_opdr_kosten
               - o.mld_opdr_materiaal
               - (o.mld_opdr_uren * o.mld_opdr_uurloon)
            )
               opdracht_correctie,
            DECODE (mld_statusopdr_key, 1, 0, 2, 0, o.mld_opdr_materiaal)
               opdracht_materiaal,
            DECODE (mld_statusopdr_key, 1, 0, 2, 0, o.mld_opdr_uurloon)
               opdracht_uurtarief,
            DECODE (mld_statusopdr_key, 1, 0, 2, 0, o.mld_opdr_kosten)
               opdracht_kosten,
            (SELECT   k.prs_kostenplaats_nr
               FROM   prs_kostenplaats k
              WHERE   k.prs_kostenplaats_key = o.prs_kostenplaats_key)
               opdracht_kostenplaats,
            (SELECT   k.prs_kostenplaats_omschrijving
               FROM   prs_kostenplaats k
              WHERE   k.prs_kostenplaats_key = o.prs_kostenplaats_key)
               opdracht_kostenplaats_oms
     FROM   mld_melding m,
            mld_meldbron mb,
            mld_stdmelding s,
            alg_locatie l,
            alg_district d,
            alg_v_allonrgoed_gegevens og,
            mld_discipline md,
            ins_srtdiscipline sd,
            mld_opdr o,
            (SELECT   mld_melding_key,
                      mld_melding_status,
                      mld_melding_datum,
                      mld_melding_einddatum,
                      aaxx.count_work_days (m.mld_melding_datum,
                                            m.mld_melding_einddatum)
                         sla_werkdgn,
                      DECODE (m.mld_melding_t_uitvoertijd.eenheid,
                              'U', TO_NUMBER (NULL),
                              m.mld_melding_t_uitvoertijd.tijdsduur)
                         plan_uitvoertijd
               FROM   mld_melding m
              WHERE   mld_melding_key IN
                            (SELECT   mld_melding_parentkey
                               FROM   mld_melding
                              WHERE   mld_melding_parentkey IS NOT NULL)) par
    WHERE       s.mld_stdmelding_key = m.mld_stdmelding_key
            AND m.mld_meldbron_key = mb.mld_meldbron_key
            AND m.fac_activiteit_key IS NULL
            AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
            AND sd.ins_srtdiscipline_key = md.ins_srtdiscipline_key
            AND md.ins_discipline_key = s.mld_ins_discipline_key
            AND l.alg_district_key = d.alg_district_key(+)
            AND m.mld_alg_onroerendgoed_keys = og.alg_onroerendgoed_keys(+)
            AND m.mld_melding_key = o.mld_melding_key(+)
            AND m.mld_melding_parentkey = par.mld_melding_key(+)
   UNION ALL
   SELECT   cnt_contract_key,
               cnt_contract_nummer_intern
            || '.'
            || COALESCE (cnt_contract_versie, '0'),
            TO_CHAR (NULL),
            TO_NUMBER (NULL),
            TO_CHAR (NULL),
            TO_CHAR (NULL),
            TO_CHAR (NULL),
            TO_NUMBER (NULL),
            TO_NUMBER (NULL),
            TO_CHAR (NULL),
            TO_CHAR (NULL),
            TO_NUMBER (NULL),
            TO_CHAR (NULL),
            TO_NUMBER (NULL),
            TO_CHAR (NULL),
            TO_CHAR (NULL),
            TO_NUMBER (NULL),
            TO_CHAR (NULL),
            kg.prs_kostensoortgrp_oms,
            prs_kostensoort_oms,
            kp.prs_kostenplaats_nr,
            prs_kostenplaats_omschrijving,
            prs_perslid_naam_full,
            c.prs_perslid_key_beh,
            prs_afdeling_naam,
            prs_afdeling_omschrijving,
            a.prs_bedrijf_key,
            TO_CHAR (NULL),
            TO_NUMBER (NULL),
            TO_CHAR (NULL),
            TO_NUMBER (NULL),
            'Contract',
            c.ins_discipline_key,
            'C',
            d.ins_discipline_omschrijving,
            TO_CHAR (NULL),
            TO_CHAR (NULL),
            DECODE (SIGN (cnt_contract_looptijd_van - SYSDATE),
                    1,
                    'Toekomst',
                    -1,
                    DECODE (SIGN (cnt_contract_looptijd_tot - SYSDATE),
                            1,
                            'Actueel',
                            -1,
                            'Verlopen')),
            TO_NUMBER (NULL),
            TO_NUMBER (NULL),                 -- Altijd in dagen; anders NULL!
            TO_DATE (NULL),
            TO_DATE (NULL),
            TO_CHAR (NULL),                                      -- prioriteit
            TO_DATE (NULL),
            TO_DATE (NULL),
            TO_DATE (NULL),
            TO_DATE (NULL),                                  -- datum verwerkt
            TO_NUMBER (NULL),
            TO_NUMBER (NULL),                                 --  acceptoptijd
            TO_NUMBER (NULL),                         --  uitvoeringoptijd_sla
            TO_NUMBER (NULL),                    --  uitvoeringoptijd_afspraak
            c.cnt_contract_document,
            TO_CHAR (NULL),
            TO_NUMBER (NULL),
            TO_NUMBER (NULL),                                  -- tevredenheid
            TO_CHAR (NULL),                       -- Opmering bij tevredenheid
            TO_CHAR (NULL),                             -- object omschrijving
            TO_CHAR (NULL),                                  -- geplande actie
            TO_NUMBER (NULL),
            1,
            'Contract Order',
            DECODE (SIGN (cnt_contract_looptijd_tot - SYSDATE),
                    1,
                    'Uitgegeven',
                    -1,
                    'Afgemeld'),
            TO_NUMBER (NULL),
            TO_DATE (NULL),
            TO_DATE (NULL),
            TO_DATE (NULL),
            TO_DATE (NULL),
            TO_DATE (NULL),
            TO_DATE (NULL),
            TO_DATE (NULL),                               -- opdracht verwerkt
            TO_NUMBER (NULL),
            TO_CHAR (NULL),
            TO_CHAR (NULL),
            b.prs_bedrijf_naam,
            TO_NUMBER (NULL),
            TO_CHAR (NULL),
            TO_NUMBER (NULL),
            TO_NUMBER (NULL),
            TO_NUMBER (NULL),
            TO_NUMBER (NULL),
            TO_NUMBER (NULL),
            TO_NUMBER (NULL),
            c.cnt_contract_kosten,
            kp.prs_kostenplaats_nr,
            prs_kostenplaats_omschrijving
     FROM   cnt_contract c,
            cnt_disc_params cd,
            ins_tab_discipline d,
            prs_kostensoort ks,
            prs_kostensoortgrp kg,
            prs_kostenplaats kp,
            prs_v_perslid_fullnames_all pf,
            prs_v_afdeling a,
            prs_bedrijf b
    WHERE       c.ins_discipline_key = d.ins_discipline_key
            AND d.ins_discipline_key = cd.cnt_ins_discipline_key
            AND cd.cnt_srtcontract_type <> 6 -- Mantelcontracten worden (vooralsnog) uitgesloten AALB#28095
            AND d.prs_kostensoort_key = ks.prs_kostensoort_key(+)
            AND ks.prs_kostensoortgrp_key = kg.prs_kostensoortgrp_key(+)
            AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
            AND c.prs_perslid_key_beh = pf.prs_perslid_key
            AND c.prs_afdeling_key_eig = a.prs_afdeling_key(+)
            AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
            AND c.cnt_contract_verwijder IS NULL
   UNION ALL
   SELECT   bes_bestelling_key,
            TO_CHAR (bestelaanvraagnr),
            TO_CHAR (NULL),
            TO_NUMBER (NULL),
            alg_district_omschrijving,
            alg_locatie_code,
            alg_locatie_omschrijving,
            alg_locatie_key,
            alg_gebouw_key,
            alg_gebouw_code,
            alg_gebouw_naam,
            alg_gebouw_key,
            TO_CHAR (NULL),                                      -- verdieping
            TO_NUMBER (NULL),
            TO_CHAR (NULL),                                       -- ruimte_nr
            TO_CHAR (NULL),                             -- ruimte_omschrijving
            TO_NUMBER (NULL),
            bes_bestelling_ordernr,
            kostensoortgroep,
            kostensoort,
            kpn,
            kpn_omschrijving,
            besteller,
            prs_perslid_key_best,
            afdeling_code,
            afdeling_omschrijving,
            prs_bedrijf_key,
            invoerder,
            invoerder_key,
            TO_CHAR (NULL),                         -- Naam van de behandelaar
            TO_NUMBER (NULL),                        -- Key van de behandelaar
            'Bestelling',
            ins_discipline_key,
            'BE',
            ins_discipline_omschrijving,
            TO_CHAR (NULL),                                      -- stdmelding
            kostensoortgroep,
            status,
            sla_tijd,
            sla_tijd,                         -- Altijd in dagen; anders NULL!
            besteldatum,
            TO_DATE (NULL),
            TO_CHAR (NULL),                                      -- prioriteit
            TO_DATE (NULL),                                  -- datum ingezien
            acceptatie_datum,
            ontvangen_datum,
            TO_DATE (NULL),                                  -- datum verwerkt
            doorlooptijd_werkdgn,
            TO_NUMBER (NULL),                                 --  acceptoptijd
            TO_NUMBER (NULL),                         --  uitvoeringoptijd_sla
            TO_NUMBER (NULL),                    --  uitvoeringoptijd_afspraak
            omschrijving,
            TO_CHAR (NULL),                                       -- opmerking
            TO_NUMBER (NULL),
            bes_bestelling_satisfaction,                       -- tevredenheid
            bes_bestelling_satisfaction_op,      -- opmerking bij tevredenheid
            TO_CHAR (NULL),                             -- object omschrijving
            TO_CHAR (NULL),                                  -- geplande actie
            bes_bestelopdr_key,
            opdr_volgnr,
            'Purchase Order',
            opdr_status,
            DECODE (opdr_volgnr, NULL, TO_NUMBER (NULL), sla_tijd),
            opdr_datum,                                          -- opdr datum
            TO_DATE (NULL),                                  -- opdr_einddatum
            TO_DATE (NULL),                                  -- opdr plandatum
            verzonden_datum,
            TO_DATE (NULL),                               -- opdr geaccepteerd
            opdr_ontv_datum,
            TO_DATE (NULL),                         -- datum opdracht verwerkt
            DECODE (opdr_volgnr,
                    NULL, TO_NUMBER (NULL),
                    doorlooptijd_werkdgn),
            opdr_omschrijving,
            bes_bestelopdr_opmerking,
            leverancier,
            TO_NUMBER (NULL),                                      -- contract
            TO_CHAR (NULL),                                     -- behandelaar
            TO_NUMBER (NULL),                               -- behandelaar_key
            TO_NUMBER (NULL),                                          -- uren
            TO_NUMBER (NULL),                                  -- uren_besteed
            TO_NUMBER (NULL),                                     -- correctie
            TO_NUMBER (NULL),                                     -- materiaal
            TO_NUMBER (NULL),                                     -- uurtarief
            -- Indien de laatste factuur ontvangen is en de status van de factuur is goedgekeurd
            -- of verwerkt zal het bedrag uit de factuur gebruikt worden.
            COALESCE (
               (SELECT   DECODE (SUM (laatste_factuur),
                                 0, TO_NUMBER (NULL),
                                 SUM (fin_factuurregel_totaal))
                  FROM   aaxx_v_factuur_gegevens g
                 WHERE   g.bes_bestelopdr_key = b.bes_bestelopdr_key
                         AND g.fin_factuur_statuses_key >= 6),
               opdr_kosten
            )
               opdr_kosten,
            DECODE (opdr_volgnr, NULL, TO_CHAR (NULL), kpn),
            DECODE (opdr_volgnr, NULL, TO_CHAR (NULL), kpn_omschrijving)
     FROM   (SELECT   b.bes_bestelling_key bes_bestelling_key,
                      b.bes_bestelling_key bestelaanvraagnr,
                      di.alg_district_omschrijving,
                      l.alg_locatie_code,
                      l.alg_locatie_omschrijving,
                      l.alg_locatie_key,
                      g.alg_gebouw_code,
                      g.alg_gebouw_naam,
                      g.alg_gebouw_key,
                      b.bes_bestelling_ordernr,
                      b.bes_bestelling_datum besteldatum,
                      b.bes_bestelling_satisfaction,
                      b.bes_bestelling_satisfaction_op,
                      (SELECT   prs_perslid_naam_full
                         FROM   prs_v_perslid_fullnames_all pf
                        WHERE   pf.prs_perslid_key = p.prs_perslid_key)
                         besteller,
                      p.prs_perslid_key prs_perslid_key_best,
                      (SELECT   MAX (prs_perslid_naam_full)
                         FROM   prs_v_perslid_fullnames_all pf
                        WHERE   pf.prs_perslid_key =
                                   COALESCE (
                                      fac.gettrackinguserkey (
                                         'BESNEW',
                                         b.bes_bestelling_key
                                      ),
                                      fac.gettrackinguserkey (
                                         'BESAP2',
                                         b.bes_bestelling_key
                                      )
                                   ))
                         invoerder,
                      COALESCE (
                         fac.gettrackinguserkey ('BESNEW',
                                                 b.bes_bestelling_key),
                         fac.gettrackinguserkey ('BESAP2',
                                                 b.bes_bestelling_key)
                      )
                         invoerder_key,
                      fac.gettrackingdate ('BESACP', b.bes_bestelling_key)
                         acceptatie_datum,
                      fac.gettrackingdate ('BESOTV', b.bes_bestelling_key)
                         ontvangen_datum,
                      aaxx_bestelling_items (b.bes_bestelling_key)
                         omschrijving,
                      (SELECT   ksg.prs_kostensoortgrp_oms
                         FROM   prs_kostensoortgrp ksg, prs_kostensoort ks
                        WHERE   ksg.prs_kostensoortgrp_key =
                                   ks.prs_kostensoortgrp_key
                                AND ks.prs_kostensoort_key =
                                      d.prs_kostensoort_key)
                         kostensoortgroep,
                      (SELECT   ks.prs_kostensoort_oms
                         FROM   prs_kostensoort ks
                        WHERE   ks.prs_kostensoort_key =
                                   d.prs_kostensoort_key)
                         kostensoort,
                      k.prs_kostenplaats_nr kpn,
                      k.prs_kostenplaats_omschrijving kpn_omschrijving,
                      a.prs_afdeling_naam afdeling_code,
                      a.prs_afdeling_omschrijving afdeling_omschrijving,
                      d.ins_discipline_key,
                      d.ins_discipline_omschrijving,
                      b.bes_bestelling_leverdatum afleverdatum,
                      aaxx.count_work_days (
                         b.bes_bestelling_datum,
                         NVL (
                            fac.gettrackingdate ('BESOTV',
                                                 b.bes_bestelling_key),
                            SYSDATE
                         )
                      )
                         doorlooptijd_werkdgn,
                      NVL (
                         (SELECT   bdp.bes_disc_params_leverdagen
                            FROM   bes_disc_params bdp
                           WHERE   d.ins_discipline_key =
                                      bdp.bes_ins_discipline_key),
                         0
                      )
                         sla_tijd,
                      (SELECT   bes_bestellingstatuses_omschr
                         FROM   bes_bestellingstatuses bs
                        WHERE   bs.bes_bestellingstatuses_key =
                                   b.bes_bestelling_status)
                         status,
                      (SELECT   b.prs_bedrijf_naam
                         FROM   prs_bedrijf b
                        WHERE   b.prs_bedrijf_key = bo.prs_bedrijf_key)
                         leverancier,
                      (SELECT   bes_bestelopdrstatuses_omschr
                         FROM   bes_bestelopdrstatuses bs
                        WHERE   bs.bes_bestelopdrstatuses_key =
                                   bo.bes_bestelopdr_status)
                         opdr_status,
                      bo.bes_bestelopdr_key,
                      fac.safe_to_number(SUBSTR (
                                            bo.bes_bestelopdr_id,
                                            INSTR (bo.bes_bestelopdr_id, '/')
                                            + 1
                                         ))
                         opdr_volgnr,
                      bo.bes_bestelopdr_datum opdr_datum,
                      fac.gettrackingdate ('BES2SN', bo.bes_bestelopdr_key)
                         verzonden_datum,
                      fac.gettrackingdate ('BES2AF', bo.bes_bestelopdr_key)
                         opdr_ontv_datum,
                      bes.bestelopdr_tooltip (bo.bes_bestelopdr_key)
                         opdr_omschrijving,
                      bes_bestelopdr_opmerking,
                      DECODE (
                         bes_bestelopdr_status,
                         8,
                         0,                                     -- geannuleerd
                         (SELECT   SUM(bes_bestelopdr_item_aantal
                                       * COALESCE (
                                            bes_bestelopdr_item_inkprijs,
                                            bes_bestelopdr_item_prijs
                                         ))
                            FROM   bes_bestelopdr_item boi
                           WHERE   boi.bes_bestelopdr_key =
                                      bo.bes_bestelopdr_key)
                      )
                         opdr_kosten,
                      bo.prs_bedrijf_key
               FROM   bes_bestelling b,
                      prs_perslid p,
                      prs_kostenplaats k,
                      prs_afdeling a,
                      mld_adres ma,
                      bes_bestelopdr bo,
                      ins_tab_discipline d,
                      alg_gebouw g,
                      alg_locatie l,
                      alg_district di,
                      (SELECT   DISTINCT
                                bes_bestelling_key, bes_bestelopdr_key
                         FROM   bes_bestelling_item bi,
                                bes_bestelopdr_item boi
                        WHERE   bi.bes_bestelopdr_item_key =
                                   boi.bes_bestelopdr_item_key) bes_opdr,
                      (SELECT   DISTINCT
                                bes_bestelling_key, ins_discipline_key
                         FROM   bes_bestelling_item bi,
                                bes_srtdeel sd,
                                bes_srtgroep sg
                        WHERE   bi.bes_srtdeel_key = sd.bes_srtdeel_key
                                AND sd.bes_srtgroep_key = sg.bes_srtgroep_key)
                      cat,
                      (  SELECT   mld_adres_key,
                                  MAX (alg_gebouw_key) alg_gebouw_key
                           FROM   alg_gebouw
                       GROUP BY   mld_adres_key) adr_geb
              WHERE       b.prs_perslid_key = p.prs_perslid_key
                      AND b.prs_kostenplaats_key = k.prs_kostenplaats_key
                      AND p.prs_afdeling_key = a.prs_afdeling_key
                      AND b.mld_adres_key_lev = ma.mld_adres_key
                      AND b.bes_bestelling_key =
                            bes_opdr.bes_bestelling_key(+)
                      AND bes_opdr.bes_bestelopdr_key =
                            bo.bes_bestelopdr_key(+)
                      AND ma.alg_locatie_key = l.alg_locatie_key(+)
                      AND l.alg_district_key = di.alg_district_key(+)
                      AND b.bes_bestelling_key = cat.bes_bestelling_key
                      AND cat.ins_discipline_key = d.ins_discipline_key
                      AND ma.mld_adres_key = adr_geb.mld_adres_key(+)
                      AND adr_geb.alg_gebouw_key = g.alg_gebouw_key(+)) b;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_MLD_KENM_MLD
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_kenmerk_melding
(
   mld_melding_id,
   mld_kenmerk_omschrijving,
   mld_kenmerk_waarde
)
AS
   SELECT mld_melding_key,
          sk.mld_srtkenmerk_omschrijving,
          aaxx_get_kenmerkwaarde (sk.mld_srtkenmerk_kenmerktype,
                                  sk.fac_kenmerkdomein_key,
                                  km.mld_kenmerkmelding_waarde)
     FROM mld_kenmerk k, mld_srtkenmerk sk, mld_kenmerkmelding km
    WHERE k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
          AND km.mld_kenmerk_key = k.mld_kenmerk_key;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_MLD_KENM_OPD
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_kenmerk_opdracht
(
   mld_opdr_id,
   mld_kenmerk_omschrijving,
   mld_kenmerk_waarde
)
AS
   SELECT mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr,
          sk.mld_srtkenmerk_omschrijving,
          aaxx_get_kenmerkwaarde (sk.mld_srtkenmerk_kenmerktype,
                                  sk.fac_kenmerkdomein_key,
                                  ko.mld_kenmerkopdr_waarde)
     FROM mld_kenmerk k,
          mld_srtkenmerk sk,
          mld_kenmerkopdr ko,
          mld_opdr o
    WHERE     k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
          AND ko.mld_kenmerk_key = k.mld_kenmerk_key
          AND ko.mld_opdr_key = o.mld_opdr_key;


-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_RES_ALGEMEEN
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_res_reservering
(
   res_reservering_key,
   res_rsv_ruimte_key,
   nummer,
   res_omschrijving,
   res_opmerking,
   res_ruimte_naam,
   invoerdatum,
   datum,
   gastheer,
   gastheer_key,
   contact,
   contact_key,
   invoerder,
   invoerder_key,
   kostensoortgroep,
   kostensoort,
   kpn,
   kpn_omschrijving,
   prs_bedrijf_key,
   afdeling_code,
   afdeling_omschrijving,
   district_omschrijving,
   alg_locatie_key,
   locatie,
   locatie_omschrijving,
   gebouw,
   gebouw_omschrijving,
   verdieping,
   ruimte,
   ruimte_key,
   opstelling,
   no_show,
   shown_bezoekers,
   mandaat,
   personeelsnr,
   werkplek,
   ins_discipline_key,
   catalogus_ins_discipline_key,
   catalogus,
   reserveerbare_ruimte,
   bezoekers,
   van,
   tot,
   duur,
   status,
   activiteit,
   tevredenheid,
   tevredenheid_opm,
   voorziening_ins_discipline_key,
   voorziening_catalogus,
   voorziening_product,
   voorziening_totaalprijs,
   voorziening_van,
   voorziening_tot,
   voorziening_aantal,
   voorziening_prijs,
   voorziening_inkoopprijs,
   voorziening_btw,
   voorziening_afgemeld
)
AS
   SELECT res.res_reservering_key,
          rrr.res_rsv_ruimte_key,
          res.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr,
          rrr.res_rsv_ruimte_omschrijving,
          rrr.res_rsv_ruimte_opmerking,
          rr.res_ruimte_nr,
          COALESCE (rrr.res_rsv_ruimte_aanmaak, voorz.van),
          COALESCE (rrr.res_rsv_ruimte_van, voorz.van),
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = rrr.res_rsv_ruimte_host_key),
          rrr.res_rsv_ruimte_host_key,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = rrr.res_rsv_ruimte_contact_key),
          rrr.res_rsv_ruimte_contact_key,
          (SELECT prs_perslid_naam_full
             FROM fac_tracking t,
                  fac_srtnotificatie sn,
                  prs_v_perslid_fullnames_all pf
            WHERE sn.fac_srtnotificatie_code = 'RESNEW'
              AND sn.fac_srtnotificatie_key = t.fac_srtnotificatie_key
              AND t.prs_perslid_key = pf.prs_perslid_key
              AND fac_tracking_refkey = rrr.res_rsv_ruimte_key),
          (SELECT prs_perslid_key
             FROM fac_tracking t, fac_srtnotificatie sn
            WHERE sn.fac_srtnotificatie_code = 'RESNEW'
              AND sn.fac_srtnotificatie_key = t.fac_srtnotificatie_key
              AND fac_tracking_refkey = rrr.res_rsv_ruimte_key),
          (SELECT ksg.prs_kostensoortgrp_oms
             FROM prs_kostensoortgrp ksg, prs_kostensoort ks
            WHERE ksg.prs_kostensoortgrp_key = ks.prs_kostensoortgrp_key
              AND ks.prs_kostensoort_key =
                     (SELECT disc.prs_kostensoort_key
                        FROM res_discipline disc
                       WHERE disc.ins_discipline_key =
                                COALESCE (
                                   voorz.ins_discipline_key,
                                   (SELECT ins_discipline_key
                                      FROM ins_tab_discipline d,
                                           res_ruimte_opstelling ro,
                                           res_ruimte rr
                                     WHERE rrr.res_ruimte_opstel_key =
                                              ro.res_ruimte_opstel_key
                                       AND ro.res_ruimte_key =
                                              rr.res_ruimte_key
                                       AND rr.res_discipline_key =
                                              d.ins_discipline_key))))
             kostensoortgroep,
          (SELECT ks.prs_kostensoort_oms
             FROM prs_kostensoort ks
            WHERE ks.prs_kostensoort_key =
                     (SELECT disc.prs_kostensoort_key
                        FROM res_discipline disc
                       WHERE disc.ins_discipline_key =
                                COALESCE (
                                   voorz.ins_discipline_key,
                                   (SELECT ins_discipline_key
                                      FROM ins_tab_discipline d,
                                           res_ruimte_opstelling ro,
                                           res_ruimte rr
                                     WHERE rrr.res_ruimte_opstel_key =
                                              ro.res_ruimte_opstel_key
                                       AND ro.res_ruimte_key =
                                              rr.res_ruimte_key
                                       AND rr.res_discipline_key =
                                              d.ins_discipline_key))))
             kostensoort,
          k.prs_kostenplaats_nr,
          k.prs_kostenplaats_omschrijving,
          (SELECT prs_bedrijf_key
             FROM prs_v_afdeling pva
            WHERE pva.prs_afdeling_key = a.prs_afdeling_key),
          a.prs_afdeling_naam,
          a.prs_afdeling_omschrijving,
          (SELECT d.alg_district_omschrijving
             FROM alg_district d,
                  alg_locatie l,
                  alg_gebouw g,
                  alg_verdieping v,
                  alg_ruimte r
            WHERE d.alg_district_key = l.alg_district_key
              AND l.alg_locatie_key = g.alg_locatie_key
              AND g.alg_gebouw_key = v.alg_gebouw_key
              AND v.alg_verdieping_key = r.alg_verdieping_key
              AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT l.alg_locatie_key
             FROM alg_locatie l,
                  alg_gebouw g,
                  alg_verdieping v,
                  alg_ruimte r
            WHERE l.alg_locatie_key = g.alg_locatie_key
              AND g.alg_gebouw_key = v.alg_gebouw_key
              AND v.alg_verdieping_key = r.alg_verdieping_key
              AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT alg_locatie_code
             FROM alg_locatie l,
                  alg_gebouw g,
                  alg_verdieping v,
                  alg_ruimte r
            WHERE l.alg_locatie_key = g.alg_locatie_key
              AND g.alg_gebouw_key = v.alg_gebouw_key
              AND v.alg_verdieping_key = r.alg_verdieping_key
              AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT alg_locatie_omschrijving
             FROM alg_locatie l,
                  alg_gebouw g,
                  alg_verdieping v,
                  alg_ruimte r
            WHERE l.alg_locatie_key = g.alg_locatie_key
              AND g.alg_gebouw_key = v.alg_gebouw_key
              AND v.alg_verdieping_key = r.alg_verdieping_key
              AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT alg_gebouw_code
             FROM alg_gebouw g, alg_verdieping v, alg_ruimte r
            WHERE g.alg_gebouw_key = v.alg_gebouw_key
              AND v.alg_verdieping_key = r.alg_verdieping_key
              AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT alg_gebouw_naam
             FROM alg_gebouw g, alg_verdieping v, alg_ruimte r
            WHERE g.alg_gebouw_key = v.alg_gebouw_key
              AND v.alg_verdieping_key = r.alg_verdieping_key
              AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT alg_verdieping_code
             FROM alg_verdieping v, alg_ruimte r
            WHERE v.alg_verdieping_key = r.alg_verdieping_key
              AND r.alg_ruimte_key = r2a.alg_ruimte_key),
          (SELECT alg_ruimte_nr
             FROM alg_ruimte r
            WHERE r.alg_ruimte_key = r2a.alg_ruimte_key),
          r2a.alg_ruimte_key,
          r2a.opstelling,
          rrr.res_rsv_ruimte_noshow,
          rrr.res_rsv_ruimte_bezoekers_shown,
          NVL ( (SELECT pr.fac_profiel_limiet
                   FROM fac_profiel pr
                  WHERE p.fac_profiel_key = pr.fac_profiel_key), 0),
          prs_perslid_nr,
          wp2.prs_werkplek_aanduiding,
          COALESCE (
             voorz.ins_discipline_key,
             (SELECT ins_discipline_key
                FROM ins_tab_discipline d,
                     res_ruimte_opstelling ro,
                     res_ruimte rr
               WHERE rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                 AND ro.res_ruimte_key = rr.res_ruimte_key
                 AND rr.res_discipline_key = d.ins_discipline_key)),
          (SELECT ins_discipline_key
             FROM ins_tab_discipline d,
                  res_ruimte_opstelling ro,
                  res_ruimte rr
            WHERE rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
              AND ro.res_ruimte_key = rr.res_ruimte_key
              AND rr.res_discipline_key = d.ins_discipline_key),
          (SELECT ins_discipline_omschrijving
             FROM ins_tab_discipline d,
                  res_ruimte_opstelling ro,
                  res_ruimte rr
            WHERE rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
              AND ro.res_ruimte_key = rr.res_ruimte_key
              AND rr.res_discipline_key = d.ins_discipline_key),
          DECODE (rrr.alg_ruimte_key, NULL, 'Ja', 'Nee'),
          rrr.res_rsv_ruimte_bezoekers,
          rrr.res_rsv_ruimte_van,
          rrr.res_rsv_ruimte_tot,
          NVL ( (rrr.res_rsv_ruimte_tot - rrr.res_rsv_ruimte_van) * 24, 0),
          (SELECT res_status_bo_omschrijving
             FROM res_status_bo rs
            WHERE rs.res_status_bo_key =
                     COALESCE (voorz.res_status_bo_key,
                               rrr.res_status_bo_key)),
          (SELECT res_activiteit_omschrijving
             FROM res_activiteit ra
            WHERE ra.res_activiteit_key = rrr.res_activiteit_key),
          rrr.res_rsv_ruimte_satisfaction,
          rrr.res_rsv_ruimte_satisfaction_op,
          voorz.ins_discipline_key,
          voorz.catalogus,
          voorz.product,
          voorz.totaalprijs,
          voorz.van,
          voorz.tot,
          voorz.aantal,
          voorz.prijs,
          voorz.inkoopprijs,
          voorz.btw,
          voorz.afgemeld
     FROM res_v_aanwezigrsv_ruimte rrr,
          res_reservering res,
          prs_kostenplaats k,
          prs_perslid p,
          prs_afdeling a,
          res_ruimte_opstelling rro,
          res_ruimte rr,
          (  SELECT res_rsv_ruimte_key,
                    MAX (o.res_opstelling_omschrijving) opstelling,
                    MAX (ra.alg_ruimte_key) alg_ruimte_key
               FROM res_rsv_ruimte r,
                    res_ruimte_opstelling ro,
                    res_opstelling o,
                    res_ruimte rr,
                    res_alg_ruimte ra
              WHERE r.res_rsv_ruimte_verwijder IS NULL
                AND r.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                AND ro.res_ruimte_key = rr.res_ruimte_key
                AND ro.res_opstelling_key = o.res_opstelling_key
                AND rr.res_ruimte_key = ra.res_ruimte_key
           GROUP BY res_rsv_ruimte_key
           UNION ALL
           SELECT res_rsv_ruimte_key, '' opstelling, alg_ruimte_key
             FROM res_rsv_ruimte
            WHERE alg_ruimte_key IS NOT NULL) r2a,
          (SELECT rrd.res_rsv_ruimte_key res_rsv_ruimte_key,
                  d.ins_deel_omschrijving product,
                  rrd.res_status_bo_key,
                  DECODE (
                     rd.res_deel_prijs_vast,
                     1,
                     NVL (rrd.res_rsv_deel_prijs, rd.res_deel_prijs),
                       (rrd.res_rsv_deel_tot - rrd.res_rsv_deel_van)
                     * 24
                     * NVL (rrd.res_rsv_deel_prijs, rd.res_deel_prijs))
                     totaalprijs,
                  rrd.res_rsv_deel_van van,
                  rrd.res_rsv_deel_tot tot,
                  (rrd.res_rsv_deel_tot - rrd.res_rsv_deel_van) * 24 aantal,
                  NVL (rrd.res_rsv_deel_prijs, rd.res_deel_prijs) prijs,
                  NULL inkoopprijs,
                  NULL btw,
                  TO_DATE (NULL) afgemeld,
                  c.ins_discipline_key ins_discipline_key,
                  c.ins_discipline_omschrijving catalogus
             FROM res_v_aanwezigrsv_deel rrd,
                  res_deel rd,
                  ins_deel d,
                  ins_tab_discipline c
            WHERE rrd.res_deel_key = rd.res_deel_key
              AND d.ins_deel_key = rd.res_ins_deel_key
              AND rrd.res_rsv_ruimte_key IS NOT NULL
              AND c.ins_discipline_key = rd.res_discipline_key
           UNION ALL
           SELECT rra.res_rsv_ruimte_key res_rsv_ruimte_key,
                  ra.res_artikel_omschrijving product,
                  rra.res_status_bo_key,
                  NVL (rra.res_rsv_artikel_prijs,
                       rra.res_rsv_artikel_aantal * res_artikel_prijs)
                     totaalprijs,
                  rra.res_rsv_artikel_levering van,
                  NULL tot,
                  rra.res_rsv_artikel_aantal aantal,
                  NVL (
                     rra.res_rsv_artikel_prijs / rra.res_rsv_artikel_aantal,
                     res_artikel_prijs)
                     prijs,
                  res_artikel_inkoopprijs inkoopprijs,
                  res_artikel_btw btw,
                  TO_DATE (NULL) afgemeld,
                  c.ins_discipline_key ins_discipline_key,
                  c.ins_discipline_omschrijving catalogus
             FROM res_v_aanwezigrsv_artikel rra,
                  res_artikel ra,
                  ins_tab_discipline c
            WHERE rra.res_artikel_key = ra.res_artikel_key
              AND ra.res_discipline_key = c.ins_discipline_key) voorz,
          (  SELECT pw.prs_perslid_key,
                    MIN (prs_werkplek_aanduiding)
                    || DECODE (COUNT ( * ), 1, '', '...')
                       prs_werkplek_aanduiding
               FROM prs_v_werkplek_gegevens wp, prs_perslidwerkplek pw
              WHERE wp.prs_werkplek_key = pw.prs_werkplek_key
           GROUP BY pw.prs_perslid_key) wp2
    WHERE rrr.res_reservering_key = res.res_reservering_key
      AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)
      AND rro.res_ruimte_key = rr.res_ruimte_key(+)
      AND rrr.res_rsv_ruimte_key = r2a.res_rsv_ruimte_key(+)
      AND rrr.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
      AND rrr.res_rsv_ruimte_key = voorz.res_rsv_ruimte_key(+)
      AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
      AND p.prs_afdeling_key = a.prs_afdeling_key
      AND wp2.prs_perslid_key(+) = p.prs_perslid_key
      AND (rrr.res_ruimte_opstel_key IS NOT NULL
        OR voorz.res_rsv_ruimte_key IS NOT NULL);

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_RES_KENMERK
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_kenmerk_reservering
(
   nummer,
   kenmerk_omschrijving,
   kenmerk_waarde
)
AS
   SELECT rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr,
          sk.res_srtkenmerk_omschrijving,
          aaxx_get_kenmerkwaarde (sk.res_srtkenmerk_kenmerktype,
                                  sk.fac_kenmerkdomein_key,
                                  kw.res_kenmerkreservering_waarde)
     FROM res_kenmerk k,
          res_srtkenmerk sk,
          res_kenmerkwaarde kw,
          res_v_aanwezigrsv_ruimte rrr
    WHERE rrr.res_rsv_ruimte_key = kw.res_rsv_ruimte_key
      AND kw.res_kenmerk_key = k.res_kenmerk_key
      AND k.res_srtkenmerk_key = sk.res_srtkenmerk_key;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_BES_ALGEMEEN
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_bes_bestelling
(
   bes_bestelling_key,
   bestelaanvraagnr,
   besteldatum,
   besteller,
   invoerder,
   kostensoortgroep,
   kostensoort,
   kpn,
   kpn_omschrijving,
   prs_bedrijf_key,
   afdeling_code,
   afdeling_omschrijving,
   alg_locatie_key,
   locatie_code,
   district_omschijving,
   afleveradres,
   mandaat,
   personeelsnr,
   werkplek,
   ins_discipline_key,
   catalogus,
   groep,
   afleverdatum,
   doorlooptijd_werkdgn,
   sla_tijd,
   productcode,
   prijs,
   inkoopprijs,
   status,
   gefiatteerddoor,
   tevredenheid,
   tevredenheid_opm,
   bestelopdrachtnummer,
   leverancier,
   aantal,
   itemprijs,
   iteminkoopprijs,
   productomschrijving,
   itemposnr
)
AS
   SELECT b.bes_bestelling_key bes_bestelling_key,
          b.bes_bestelling_key bestelaanvraagnr,
          b.bes_bestelling_datum besteldatum,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = p.prs_perslid_key)
             besteller,
          (SELECT MAX (prs_perslid_naam_full)
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key =
                     COALESCE(fac.gettrackinguserkey ('BESNEW', b.bes_bestelling_key), fac.gettrackinguserkey ('BESAP2', b.bes_bestelling_key)))
             invoerder,
          (SELECT ksg.prs_kostensoortgrp_oms
             FROM prs_kostensoortgrp ksg, prs_kostensoort ks
            WHERE ksg.prs_kostensoortgrp_key = ks.prs_kostensoortgrp_key
              AND ks.prs_kostensoort_key =
                     (SELECT disc.prs_kostensoort_key
                        FROM bes_discipline disc
                       WHERE disc.ins_discipline_key = d.ins_discipline_key))
             kostensoortgroep,
          (SELECT ks.prs_kostensoort_oms
             FROM prs_kostensoort ks
            WHERE ks.prs_kostensoort_key =
                     (SELECT disc.prs_kostensoort_key
                        FROM bes_discipline disc
                       WHERE disc.ins_discipline_key = d.ins_discipline_key))
             kostensoort,
          k.prs_kostenplaats_nr kpn,
          k.prs_kostenplaats_omschrijving kpn_omschrijving,
          (SELECT prs_bedrijf_key
             FROM prs_v_afdeling pva
            WHERE pva.prs_afdeling_key = a.prs_afdeling_key)
             prs_bedrijf_key,
          a.prs_afdeling_naam afdeling_code,
          a.prs_afdeling_omschrijving afdeling_omschrijving,
          ma.alg_locatie_key alg_locatie_key,
          (SELECT alg_locatie_code
             FROM alg_locatie l
            WHERE l.alg_locatie_key = ma.alg_locatie_key)
             locatie_code,
          (SELECT alg_district_omschrijving
             FROM alg_locatie l, alg_district d
            WHERE l.alg_district_key = d.alg_district_key
              AND l.alg_locatie_key = ma.alg_locatie_key)
             district_omschijving,
          ma.mld_adres_naam afleveradres,
          NVL ( (SELECT pr.fac_profiel_limiet
                   FROM fac_profiel pr
                  WHERE p.fac_profiel_key = pr.fac_profiel_key), 0)
             mandaat,
          prs_perslid_nr personeelsnr,
          wp2.prs_werkplek_aanduiding werkplek,
          d.ins_discipline_key ins_discipline_key,
          d.ins_discipline_omschrijving catalogus,
          sg.bes_srtgroep_omschrijving groep,
          b.bes_bestelling_leverdatum afleverdatum,
          TO_CHAR(aaxx.count_work_days (
                     b.bes_bestelling_datum,
                     NVL (
                        fac.gettrackingdate ('BESOTV', b.bes_bestelling_key),
                        SYSDATE)))
             doorlooptijd_werkdgn,
          NVL ( (SELECT bdp.bes_disc_params_leverdagen
                   FROM bes_disc_params bdp
                  WHERE d.ins_discipline_key = bdp.bes_ins_discipline_key),
               0)
             sla_tijd,
          sd.bes_srtdeel_nr productcode,
          DECODE(bes_bestelling_status,
                 8,0,    -- geannuleerd
                 bi.bes_bestelling_item_prijs * bi.bes_bestelling_item_aantal) prijs,
          DECODE(bes_bestelling_status,
                 8,0,    -- geannuleerd
                 NVL (bi.bes_bestelling_item_inkprijs, bi.bes_bestelling_item_prijs)
                 * bi.bes_bestelling_item_aantal)
             inkoopprijs,
          (SELECT bes_bestellingstatuses_omschr
             FROM bes_bestellingstatuses bs
            WHERE bs.bes_bestellingstatuses_key = b.bes_bestelling_status)
             status,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = b.bes_bestelling_fiat_user)
             gefiatteerddoor,
          b.bes_bestelling_satisfaction,
          b.bes_bestelling_satisfaction_op,
          bo.bes_bestelopdr_id bestelopdrachtnummer,
          (SELECT b.prs_bedrijf_naam
             FROM prs_bedrijf b
            WHERE b.prs_bedrijf_key = bo.prs_bedrijf_key)
             leverancier,
          bi.bes_bestelling_item_aantal aantal,
          DECODE (bes_bestelling_status,
                  8, 0,   -- geannuleerd
                  bi.bes_bestelling_item_prijs) itemprijs,
          DECODE (bes_bestelling_status,
                  8,0,    -- geannuleerd
                  NVL (bi.bes_bestelling_item_inkprijs, bi.bes_bestelling_item_prijs))
             iteminkoopprijs,
          sd.bes_srtdeel_omschrijving productomschrijving,
          boi.bes_bestelopdr_item_posnr itemposnr
     FROM bes_bestelling b,
          prs_perslid p,
          prs_kostenplaats k,
          prs_afdeling a,
          mld_adres ma,
          (  SELECT pw.prs_perslid_key,
                    MIN (prs_werkplek_aanduiding)
                    || DECODE (COUNT ( * ), 1, '', '...')
                       prs_werkplek_aanduiding
               FROM prs_v_werkplek_gegevens wp, prs_perslidwerkplek pw
              WHERE wp.prs_werkplek_key = pw.prs_werkplek_key
           GROUP BY pw.prs_perslid_key) wp2,
          bes_bestelling_item bi,
          bes_bestelopdr_item boi,
          bes_bestelopdr bo,
          bes_srtdeel sd,
          bes_srtgroep sg,
          ins_tab_discipline d
    WHERE b.prs_perslid_key = p.prs_perslid_key
      AND b.prs_kostenplaats_key = k.prs_kostenplaats_key
      AND p.prs_afdeling_key = a.prs_afdeling_key
      AND b.mld_adres_key_lev = ma.mld_adres_key
      AND wp2.prs_perslid_key(+) = p.prs_perslid_key
      AND b.bes_bestelling_key = bi.bes_bestelling_key
      AND bi.bes_bestelopdr_item_key = boi.bes_bestelopdr_item_key(+)
      AND boi.bes_bestelopdr_key = bo.bes_bestelopdr_key(+)
      AND bi.bes_srtdeel_key = sd.bes_srtdeel_key
      AND sd.bes_srtgroep_key = sg.bes_srtgroep_key
      AND sg.ins_discipline_key = d.ins_discipline_key;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_BES_KENMERK
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_kenmerk_bestelling
(
   nummer,
   kenmerk_omschrijving,
   kenmerk_waarde
)
AS
   SELECT kb.bes_bestelling_key,
          sk.bes_srtkenmerk_omschrijving,
          aaxx_get_kenmerkwaarde (sk.bes_srtkenmerk_kenmerktype,
                                  sk.fac_kenmerkdomein_key,
                                  bes_kenmerkbestell_waarde)
     FROM bes_kenmerk k,
          bes_srtkenmerk sk,
          fac_kenmerkdomein fkd,
          bes_kenmerkbestell kb
    WHERE kb.bes_kenmerk_key = k.bes_kenmerk_key
      AND k.bes_srtkenmerk_key = sk.bes_srtkenmerk_key;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_BEZ_BEZOEKERS
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_bez_bezoekers
(
   bezoekers_key,
   afspraak_begin,
   afspraak_ontvangen,
   ontvangen_door,
   afspraak_eind,
   afspraak_afgemeld,
   afgemeld_door,
   contactpersoon,
   gastheer,
   locatie,
   gebouw,
   verdieping,
   ruimte,
   actie,
   opmerking,
   parkeerplaats,
   ingevoerd_door,
   ingevoerd,
   res_rsv_ruimte_key,
   reservering,
   bezoeker,
   bedrijf
)
AS
   SELECT b.bez_bezoekers_key,
          a.bez_afspraak_datum,
          bez_bezoekers_done,
          bezdon.prs_perslid_key,
          bez_afspraak_eind,
          bez_bezoekers_out,
          bezout.prs_perslid_key,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = a.bez_afspraak_contact_key)
             contact,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE pf.prs_perslid_key = a.bez_afspraak_host_key)
             HOST,
          alg_locatie_code || '-' || alg_locatie_omschrijving,
          (SELECT alg_gebouw_upper || '-' || alg_gebouw_naam
             FROM alg_gebouw g
            WHERE g.alg_gebouw_key = og.alg_gebouw_key)
             gebouw,
          (SELECT alg_verdieping_volgnr
             FROM alg_verdieping v
            WHERE v.alg_verdieping_key = og.alg_verdieping_key)
             verdieping,
          (SELECT alg_ruimte_nr || '-' || alg_ruimte_omschrijving
             FROM alg_ruimte r
            WHERE r.alg_ruimte_key = og.alg_ruimte_key)
             ruimte,
          (SELECT bez_actie_omschrijving
             FROM bez_actie ac
            WHERE ac.bez_actie_key = a.bez_actie_key)
             actie,
          a.bez_afspraak_opmerking opmerking,
          (SELECT MAX (ins_deel_omschrijving)
             FROM res_v_aanwezigrsv_deel rrd, res_deel rd, ins_deel d
            WHERE rrd.bez_bezoekers_key = b.bez_bezoekers_key
              AND rrd.res_deel_key = rd.res_deel_key
              AND rd.res_ins_deel_key = d.ins_deel_key)
             parkeer,
          bezmut.prs_perslid_key,
          bezmut.fac_tracking_datum,
          a.res_rsv_ruimte_key res_rsv_ruimte_key,
          (SELECT rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr
             FROM res_rsv_ruimte rrr
            WHERE rrr.res_rsv_ruimte_key = a.res_rsv_ruimte_key)
             reservering_nummer,
          b.bez_afspraak_naam,
          b.bez_afspraak_bedrijf
     FROM bez_bezoekers b,
          bez_afspraak a,
          alg_v_onroerendgoed og,
          alg_locatie l,
          (SELECT fac_tracking_refkey, prs_perslid_key
             FROM fac_tracking t, fac_srtnotificatie sn
            WHERE t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
              AND sn.fac_srtnotificatie_code = 'BEZDON'
              AND NOT EXISTS
                     (SELECT fac_tracking_refkey
                        FROM fac_tracking t2
                       WHERE t2.fac_srtnotificatie_key =
                                t.fac_srtnotificatie_key
                         AND t2.fac_tracking_refkey = t.fac_tracking_refkey
                         AND t2.fac_tracking_key > t.fac_tracking_key))
          bezdon,
          (SELECT fac_tracking_refkey, prs_perslid_key
             FROM fac_tracking t, fac_srtnotificatie sn
            WHERE t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
              AND sn.fac_srtnotificatie_code = 'BEZOUT'
              AND NOT EXISTS
                     (SELECT fac_tracking_refkey
                        FROM fac_tracking t2
                       WHERE t2.fac_srtnotificatie_key =
                                t.fac_srtnotificatie_key
                         AND t2.fac_tracking_refkey = t.fac_tracking_refkey
                         AND t2.fac_tracking_key > t.fac_tracking_key))
          bezout,
          (SELECT fac_tracking_refkey, prs_perslid_key, fac_tracking_datum
             FROM fac_tracking t, fac_srtnotificatie sn
            WHERE t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
              AND sn.fac_srtnotificatie_code = 'BEZMUT'
              AND NOT EXISTS
                     (SELECT fac_tracking_refkey
                        FROM fac_tracking t2
                       WHERE t2.fac_srtnotificatie_key =
                                t.fac_srtnotificatie_key
                         AND t2.fac_tracking_refkey = t.fac_tracking_refkey
                         AND t2.fac_tracking_key > t.fac_tracking_key))
          bezmut
    WHERE b.bez_afspraak_key = a.bez_afspraak_key
      AND a.alg_onrgoed_keys = og.alg_onroerendgoed_keys(+)
      AND a.alg_locatie_key = l.alg_locatie_key(+)
      AND b.bez_bezoekers_key = bezdon.fac_tracking_refkey(+)
      AND b.bez_bezoekers_key = bezout.fac_tracking_refkey(+)
      AND a.bez_afspraak_key = bezmut.fac_tracking_refkey(+);

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_ALG_ONRGOED
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_alg_onrgoed
(
   alg_onroerendgoed_keys,
   alg_onroerendgoed_code,
   alg_onroerendgoed_omschrijving,
   alg_onroerendgoed_verwijder,
   alg_type,
   alg_regio_key,
   alg_regio_omschrijving,
   alg_district_key,
   alg_district_omschrijving,
   alg_locatie_key,
   alg_locatie_code,
   alg_locatie_omschrijving,
   alg_terreinsector_key,
   alg_terreinsector_code,
   alg_terreinsector_naam,
   alg_gebouw_key,
   alg_gebouw_code,
   alg_gebouw_naam,
   alg_gebouw_verantwoordelijke,
   alg_gebouw_verantwoordelijke2,
   alg_gebouw_bvo,
   alg_gebouw_bez,
   alg_gebouw_werkdagen,
   alg_gebouw_beginuur,
   alg_gebouw_einduur,
   alg_gebouw_functie,
   alg_gebouw_x,
   alg_gebouw_y,
   alg_verdieping_key,
   alg_verdieping_code,
   alg_verdieping_omschrijving,
   alg_ruimte_key,
   alg_ruimte_nr,
   alg_ruimte_omschrijving,
   alg_ruimte_m2,
   alg_ruimte_m2_alt1,
   alg_ruimte_m2_alt2
)
as
   select alg_onroerendgoed_keys,
          decode (alg_type,
                  'T',
                  alg_terreinsector_code,
                  'G',
                  alg_gebouw_code,
                  'V',
                  alg_verdieping_code,
                  'R',
                  alg_ruimte_nr),
          decode (alg_type,
                  'T',
                  alg_terreinsector_naam,
                  'G',
                  alg_gebouw_naam,
                  'V',
                  alg_verdieping_omschrijving,
                  'R',
                  alg_ruimte_omschrijving),
          decode (alg_type,
                  'T',
                  alg_terreinsector_verwijder,
                  'G',
                  alg_gebouw_verwijder,
                  'V',
                  alg_verdieping_verwijder,
                  'R',
                  alg_ruimte_verwijder),
          aog.alg_type,
          r.alg_regio_key,
          r.alg_regio_omschrijving,
          d.alg_district_key,
          d.alg_district_omschrijving,
          l.alg_locatie_key,
          l.alg_locatie_code,
          l.alg_locatie_omschrijving,
          t.alg_terreinsector_key,
          t.alg_terreinsector_code,
          t.alg_terreinsector_naam,
          g.alg_gebouw_key,
          g.alg_gebouw_code,
          g.alg_gebouw_naam,
          g.prs_perslid_key_verantw,
          g.prs_perslid_key_verantw2,
          ( SELECT SUM (alg_ruimte_bruto_vloeropp) alg_gebouw_bvo
              FROM alg_ruimte r, alg_verdieping v
             WHERE v.alg_verdieping_key = r.alg_verdieping_key
               AND r.alg_ruimte_verwijder IS NULL
               AND alg_gebouw_key = 1701) alg_gebouw_bvo,
          alg_gebouw_bez,
          alg_gebouw_werkdagen,
          DECODE(alg_gebouw_beginuur, NULL, TO_CHAR(NULL), 0, TO_CHAR(NULL),
                 TO_CHAR(TRUNC(alg_gebouw_beginuur)) || ':' ||TO_CHAR(( alg_gebouw_beginuur - TRUNC(alg_gebouw_beginuur))*60, 'FM00')
                 ) alg_gebouw_beginuur,
          DECODE(alg_gebouw_einduur, NULL, TO_CHAR(NULL), 0, TO_CHAR(NULL),
                 TO_CHAR(TRUNC(alg_gebouw_einduur)) || ':' ||TO_CHAR(( alg_gebouw_einduur - TRUNC(alg_gebouw_einduur))*60, 'FM00')
                 ) alg_gebouw_einduur,
          ( SELECT alg_srtgebouw_omschrijving
              FROM alg_srtgebouw sg
             WHERE sg.alg_srtgebouw_key = g.alg_srtgebouw_key) alg_gebouw_functie,
          alg_gebouw_x,
          alg_gebouw_y,
          v.alg_verdieping_key,
          v.alg_verdieping_code,
          v.alg_verdieping_omschrijving,
          ru.alg_ruimte_key,
          ru.alg_ruimte_nr,
          ru.alg_ruimte_omschrijving,
          ru.alg_ruimte_bruto_vloeropp,
          ru.alg_ruimte_opp_alt1,
          ru.alg_ruimte_opp_alt2
     from alg_v_allonroerendgoed aog,
          alg_ruimte ru,
          alg_verdieping v,
          alg_terreinsector t,
          alg_gebouw g,
          alg_locatie l,
          alg_district d,
          alg_regio r
    where aog.alg_gebouw_key = g.alg_gebouw_key(+)
      and aog.alg_terreinsector_key = t.alg_terreinsector_key(+)
      and aog.alg_verdieping_key = v.alg_verdieping_key(+)
      and aog.alg_ruimte_key = ru.alg_ruimte_key(+)
      and g.alg_locatie_key = l.alg_locatie_key
      and l.alg_district_key = d.alg_district_key
      and d.alg_regio_key = r.alg_regio_key
   union all
   select to_number (null),
          alg_locatie_code,
          alg_locatie_omschrijving,
          l.alg_locatie_verwijder,
          'L',
          r.alg_regio_key,
          alg_regio_omschrijving,
          d.alg_district_key,
          alg_district_omschrijving,
          l.alg_locatie_key,
          alg_locatie_code,
          alg_locatie_omschrijving,
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_number (null),
          to_number (null),     --   alg_gebouw_bvo,
          to_number (null),     --   alg_gebouw_bez,
          to_number (null),     --   alg_gebouw_werkdagen,
          to_char (null),       --   alg_gebouw_beginuur,
          to_char (null),       --   alg_gebouw_einduur,
          to_char (null),       --   alg_gebouw_functie,
          to_number (null),     --   alg_gebouw_x,
          to_number (null),     --   alg_gebouw_y,
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_number (null),
          to_number (null)
     from alg_locatie l, alg_district d, alg_regio r
    where l.alg_district_key = d.alg_district_key
      and d.alg_regio_key = r.alg_regio_key
   union all
   select to_number (null),
          to_char (null),
          alg_district_omschrijving,
          d.alg_district_verwijder,
          'D',
          r.alg_regio_key,
          alg_regio_omschrijving,
          d.alg_district_key,
          alg_district_omschrijving,
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_number (null),
          to_number (null),     --   alg_gebouw_bvo,
          to_number (null),     --   alg_gebouw_bez,
          to_number (null),     --   alg_gebouw_werkdagen,
          to_char (null),       --   alg_gebouw_beginuur,
          to_char (null),       --   alg_gebouw_einduur,
          to_char (null),       --   alg_gebouw_functie,
          to_number (null),     --   alg_gebouw_x,
          to_number (null),     --   alg_gebouw_y,
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_number (null),
          to_number (null)
     from alg_district d, alg_regio r
    where d.alg_regio_key = r.alg_regio_key
   union all
   select to_number (null),
          to_char (null),
          alg_regio_omschrijving,
          r.alg_regio_verwijder,
          'R',
          r.alg_regio_key,
          alg_regio_omschrijving,
          to_number (null),
          to_char (null),
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_number (null),
          to_number (null),     --   alg_gebouw_bvo,
          to_number (null),     --   alg_gebouw_bez,
          to_number (null),     --   alg_gebouw_werkdagen,
          to_char (null),       --   alg_gebouw_beginuur,
          to_char (null),       --   alg_gebouw_einduur,
          to_char (null),       --   alg_gebouw_functie,
          to_number (null),     --   alg_gebouw_x,
          to_number (null),     --   alg_gebouw_y,
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_char (null),
          to_char (null),
          to_number (null),
          to_number (null),
          to_number (null)
     from alg_regio r;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_ALG_KENMERK
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_kenmerk_onrgoed
(
   alg_onrgoed_key,
   alg_kenmerk_niveau,
   alg_kenmerk_omschrijving,
   alg_kenmerk_waarde
)
AS
   SELECT aog.alg_onrgoed_key,
          k.alg_kenmerk_niveau,
          k.alg_kenmerk_omschrijving,
          aaxx_get_kenmerkwaarde (k.alg_kenmerk_kenmerktype,
                                  k.fac_kenmerkdomein_key,
                                  aog.alg_onrgoedkenmerk_waarde)
     FROM alg_kenmerk k, alg_onrgoedkenmerk aog
    WHERE k.alg_kenmerk_key = aog.alg_kenmerk_key
      AND aog.alg_onrgoedkenmerk_verwijder IS NULL;


-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_INS_SENSOR_STATUS
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_ins_sensor_status
(
   ruimte_key,
   sensor_id,
   tijdstip_aan,
   tijdstip_uit
)
AS
     SELECT d.ins_alg_ruimte_key,
            d.ins_deel_omschrijving,
            h.ins_deel_statedate,
            h.uit
       FROM (SELECT h.*,
                    LEAD (ins_deel_statedate)
                       OVER (PARTITION BY ins_deel_key ORDER BY ins_deel_statedate)
                       AS uit
               FROM ins_deel_state_history h) h,
            ins_srtdeel sd,
            ins_deel d
      WHERE h.ins_deel_key = d.ins_deel_key
        AND d.ins_srtdeel_key = sd.ins_srtdeel_key
        AND h.ins_deel_state = '1'
   ORDER BY d.ins_alg_ruimte_key, h.ins_deel_statedate;


-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_INSPECTIE
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_inspectie
(
   deelsrtcontrole_key,
   deel_key,
   deel_omschrijving,
   srtcontrole_info,
   srtcontrole_niveau,
   srtcontrole_omschrijving,
   srtcontrole_periode,
   srtcontrole_eenheid,
   deelsrtcontrole_datum,
   deelsrtcontrole_gepland,
   deelsrtcontrole_status,
   deelsrtcontrole_status_next,
   controlemode_omschrijving,
   controlemode_opmerking,
   deelsrtcontrole_opmerking,
   prs_perslid_key,
   gecontroleerd_door
)
AS
   SELECT dc.ins_deelsrtcontrole_key,
          d.ins_deel_key,
          d.ins_deel_omschrijving,
          sc.ins_srtcontrole_info,
          sc.ins_srtcontrole_niveau,
          sc.ins_srtcontrole_omschrijving,
          COALESCE (
                (SELECT ins_srtcontroledl_xcp_periode
                   FROM ins_srtcontroledl_xcp
                  WHERE d.ins_deel_key = ins_deel_key
                    AND ins_srtcontrole_key = sc.ins_srtcontrole_key),
                sc.ins_srtcontrole_periode
             ) ins_srtcontrole_periode,
          DECODE (
             COALESCE (
                (SELECT ins_srtcontroledl_xcp_eenheid
                   FROM ins_srtcontroledl_xcp
                  WHERE d.ins_deel_key = ins_deel_key
                    AND ins_srtcontrole_key = sc.ins_srtcontrole_key),
                sc.ins_srtcontrole_eenheid
             ),
             0,
             'Uurlijks',
             1,
             'Dagelijks',
             2,
             'Wekelijks',
             3,
             'Maandelijks',
             4,
             'Jaarlijks',
             'Onbekend' ) ins_srtcontrole_eenheid,
          ins_deelsrtcontrole_datum,
          (SELECT MAX (dc2.ins_deelsrtcontrole_datum)
                  + sc.ins_srtcontrole_periode
             FROM ins_deelsrtcontrole dc2
            WHERE dc2.ins_deelsrtcontrole_datum <
                     dc.ins_deelsrtcontrole_datum
              AND dc2.ins_deel_key = dc.ins_deel_key
              AND dc2.ins_srtcontrole_key = dc.ins_srtcontrole_key
              AND dc2.ins_controlemode_key = dc.ins_controlemode_key)
             ins_deelsrtcontrole_gepland,
          (SELECT DECODE (
                     SIGN(  MAX (dc2.ins_deelsrtcontrole_datum)
                          + sc.ins_srtcontrole_periode
                          - dc.ins_deelsrtcontrole_datum),
                     -1,
                     'Te laat',
                     'Op tijd')
             FROM ins_deelsrtcontrole dc2
            WHERE dc2.ins_deelsrtcontrole_datum <
                     dc.ins_deelsrtcontrole_datum
              AND dc2.ins_deel_key = dc.ins_deel_key
              AND dc2.ins_srtcontrole_key = dc.ins_srtcontrole_key
              AND dc2.ins_controlemode_key = dc.ins_controlemode_key)
             ins_deelsrtcontrole_status,
          (SELECT DECODE (
                     COUNT ( * ),
                     0,
                     DECODE (
                        SIGN( (dc.ins_deelsrtcontrole_datum
                               + sc.ins_srtcontrole_periode)
                             - SYSDATE),
                        -1,
                        'Te laat',
                        ''))
                     status_fut
             FROM ins_deelsrtcontrole dc2
            WHERE dc2.ins_deelsrtcontrole_datum >
                     dc.ins_deelsrtcontrole_datum
              AND dc2.ins_deel_key = dc.ins_deel_key
              AND dc2.ins_srtcontrole_key = dc.ins_srtcontrole_key
              AND dc2.ins_controlemode_key = dc.ins_controlemode_key)
             ins_deelsrtcontrole_next,
          cm.ins_controlemode_oms,
          cm.ins_controlemode_opmerking,
          dc.ins_deelsrtcontrole_opmerking,
          dc.prs_perslid_key,
          pf.prs_perslid_naam_full
     FROM ins_deelsrtcontrole dc,
          ins_deel d,
          ins_srtcontrole sc,
          ins_controlemode cm,
          prs_v_perslid_fullnames_all pf
    WHERE dc.ins_deel_key = d.ins_deel_key
      AND dc.ins_srtcontrole_key = sc.ins_srtcontrole_key
      AND dc.ins_controlemode_key = cm.ins_controlemode_key
      AND dc.prs_perslid_key = pf.prs_perslid_key(+);

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_INS_OBJECT
-------------------------------------------------------------------------------

CREATE OR REPLACE VIEW aaxx_v_dwh_ins_object
(
   ins_deel_key,
   identificatie,
   beschrijving,
   discipline_omschrijving,
   groep_omschrijving,
   objectsoort_omschrijving,
   objectsoort_code,
   registratiedatum,
   vervaldatum,
   koppel_type,
   plaats_eigenaar,
   beheerder
)
AS
   SELECT ins_deel_key,
          ins_deel_omschrijving identificatie,
          ins_deel_opmerking beschrijving,
          ins_discipline_omschrijving discipline_omschrijving,
          ins_srtgroep_omschrijving groep_omschrijving,
          ins_srtdeel_omschrijving objectsoort_omschrijving,
          ins_srtdeel_code objectsoort_code,
          ins_deel_aanmaak registratiedatum,
          ins_deel_vervaldatum vervaldatum,
          'Afdeling' koppel_type,
          (SELECT d.prs_afdeling_omschrijving
             FROM prs_v_afdeling d
            WHERE prs_afdeling_key =
                     COALESCE (ins_alg_ruimte_key_org, ins_alg_ruimte_key))
             plaats_eigenaar,
          pf1.prs_perslid_naam_full beheerder
     FROM ins_v_aanwezigdeel d,
          ins_v_aanwezigsrtdeel srt,
          ins_v_aanwezigsrtgroep sg,
          ins_v_aanwezigdiscipline disc,
          prs_v_perslid_fullnames_all pf1,
          prs_v_afdeling_boom pb
    WHERE srt.ins_srtdeel_key = d.ins_srtdeel_key
      AND sg.ins_srtgroep_key = srt.ins_srtgroep_key
      AND sg.ins_discipline_key = disc.ins_discipline_key
      AND prs_perslid_key_beh = pf1.prs_perslid_key(+)
      AND d.ins_alg_ruimte_key = pb.prs_afdeling_key
      AND d.ins_deel_module = 'INS'
      AND d.ins_deel_parent_key IS NULL
      AND COALESCE (ins_alg_ruimte_type_org, ins_alg_ruimte_type) = 'A'
   UNION
   SELECT ins_deel_key,
          ins_deel_omschrijving,
          ins_deel_opmerking,
          ins_discipline_omschrijving,
          ins_srtgroep_omschrijving,
          ins_srtdeel_omschrijving,
          ins_srtdeel_code,
          ins_deel_aanmaak,
          ins_deel_vervaldatum,
          'Persoon',
          COALESCE (pf2.prs_perslid_naam_full, 'onbekend') eigenaar,
          pf1.prs_perslid_naam_full
     FROM ins_v_aanwezigdeel d,
          ins_v_aanwezigsrtdeel srt,
          ins_v_aanwezigsrtgroep sg,
          ins_v_aanwezigdiscipline disc,
          prs_v_perslid_fullnames_all pf1,
          prs_v_perslid_fullnames_all pf2
    WHERE srt.ins_srtdeel_key = d.ins_srtdeel_key
      AND sg.ins_srtgroep_key = srt.ins_srtgroep_key
      AND sg.ins_discipline_key = disc.ins_discipline_key
      AND prs_perslid_key_beh = pf1.prs_perslid_key(+)
      AND d.ins_deel_module = 'INS'
      AND d.ins_deel_parent_key IS NULL
      AND COALESCE (ins_alg_ruimte_type_org, ins_alg_ruimte_type) = 'P'
      AND pf2.prs_perslid_key(+) =
             COALESCE (ins_alg_ruimte_key_org, ins_alg_ruimte_key)
   UNION
   SELECT ins_deel_key,
          ins_deel_omschrijving,
          ins_deel_opmerking,
          ins_discipline_omschrijving,
          ins_srtgroep_omschrijving,
          ins_srtdeel_omschrijving,
          ins_srtdeel_code,
          ins_deel_aanmaak,
          ins_deel_vervaldatum,
          DECODE (o.alg_onroerendgoed_type,
                  'R',
                  'Ruimte',
                  'T',
                  'Terrein',
                  'W',
                  'Werkplek'),
          o.alg_plaatsaanduiding || ' ('
          || DECODE (
                o.alg_onroerendgoed_type,
                'R',
                (SELECT r.alg_ruimte_omschrijving
                   FROM alg_ruimte r
                  WHERE r.alg_ruimte_key = d.ins_alg_ruimte_key),
                'T',
                (SELECT t.alg_terreinsector_naam
                   FROM alg_terreinsector t
                  WHERE t.alg_terreinsector_key = d.ins_alg_ruimte_key),
                'W',
                (SELECT r.alg_ruimte_omschrijving
                   FROM alg_ruimte r, prs_werkplek w
                  WHERE r.alg_ruimte_key = w.prs_alg_ruimte_key
                    AND w.prs_werkplek_key = d.ins_alg_ruimte_key)
             )
          || ')'
             eigenaar,
          pf1.prs_perslid_naam_full
     FROM ins_v_aanwezigdeel d,
          ins_v_aanwezigsrtdeel srt,
          ins_v_aanwezigsrtgroep sg,
          ins_v_aanwezigdiscipline disc,
          prs_v_perslid_fullnames_all pf1,
          ins_v_alg_overzicht o
    WHERE srt.ins_srtdeel_key = d.ins_srtdeel_key
      AND sg.ins_srtgroep_key = srt.ins_srtgroep_key
      AND sg.ins_discipline_key = disc.ins_discipline_key
      AND prs_perslid_key_beh = pf1.prs_perslid_key(+)
      AND d.ins_deel_module = 'INS'
      AND d.ins_deel_parent_key IS NULL
      AND COALESCE (ins_alg_ruimte_type_org, ins_alg_ruimte_type) IN
                ('T', 'R', 'W')
      AND o.alg_onroerendgoed_keys =
             COALESCE (ins_alg_ruimte_key_org, ins_alg_ruimte_key)
      AND o.alg_onroerendgoed_type =
             COALESCE (ins_alg_ruimte_type_org, ins_alg_ruimte_type)
      AND o.alg_locatie_key = d.ins_alg_locatie_key;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_KENMERK_INSPECTIE
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_kenmerk_inspectie
(
   deelsrtcontrole_key,
   ins_kenmerk_omschrijving,
   ins_kenmerk_waarde
)
AS
   SELECT   ins_deelsrtcontrole_key deelsrtcontrole_key,
            srt.ins_srtkenmerk_omschrijving kenmerk_omschrijving,
            aaxx_get_kenmerkwaarde (srt.ins_srtkenmerk_kenmerktype,
                                    srt.fac_kenmerkdomein_key,
                                    kds.ins_kmdeelsrtcontr_waarde)
               kenmerk_waarde
     FROM   ins_kmdeelsrtcontr kds, ins_kenmerk k, ins_srtkenmerk srt
    WHERE       kds.ins_kenmerk_key = k.ins_kenmerk_key
            AND srt.ins_srtkenmerk_key = k.ins_srtkenmerk_key
            AND ins_kmdeelsrtcontr_verwijder IS NULL;


-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_UREN
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_uren
(
   mld_opdr_id,
   prs_perslid_key,
   datum,
   uren_besteed,
   uren_opmerking,
   uren_status
)
AS
   SELECT ug.mld_melding_key || '/' || ug.mld_opdr_bedrijfopdr_volgnr,
          ug.prs_perslid_key,
          ug.mld_opdr_uren_datum,
          ug.mld_opdr_uren_besteed,
          ug.mld_opdr_uren_opmerking,
          REPLACE(ug.uren_status_tekst, '&'||'nbsp;', ' ') uren_status_tekst
     FROM aaxx_v_exact_uren_gegevens ug;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_UREN_IMPROD
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_uren_improd
(
   prs_perslid_key,
   code_improductief,
   omschr_improductief,
   datum,
   uren_besteed,
   uren_opmerking,
   uren_status
)
AS
   SELECT ou.prs_perslid_key,
          io.mld_impropdr_code,
          io.mld_impropdr_omschrijving,
          ou.mld_opdr_uren_datum,
          ou.mld_opdr_uren_besteed,
          ou.mld_opdr_uren_opmerking,
          REPLACE(lx.fac_locale_xsl_tekst, '&'||'nbsp;', ' ') fac_locale_xsl_tekst
     FROM mld_opdr_uren ou,
          mld_impropdr io,
          (SELECT *
             FROM fac_locale_xsl
            WHERE fac_locale_xsl_lang = 'NL') lx
    WHERE ou.mld_impropdr_key = io.mld_impropdr_key
      AND lx.fac_locale_xsl_label =
             'lcl_mld_uren_status_' || ou.mld_opdr_uren_status;

-------------------------------------------------------------------------------
-- DATAWAREHOUSE - DWH_TRACKING
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_tracking
AS
   SELECT t.fac_tracking_refkey ref_key,
          sn.fac_srtnotificatie_xmlnode soort,
          t.fac_tracking_datum datum,
          sn.fac_srtnotificatie_code actiecode,
          t.fac_tracking_oms omschrijving,
          t.prs_perslid_key prs_perslid_key
     FROM fac_tracking t,
          fac_srtnotificatie sn
    WHERE     sn.fac_srtnotificatie_key = t.fac_srtnotificatie_key
          AND sn.fac_srtnotificatie_xmlnode IS NOT NULL;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_BUDGET_TRACKER
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_dwh_budget_tracker
(
   nummer,
   datum,
   status,
   laatste_actie,
   vakgroeptype,
   vakgroep,
   kostensoort_code,
   kostensoort_omschrijving,
   financiele_waarde,
   kostensoortgroep_omschrijving,
   melding,
   omschrijving,
   organisatie,
   naam,
   kostenplaats,
   kostenplaats_omschrijving,
   plaats,
   locatie,
   gebouw,
   code_exact,
   opdracht_status,
   uitvoerende,
   contactpersoon,
   uren,
   uurloon,
   materiaal,
   kosten,
   gefactureerd
)
AS
   SELECT m.mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr nummer,
          o.mld_opdr_datumbegin datum,
          (SELECT mld_statusopdr_omschrijving
             FROM mld_statusopdr s
            WHERE o.mld_statusopdr_key = s.mld_statusopdr_key)
             status,
          mld.getopdrachtstatusdate (o.mld_opdr_key, mld_statusopdr_key)
             laatste_actie,
          sd.ins_srtdiscipline_prefix vakgroeptype,
          md.ins_discipline_omschrijving vakgroep,
          COALESCE (kstd.prs_kostensoort_oms, kvg.prs_kostensoort_oms)
             kostensoort_code,
          COALESCE (kstd.prs_kostensoort_opmerking,
                    kvg.prs_kostensoort_opmerking)
             kostensoort_omschrijving,
          COALESCE (kstd.prs_kostensoort_refcode,
                    kvg.prs_kostensoort_refcode)
             financiele_waarde,
          (SELECT prs_kostensoortgrp_oms
             FROM prs_kostensoortgrp ksg
            WHERE ksg.prs_kostensoortgrp_key =
                     COALESCE (kstd.prs_kostensoortgrp_key,
                               kvg.prs_kostensoortgrp_key))
             kostensoortgroep_omschrijving,
          std.mld_stdmelding_omschrijving melding,
          mld_melding_omschrijving omschrijving,
          (SELECT d.prs_afdeling_naam
             FROM prs_v_afdeling d
            WHERE p.prs_afdeling_key = d.prs_afdeling_key)
             organisatie,
          p.prs_perslid_naam
          || DECODE (NVL (p.prs_perslid_voorletters, ''),
                     '', '',
                     ', ' || p.prs_perslid_voorletters)
          || DECODE (NVL (p.prs_perslid_tussenvoegsel, ''),
                     '', '',
                     ' ' || p.prs_perslid_tussenvoegsel)
          || DECODE (NVL (p.prs_perslid_voornaam, ''),
                     '', '',
                     ' (' || p.prs_perslid_voornaam || ')')
             naam,
          (SELECT k.prs_kostenplaats_nr
             FROM prs_kostenplaats k
            WHERE k.prs_kostenplaats_key = o.prs_kostenplaats_key)
             kostenplaats,
          (SELECT k.prs_kostenplaats_omschrijving
             FROM prs_kostenplaats k
            WHERE k.prs_kostenplaats_key = o.prs_kostenplaats_key)
             kostenplaats_omschrijving,
          (SELECT alg_locatie_code
             FROM alg_locatie l
            WHERE m.mld_alg_locatie_key = l.alg_locatie_key)
          || (SELECT CASE COALESCE (g.alg_gebouw_code, '')
                        WHEN '' THEN ''
                        ELSE '-' || g.alg_gebouw_code
                     END
                     || CASE COALESCE (g.alg_verdieping_code, '')
                           WHEN '' THEN ''
                           ELSE '-' || g.alg_verdieping_code
                        END
                     || CASE COALESCE (g.alg_ruimte_nr, '')
                           WHEN '' THEN ''
                           ELSE '-' || g.alg_ruimte_nr
                        END
                FROM alg_v_allonrgoed_gegevens g
               WHERE m.mld_alg_onroerendgoed_keys = g.alg_onroerendgoed_keys)
             plaats,
          alg_locatie_code locatie,
          alg_gebouw_code gebouw,
          COALESCE ( (SELECT exact_code
                        FROM aaxx_v_exact_code_gebouw ogk
                       WHERE ogk.alg_gebouw_key = v.alg_gebouw_key),
                    v.alg_gebouw_code)
             code_exact,
          (SELECT mld_statusopdr_omschrijving
             FROM mld_statusopdr so
            WHERE o.mld_statusopdr_key = so.mld_statusopdr_key)
             opdracht_status,
          COALESCE ( (SELECT prs_bedrijf_naam
                        FROM prs_bedrijf b
                       WHERE o.mld_uitvoerende_keys = prs_bedrijf_key),
                    (SELECT prs_perslid_naam_full
                       FROM prs_v_perslid_fullnames_all
                      WHERE o.mld_uitvoerende_keys = prs_perslid_key))
             uitvoerende,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames_all pf
            WHERE o.prs_perslid_key = pf.prs_perslid_key)
             contactpersoon,
          o.mld_opdr_uren uren,
          o.mld_opdr_uurloon uurloon,
          o.mld_opdr_materiaal materiaal,
          o.mld_opdr_kosten kosten,
          COALESCE ( (SELECT SUM (f.fin_factuur_totaal)
                        FROM aaxx_v_aanwezigfactuur f
                       WHERE f.mld_opdr_key = o.mld_opdr_key), 0)
             gefactureerd
     FROM mld_melding m,
          mld_discipline md,
          ins_srtdiscipline sd,
          alg_v_allonrgoed_gegevens v,
          alg_locatie l,
          alg_district di,
          prs_perslid p,
          mld_opdr o,
          mld_stdmelding std,
          prs_kostensoort kstd,
          prs_kostensoort kvg
    WHERE m.mld_alg_locatie_key = l.alg_locatie_key(+)
      AND l.alg_district_key = di.alg_district_key(+)
      AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key(+)
      AND m.mld_alg_onroerendgoed_keys = v.alg_onroerendgoed_keys(+)
      AND m.prs_perslid_key = p.prs_perslid_key
      AND m.mld_stdmelding_key = std.mld_stdmelding_key
      AND std.mld_ins_discipline_key = md.ins_discipline_key
      AND m.mld_melding_key = o.mld_melding_key
      AND std.prs_kostensoort_key = kstd.prs_kostensoort_key(+)
      AND md.prs_kostensoort_key = kvg.prs_kostensoort_key(+)
   UNION ALL
   SELECT cnt_contract_nummer_intern,
          c.cnt_contract_looptijd_van,
          DECODE (
             SIGN (cnt_contract_looptijd_van - SYSDATE),
             1,
             'Toekomst',
             -1,
             DECODE (SIGN (cnt_contract_looptijd_tot - SYSDATE),
                     1, 'Actueel',
                     -1, 'Verlopen'))
             status,
          c.cnt_contract_looptijd_tot laatste_actie,
          'Contract' vakgroeptype,
          d.ins_discipline_omschrijving vakgroep,
          k.prs_kostensoort_oms kostensoort_code,
          k.prs_kostensoort_opmerking kostensoort_omschrijving,
          k.prs_kostensoort_refcode financiele_waarde,
          (SELECT prs_kostensoortgrp_oms
             FROM prs_kostensoortgrp ksg
            WHERE ksg.prs_kostensoortgrp_key = k.prs_kostensoortgrp_key)
             kostensoortgroep_omschrijving,
          c.cnt_contract_omschrijving melding,
          SUBSTR (
             REPLACE (cnt_contract_document, CHR (13) || CHR (10), '<ret>'),
             1,
             2000)
             omschrijving,
          prs_afdeling_naam organisatie,
          p.prs_perslid_naam
          || DECODE (NVL (p.prs_perslid_voorletters, ''),
                     '', '',
                     ', ' || p.prs_perslid_voorletters)
          || DECODE (NVL (p.prs_perslid_tussenvoegsel, ''),
                     '', '',
                     ' ' || p.prs_perslid_tussenvoegsel)
          || DECODE (NVL (p.prs_perslid_voornaam, ''),
                     '', '',
                     ' (' || p.prs_perslid_voornaam || ')')
             naam,
          kp.prs_kostenplaats_nr kostenplaats,
          kp.prs_kostenplaats_omschrijving kostenplaats_omschrijving,
          alg_locatie_code || '-' || alg_gebouw_code plaats,
          alg_locatie_code locatie,
          alg_gebouw_code gebouw,
          COALESCE ( (SELECT exact_code
                        FROM aaxx_v_exact_code_gebouw ogk
                       WHERE ogk.alg_gebouw_key = g.alg_gebouw_key),
                    g.alg_gebouw_code)
             code_exact,
          '-' opdracht_status,
          prs_bedrijf_naam uitvoerende,
          '-' contactpersoon,
          0 uren,
          0 uurloon,
          0 materiaal,
          COALESCE (
             DECODE (
                cnt_gew.cnt_contract_plaats_gewicht,
                0,
                1,
                (cp.cnt_contract_plaats_gewicht
                 / cnt_gew.cnt_contract_plaats_gewicht)
                * c.cnt_contract_kosten),
             0)
             kosten,
          COALESCE (
             DECODE (
                cnt_gew.cnt_contract_plaats_gewicht,
                0,
                1,
                (cp.cnt_contract_plaats_gewicht
                 / cnt_gew.cnt_contract_plaats_gewicht)
                * (SELECT SUM (fin_factuur_totaal)
                     FROM aaxx_v_aanwezigfactuur f
                    WHERE f.cnt_contract_key = c.cnt_contract_key)),
             0)
             gefactureerd
     FROM cnt_contract c,
          cnt_discipline d,
          cnt_contract_plaats cp,
          prs_bedrijf b,
          prs_kostensoort k,
          prs_kostenplaats kp,
          prs_afdeling a,
          prs_perslid p,
          alg_locatie l,
          alg_gebouw g,
          prs_contactpersoon cop,
          (  SELECT cnt_contract_key,
                    SUM (cnt_contract_plaats_gewicht)
                       cnt_contract_plaats_gewicht
               FROM cnt_contract_plaats
           GROUP BY cnt_contract_key) cnt_gew,
          (SELECT cp.cnt_contract_plaats_key, alg_locatie_key, alg_gebouw_key
             FROM alg_v_allonroerendgoed aog, cnt_contract_plaats cp
            WHERE aog.alg_type = cp.cnt_alg_plaats_code
              AND aog.alg_onroerendgoed_keys = cp.cnt_alg_plaats_key) cog
    WHERE c.cnt_contract_key = cp.cnt_contract_key(+)
      AND c.cnt_contract_key = cnt_gew.cnt_contract_key(+)
      AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
      AND c.ins_discipline_key = d.ins_discipline_key
      AND d.prs_kostensoort_key = k.prs_kostensoort_key(+)
      AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
      AND c.prs_afdeling_key_eig = a.prs_afdeling_key
      AND c.prs_perslid_key_beh = p.prs_perslid_key
      AND cp.cnt_contract_plaats_key = cog.cnt_contract_plaats_key(+)
      AND c.prs_contactpersoon_key = cop.prs_contactpersoon_key(+)
      AND cog.alg_locatie_key = l.alg_locatie_key(+)
      AND cog.alg_gebouw_key = g.alg_gebouw_key(+)
      AND cnt_contract_verwijder IS NULL;

-------------------------------------------------------------------------------
-- EXPORTFUNCTIE - DWH_SEARCH_RESULTS
-------------------------------------------------------------------------------

CREATE OR REPLACE VIEW aaxx_v_dwh_gui_counter
(
   fac_gui_counter_key,
   fac_gui_counter_group,
   fac_gui_counter_info,
   fac_gui_counter_refkey,
   fac_gui_counter_choice,
   fac_gui_counter_result,
   fac_gui_counter_date,
   prs_perslid_key,
   prs_perslid_naam_full
)
AS
   SELECT   fgc.fac_gui_counter_key,
            fgc.fac_gui_counter_group,
            fgc.fac_gui_counter_info,
            fgc.fac_gui_counter_refkey,
            choice.fac_gui_counter_info fac_gui_counter_choice,
            result.fac_gui_counter_info fac_gui_counter_result,
            fac_gui_counter_date,
            fgc.prs_perslid_key,
            prs_perslid_naam_full
     FROM   fac_gui_counter fgc,
            prs_v_perslid_fullnames pf,
            (SELECT   fac_gui_counter_refkey, fac_gui_counter_info
               FROM   fac_gui_counter fgc
              WHERE   fac_gui_counter_info IS NOT NULL
                      AND fac_gui_counter_group = 'searchchoice') choice,
            (SELECT   fac_gui_counter_refkey, fac_gui_counter_info
               FROM   fac_gui_counter fgc
              WHERE   fac_gui_counter_info IS NOT NULL
                      AND fac_gui_counter_group = 'searchresult') result
    WHERE       fac_gui_counter_group = 'search'
            AND fgc.fac_gui_counter_info IS NOT NULL
            AND fgc.prs_perslid_key = pf.prs_perslid_key
            AND choice.fac_gui_counter_refkey(+) = fgc.fac_gui_counter_key
            AND result.fac_gui_counter_refkey(+) = fgc.fac_gui_counter_key
   UNION ALL
   SELECT   fgc.fac_gui_counter_key,
            fgc.fac_gui_counter_group,
            fac_usrrap_omschrijving,
            fgc.fac_gui_counter_refkey,
            NULL,
            NULL,
            fac_gui_counter_date,
            fgc.prs_perslid_key,
            prs_perslid_naam_full
     FROM   fac_gui_counter fgc, prs_v_perslid_fullnames pf, fac_usrrap fr
    WHERE       fgc.fac_gui_counter_group = 'report'
            AND fgc.prs_perslid_key = pf.prs_perslid_key(+)
            AND fr.fac_usrrap_key(+) = fgc.fac_gui_counter_refkey
   UNION ALL
   SELECT   fgc.fac_gui_counter_key,
            fgc.fac_gui_counter_group,
            COALESCE (fac_menu_altlabel, lcl.l (fac_menuitems_label)),
            fgc.fac_gui_counter_refkey,
            NULL,
            NULL,
            fac_gui_counter_date,
            fgc.prs_perslid_key,
            prs_perslid_naam_full
     FROM   fac_gui_counter fgc,
            prs_v_perslid_fullnames pf,
            fac_menu m,
            fac_menuitems mi
    WHERE       fgc.fac_gui_counter_group = 'menu'
            AND fgc.prs_perslid_key = pf.prs_perslid_key(+)
            AND m.fac_menu_key = fac_gui_counter_refkey
            AND mi.fac_menuitems_key(+) = m.fac_menuitems_key;

-------------------------------------------------------------------------------
-- Rapportage tbv berekening aantal key users
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_lcrap_key_stats
(
   PRS_PERSLID_KEY,
   PRS_PERSLID_OSLOGIN,
   PRS_PERSLID_OSLOGIN2,
   PRS_PERSLID_NR,
   PRS_PERSLID_NAAM_FULL,
   PRS_AFDELING_NAAM,
   LEV_WRITE_CNT,
   MAX_ALG_WRITE,
   MAX_PRS_WRITE,
   LEV_READ_CNT,
   MAX_ALG_READ,
   MAX_PRS_READ,
   AUT_GROEP_CNT
)
AS
   SELECT x.prs_perslid_key,
          x.prs_perslid_oslogin,
          x.prs_perslid_oslogin2,
          x.prs_perslid_nr,
          x.prs_perslid_naam_full,
          prs_afdeling_naam,
          COALESCE (y.lev_write_cnt, 0) lev_write_cnt,
          y.max_alg_write,
          y.max_prs_write,
          COALESCE (z.lev_read_cnt, 0) lev_read_cnt,
          z.max_alg_read,
          z.max_prs_read,
          x.aut_groep_cnt
     FROM (  SELECT fn.prs_perslid_key,
                    p.prs_perslid_oslogin,
                    p.prs_perslid_oslogin2,
                    kl.prs_kenmerklink_waarde prs_perslid_nr,
                    prs_afdeling_naam,
                    fn.prs_perslid_naam_full,
                    COUNT (DISTINCT gg.fac_groep_key) aut_groep_cnt
               FROM prs_v_aanwezigperslid p,
                    prs_afdeling a,
                    prs_v_perslid_fullnames fn,
                    fac_gebruikersgroep gg,
                    (SELECT prs_kenmerklink_waarde, prs_link_key
                       FROM prs_kenmerklink
                      WHERE prs_kenmerk_key = 3) kl -- personeelsnummer AAFM
              WHERE     a.prs_afdeling_key = p.prs_afdeling_key
                    AND p.prs_perslid_oslogin IS NOT NULL
                    AND p.prs_perslid_key = fn.prs_perslid_key
                    AND p.prs_perslid_key = gg.prs_perslid_key
                    AND p.prs_perslid_key = kl.prs_link_key(+)
           GROUP BY fn.prs_perslid_key,
                    fn.prs_perslid_naam_full,
                    prs_perslid_oslogin,
                    prs_perslid_oslogin2,
                    kl.prs_kenmerklink_waarde,
                    prs_afdeling_naam) x
          LEFT JOIN (  SELECT gg.prs_perslid_key,
                              COUNT (DISTINCT gr.fac_groeprechten_key)
                                 lev_write_cnt,
                              MIN (gr.fac_gebruiker_alg_level_write)
                                 max_alg_write,
                              MIN (gr.fac_gebruiker_prs_level_write)
                                 max_prs_write
                         FROM fac_gebruikersgroep gg,
                              fac_groeprechten gr,
                              fac_functie f
                        WHERE     gg.fac_groep_key = gr.fac_groep_key
                              AND gr.fac_functie_key = f.fac_functie_key
                              AND fac_functie_groep IN (1, 2)
                              AND (gr.fac_gebruiker_alg_level_write <> 9
                                   OR gr.fac_gebruiker_prs_level_write <> 9)
                     GROUP BY gg.prs_perslid_key) y
             ON x.prs_perslid_key = y.prs_perslid_key
          LEFT JOIN (  SELECT gg.prs_perslid_key,
                              COUNT (DISTINCT gr.fac_groeprechten_key)
                                 lev_read_cnt,
                              MIN (gr.fac_gebruiker_alg_level_read)
                                 max_alg_read,
                              MIN (gr.fac_gebruiker_prs_level_read)
                                 max_prs_read
                         FROM fac_gebruikersgroep gg,
                              fac_groeprechten gr,
                              fac_functie f
                        WHERE     gg.fac_groep_key = gr.fac_groep_key
                              AND gr.fac_functie_key = f.fac_functie_key
                              AND fac_functie_groep IN (1, 2)
                              AND (gr.fac_gebruiker_alg_level_read <> 9
                                   OR gr.fac_gebruiker_prs_level_read <> 9)
                     GROUP BY gg.prs_perslid_key) z
             ON x.prs_perslid_key = z.prs_perslid_key
    WHERE COALESCE (y.lev_write_cnt, 0) > 0
          OR COALESCE (z.lev_read_cnt, 0) > 0;


--=============================================================================
-- IMPORTFUNCTIES
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
-- IMPORTFUNCTIE - Import srtruimte
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_rap_srtruimte (
   key,
   omschrijving,
   code,
   werkplek,
   verhuurbaar,
   huur,
   sk_onderhoud,
   sk_utility,
   sk_overig,
   prijs5
   )
AS
   SELECT alg_srtruimte_key,
          alg_srtruimte_omschrijving,
          alg_srtruimte_code,
          prs_bevat_werkplek,
          prs_verhuurbaar,
          alg_srtruimte_prijs,
          alg_srtruimte_prijs2,
          alg_srtruimte_prijs3,
          alg_srtruimte_prijs4,
          alg_srtruimte_prijs5
   FROM alg_v_aanwezigsrtruimte;

CREATE OR REPLACE PROCEDURE aaxx_import_srtruimte (
   p_import_key IN NUMBER
)
AS
   CURSOR c_cursor
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;

   v_newline          VARCHAR2 (1000);
   v_aanduiding       VARCHAR2 (1000);                                                                   -- Import line
   v_field            VARCHAR2 (100);                                                                   -- Import field
   v_fielddelimitor   VARCHAR2 (1);                                                                  -- Field seperator
   v_errormsg         VARCHAR (200);
   v_errorhint        VARCHAR (200);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_skipfield        VARCHAR2 (100);
   -- De importvelden
   v_key              VARCHAR2 (100);
   v_omschrijving     VARCHAR2 (100);
   v_code             VARCHAR2 (100);
   v_werkplek         VARCHAR2 (100);
   v_verhuurbaar      VARCHAR2 (100);
   v_prijs1           VARCHAR2 (100);
   v_prijs2           VARCHAR2 (100);
   v_prijs3           VARCHAR2 (100);
   v_prijs4           VARCHAR2 (100);
   v_prijs5           VARCHAR2 (100);
   header_found       BOOLEAN;

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

   -- Clear my previous imported rows
   DELETE FROM aaxx_imp_srtruimte;

   FOR rec1 IN c_cursor
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := v_newline;

         IF SUBSTR (v_newline, 1, 3) = '?'
         THEN
            -- EF BB BF aangetroffen
            fac.imp_writelog (p_import_key,
                              'W',
                              'Byte Order Mark aangetroffen',
                              'Bestand heeft onbehandeld UTF-8 formaat.'
                             );
            v_newline := SUBSTR (v_newline, 4);
         END IF;

         fac.imp_getfield (v_newline, v_fielddelimitor, v_key);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_omschrijving);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_code);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_werkplek);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_verhuurbaar);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_prijs1);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_prijs2);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_prijs3);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_prijs4);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_prijs5);


         -- Skip until a valid header is found
         IF     UPPER(v_key)    = 'KEY'
            AND UPPER(v_code)   = 'CODE'
            AND UPPER(v_prijs1) = 'HUUR'
            AND UPPER(v_prijs5) = 'PRIJS5'
         THEN
            -- Sla de kopregel over.
            header_found := TRUE;
         ELSIF (header_found AND v_omschrijving IS NOT NULL)
         THEN
            INSERT INTO aaxx_imp_srtruimte
                        (alg_srtruimte_key,
                         alg_srtruimte_omschrijving,
                         alg_srtruimte_code,
                         prs_bevat_werkplek,
                         prs_verhuurbaar,
                         alg_srtruimte_prijs,
                         alg_srtruimte_prijs2,
                         alg_srtruimte_prijs3,
                         alg_srtruimte_prijs4,
                         alg_srtruimte_prijs5 )
                 VALUES (fac.safe_to_number (v_key),
                         SUBSTR (v_omschrijving, 1, 30),
                         SUBSTR (v_code, 1, 10),
                         fac.safe_to_number (SUBSTR(v_werkplek, 1)),
                         fac.safe_to_number (SUBSTR(v_verhuurbaar, 1)),
                         fac.safe_to_number (REPLACE(v_prijs1,',','.')),
                         fac.safe_to_number (REPLACE(v_prijs2,',','.')),
                         fac.safe_to_number (REPLACE(v_prijs3,',','.')),
                         fac.safe_to_number (REPLACE(v_prijs4,',','.')),
                         fac.safe_to_number (REPLACE(v_prijs5,',','.'))
                        );
         END IF;

         COMMIT;
      END;
   END LOOP;

   IF NOT header_found
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Geen geldige header aangetroffen',
                        'Bestand is geen geldig ruimtesoort importbestand.'
                       );
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', SUBSTR (v_errormsg, 1, 1000), v_aanduiding);
      -- maak de importtabel leeg om te voorkomen dat er halve bestanden ingelezen worden.
      DELETE FROM aaxx_imp_srtruimte;
END;
/


CREATE OR REPLACE PROCEDURE aaxx_update_srtruimte (p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT *
        FROM aaxx_imp_srtruimte
       WHERE alg_srtruimte_omschrijving is not NULL;

   v_oldcount     NUMBER;
   v_newcount     NUMBER;
   v_prs_bedrijf_key  NUMBER;
   v_prs_dienst_key   NUMBER;
   v_alg_locatie_key  NUMBER;
   v_alg_gebouw_key   NUMBER;
   v_errormsg         VARCHAR (1000);
   v_error_hint       VARCHAR (1000);
   oracle_err_mes     VARCHAR2 (150);
   oracle_err_num     VARCHAR2 (150);
   currentversion     fac_module.fac_module_version%TYPE;
BEGIN

   SELECT MAX (fac_module_version)
     INTO currentversion
     FROM fac_module;

   fac.imp_writelog (p_import_key,
                     'I',
                     'AAFM ruimtesoort import version ' || currentversion,
                     '$Revision$'
                    );

   SELECT COUNT (*)
     INTO v_newcount
     FROM alg_v_aanwezigsrtruimte;

   IF v_newcount = 0 THEN
     fac.imp_writelog (p_import_key,
                       'E',
                       'AAFM ruimtesoort import bevat geen records',
                       '$Revision$'
                      );
     return;
   END IF;

   -- How many active records are now present?
   SELECT COUNT (*)
     INTO v_oldcount
     FROM alg_v_aanwezigsrtruimte;

   FOR rec IN c
   LOOP
      BEGIN
         IF rec.alg_srtruimte_key IS NULL THEN
            v_errormsg := 'Toevoegen ruimtesoort [' || rec.alg_srtruimte_code || '] ';
           INSERT INTO alg_srtruimte (
              alg_srtruimte_omschrijving,
              alg_srtruimte_code,
              prs_bevat_werkplek,
              prs_verhuurbaar,
              alg_srtruimte_prijs,
              alg_srtruimte_prijs2,
              alg_srtruimte_prijs3,
              alg_srtruimte_prijs4,
              alg_srtruimte_prijs5)
           VALUES (
              rec.alg_srtruimte_omschrijving,
              rec.alg_srtruimte_code,
              rec.prs_bevat_werkplek,
              rec.prs_verhuurbaar,
              rec.alg_srtruimte_prijs,
              rec.alg_srtruimte_prijs2,
              rec.alg_srtruimte_prijs3,
              rec.alg_srtruimte_prijs4,
              rec.alg_srtruimte_prijs5);
         ELSE
            v_errormsg := 'Aanpassen ruimtesoort [' || rec.alg_srtruimte_code || '] ';
            UPDATE alg_srtruimte SET
              alg_srtruimte_omschrijving = rec.alg_srtruimte_omschrijving,
              alg_srtruimte_code         = rec.alg_srtruimte_code,
              prs_bevat_werkplek         = rec.prs_bevat_werkplek,
              prs_verhuurbaar            = rec.prs_verhuurbaar,
              alg_srtruimte_prijs        = rec.alg_srtruimte_prijs,
              alg_srtruimte_prijs2       = rec.alg_srtruimte_prijs2,
              alg_srtruimte_prijs3       = rec.alg_srtruimte_prijs3,
              alg_srtruimte_prijs4       = rec.alg_srtruimte_prijs4,
              alg_srtruimte_prijs5       = rec.alg_srtruimte_prijs5
            WHERE alg_srtruimte_key = rec.alg_srtruimte_key;
         END IF;

         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            v_error_hint     := v_errormsg;
            oracle_err_num   := SQLCODE;
            oracle_err_mes   := SUBSTR (SQLERRM, 1, 100);
            v_errormsg       :=
                  v_errormsg
               || 'ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_errormsg,
                              v_error_hint
            );
            COMMIT;                                             -- tbv logging
      END;
   END LOOP;

   SELECT COUNT (*)
     INTO v_newcount
     FROM alg_v_aanwezigsrtruimte;

   fac.imp_writelog (p_import_key,
                     'S',
                     'Aantal ruimte soorten vooraf: ' || TO_CHAR (v_oldcount) || '  nu: ' || TO_CHAR (v_newcount),
                     ''
                    );

END;
/

--------------------------------
-- import facturen
--------------------------------

-- rapportage factuurvoorstel inkoopfacturen. Het resultaat kan met onderstaande importroutines ingelezen worden.
CREATE OR REPLACE VIEW aaxx_v_rap_inkoopfactuur
(
   fclt_x_bedrijfnaam,
   fclt_x_afrond_datum,
   leveranciernr,
   factuurnr,
   factuurdatum,
   ordernr,
   locatie,
   afleverdatum,
   omschrijving,
   aantal,
   kostprijs,
   btwbedrag,
   btw,
   docid,
   debiteurnummer,
   opmerking,
   lastinvoice,
   btwverlegd,
   gebouw,
   orderomschrijving,
   referentie,
   afmelddatum,
   uren,
   materiaal
)
AS
   SELECT   prs_bedrijf_naam bedrijfsnaam,
            tr2.fac_tracking_datum datum,
            prs_leverancier_nr leveranciernr,
            NULL factuurnr,
            NULL factuurdatum,
            (SELECT      sd.ins_srtdiscipline_prefix
                      || m.mld_melding_key
                      || '/'
                      || o.mld_opdr_bedrijfopdr_volgnr
               FROM   mld_melding m,
                      mld_stdmelding std,
                      ins_tab_discipline d,
                      ins_srtdiscipline sd
              WHERE       o.mld_melding_key = m.mld_melding_key
                      AND m.mld_stdmelding_key = std.mld_stdmelding_key
                      AND std.mld_ins_discipline_key = d.ins_discipline_key
                      AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key)
               ordernr,
            (SELECT   alg_locatie_code || ' - ' || alg_locatie_omschrijving
               FROM   alg_locatie l
              WHERE   l.alg_locatie_key = m.mld_alg_locatie_key)
               locatie,
            TO_CHAR (mld_opdr_datumbegin, 'ddmmyyyy') afleverdatum,
            NULL omschrijving,
            1 aantal,
            o.mld_opdr_kosten kostprijs,
            NULL btwbedrag,
            21 btw,
            NULL docid,
            NULL debiteurnummer,
            NULL opmerking,
            'Ja' lastinvoice,
            'Nee' btwverlegd,
            (SELECT   og.alg_gebouw_code || ' - ' || og.alg_gebouw_naam
               FROM   alg_v_allonrgoed_gegevens og
              WHERE   m.mld_alg_onroerendgoed_keys =
                         og.alg_onroerendgoed_keys)
               gebouw,
            REPLACE (REPLACE (o.mld_opdr_omschrijving, CHR (13), ''),
                     CHR (10),
                     '<ret>')
               orderomschrijving,
            (SELECT   mld_kenmerkopdr_waarde
               FROM   mld_srtkenmerk sk, mld_kenmerk k, mld_kenmerkopdr ko
              WHERE       sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
                      AND mld_kenmerk_niveau = 'O'
                      AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                      AND ko.mld_kenmerkopdr_verwijder IS NULL
                      AND ko.mld_opdr_key = o.mld_opdr_key
                      AND mld_srtkenmerk_omschrijving LIKE
                            'Ref. Nr. Leverancier%')
               referentie,
            tr.fac_tracking_datum afmelddatum,
            o.mld_opdr_uren,
            o.mld_opdr_materiaal
     FROM   prs_bedrijf b,
            mld_opdr o,
            mld_melding m,
            mld_typeopdr ot,
            fac_tracking tr,
            fac_tracking tr2,
            fac_srtnotificatie str,
            fac_srtnotificatie str2
    WHERE       o.mld_uitvoerende_keys = b.prs_bedrijf_key
            AND tr.fac_srtnotificatie_key = str.fac_srtnotificatie_key
            AND tr2.fac_srtnotificatie_key = str2.fac_srtnotificatie_key
            AND str.fac_srtnotificatie_code = 'ORDAFM'
            AND str2.fac_srtnotificatie_code = 'ORDAFR'
            AND o.mld_opdr_key = tr.fac_tracking_refkey
            AND o.mld_opdr_key = tr2.fac_tracking_refkey
            AND o.mld_melding_key = m.mld_melding_key
            AND o.mld_statusopdr_key = 9                           -- Afgerond
            AND o.mld_opdr_kosten <> 0
            AND o.mld_typeopdr_key = ot.mld_typeopdr_key
            AND (ot.mld_typeopdr_omschrijving = 'Workorder'
                 OR ot.mld_typeopdr_omschrijving = 'Projectorder')
            AND NOT EXISTS
                  (SELECT   mld_kenmerkopdr_key
                     FROM   mld_kenmerkopdr ko, mld_kenmerk k
                    WHERE   mld_opdr_key = o.mld_opdr_key
                            AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                            AND k.mld_srtkenmerk_key =
                                  DECODE (aaxx_get_user,
                                          'SITECH', 321,         -- Reden 0 order
                                          'ENEXIS', 221,
                                          'FPC', 1,
                                          'IT', 381,
                                          'NS', 661,
                                          'SABIC', 34,
                                          2))
            AND NOT EXISTS
                  (SELECT   mld_kenmerkopdr_key
                     FROM   mld_kenmerkopdr ko,
                            mld_kenmerk k,
                            mld_srtkenmerk sk
                    WHERE       mld_opdr_key = o.mld_opdr_key
                            AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                            AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key
                            AND UPPER (sk.mld_srtkenmerk_omschrijving) =
                                  'CLAUSULE'
                            AND UPPER(aaxx_get_kenmerkwaarde (
                                         sk.mld_srtkenmerk_kenmerktype,
                                         sk.fac_kenmerkdomein_key,
                                         ko.mld_kenmerkopdr_waarde
                                      )) = 'BINNEN CLAUSULE');

-- AAVL#33405 rapportage factuurvoorstel inkoopfacturen tbv bestellingen.
-- Het resultaat kan met onderstaande importroutines ingelezen worden.
CREATE OR REPLACE VIEW aaxx_v_rap_bes_inkfactuur
(
   FCLT_X_BEDRIJFNAAM,
   FCLT_X_LEVER_DATUM,
   LEVERANCIERNR,
   FACTUURNR,
   FACTUURDATUM,
   ORDERNR,
   LOCATIE,
   AFLEVERDATUM,
   OMSCHRIJVING,
   AANTAL,
   KOSTPRIJS,
   BTWBEDRAG,
   BTW,
   DOCID,
   DEBITEURNUMMER,
   OPMERKING,
   LASTINVOICE,
   BTWVERLEGD,
   GEBOUW,
   ORDEROMSCHRIJVING,
   REFERENTIE,
   AFMELDDATUM,
   UREN,
   MATERIAAL
)
AS
     SELECT   prs_bedrijf_naam,
              ft.fac_tracking_datum datum,
              prs_leverancier_nr leveranciernr,
              NULL factuurnr,
              NULL factuurdatum,
              bes_bestelopdr_id,
              (SELECT   alg_locatie_code || ' - ' || alg_locatie_omschrijving
                 FROM   alg_locatie l
                WHERE   l.alg_locatie_key = ma.alg_locatie_key)
                 locatie,
              TO_CHAR (ft.fac_tracking_datum, 'ddmmyyyy') afleverdatum,
              NULL omschrijving,
              SUM (bes_bestelopdr_item_aantalontv) aantal,
              SUM (bes_bestelopdr_item_prijs * bes_bestelopdr_item_aantalontv) kostprijs,
              NULL btwbedrag,
              bes_srtdeel_btw BTW,
              NULL docid,
              NULL debiteurnummer,
              NULL opmerking,
              'Ja' lastinvoice,
              'Nee' btwverlegd,
              NULL gebouw,
              NULL orderomschrijving,
              NULL referentie,
              ft.fac_tracking_datum afmelddatum,
              NULL uren,
              NULL materiaal
       FROM   bes_bestelopdr bo,
              prs_bedrijf b,
              mld_adres ma,
              bes_bestelopdr_item bboi,
              bes_bestelling_item bbi,
              bes_srtdeel bsd,
              fac_tracking ft,
              fac_srtnotificatie srt
      WHERE       bes_bestelopdr_status = 6
              AND b.prs_bedrijf_key = bo.prs_bedrijf_key
              AND bo.mld_adres_key_lev = ma.mld_adres_key
              AND bo.bes_bestelopdr_key = bboi.bes_bestelopdr_key
              AND bbi.bes_bestelopdr_item_key = bboi.bes_bestelopdr_item_key
              AND bbi.bes_srtdeel_key = bsd.bes_srtdeel_key
              AND ft.fac_tracking_refkey = bo.bes_bestelopdr_key
              AND srt.fac_srtnotificatie_key = ft.fac_srtnotificatie_key
              AND srt.fac_srtnotificatie_code = 'BES2AF'
   GROUP BY   prs_bedrijf_naam,
              TO_CHAR (ft.fac_tracking_datum, 'yyyy-mm'),
              prs_leverancier_nr,
              bes_bestelopdr_id,
              ma.alg_locatie_key,
              ft.fac_tracking_datum,
              bes_srtdeel_btw,
              ft.fac_tracking_datum;

CREATE OR REPLACE PROCEDURE aaxx_import_factuur (p_import_key IN NUMBER)
AS

    -- Standaard volgorde van de kolommen in het CSV-formaat, waarbij 3 velden VERPLICHT (minimaal door Facilitor vereist)
    -- Variabelelijst
    -- v_leveranciernr: 1
    -- v_factuurnr: 2            (VERPLICHT, anders zet Facilitor '-' in factuurnr, en is status van factuur "Incompleet")
    -- v_factuurdatum: 3
    -- v_ordernr: 4              (VERPLICHT, anders is status van factuur "Incompleet")
    -- v_locatie: 5
    -- v_afleverdatum: 6
    -- v_omschrijving: 7
    -- v_aantal: 8
    -- v_kostprijs: 9            (VERPLICHT, anders is status van factuur "Incompleet")
    -- v_btw_bedrag: 10          (VERPLICHT, of anders veld 11, anders is status van factuur "Incompleet")
    -- v_btw: 11                 (VERPLICHT, of anders veld 10, anders is status van factuur "Incompleet")
    -- v_docid: 12
    -- v_debiteur_nr: 13
    -- v_opmerking: 14
    -- v_btw_verlegd: 15         (VERPLICHT, Ja/Nee/<leeg> waarbij leeg gelijk is aan Nee. Andere waarden leidt tot "Incompleet")
    -- v_kenmerk1: 16
    -- v_kenmerk2: 17
    -- v_kenmerk3: 18
    -- v_kenmerk4: 19
    -- v_kenmerk5: 20
    -- v_boekmaand: 21           (GELDIG, Indien gevuld dan moet er een geldige jaar-maand combinatie staan. Andere waarden leidt tot "Incompleet")
    -- Eerst geprobeerd via nette array, geeft problemen met type buiten package, en in package lukt niet omdat
    -- de import in Facilitor package-loos is (en niet 1-2-3 zo kan worden gemaakt vanwege alle bestaande klanten)
    -- v_seq_of_columns ListOfInteger := (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21);

    -- Dus dan maar via een string, en ook op slimme wijze, nl alsof het een ingelezen factuur-record is met p_fielddelimitor
    v_seq_of_columns VARCHAR(100);


    -- Afwijkingen op deze volgorde zijn in eigen cust_import_factuur te regelen.

    -- Als leveranciersnr en factuurnr b.v. zijn omgedraaid in het CSV-formaat,
    -- dan factuurimport ListOfInteger := (2,1,3,4,5,6,7,8,9,10,11,12);
    -- v_seq_of_columns := '2;1;3;4;5;6;7;8;9;10;11;12';

    -- Als leveranciersnr NIET in CSV staat, dan factuurimport ListOfInteger := (0,2,3,4,5,6,7,8,9,10,11,12);
    -- v_seq_of_columns := '0;2;3;4;5;6;7;8;9;10;11;12';
    -- M.a.w. waar een 0 staat, wordt de variabele niet ingelezen en blift LEEG.

BEGIN
    v_seq_of_columns := '1;2;3;4;5;6;7;8;9;10;11;12;13;14;16;15;0;0;0;0;17';
    fac_import_factuur_body(p_import_key, v_seq_of_columns);
END;
/



CREATE OR REPLACE PROCEDURE aaxx_update_factuur (p_import_key IN NUMBER)
AS
   v_invoerder  NUMBER(10);
BEGIN

   fac_update_factuur (p_import_key);

   -- AAFM specifieke update voor kenmerken
   -- ja = 1
   -- nee = 2
   -- kenmerk_key = 2 voor kenmerk laatste factuur.
   INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde)
   SELECT DISTINCT fin_factuur_key, fin_kenmerk_key, fac_usrdata_key
     FROM fac_imp_factuur i,
          fin_kenmerk k,
          fac_kenmerkdomein kd,
          fac_usrdata ud
    WHERE UPPER (COALESCE (i.kenmerk1, 'Nee')) = UPPER (ud.fac_usrdata_omschr)
      AND ud.fac_usrtab_key = kd.fac_usrtab_key
      AND k.fac_kenmerkdomein_key = kd.fac_kenmerkdomein_key
      AND k.fin_kenmerk_key = 2
      AND i.fin_factuur_key IS NOT NULL
      AND NOT EXISTS
             (SELECT fin_kenmerkfactuur_key
                FROM fin_kenmerkfactuur kf
               WHERE kf.fin_kenmerk_key = 2
                 AND kf.fin_factuur_key = i.fin_factuur_key);

   SELECT MAX(prs_perslid_key)
     INTO v_invoerder
     FROM fac_import
    WHERE fac_import_key = p_import_key;

   -- zet de FINNEW notificatie op de gebruiker die de import gestart heeft om te kunnen traceren hoe de facturen in het
   -- systeem gekomen zijn.
   UPDATE fac_tracking t
      SET prs_perslid_key = v_invoerder
        , fac_tracking_oms = fac_tracking_oms || ' (via Excel)'
    WHERE prs_perslid_key IS NULL
      AND EXISTS
             (SELECT fac_tracking_key
                FROM fac_imp_factuur i, fac_srtnotificatie sn
               WHERE i.fin_factuur_key = t.fac_tracking_refkey
                 AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                 AND sn.fac_srtnotificatie_code = 'FINNEW');

END;
/

-- view om aantal ingevoerde facturen terug te herleiden naar scanning en excel import.
CREATE OR REPLACE VIEW aaxx_v_rap_invoice_scan
(
   hide_f_ts,
   fclt_d_datum,
   totaal,
   scanning,
   excel
)
AS
     SELECT TO_CHAR (fac_tracking_datum, 'yyyymmdd'),
            TO_CHAR (fac_tracking_datum, 'dd-mm-yyyy'),
            SUM (aantal),
            SUM (scanning),
            SUM (excel)
       FROM (SELECT f.fin_factuur_key,
                    fac_tracking_datum,
                    fac_tracking_key,
                    fac_tracking_oms,
                    1 aantal,
                    DECODE (t.prs_perslid_key, 8, 1, 0) excel,
                    DECODE (t.prs_perslid_key, 9, 1, 0) scanning
               FROM fin_factuur f,
                    (SELECT t.*
                       FROM fac_tracking t, fac_srtnotificatie sn
                      WHERE t.fac_srtnotificatie_key =
                               sn.fac_srtnotificatie_key
                        AND sn.fac_srtnotificatie_code = 'FINNEW') t
              WHERE f.fin_factuur_verwijder IS NULL
                AND f.fin_factuur_key = t.fac_tracking_refkey(+))
   GROUP BY TO_CHAR (fac_tracking_datum, 'dd-mm-yyyy'),
            TO_CHAR (fac_tracking_datum, 'yyyymmdd');

--------------------------------
-- import contractorders
--------------------------------
CREATE OR REPLACE PROCEDURE aaxx_import_contract (
   p_import_key IN NUMBER)
IS
   c_fielddelimitor      VARCHAR2 (1) := ';';

   v_newline             VARCHAR2 (4000);                        -- Input line
   v_read                VARCHAR2 (4000);
   v_lastchar            VARCHAR2 (1);
   v_firstchar           VARCHAR2 (1);
   v_errormsg            VARCHAR (1000);
   v_hint                VARCHAR (1000);
   oracle_err_num        NUMBER;
   oracle_err_mes        VARCHAR2 (200);
   v_count               NUMBER;
   v_ongeldig            NUMBER (1);
   v_mode                NUMBER (1);
   v_aanduiding          VARCHAR (200);
   v_header_is_valid     NUMBER (1);

   -- De importvelden:
   v_gebouw_code         VARCHAR2 (100);
   v_leverancier         VARCHAR2 (100);
   v_beschrijving        VARCHAR2 (100);
   v_van                 VARCHAR2 (100);
   v_dienst              VARCHAR2 (100);
   v_tot                 VARCHAR2 (100);
   v_versie              VARCHAR2 (100);
   v_omschrijving        VARCHAR2 (4000);
   v_bedrag              VARCHAR2 (100);
   v_termijnbedrag       VARCHAR2 (100);
   v_contractsoort       VARCHAR2 (100);
   v_contractnummer      VARCHAR2 (100);
   v_volgnummer          VARCHAR2 (100);
   v_leveranciernummer   VARCHAR2 (100);
   v_contractafdeling    VARCHAR2 (100);
   v_gewijzigddoor       VARCHAR2 (100);
   v_contractmanager     VARCHAR2 (100);
   v_discipline_key      NUMBER;
   v_dummy               VARCHAR2 (100);



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

   rec                   c%ROWTYPE;
BEGIN
   -- Eerst opruiming

   DELETE FROM aaxx_imp_contract;

   COMMIT;

   v_header_is_valid := 0;

   OPEN c;

   IF (c%ISOPEN)
   THEN
      LOOP
         BEGIN
            v_errormsg := 'Fout FETCH te importeren rij';

            FETCH c INTO rec;

            EXIT WHEN c%NOTFOUND;
            v_read := rec.fac_imp_file_line;
            v_newline := v_read;

            v_lastchar := SUBSTR (v_read, LENGTH (v_read), 1);
            v_firstchar := SUBSTR (v_read, 1, 1);

            -- voeg regels samen die een cr/lf bevatten.
            IF v_firstchar = '"'
            THEN
               WHILE v_lastchar <> '"'
               LOOP
                  BEGIN
                     FETCH c INTO rec;

                     EXIT WHEN c%NOTFOUND;
                     v_read := rec.fac_imp_file_line;
                     v_lastchar := SUBSTR (v_read, LENGTH (v_read), 1);
                     v_newline := v_newline || CHR (13) || CHR (10) || v_read;
                  END;
               END LOOP;
            END IF;

            v_errormsg := 'Fout opvragen te importeren rij:' || substr(v_newline,1,200);
            v_aanduiding := '';
            v_ongeldig := 0;

            IF (UPPER(v_newline) like
                   'GEBOUW;BEDRIJF;LEVNR;BESCHRIJVING;INGANGSDATUM;EINDDATUM;ORDEROMSCHRIJVING;BEDRAG;TERMIJNBEDRAG;DIENST;CONTRACTSOORT;CONTRACTNR;VERSIE;REGELNR;CONTRACTAFDELING;CONTRACTMANAGER;GEWIJZIGDDOOR%')
            THEN
               v_header_is_valid := 1;
            ELSE
               -- Lees alle veldwaarden
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_gebouw_code);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (leverancier)'
                  || v_gebouw_code;
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_leverancier);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (leveranciernummer)'
                  || v_gebouw_code;
               fac.imp_getfield (v_newline,
                                 C_FIELDDELIMITOR,
                                 v_leveranciernummer);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (beschrijving)'
                  || v_gebouw_code;
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_beschrijving);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (van)' || v_gebouw_code;
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_van);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (tot)' || v_gebouw_code;
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_tot);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (omschrijving)'
                  || v_gebouw_code;
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_omschrijving);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (bedrag)' || v_gebouw_code;
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_bedrag);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (termijnbedrag)' || v_gebouw_code;
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_termijnbedrag);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (dienst)' || v_gebouw_code;
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_dienst);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (dienst)' || v_gebouw_code;
               fac.imp_getfield (v_newline,
                                 C_FIELDDELIMITOR,
                                 v_contractsoort);

               -- controleeer of het contractsoort bestaat
               v_errormsg :=
                  'Controleer of de contractsoort al bestaat: ' || v_contractsoort;
               BEGIN
                  SELECT ins_discipline_key
                    INTO v_discipline_key
                    FROM cnt_discipline
                   WHERE     ins_discipline_verwijder IS NULL
                         AND UPPER (TRIM (ins_discipline_omschrijving)) =
                             UPPER (TRIM (SUBSTR(v_contractsoort,1,30)));
               EXCEPTION WHEN NO_DATA_FOUND
               THEN
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_aanduiding || 'Onbekende contractsoort: ' || v_contractsoort,
                                    'Toelichting: ... ');
               END;
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (contractcode):'
                  || v_gebouw_code;
               fac.imp_getfield (v_newline,
                                 C_FIELDDELIMITOR,
                                 v_contractnummer);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (versie)' || v_gebouw_code;
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_versie);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (volgnummer)'
                  || v_gebouw_code;
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_volgnummer);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (contractafdeling)'
                  || v_gebouw_code;
               fac.imp_getfield (v_newline,
                                 C_FIELDDELIMITOR,
                                 v_contractafdeling);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (contractmanager)'
                  || v_gebouw_code;
               fac.imp_getfield (v_newline,
                                 C_FIELDDELIMITOR,
                                 v_contractmanager);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (gewijzigddoor)'
                  || v_gebouw_code;
               fac.imp_getfield (v_newline,
                                 C_FIELDDELIMITOR,
                                 v_gewijzigddoor);


               -- Insert geformatteerde import record

               v_errormsg :=
                     'Fout bij toevoegen te importeren gebouw ['
                  || v_gebouw_code
                  || ']';

               INSERT INTO AAXX_IMP_CONTRACT (gebouw,
                                              leverancier,
                                              leveranciernummer,
                                              beschrijving,
                                              van,
                                              tot,
                                              omschrijving,
                                              bedrag,
                                              termijnbedrag,
                                              dienst,
                                              contractsoort,
                                              contractnummer,
                                              versie,
                                              volgnummer,
                                              contractafdeling,
                                              contractmanager,
                                              gewijzigddoor,
                                              volgorde)
                   VALUES (v_gebouw_code,
                           v_leverancier,
                           v_leveranciernummer,
                           v_beschrijving,
                           fac.safe_to_date (v_van, 'dd-mm-yy'),
                           fac.safe_to_date (v_tot, 'dd-mm-yy'),
                           v_omschrijving,
                           aaxx_get_imp_float (v_bedrag),
                           aaxx_get_imp_float (v_termijnbedrag),
                           v_dienst,
                           SUBSTR(v_contractsoort,1,30),
                           TRIM(v_contractnummer),
                           v_versie,
                           fac.safe_to_number (
                              REPLACE (v_volgnummer, ',', '.')),
                           v_contractafdeling,
                           v_contractmanager,
                           v_gewijzigddoor,
                           rec.fac_imp_file_index);
            END IF;
         END;
      END LOOP;
   END IF;

   IF v_header_is_valid = 0
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || 'Ongeldig importbestand',
                        'Toelichting: ... ');
   END IF;


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


CREATE OR REPLACE PROCEDURE aaxx_update_contract (p_import_key IN NUMBER)
AS
   CURSOR cdisc
   IS
      SELECT contractsoort, MIN(volgorde) volgorde
        FROM aaxx_imp_contract
       WHERE NOT EXISTS
                (SELECT ins_discipline_key
                   FROM cnt_discipline
                  WHERE UPPER (TRIM (ins_discipline_omschrijving)) =
                           UPPER (TRIM (contractsoort)))
       GROUP BY contractsoort;

   CURSOR c
   IS
        SELECT *
          FROM aaxx_imp_contract
      ORDER BY volgorde;

   e_bestaand_contractnr EXCEPTION;
   v_aanduiding         VARCHAR2 (200);
   v_oldcountcnt        NUMBER;
   v_newcountcnt        NUMBER;
   v_countcnt           NUMBER;
   v_errormsg           VARCHAR (1000);
   v_error              NUMBER (1);
   v_error_hint         VARCHAR (1000);
   oracle_err_mes       VARCHAR2 (150);
   oracle_err_num       VARCHAR2 (150);
   currentversion       fac_module.fac_module_version%TYPE;
   v_gebouw_key         NUMBER;
   v_dienst_key         NUMBER;
   v_afdeling_key       NUMBER;
   v_perslid_key        NUMBER;
   v_perslid_man_key    NUMBER;
   v_discipline_key     NUMBER;
   v_contract_key       NUMBER;
   v_bedrijf_key        NUMBER;
   v_kostenplaats_key   NUMBER;
   v_count              NUMBER;
BEGIN
   v_error := 0;

   SELECT MAX (fac_module_version) INTO currentversion FROM fac_module;

   fac.imp_writelog (
      p_import_key,
      'I',
      'AAFM Contract import version ' || currentversion,
      '$Revision$');

   SELECT COUNT ( * ) INTO v_countcnt FROM aaxx_imp_contract;

   IF v_countcnt = 0
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'AAFM Contract import bevat geen records',
                        '$Revision$');
      RETURN;
   END IF;

   SELECT COUNT ( * ) INTO v_oldcountcnt FROM cnt_contract;

   UPDATE cnt_contract
      SET cnt_contract_versie = '0'
    WHERE cnt_contract_versie IS NULL;

   FOR rec IN cdisc
   LOOP
      BEGIN
         v_aanduiding := ' regel[' || rec.volgorde || '] contractsoort: ' || rec.contractsoort;
         v_error_hint := 'Toevoegen contractsoort:' || rec.contractsoort;

         INSERT INTO ins_tab_discipline (ins_discipline_module,
                                         ins_discipline_omschrijving)
             VALUES ('CNT', rec.contractsoort)
          RETURNING ins_discipline_key
               INTO v_discipline_key;

         INSERT INTO cnt_disc_params (cnt_ins_discipline_key,
                                      cnt_srtcontract_type)
             VALUES (v_discipline_key, 5);
      END;
   END LOOP;

   FOR rec IN c
   LOOP
      BEGIN
         v_aanduiding :=
               'regel['
            || rec.volgorde
            || '] nummer: '
            || rec.contractnummer
            || ' versie: '
            || rec.versie
            || ' volgnummer: '
            || rec.volgnummer;
         v_error_hint := 'Controle op bedrijf (check contract vinkje)';

         v_perslid_man_key := NULL;

         SELECT prs_bedrijf_key
           INTO v_bedrijf_key
           FROM prs_v_aanwezigbedrijf
          WHERE prs_bedrijf_contract = 1
                AND (   UPPER (TRIM (prs_leverancier_nr)) = UPPER (TRIM (rec.leveranciernummer))
                    OR (rec.leveranciernummer IS NULL AND rec.leverancier = prs_bedrijf_naam));

         v_error_hint := 'Controle op dienst';

         IF rec.dienst IS NOT NULL
         THEN
            SELECT prs_dienst_key
              INTO v_dienst_key
              FROM prs_dienst
             WHERE UPPER (TRIM (prs_dienst_omschrijving)) = UPPER (TRIM (rec.dienst));
         END IF;

         v_error_hint := 'Controle op contractsoort';

         SELECT ins_discipline_key
           INTO v_discipline_key
           FROM cnt_discipline
          WHERE     ins_discipline_verwijder IS NULL
                AND UPPER (TRIM (ins_discipline_omschrijving)) =
                       UPPER (TRIM (rec.contractsoort));

         v_error_hint := 'Controle op contractafdeling';

         SELECT prs_afdeling_key
           INTO v_afdeling_key
           FROM prs_afdeling
          WHERE     prs_afdeling_verwijder IS NULL
                AND UPPER (TRIM (prs_afdeling_naam)) = UPPER (TRIM (rec.contractafdeling));

         v_error_hint := 'Controle op contractmanager';

         IF rec.contractmanager IS NOT NULL
         THEN
            SELECT prs_perslid_key
              INTO v_perslid_man_key
              FROM prs_v_aanwezigperslid
             WHERE prs_perslid_oslogin = UPPER (TRIM (rec.contractmanager))
                   OR prs_perslid_oslogin2 = UPPER (TRIM (rec.contractmanager));
         END IF;

         v_error_hint := 'Controle op gewijzigddoor';

         SELECT prs_perslid_key
           INTO v_perslid_key
           FROM prs_v_aanwezigperslid
          WHERE prs_perslid_oslogin = UPPER (TRIM (rec.gewijzigddoor))
                OR prs_perslid_oslogin2 = UPPER (TRIM (rec.gewijzigddoor));

         IF rec.volgnummer IS NULL
         THEN
            -- kopregel
            v_contract_key := NULL;
            v_error_hint := 'Controle op kostenplaats';

            SELECT prs_kostenplaats_key
              INTO v_kostenplaats_key
              FROM prs_v_aanwezigkostenplaats
             WHERE UPPER (TRIM (prs_kostenplaats_nr)) = UPPER (TRIM (rec.gebouw));

            v_error_hint := 'Controle op contractnummer';

            IF rec.contractnummer IS NOT NULL
            THEN
               SELECT COUNT ( * )
                 INTO v_count
                 FROM cnt_v_aanwezigcontract
                WHERE TRIM (cnt_contract_nummer_intern) = TRIM (rec.contractnummer)
                      AND cnt_contract_versie = rec.versie;

               IF v_count > 0
               THEN
                  RAISE e_bestaand_contractnr;
               END IF;
            END IF;

            v_error_hint := 'Toevoegen contract';

            INSERT INTO cnt_contract (cnt_contract_nummer,
                                      cnt_contract_nummer_intern,
                                      cnt_contract_omschrijving,
                                      cnt_contract_document,
                                      cnt_contract_looptijd_van,
                                      cnt_contract_looptijd_tot,
                                      cnt_contract_status,
                                      cnt_contract_kosten,
                                      cnt_contract_termijnkosten,
                                      cnt_prs_bedrijf_key,
                                      prs_afdeling_key_eig,
                                      ins_discipline_key,
                                      prs_perslid_key_eig,
                                      prs_perslid_key_beh,
                                      prs_kostenplaats_key,
                                      cnt_contract_versie,
                                      cnt_contract_opzegtermijn,
                                      cnt_contract_rappeltermijn)
                VALUES (rec.contractnummer,
                        rec.contractnummer,
                        SUBSTR (rec.beschrijving, 1, 50),
                        REPLACE (REPLACE (rec.omschrijving, '<(>', ''),
                                 '<)>',
                                 ''),
                        rec.van,
                        rec.tot,
                        2,          -- Nieuw
                        rec.bedrag,
                        rec.termijnbedrag,
                        v_bedrijf_key,
                        v_afdeling_key,
                        v_discipline_key,
                        v_perslid_man_key,
                        v_perslid_key,
                        v_kostenplaats_key,
                        DECODE(rec.versie, '0', NULL, rec.versie),
                        1,
                        1)
             RETURNING cnt_contract_key
                  INTO v_contract_key;

            -- controle of het om bestaande contractnummers gaat. Indien het een import van nieuwe
            -- contracten betreft, zal vaak het contractnummer leeg zijn. We vullen dan het contractnummer
            -- met de key van het contract.
            IF rec.contractnummer IS NULL
            THEN
               UPDATE cnt_contract
                  SET cnt_contract_nummer = cnt_contract_key,
                      cnt_contract_nummer_intern = cnt_contract_key
                WHERE cnt_contract_key = v_contract_key;
            END IF;

            -- als we versie 1 van een contract gaan toevoegen moeten we het initiele contract met
            -- versie NULL gaan omzetten naar versie 0.
            IF rec.versie = '1'
            THEN
               UPDATE cnt_contract
                  SET cnt_contract_versie = '0'
                WHERE cnt_contract_nummer = rec.contractnummer
                  AND cnt_contract_versie IS NULL;
            END IF;
         ELSE
            v_error_hint := 'Controle op gebouwcode';

            SELECT alg_gebouw_key
              INTO v_gebouw_key
              FROM alg_v_aanweziggebouw
             WHERE UPPER (alg_gebouw_code) = UPPER (rec.gebouw);

            -- als het bovenliggende contract niet aangemaakt kon worden gaan we ook geen scope invullen.
            IF v_contract_key IS NOT NULL
            THEN
               -- Scope van het contract zetten.
               INSERT INTO cnt_contract_plaats (cnt_contract_key,
                                                cnt_alg_plaats_key,
                                                cnt_alg_plaats_code,
                                                cnt_contract_plaats_gewicht)
                   VALUES (v_contract_key,
                           v_gebouw_key,
                           'G',
                           rec.bedrag);
            END IF;
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            IF oracle_err_num = 1 THEN oracle_err_mes := 'Combinatie contractnummer/versie bestaat al.'; END IF;
            IF oracle_err_num = -1422 THEN oracle_err_mes := 'Controle levert meer dan één resultaat op.'; END IF;
            IF oracle_err_num = 100 THEN oracle_err_mes := 'Controle levert geen resultaat op.'; END IF;
            v_errormsg :=
                  'OTHERS (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            aaxx_imp_writelog (p_import_key,
                               'E',
                               v_errormsg,
                               v_error_hint || ' - ' || v_aanduiding);
            v_error := 1;
      END;
   END LOOP;

   IF v_error = 0
   THEN
      COMMIT;
   ELSE
      ROLLBACK;
   END IF;

   -- How many active records are now present?
   SELECT COUNT ( * ) INTO v_newcountcnt FROM cnt_contract;

   fac.imp_writelog (
      p_import_key,
      'S',
         'Aantal contracten vooraf: '
      || TO_CHAR (v_oldcountcnt)
      || '  nu: '
      || TO_CHAR (v_newcountcnt),
      '');

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


--------------------------------
-- import ruimtegegevens
--------------------------------
CREATE OR REPLACE PROCEDURE aaxx_import_ruimte (
   p_import_key IN NUMBER)
IS
   c_fielddelimitor      VARCHAR2 (1) := ';';

   v_newline             VARCHAR2 (4000);                        -- Input line
   v_read                VARCHAR2 (4000);
   v_lastchar            VARCHAR2 (1);
   v_firstchar           VARCHAR2 (1);
   v_errormsg            VARCHAR (1000);
   v_hint                VARCHAR (1000);
   oracle_err_num        NUMBER;
   oracle_err_mes        VARCHAR2 (200);
   v_count               NUMBER;
   v_ongeldig            NUMBER (1);
   v_mode                NUMBER (1);
   v_aanduiding          VARCHAR (200);
   v_header_is_valid     NUMBER (1);

   -- De importvelden:
   v_locatie_code           VARCHAR2(100);
   v_gebouw_code            VARCHAR2(100);
   v_verdieping_code        VARCHAR2(100);
   v_ruimte_key             VARCHAR2(100);
   v_ruimte_nr              VARCHAR2(100);
   v_ruimte_omschrijving    VARCHAR2(100);
   v_srtruimte_omschrijving VARCHAR2(100);
   v_dienstniveau_omschr    VARCHAR2(100);
   v_ruimte_bruto_vloeropp  VARCHAR2(100);
   v_dummy                  VARCHAR2(100);



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

   rec                   c%ROWTYPE;
BEGIN
   -- Eerst opruiming

   DELETE FROM aaxx_imp_ruimte;

   COMMIT;

   v_header_is_valid := 0;

   OPEN c;

   IF (c%ISOPEN)
   THEN
      LOOP
         BEGIN
            v_errormsg := 'Fout FETCH te importeren rij';

            FETCH c INTO rec;

            EXIT WHEN c%NOTFOUND;
            v_read := rec.fac_imp_file_line;
            v_newline := v_read;

            v_lastchar := SUBSTR (v_read, LENGTH (v_read), 1);
            v_firstchar := SUBSTR (v_read, 1, 1);

            -- voeg regels samen die een cr/lf bevatten.
            IF v_firstchar = '"'
            THEN
               WHILE v_lastchar <> '"'
               LOOP
                  BEGIN
                     FETCH c INTO rec;

                     EXIT WHEN c%NOTFOUND;
                     v_read := rec.fac_imp_file_line;
                     v_lastchar := SUBSTR (v_read, LENGTH (v_read), 1);
                     v_newline := v_newline || CHR (13) || CHR (10) || v_read;
                  END;
               END LOOP;
            END IF;

            v_errormsg := 'Fout opvragen te importeren rij';
            v_aanduiding := '';
            v_ongeldig := 0;

            IF (v_newline like
                   'LOCATIE;GEBOUW;VERDIEPING;ALG_RUIMTE_KEY;ALG_RUIMTE_NR;ALG_RUIMTE_OMSCHRIJVING;ALG_SRTRUIMTE_OMSCHRIJVING;MLD_DIENSTNIVEAU_OMSCHR;ALG_RUIMTE_BRUTO_VLOEROPP%')
            THEN
               v_header_is_valid := 1;
            ELSE
               -- Lees alle veldwaarden
               v_errormsg :=
                  'Fout opvragen te importeren rij (alg_locatie_code) Regel [' || rec.fac_imp_file_index || ']';
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_locatie_code);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (alg_gebouw_code) Regel [' || rec.fac_imp_file_index || ']';
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_gebouw_code);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (alg_verdieping_code) Regel [' || rec.fac_imp_file_index || ']';
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_verdieping_code);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (alg_ruimte_key) Regel [' || rec.fac_imp_file_index || ']';
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_ruimte_key);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (alg_ruimte_nr) Regel [' || rec.fac_imp_file_index || ']';
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_ruimte_nr);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (alg_ruimte_omschrijving) Regel [' || rec.fac_imp_file_index || ']';
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_ruimte_omschrijving);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (alg_srtruimte_omschrijving) Regel [' || rec.fac_imp_file_index || ']';
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_srtruimte_omschrijving);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (mld_dienstniveau_omschr) Regel [' || rec.fac_imp_file_index || ']';
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_dienstniveau_omschr);
               --
               v_errormsg :=
                  'Fout opvragen te importeren rij (alg_ruimte_bruto_vloeropp) Regel [' || rec.fac_imp_file_index || ']';
               fac.imp_getfield (v_newline, C_FIELDDELIMITOR, v_ruimte_bruto_vloeropp);
               --
               -- Insert geformatteerde import record
               IF v_ruimte_key IS NOT NULL
               THEN
                  v_errormsg :=
                        'Fout bij toevoegen te importeren gebouw ['
                     || v_gebouw_code
                     || ']';

                  INSERT INTO aaxx_imp_ruimte(volgorde,
                                              alg_locatie_code,
                                              alg_gebouw_code,
                                              alg_verdieping_code,
                                              alg_ruimte_key,
                                              alg_ruimte_nr,
                                              alg_ruimte_omschrijving,
                                              alg_srtruimte_omschrijving,
                                              mld_dienstniveau_omschr,
                                              alg_ruimte_bruto_vloeropp)
                      VALUES (rec.fac_imp_file_index,
                              SUBSTR(v_locatie_code, 1, 10),
                              SUBSTR(v_gebouw_code, 1, 12),
                              SUBSTR(v_verdieping_code, 1, 10),
                              v_ruimte_key,
                              SUBSTR(v_ruimte_nr, 1,10),
                              SUBSTR(v_ruimte_omschrijving, 1, 30),
                              SUBSTR(v_srtruimte_omschrijving, 1, 30),
                              SUBSTR(v_dienstniveau_omschr, 1, 60),
                              replace(v_ruimte_bruto_vloeropp, ',','.'));
               END IF;
            END IF;
         END;
      END LOOP;
   END IF;

   IF v_header_is_valid = 0
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || 'Ongeldig importbestand',
                        'Toelichting: ... ');
   END IF;


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


CREATE OR REPLACE PROCEDURE aaxx_update_ruimte (p_import_key IN NUMBER)
AS
   CURSOR c
   IS
        SELECT *
          FROM aaxx_imp_ruimte
      ORDER BY volgorde;

   v_aanduiding         VARCHAR2 (200);
   v_errormsg           VARCHAR (1000);
   v_error              NUMBER (1);
   v_error_hint         VARCHAR (1000);
   oracle_err_mes       VARCHAR2 (150);
   oracle_err_num       VARCHAR2 (150);
   currentversion       fac_module.fac_module_version%TYPE;
   v_srtruimte_key      NUMBER;
   v_dienstniveau_key   NUMBER;
BEGIN
   v_error := 0;

   SELECT MAX (fac_module_version) INTO currentversion FROM fac_module;

   fac.imp_writelog (
      p_import_key,
      'I',
      'AAFM Ruimte update version ' || currentversion,
      '$Revision$');

   FOR rec IN c
   LOOP
      BEGIN
         v_aanduiding :=
               'regel['
            || rec.volgorde
            || '] plaats: '
            || rec.alg_locatie_code || '-'
            || rec.alg_gebouw_code || '-'
            || rec.alg_verdieping_code || '-'
            || rec.alg_ruimte_nr;

         v_error_hint := 'Controle op ruimtesoort';

         v_srtruimte_key := NULL;
         IF rec.alg_srtruimte_omschrijving IS NOT NULL
         THEN
            SELECT alg_srtruimte_key
              INTO v_srtruimte_key
              FROM alg_srtruimte
             WHERE alg_srtruimte_verwijder IS NULL
                   AND alg_srtruimte_upper = UPPER (rec.alg_srtruimte_omschrijving);
         END IF;

         v_error_hint := 'Controle op dienstniveau';

         v_dienstniveau_key := NULL;
         IF rec.mld_dienstniveau_omschr IS NOT NULL
         THEN
            SELECT mld_dienstniveau_key
              INTO v_dienstniveau_key
              FROM mld_dienstniveau
             WHERE UPPER (TRIM (mld_dienstniveau_omschr)) = UPPER (TRIM (rec.mld_dienstniveau_omschr));
         END IF;

         v_error_hint := 'Aanpassen ruimtegegevens.';
         UPDATE alg_ruimte SET alg_ruimte_nr = rec.alg_ruimte_nr,
                               alg_ruimte_omschrijving = rec.alg_ruimte_omschrijving,
                               alg_srtruimte_key = v_srtruimte_key,
                               mld_dienstniveau_key = v_dienstniveau_key,
                               alg_ruimte_bruto_vloeropp = rec.alg_ruimte_bruto_vloeropp
         WHERE alg_ruimte_key = rec.alg_ruimte_key;

      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            IF oracle_err_num = -1422 THEN oracle_err_mes := 'Controle levert meer dan één resultaat op.'; END IF;
            IF oracle_err_num = 100 THEN oracle_err_mes := 'Controle levert geen resultaat op.'; END IF;
            v_errormsg :=
                  'OTHERS (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            aaxx_imp_writelog (p_import_key,
                               'E',
                               v_errormsg,
                               v_error_hint || ' - ' || v_aanduiding);
            v_error := 1;
      END;
   END LOOP;

   IF v_error = 0
   THEN
      COMMIT;
   ELSE
      ROLLBACK;
   END IF;

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


-------------------------------------------------------------------------------
-- IMPORTFUNCTIE - Import uplift
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_rap_uplift (
   jaar,
   maand,
   kostensoort,
   soort_order,
   leverancier,
   nummer,
   uplift
)
AS
   SELECT jaar,
          maand,
          prs_kostensoort_oms,
          soort_order,
          prs_bedrijf_naam,
          prs_leverancier_nr,
          uplift
   FROM aaxx_imp_uplift;

CREATE OR REPLACE PROCEDURE aaxx_import_uplift (
   p_import_key IN NUMBER
)
AS
   CURSOR c_cursor
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;

   v_newline          VARCHAR2 (1000);
   v_aanduiding       VARCHAR2 (1000);                                                                   -- Import line
   v_field            VARCHAR2 (100);                                                                   -- Import field
   v_fielddelimitor   VARCHAR2 (1);                                                                  -- Field seperator
   v_errormsg         VARCHAR (200);
   v_errorhint        VARCHAR (200);
   v_count            NUMBER;
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_skipfield        VARCHAR2 (100);
   -- De importvelden
   v_jaar                VARCHAR2 (100);
   v_maand               VARCHAR2 (100);
   v_prs_kostensoort_oms VARCHAR2 (100);
   v_soort_order         VARCHAR2 (100);
   v_prs_bedrijf_naam    VARCHAR2 (100);
   v_prs_leverancier_nr  VARCHAR2 (100);
   v_uplift              VARCHAR2 (100);
   header_found       BOOLEAN;

BEGIN
   -- Eerst opruiming

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

   FOR rec1 IN c_cursor
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_aanduiding := v_newline;

         IF SUBSTR (v_newline, 1, 3) = '?'
         THEN
            -- EF BB BF aangetroffen
            fac.imp_writelog (p_import_key,
                              'W',
                              'Byte Order Mark aangetroffen',
                              'Bestand heeft onbehandeld UTF-8 formaat.'
                             );
            v_newline := SUBSTR (v_newline, 4);
         END IF;

         fac.imp_getfield (v_newline, v_fielddelimitor, v_jaar);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_maand);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_prs_kostensoort_oms);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_soort_order);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_prs_bedrijf_naam);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_prs_leverancier_nr);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_uplift);

         -- Skip until a valid header is found
         IF     UPPER(v_jaar)    = 'JAAR'
            AND UPPER(v_maand)   = 'MAAND'
            AND UPPER(v_prs_kostensoort_oms) = 'KOSTENSOORT'
            AND UPPER(v_prs_leverancier_nr) = 'NUMMER'
            AND UPPER(v_uplift) = 'UPLIFT'
         THEN
            -- Sla de kopregel over.
            header_found := TRUE;
         ELSIF (header_found AND v_jaar IS NOT NULL)
         THEN
            -- voeg nieuwe records toe
            -- en wijzig bestaande records

            -- ken ik de combinatie van jaar,maand, kostensoort, en leveranciernummer al?
            SELECT count(*)
              INTO v_count
              FROM aaxx_imp_uplift
             WHERE jaar = v_jaar
               AND maand = v_maand
               AND prs_kostensoort_oms = v_prs_kostensoort_oms
               AND soort_order = v_soort_order
               AND prs_leverancier_nr = v_prs_leverancier_nr;

            IF v_count > 0 THEN
               -- update de bestaande record(s)
               UPDATE aaxx_imp_uplift
                  SET uplift = fac.safe_to_number (REPLACE(v_uplift,',','.'))
                WHERE jaar = v_jaar
                  AND maand = v_maand
                  AND soort_order = v_soort_order
                  AND prs_kostensoort_oms = v_prs_kostensoort_oms
                  AND prs_leverancier_nr = v_prs_leverancier_nr;
            ELSE
               -- voeg nieuwe records toe
               INSERT INTO aaxx_imp_uplift
                          (jaar,
                           maand,
                           prs_kostensoort_oms,
                           soort_order,
                           prs_bedrijf_naam,
                           prs_leverancier_nr,
                           uplift)
                   VALUES (fac.safe_to_number (v_jaar),
                           fac.safe_to_number (v_maand),
                           v_prs_kostensoort_oms,
                           v_soort_order,
                           v_prs_bedrijf_naam,
                           v_prs_leverancier_nr,
                           fac.safe_to_number (REPLACE(v_uplift,',','.')));

            END IF;
            SELECT count(*)
              INTO v_count
              FROM prs_bedrijf
             WHERE prs_leverancier_nr = v_prs_leverancier_nr;
            IF v_count = 0 THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                'Geen leverancier met nummer ['||v_prs_leverancier_nr||'] gevonden',
                                ''
                               );
            END IF;
            SELECT count(*)
              INTO v_count
              FROM prs_kostensoort
             WHERE prs_kostensoort_upper = upper(v_prs_kostensoort_oms);
            IF v_count = 0 THEN
              fac.imp_writelog (p_import_key,
                                'W',
                                'Geen kostensoort met code ['||v_prs_kostensoort_oms ||'] gevonden',
                                ''
                               );
            END IF;
         END IF;

         COMMIT;
      END;
   END LOOP;

   IF NOT header_found
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Geen geldige header aangetroffen',
                        'Bestand is geen geldig ruimtesoort importbestand.'
                       );
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key, 'E', SUBSTR (v_errormsg, 1, 1000), v_aanduiding);
      -- maak de importtabel leeg om te voorkomen dat er halve bestanden ingelezen worden.
END;
/


CREATE OR REPLACE PROCEDURE aaxx_update_uplift (p_import_key IN NUMBER)
AS
BEGIN
   NULL;
END;
/

-------------------------------------------------------------------------------
-- Importfunctie om elementen op te voeren voor assetmanagement
--
--
-------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE aaxx_import_asset (p_import_key IN NUMBER)
AS

CURSOR c_disc
IS
   SELECT DISTINCT i.ins_discipline_omschrijving
     FROM fac_imp_ins i
    WHERE NOT EXISTS
       (  SELECT ins_discipline_key
            FROM ins_discipline d
           WHERE UPPER(d.ins_discipline_omschrijving) = UPPER(i.ins_discipline_omschrijving));

CURSOR c_srtgroep
IS
   SELECT DISTINCT i.ins_discipline_omschrijving, i.ins_srtgroep_omschrijving
     FROM fac_imp_ins i
    WHERE NOT EXISTS
       (  SELECT d.ins_discipline_key
            FROM ins_discipline d, ins_srtgroep sg
           WHERE sg.ins_discipline_key = d.ins_discipline_key
             AND UPPER(sg.ins_srtgroep_omschrijving) = UPPER(i.ins_srtgroep_omschrijving)
             AND UPPER(d.ins_discipline_omschrijving) = UPPER(i.ins_discipline_omschrijving));

CURSOR c_srtdeel
IS
   SELECT DISTINCT i.ins_discipline_omschrijving, i.ins_srtgroep_omschrijving, i.ins_srtdeel_omschrijving, i.ins_srtdeel_code
     FROM fac_imp_ins i
    WHERE NOT EXISTS
       (  SELECT d.ins_discipline_key
            FROM ins_discipline d, ins_srtgroep sg, ins_srtdeel sd
           WHERE sg.ins_discipline_key = d.ins_discipline_key
             AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
             AND UPPER(sd.ins_srtdeel_omschrijving||'-'||sd.ins_srtdeel_code) = UPPER(i.ins_srtdeel_omschrijving || '-' || i.ins_srtdeel_code)
             AND UPPER(sg.ins_srtgroep_omschrijving) = UPPER(i.ins_srtgroep_omschrijving)
             AND UPPER(d.ins_discipline_omschrijving) = UPPER(i.ins_discipline_omschrijving));

BEGIN
   fac_import_ins(p_import_key);

   -- controleer of de discipline, groep en objectsoort wel bestaan.
   FOR rec IN c_disc
   LOOP
      fac.imp_writelog (p_import_key, 'E', 'Discipline bestaat nog niet', rec.ins_discipline_omschrijving);
   END LOOP;

   FOR rec IN c_srtgroep
   LOOP
      fac.imp_writelog (p_import_key, 'E', 'Groep bestaat nog niet', rec.ins_discipline_omschrijving || ' / ' || rec.ins_srtgroep_omschrijving);
   END LOOP;

   FOR rec IN c_srtdeel
   LOOP
      fac.imp_writelog (p_import_key, 'E', 'Objectsoort bestaat nog niet', rec.ins_discipline_omschrijving || ' / ' || rec.ins_srtgroep_omschrijving  || ' / ' || rec.ins_srtdeel_code  || ' ' || rec.ins_srtdeel_omschrijving);
   END LOOP;

END;
/



CREATE OR REPLACE PROCEDURE aaxx_update_asset (p_import_key IN NUMBER)
AS
   v_count NUMBER;
BEGIN
   SELECT count(*)
     INTO v_count
     FROM imp_log
    WHERE fac_import_key = p_import_key
      AND imp_log_status = 'E';

   IF v_count = 0
   THEN
      fac_update_ins(p_import_key);
   ELSE
      fac.imp_writelog (p_import_key, 'E', 'Verwerk actie niet uitgevoerd ivm fouten in bestand', '');
   END IF;
END;
/

-- Overzicht met geplande en uitgevoerde inspecties.
CREATE OR REPLACE VIEW aaxx_v_rap_asset_insp
(
   ins_deel_key,
   ins_discipline_omschrijving,
   ins_srtgroep_omschrijving,
   ins_srtdeel_code,
   ins_deel_omschrijving,
   alg_locatie_plaats,
   alg_locatie_omschrijving,
   alg_gebouw_omschrijving,
   alg_plaatsaanduiding,
   ins_srtcontrole_omschrijving,
   volgende_controle,
   laatste_controle,
   gepland_controle
)
AS
     SELECT idg.ins_deel_key,
            idg.ins_discipline_omschrijving,
            idg.ins_srtgroep_omschrijving,
            idg.ins_srtdeel_upper,
            idg.ins_deel_omschrijving,
            l.alg_locatie_plaats,
            l.alg_locatie_omschrijving,
            idg.alg_gebouw_omschrijving,
            idg.alg_plaatsaanduiding,
            idg.ins_srtcontrole_omschrijving,
            idg.nextdate,
            DECODE (TRUNC (idg.ins_deel_aanmaak),
                    TRUNC (dc.ins_deelsrtcontrole_datum), TO_DATE (NULL),
                    dc.ins_deelsrtcontrole_datum)
               uitgevoerd_op,
            dc.ins_deelsrtcontrole_plandatum
               gepland_op
       FROM (SELECT i.*,
                    sc.*,
                    fac.nextcyclusdatedeel (i.ins_deel_key,
                                            sc.ins_srtcontrole_key,
                                            1)
                       nextdate,
                    (SELECT dsc.ins_deelsrtcontrole_key
                       FROM ins_deelsrtcontrole dsc
                      WHERE dsc.ins_deel_key = i.ins_deel_key
                        AND dsc.ins_srtcontrole_key = sc.ins_srtcontrole_key
                        AND NOT EXISTS
                               (SELECT dsc1.ins_deelsrtcontrole_key
                                  FROM ins_deelsrtcontrole dsc1
                                 WHERE dsc.ins_deel_key = dsc1.ins_deel_key
                                   AND dsc.ins_srtcontrole_key =
                                          dsc1.ins_srtcontrole_key
                                   AND dsc1.ins_deelsrtcontrole_key >
                                          dsc.ins_deelsrtcontrole_key))
                       ins_deelsrtcontrole_key1
               FROM ins_v_deel_gegevens i,
                    ins_srtcontrole sc,
                    ins_srtcontroledl_xcp xcp
              WHERE i.ins_discipline_key = sc.ins_srtinstallatie_key
                AND i.ins_deel_key = xcp.ins_deel_key
                AND sc.ins_srtcontrole_key = xcp.ins_srtcontrole_key) idg,
            ins_deelsrtcontrole dc,
            alg_locatie l
      WHERE idg.ins_deelsrtcontrole_key1 = dc.ins_deelsrtcontrole_key(+)
        AND idg.alg_locatie_key = l.alg_locatie_key
   ORDER BY fac.safe_to_number (ins_deel_omschrijving);

-------------------------------------------------------------------------------
-- Importfunctie om contactpersonen bij bedrijven toe te voegen aan FACILITOR
--
--
-------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE aaxx_import_contactpersoon (p_import_key IN NUMBER)
AS
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   v_errormsg                VARCHAR2 (400);
   v_errorhint               VARCHAR2 (400);
   v_count                   NUMBER;
BEGIN

   v_errorhint := 'Generieke update';
   -- de sequence array staat beschreven in FAC_PACF.SRC bij de fac_import_perslid_upd_body proc
   prs.import_perslid (p_import_key,
                       '0;0;0;0;0;0;1;2;3;5;' ||
                       '4;0;0;0;0;7;8;9;0;11;' ||
                       '10;12;13;6;0;0;14;15;0;0;'||
                       '0;0;0;0;0;0;0;0;0;0;'||
                       '0;0;0;0;0;0',
                       'Afdelingscode;PersoonAchternaam;Tussenvoegsel;Voorletters;Voornaam;Titel/Aanhef;Telefoonnummer;Mobiel;Email;Functie;Personeelsnummer;Loginnaam;Password;Bedrijf;Autorisatieprofiel%'
                       );

   -- Klantspecifieke aanpassingen
   v_errorhint := 'Controle op Bedrijf';
   FOR rec IN (SELECT distinct prs_kenmerk1 FROM fac_imp_perslid)
   LOOP
      IF rec.prs_kenmerk1 IS NOT NULL
      THEN
         SELECT count(*)
           INTO v_count
           FROM prs_bedrijf
          WHERE prs_bedrijf_verwijder IS NULL
            AND UPPER(prs_bedrijf_naam) = upper(rec.prs_kenmerk1);

         IF v_count <> 1
         THEN
            fac.imp_writelog (p_import_key, 'E', 'Bedrijf: ' || rec.prs_kenmerk1 || ' komt ' || v_count || ' keer voor in de lijst met bedrijven.', v_errorhint);
         END IF;
      END IF;
   END LOOP;

   v_errorhint := 'Controle op Autorisatieprofiel';
   FOR rec IN (SELECT prs_kenmerk2 FROM fac_imp_perslid)
   LOOP
      IF rec.prs_kenmerk2 IS NOT NULL
      THEN
         SELECT count(*)
           INTO v_count
           FROM fac_groep
          WHERE upper(fac_groep_omschrijving) = upper(rec.prs_kenmerk2);

         IF v_count <> 1
         THEN
            fac.imp_writelog (p_import_key, 'E', 'Autorisatieprofiel: ' || rec.prs_kenmerk2 || ' komt ' || v_count || ' keer voor in de lijst met autorisatieprofielen.', v_errorhint);
         END IF;
      END IF;
   END LOOP;

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


CREATE OR REPLACE PROCEDURE aaxx_update_contactpersoon (
   p_import_key IN NUMBER)
IS
   CURSOR c
   IS
      SELECT * FROM fac_imp_perslid;

   v_count          NUMBER;
   v_perslid_key    NUMBER;
   v_bedrijf_key    NUMBER;
   v_groep_key      NUMBER;
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_errormsg       VARCHAR2 (400);
   v_errorhint      VARCHAR2 (400);
BEGIN
   -- generic update
   prs.update_perslid (p_import_key, 'NR', 'A');

   FOR rec IN c
   LOOP
      BEGIN
         v_errorhint := 'Zoek aangemaakt persoon.';

         SELECT MAX (prs_perslid_key)
           INTO v_perslid_key
           FROM prs_perslid p
          WHERE rec.prs_perslid_naam = p.prs_perslid_naam
            AND COALESCE (rec.prs_perslid_voornaam, 'Voornaam') =
                   COALESCE (p.prs_perslid_voornaam, 'Voornaam')
            AND COALESCE (rec.prs_perslid_tussenvoegsel, 'Tussenvoegsel') =
                   COALESCE (p.prs_perslid_tussenvoegsel, 'Tussenvoegsel')
            AND COALESCE (rec.prs_perslid_voorletters, 'Voorletters') =
                   COALESCE (p.prs_perslid_voorletters, 'Voorletters')
            AND p.prs_perslid_aanmaak > SYSDATE - 1
            AND p.prs_perslid_verwijder IS NULL;

         IF v_perslid_key IS NULL
         THEN
            fac.imp_writelog (
               p_import_key,
               'E',
                  'Persoon: '
               || rec.prs_perslid_naam
               || '-'
               || rec.prs_perslid_voornaam
               || '-'
               || rec.prs_perslid_voorletters
               || ' kan niet gevonden worden.',
               v_errorhint);
         ELSE
            v_errorhint := 'Zoek bedrijf.';

            SELECT MAX (prs_bedrijf_key)
              INTO v_bedrijf_key
              FROM prs_bedrijf
             WHERE prs_bedrijf_verwijder IS NULL
               AND UPPER (prs_bedrijf_naam) = UPPER (rec.prs_kenmerk1);

            IF v_bedrijf_key IS NULL
            THEN
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  'Bedrijf: ' || rec.prs_kenmerk1 || ' kan niet gevonden worden.',
                  v_errorhint);
            ELSE
               INSERT INTO prs_contactpersoon (prs_contactpersoon_naam,
                                               prs_contactpersoon_tussenv,
                                               prs_contactpersoon_voorletters,
                                               prs_contactpersoon_voornaam,
                                               prs_contactpersoon_titel,
                                               prs_contactpersoon_telefoon_1,
                                               prs_contactpersoon_telefoon_2,
                                               prs_contactpersoon_email,
                                               prs_perslid_key,
                                               prs_bedrijf_key)
                   VALUES (rec.prs_perslid_naam,
                           rec.prs_perslid_tussenvoegsel,
                           rec.prs_perslid_voorletters,
                           rec.prs_perslid_voornaam,
                           rec.prs_perslid_titel,
                           rec.prs_perslid_telefoonnr,
                           rec.prs_perslid_mobiel,
                           rec.prs_perslid_email,
                           v_perslid_key,
                           v_bedrijf_key);

               v_errorhint := 'Zoek autorisatiegroep.';

               SELECT MAX (fac_groep_key)
                 INTO v_groep_key
                 FROM fac_groep
                WHERE UPPER (rec.prs_kenmerk2) = UPPER (fac_groep_omschrijving);

               IF v_groep_key IS NULL
               THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                        'Autorisatiegroep: '
                     || rec.prs_kenmerk2
                     || ' kan niet gevonden worden.',
                     v_errorhint);
               ELSE
                  INSERT INTO fac_gebruikersgroep (prs_perslid_key,
                                                fac_groep_key)
                      VALUES (v_perslid_key, v_groep_key);
               END IF;
            END IF;
         END IF;
      END;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg := 'Error ' || oracle_err_num || '/' || oracle_err_mes;
      fac.imp_writelog (p_import_key,
                        'E',
                        v_errormsg,
                        v_errorhint);
END aaxx_update_contactpersoon;
/



-------------------------------------------------------------------------------
-- Importfunctie om personen die gedefinieerd zijn in de AAIT database ook in
-- de klantdatabase toe te voegen.
-- kenmerk_key 4 = prs_perslid_key in AAIT database
-- kenmerk_key 3 = personeelsnummer in AAIT
-- kenmerk_key 2 = kostenplaats in AD
-------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE aaxx_import_aafm_medewerkers (
   p_import_key IN NUMBER)
AS
BEGIN
   NULL;
END;
/

CREATE OR REPLACE PROCEDURE aaxx_update_aafm_medewerkers (
   p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT afdelingscode,
             persoonachternaam,
             tussenvoegsel,
             voorletters,
             voornaam,
             titel,
             telefoonnummer,
             mobiel,
             email,
             functie,
             loginnaam,
             personeelsnummer,
             dienstverband,
             uurloon,
             kostenplaats,
             prs_perslid_apikey,
             i.prs_perslid_key prs_perslid_key_aait,
             p.prs_perslid_key,
             p.prs_perslid_nr
        FROM aait.aait_imp_perslid i,
             (SELECT prs_perslid_key,
                     prs_perslid_nr,
                     prs_kenmerklink_waarde aait_prs_perslid_key
                FROM prs_perslid p, prs_kenmerklink kl
               WHERE p.prs_perslid_key = kl.prs_link_key
                 AND kl.prs_kenmerk_key = 4
                 AND p.prs_perslid_verwijder IS NULL
                 AND kl.prs_kenmerklink_verwijder IS NULL) p
       WHERE i.prs_perslid_key = p.aait_prs_perslid_key(+)
         AND i.prs_perslid_key IS NOT NULL
         AND i.personeelsnummer <> 'N/A';

    CURSOR c_del
    IS
       SELECT prs_perslid_key,
              prs_perslid_naam,
              prs_perslid_voornaam,
              prs_perslid_login,
              prs_afdeling_omschrijving,
              klo.prs_kenmerklink_waarde nr
         FROM prs_perslid p, prs_kenmerklink klo, prs_afdeling a
        WHERE p.prs_perslid_key = klo.prs_link_key
          AND p.prs_afdeling_key = a.prs_afdeling_key
          AND prs_kenmerk_key = 3  -- personeelsnummer AAFM
          AND prs_perslid_verwijder IS NULL
          AND NOT EXISTS
                 (SELECT prs_kenmerklink_key
                    FROM prs_kenmerklink kl, aait.aait_imp_perslid i
                   WHERE kl.prs_link_key = p.prs_perslid_key AND prs_kenmerk_key = 4  -- prs_perslid_key in AAIT
                       AND fac.safe_to_number(kl.prs_kenmerklink_waarde) = i.prs_perslid_key);

   v_count                NUMBER;
   v_prs_bedrijf_key      NUMBER;
   v_prs_bedrijf_naam     VARCHAR2 (100);
   v_prs_afdeling_key     NUMBER;
   v_prs_srtperslid_key   NUMBER;
   v_prs_perslid_key      NUMBER;
   v_fac_groep_key        NUMBER;
   v_fac_default_key      NUMBER;
   v_errormsg             VARCHAR2 (1000);
   v_error_hint           VARCHAR2 (1000);
   oracle_err_num         NUMBER;
   oracle_err_mes         VARCHAR2 (2000);
BEGIN

   v_errormsg := 'Controle of importbestand goed gevuld is.';
   SELECT COUNT(*)
     INTO v_count
     FROM aait.aait_imp_perslid
    WHERE prs_perslid_key IS NOT NULL;

   IF v_count < 250 THEN
      fac.imp_writelog (p_import_key, 'E', 'Import bestand bevat te weinig (' || v_count || ') records.', '');
      RETURN;
   END IF;

   IF aaxx_get_user = 'SITECH'
   THEN
      v_prs_bedrijf_naam := 'DERDEN';
   ELSE
      v_prs_bedrijf_naam := 'AAFM';
   END IF;

   v_errormsg := 'Check of autorisatiegroep al bestaat';
   BEGIN
      SELECT fac_groep_key
        INTO v_fac_groep_key
        FROM fac_groep
       WHERE UPPER (fac_groep_omschrijving) = 'AAFM MEDEWERKER';
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         INSERT INTO fac_groep (fac_groep_omschrijving)
             VALUES ('AAFM Medewerker')
          RETURNING fac_groep_key
               INTO v_fac_groep_key;
   END;

   v_errormsg := 'Zoek de default groep';
   BEGIN
      SELECT fac_groep_key
        INTO v_fac_default_key
        FROM fac_groep
       WHERE UPPER (fac_groep_omschrijving) = '_DEFAULT';
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         fac.imp_writelog (p_import_key,
            'E',
            'Defaultgroep kan niet gevonden worden.' ,
            '');
   END;

   -- Check of bedrijf AAFM al bestaat
   v_errormsg := 'Check of bedrijf bestaat';

   BEGIN
      SELECT prs_bedrijf_key
        INTO v_prs_bedrijf_key
        FROM prs_bedrijf
       WHERE prs_bedrijf_naam = v_prs_bedrijf_naam
         AND prs_bedrijf_intern = 1
         AND prs_bedrijf_verwijder IS NULL;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         INSERT INTO prs_bedrijf (prs_bedrijf_naam, prs_bedrijf_intern)
             VALUES ('AAFM', 1)
          RETURNING prs_bedrijf_key
               INTO v_prs_bedrijf_key;
   END;

   -- Check of afdeling AAFM al bestaat
   v_errormsg := 'Check of afdeling bestaat';

   BEGIN
      IF aaxx_get_user = 'SITECH'
      THEN
         SELECT prs_afdeling_key
           INTO v_prs_afdeling_key
           FROM prs_afdeling
          WHERE prs_afdeling_naam = '284'
            AND prs_bedrijf_key = v_prs_bedrijf_key
            AND prs_afdeling_verwijder IS NULL;
      ELSE
         SELECT prs_afdeling_key
           INTO v_prs_afdeling_key
           FROM prs_afdeling
          WHERE prs_afdeling_omschrijving = 'AAFM'
            AND prs_bedrijf_key = v_prs_bedrijf_key
            AND prs_afdeling_verwijder IS NULL;
      END IF;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         INSERT INTO prs_afdeling (prs_afdeling_naam,
                                   prs_afdeling_omschrijving,
                                   prs_bedrijf_key)
             VALUES ('AAFM', 'AAFM', v_prs_bedrijf_key)
          RETURNING prs_afdeling_key
               INTO v_prs_afdeling_key;
   END;

   v_errormsg := 'Bepaal srtperslid';

   SELECT prs_srtperslid_key
     INTO v_prs_srtperslid_key
     FROM prs_srtperslid
    WHERE prs_srtperslid_omschrijving = 'Onbekend';

   FOR rec IN c
   LOOP
      BEGIN
         -- set alvast de variable om straks de kenmerken goed te kunnen opslaan.
         v_prs_perslid_key := rec.prs_perslid_key;

         -- als de persoon een personeelsnummer van de klant heeft gaan we niets aan zijn
         -- gegevens aanpassen maar wordt de persoon alleen aan de autorisatiegroep toegevoegd.
         IF rec.prs_perslid_nr IS NULL
         THEN
            IF rec.prs_perslid_key IS NULL
            THEN
               -- misschien kunnen we de persoon nog vinden op basis van personeelsnummer
               v_errormsg := 'Zoek persoon met zelfde personeelsnummer ' || rec.personeelsnummer;
               SELECT MAX(prs_perslid_key)
                 INTO v_prs_perslid_key
                 FROM prs_kenmerklink, prs_perslid
                WHERE prs_kenmerk_key = 3
                  AND prs_kenmerklink_verwijder IS NULL
                  AND prs_link_key = prs_perslid_key
                  AND prs_perslid_verwijder IS NULL
                  AND rec.personeelsnummer = prs_kenmerklink_waarde;

               -- persoon bestaat nog niet
               v_errormsg := 'Controle login ' || rec.personeelsnummer;
               SELECT count(prs_perslid_key)
                 INTO v_count
                 FROM prs_perslid
                WHERE prs_perslid_oslogin = UPPER(rec.loginnaam);

               IF v_count = 0 AND v_prs_perslid_key IS NULL THEN

                  v_errormsg := 'Toevoegen persoon ' || rec.personeelsnummer;

                  INSERT INTO prs_perslid (prs_afdeling_key,
                                           prs_perslid_naam,
                                           prs_perslid_tussenvoegsel,
                                           prs_perslid_voorletters,
                                           prs_perslid_voornaam,
                                           prs_perslid_titel,
                                           prs_perslid_telefoonnr,
                                           prs_perslid_mobiel,
                                           prs_perslid_email,
                                           prs_srtperslid_key,
                                           prs_perslid_oslogin,
                                           prs_perslid_apikey,
                                           prs_perslid_ingids,
                                           prs_perslid_dienstverband,
                                           prs_perslid_uurloon)
                      VALUES (v_prs_afdeling_key,
                              rec.persoonachternaam,
                              rec.tussenvoegsel,
                              rec.voorletters,
                              rec.voornaam,
                              rec.titel,
                              SUBSTR(rec.telefoonnummer,1,15),
                              rec.mobiel,
                              rec.email,
                              v_prs_srtperslid_key,
                              rec.loginnaam,
                              rec.prs_perslid_apikey,
                              NULL,
                              fac.safe_to_number (
                                 REPLACE (rec.dienstverband, ',', '.')),
                              fac.safe_to_number (REPLACE (rec.uurloon, ',', '.')))
                   RETURNING prs_perslid_key
                        INTO v_prs_perslid_key;

               ELSE
                  fac.imp_writelog (p_import_key,
                     'E',
                     'Login bestaat al bij andere persoon. (' || rec.persoonachternaam || ' - ' || rec.loginnaam || ' - ' || rec.personeelsnummer || ')' ,
                     '');
               END IF;

            ELSE
               -- persoon bestaat al
               v_errormsg := 'Aanpassen persoon ' || rec.personeelsnummer;

               UPDATE prs_perslid
                  SET prs_afdeling_key = v_prs_afdeling_key,
                      prs_perslid_naam = rec.persoonachternaam,
                      prs_perslid_tussenvoegsel = rec.tussenvoegsel,
                      prs_perslid_voorletters = rec.voorletters,
                      prs_perslid_voornaam = rec.voornaam,
                      prs_perslid_titel = rec.titel,
                      prs_perslid_telefoonnr = SUBSTR(rec.telefoonnummer,1,15),
                      prs_perslid_mobiel = rec.mobiel,
                      prs_perslid_email = COALESCE(prs_perslid_email, rec.email),
                      prs_srtperslid_key = v_prs_srtperslid_key,
                      prs_perslid_oslogin = rec.loginnaam,
                      prs_perslid_apikey = rec.prs_perslid_apikey,
                      prs_perslid_ingids = NULL,
                      prs_perslid_dienstverband =
                         fac.safe_to_number (
                            REPLACE (rec.dienstverband, ',', '.')),
                      prs_perslid_uurloon =
                         fac.safe_to_number (REPLACE (rec.uurloon, ',', '.'))
                WHERE prs_perslid_key = rec.prs_perslid_key;


            END IF;
            -- verwijder de zojuist toegevoegde persoon uit de default groep.
               DELETE fac_gebruikersgroep
                WHERE fac_groep_key = v_fac_default_key
                      AND prs_perslid_key = v_prs_perslid_key;
         END IF;

         IF v_prs_perslid_key IS NOT NULL
         THEN
            v_errormsg := 'Toevoegen key naar AAIT prs_perslid_key kenmerk ' || v_prs_perslid_key;
            aaxx.set_prs_kenmerk (p_import_key,
                                  'P',
                                  4,
                                  v_prs_perslid_key,
                                  rec.prs_perslid_key_aait);

            v_errormsg := 'Toevoegen personeelsnummer kenmerk ' || v_prs_perslid_key;
            aaxx.set_prs_kenmerk (p_import_key,
                                  'P',
                                  3,
                                  v_prs_perslid_key,
                                  rec.personeelsnummer);

            v_errormsg := 'Toevoegen kostenplaats kenmerk ' || v_prs_perslid_key;
            aaxx.set_prs_kenmerk (p_import_key,
                                  'P',
                                  2,
                                  v_prs_perslid_key,
                                  rec.kostenplaats);

            IF rec.afdelingscode = 'SD'
            THEN
               -- Servicedesk autorisatie toevoegen.
               v_errormsg := 'Toevoegen SD autorisatie ' || rec.personeelsnummer;
               INSERT INTO fac_gebruikersgroep (prs_perslid_key, fac_groep_key)
                  (SELECT v_prs_perslid_key, fac_groep_key
                     FROM fac_groep g
                    WHERE TRIM (fac_groep_upper) = 'AAFM SERVICEDESK'
                      AND NOT EXISTS
                             (SELECT fac_gebruikersgroep_key
                                FROM fac_gebruikersgroep gg
                               WHERE gg.prs_perslid_key = v_prs_perslid_key
                                 AND gg.fac_groep_key = g.fac_groep_key));

               -- Servicedesk medewerkers mandateren voor alle kostenplaatsen.
               v_errormsg := 'Toevoegen SD mandaat ' || rec.personeelsnummer;
               DELETE prs_perslidkostenplaats
                WHERE prs_perslid_key = v_prs_perslid_key
                  AND prs_kostenplaats_key IS NOT NULL;

               INSERT INTO prs_perslidkostenplaats (prs_perslid_key)
                  (SELECT v_prs_perslid_key FROM DUAL
                    WHERE NOT EXISTS
                             (SELECT prs_perslid_key
                                FROM prs_perslidkostenplaats pkp
                               WHERE pkp.prs_perslid_key = v_prs_perslid_key));

            END IF;


            -- voeg iedereen toe aan de gebruikersgroep AAFM Medewerker
            INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key)
               SELECT fac_groep_key, prs_perslid_key
                 FROM fac_groep g, prs_perslid p
                WHERE g.fac_groep_key = v_fac_groep_key
                  AND p.prs_perslid_key = v_prs_perslid_key
                  AND NOT EXISTS
                         (SELECT fac_gebruikersgroep_key
                            FROM fac_gebruikersgroep gg
                           WHERE gg.prs_perslid_key = p.prs_perslid_key
                             AND gg.fac_groep_key = g.fac_groep_key);

         END IF;

         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            v_error_hint := v_errormsg;
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg :=
                  v_errormsg
               || 'ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_errormsg,
                              v_error_hint);
            COMMIT;                                             -- tbv logging
      END;
   END LOOP;

   DELETE fac_gebruikersgroep
    WHERE fac_groep_key = v_fac_groep_key
          AND prs_perslid_key NOT IN
                   (SELECT p.prs_perslid_key
                      FROM aait.aait_imp_perslid i,
                           prs_perslid p,
                           prs_kenmerklink kl
                     WHERE p.prs_perslid_key = kl.prs_link_key
                       AND kl.prs_kenmerk_key = 3
                       AND i.personeelsnummer = kl.prs_kenmerklink_waarde);

   -- probeer personen te verwijderen die niet meer voorkomen in het importbestand
   FOR rec_del IN c_del
   LOOP
      BEGIN
         IF COALESCE(rec_del.prs_perslid_login, SYSDATE -11) > SYSDATE -10
         THEN
            fac.imp_writelog (p_import_key,
                              'I',
                              'Persoon ' || rec_del.prs_perslid_naam || ' (' || rec_del.prs_perslid_voornaam || ') zou verwijderd moeten worden',
                              '');
            UPDATE prs_perslid
               SET prs_perslid_oslogin = NULL,
                   prs_perslid_oslogin2 = NULL
             WHERE prs_perslid_key = rec_del.prs_perslid_key;
         ELSE
             fac.imp_writelog (p_import_key,
                              'I',
                              'Persoon ' || rec_del.prs_perslid_naam || ' (' || rec_del.prs_perslid_voornaam || ') zou verwijderd moeten worden',
                              '');
             aaxx.prs_del_perslid (p_import_key, rec_del.prs_perslid_key, 0, 0);
         END IF;
      END;
   END LOOP;
END;
/


-- view om ongeldige records te vinden.
CREATE OR REPLACE VIEW aaxx_rap_perslid_mismatch (hide_f_index, naam, voornaam, lastlogin, afdeling, AAFMpersoneelsnummer)
AS
  SELECT sysdate - prs_perslid_login,
         prs_perslid_naam,
         prs_perslid_voornaam,
         prs_perslid_login,
         prs_afdeling_omschrijving,
         klo.prs_kenmerklink_waarde nr
    FROM prs_perslid p, prs_kenmerklink klo, prs_afdeling a
   WHERE p.prs_perslid_key = klo.prs_link_key
     AND p.prs_afdeling_key = a.prs_afdeling_key
     AND prs_kenmerk_key = 3
     AND prs_perslid_verwijder IS NULL
     AND prs_perslid_login IS NOT NULL
     AND NOT EXISTS
            (SELECT prs_kenmerklink_key
               FROM prs_kenmerklink
              WHERE prs_link_key = p.prs_perslid_key AND prs_kenmerk_key = 4);


-------------------------------------------------------------------------------
-- KOPPELINGEN MET LEVERANCIERS
-------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE aaxx_import_opdrstat_strukton (
   p_import_key IN NUMBER)
AS
   c_delim                VARCHAR2 (1) := ';';
   v_newline              VARCHAR2 (1000);                       -- Input line
   v_errormsg             VARCHAR2 (4000);
   oracle_err_num         NUMBER;
   oracle_err_mes         VARCHAR2 (200);
   v_aanduiding           VARCHAR2 (1200);
   v_dummy                VARCHAR2 (200);
   header_is_valid        NUMBER := 0;
   v_count                NUMBER;
   v_count_tot            NUMBER (10) := 0;
   v_count_import         NUMBER (10) := 0;
   v_ongeldig             NUMBER (1) := 0;
   -- De importvelden
   v_mld_opdr_opmerking   VARCHAR2 (4000);
   v_mld_opdr_key         NUMBER (10);
   v_mld_opdr_key_tekst   VARCHAR2 (100);
   v_extern_nummer        VARCHAR2 (100);
   v_status               NUMBER (10);
   v_status_tekst         VARCHAR2 (100);
   v_status_code          VARCHAR2 (100);
   v_datumtijd            DATE;
   v_datumtijd_tekst      VARCHAR2 (100);
   v_opmerking            VARCHAR2 (3000);

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

   COMMIT;

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

         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);
         v_opmerking := substr(v_opmerking, 1, 1000);
         -- verwijder de markering voor cr/lf die we zelf in de stylesheet toegevoegd hebben.
         v_opmerking := replace(v_opmerking, '@@',CHR (13));
         v_aanduiding :=
               '['
            || v_extern_nummer
            || '|'
            || v_mld_opdr_key_tekst
            || '|'
            || v_status_tekst
            || '|'
            || v_opmerking
            || '] ';

         -- 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'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Fout inlezen mld_opdr_key [' || v_aanduiding || ']';
            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, ins_tab_discipline d, ins_srtdiscipline sd, mld_stdmelding std
                WHERE o.mld_melding_key = m.mld_melding_key
                  AND m.mld_stdmelding_key = std.mld_stdmelding_key
                  AND std.mld_ins_discipline_key = d.ins_discipline_key
                  AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
                  AND sd.ins_srtdiscipline_prefix || m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr = v_mld_opdr_key_tekst;

            EXCEPTION WHEN NO_DATA_FOUND THEN
               BEGIN
                 fac.imp_writelog (p_import_key, 'W',  'Opdracht kan niet gevonden worden. [' || v_aanduiding || ']', '');

               -- kijk nu of de opdracht gevonden kan worden a.d.h.v het Struktonnummer
               SELECT o.mld_opdr_key, o.mld_opdr_opmerking
                 INTO v_mld_opdr_key, v_mld_opdr_opmerking
                 FROM mld_opdr o, mld_kenmerkopdr ko, mld_kenmerk k
                WHERE o.mld_opdr_key = ko.mld_opdr_key
                  AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                  AND k.mld_srtkenmerk_key = 35
                  AND ko.mld_kenmerkopdr_waarde = v_extern_nummer;

               EXCEPTION WHEN OTHERS THEN
                  v_ongeldig := 1;
                  v_errormsg := 'Opdracht kan niet gevonden worden (intern/externnr).  [' || v_aanduiding || ']';
                  v_mld_opdr_key := NULL;
               END;
            END;

            IF v_ongeldig = 0
            THEN
               v_errormsg :=
                  'Fout bij bepalen status [' || v_aanduiding || ']';

               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 := 6;                                -- afgemeld
                  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;

            -- Lees alle veldwaarden
            IF v_ongeldig = 0
            THEN
               v_errormsg :=
                  'Fout bij converteren datumtijd [' || v_aanduiding || ']';
               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;

               IF v_datumtijd = NULL
               THEN
                  v_ongeldig := 0;
               END IF;
            END IF;

            IF v_ongeldig = 0
            THEN
               v_errormsg :=
                  'Fout bij aanvullen opmerking [' || v_aanduiding || ']';

               -- controleer of de opmerking niet leeg is en of dezelfde opmerking al bij een eerdere statusovergang
               -- gemeld is.
               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 toevoegen opdracht status ['
                     || v_aanduiding
                     || ']';

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

                  v_count_import := v_count_import + 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,
                        'Fout bij toevoegen regel aan importtabel aaxx_imp_opdr_status_strukton.');
               END;
            ELSE
               IF v_status_code <> '40' AND v_status_code <> '45'
               THEN
                  fac.imp_writelog (p_import_key,
                                    'E',
                                    v_errormsg,
                                    '');
               END IF;
            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!');
   END IF;

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


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

   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanduiding     VARCHAR2 (200);
   v_count_tot      NUMBER (10);
   v_count          NUMBER (10);
   v_mld_key        NUMBER (10) := 0;
   v_opdr_key       NUMBER (10) := 0;
   v_opdr_status    NUMBER (10) := 0;
   v_user_key       NUMBER (10) := 0;
   v_mld_typeopdr_key NUMBER (10);
   v_mld_kenmerk_key  NUMBER (10);
   v_mld_kenmerkopdr_key NUMBER (10);
   v_mld_srtkenmerk_key NUMBER (10);
BEGIN
   -- Loop door alle geimporteerde opdrachtstatusberichten en verwerk deze.
   v_count_tot := 0;

   -- Stel de key in van het srtkenmerk 'Ref. Nr. Leverancier'. Hier wordt
   -- het nummer dat Strukton aan de call gegeven heeft geregistreerd.
   IF aaxx_get_user = 'SABIC' THEN v_mld_srtkenmerk_key := 35; END IF;
   IF aaxx_get_user = 'ENEXIS' THEN v_mld_srtkenmerk_key := 381; END IF;
   IF aaxx_get_user = 'ESSENT' THEN v_mld_srtkenmerk_key := 741; END IF;
   IF aaxx_get_user = 'NS' THEN v_mld_srtkenmerk_key := 761; END IF;
   IF aaxx_get_user = 'SITECH' THEN v_mld_srtkenmerk_key := 123; END IF;
   IF aaxx_get_user = 'VL' THEN v_mld_srtkenmerk_key := 82; END IF;
   IF aaxx_get_user = 'HUNTSMAN' THEN v_mld_srtkenmerk_key := 381; END IF;
   IF aaxx_get_user = 'DOW' THEN v_mld_srtkenmerk_key := 81; END IF;

   v_user_key := 10;  -- Strukton user

   FOR rec IN c1
   LOOP
      BEGIN
         v_aanduiding :=
               '['
            || rec.mld_opdr_key
            || '|'
            || SUBSTR (rec.opmerking, 1, 100)
            || '] ';
         v_count_tot := v_count_tot + 1;
         v_count := 0;

         -- Key van melding/opdracht bepalen en externnr bij opdracht opslaan.
         IF (rec.mld_opdr_key IS NOT NULL)
         THEN
            v_errormsg := 'Fout bij 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 bij bepalen kenmerk extern nummer.';
            SELECT k.mld_kenmerk_key
              INTO v_mld_kenmerk_key
              FROM mld_kenmerk k
             WHERE k.mld_srtkenmerk_key = v_mld_srtkenmerk_key
               AND k.mld_typeopdr_key = v_mld_typeopdr_key;

            v_errormsg := 'Fout bij bepalen kenmerkopdracht extern nummer.';
            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;

            v_errormsg := 'Fout bij aanpassen extern nummer.';
            IF v_mld_kenmerkopdr_key IS NULL THEN
               -- kenmerk toevoegen
               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 aanpassen
               UPDATE mld_kenmerkopdr SET mld_kenmerkopdr_waarde = rec.extern_nummer WHERE mld_kenmerkopdr_key = v_mld_kenmerkopdr_key;
            END IF;

            v_errormsg := 'Fout bij bijwerken opdracht-opmerking.';

            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;

            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, v_user_key);       -- Facilitor
               ELSIF rec.status = 6 AND v_opdr_status = 5
               THEN
                  -- Meld de opdracht af als deze uitgegeven was
                  MLD.setopdrachtstatus (v_opdr_key, 8, v_user_key); -- Facilitor, eerst accepteren
                  MLD.setopdrachtstatus (v_opdr_key, 6, v_user_key);       -- Facilitor
               ELSIF rec.status = 6 AND v_opdr_status = 8
               THEN
                  -- Meld de opdracht af als deze geaccepteerd was
                  MLD.setopdrachtstatus (v_opdr_key, 6, v_user_key);       -- Facilitor
               ELSIF rec.status = 1 AND v_opdr_status = 5
               THEN
                  -- Opdracht is afgewezen op het moment dat de opdracht nog niet geaccepteerd is.
                  MLD.setopdrachtstatus (v_opdr_key, 1, v_user_key);       -- Facilitor
                  MLD.updatemeldingstatusAV (v_mld_key, 0, v_user_key, 0);
               ELSIF rec.status = 1 AND v_opdr_status = 8
               THEN
                  -- Opdracht is afgewezen op het moment dat de opdracht al geaccepteerd is.
                  MLD.setopdrachtstatus (v_opdr_key, 1, v_user_key);       -- Facilitor
                  MLD.updatemeldingstatusAV (v_mld_key, 0, v_user_key, 0);
               END IF;

               IF rec.status = 6 AND v_opdr_status <> 6
               THEN
                  v_errormsg := 'Fout bij statusaanpassing melding.';
                  -- Sinds AADO#30922 wordt de melding niet meer automatisch afgemeld.
                  MLD.updatemeldingstatusAV (v_mld_key, 0, v_user_key, 0);
               END IF;
            END IF;
         END IF;

         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
            v_errormsg :=
                  v_errormsg
               || ' ORACLE (error '
               || oracle_err_num
               || '/'
               || oracle_err_mes
               || ')';
            fac.imp_writelog (p_import_key,
                              'E',
                              v_aanduiding || v_errormsg,
                              'Fout bij verwerken opdrachtstatusbericht.');
      END;
   END LOOP;

   COMMIT;
END;
/


-------------------------------------------------------------------------------
-- IMPORTFUNCTIE - DIENST_LOC_BLD
-------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE aaxx_import_dienst_loc_bld (
   p_import_key IN NUMBER)
AS
   CURSOR c_cursor
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;

   v_newline          VARCHAR2 (1000);                          -- Import line
   v_field            VARCHAR2 (100);                          -- Import field
   v_fielddelimitor   VARCHAR2 (1);                         -- Field seperator
   v_errormsg         VARCHAR (200);
   v_errorhint        VARCHAR (200);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_skipfield        VARCHAR2 (100);
   -- De importvelden
   v_bedrijf_naam     VARCHAR2 (100);
   v_bedrijf_nr       VARCHAR2 (100);
   v_dienst_oms       VARCHAR2 (100);
   v_locatie_code     VARCHAR2 (100);
   v_gebouw_code      VARCHAR2 (100);
   header_found       BOOLEAN;
BEGIN
   -- Init
   header_found := FALSE;
   v_fielddelimitor := ';';

   -- Clear my previous imported rows
   DELETE FROM aaxx_imp_dienst_loc_bld;

   FOR rec1 IN c_cursor
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;

         IF SUBSTR (v_newline, 1, 3) = '?'
         THEN
            -- EF BB BF aangetroffen
            fac.imp_writelog (p_import_key,
                              'W',
                              'Byte Order Mark aangetroffen',
                              'Bestand heeft onbehandeld UTF-8 formaat.');
            v_newline := SUBSTR (v_newline, 4);
         END IF;

         fac.imp_getfield (v_newline, v_fielddelimitor, v_bedrijf_naam);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_bedrijf_nr);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dienst_oms);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_locatie_code);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_gebouw_code);

         -- Skip until a valid header is found
         IF     UPPER (v_bedrijf_naam) = 'BEDRIJFNAAM'
            AND UPPER (v_bedrijf_nr) = 'BEDRIJF_NR'
            AND UPPER (v_dienst_oms) = 'DIENST'
            AND UPPER (v_locatie_code) = 'LOCATIE_CODE'
            AND UPPER (v_gebouw_code) = 'GEBOUW_CODE'
         THEN
            -- Sla de kopregel over.
            header_found := TRUE;
         ELSIF (header_found)
         THEN
            INSERT INTO aaxx_imp_dienst_loc_bld (prs_bedrijf_naam,
                                                 prs_bedrijf_nr,
                                                 prs_dienst_omschrijving,
                                                 alg_locatie_code,
                                                 alg_gebouw_code)
                VALUES (SUBSTR (v_bedrijf_naam, 1, 60),
                        SUBSTR (v_bedrijf_nr, 1, 50),
                        SUBSTR (v_dienst_oms, 1, 60),
                        SUBSTR (v_locatie_code, 1, 10),
                        SUBSTR (v_gebouw_code, 1, 12));
         END IF;

         COMMIT;
      END;
   END LOOP;

   IF NOT header_found
   THEN
      fac.imp_writelog (
         p_import_key,
         'E',
         'Geen geldige header aangetroffen',
         'Bestand is geen geldig BedrijfDienstLocatieGebouw importbestand.');
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
         'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        SUBSTR (v_errormsg, 1, 1000),
                        '');

      -- maak de importtabel leeg om te voorkomen dat er halve bestanden ingelezen worden.
      DELETE FROM aaxx_imp_dienst_loc_bld;
END;
/

CREATE OR REPLACE PROCEDURE aaxx_update_dienst_loc_bld (
   p_import_key IN NUMBER)
AS
   CURSOR cbdlg
   IS
      SELECT prs_bedrijf_naam,
             prs_bedrijf_nr,
             prs_dienst_omschrijving,
             alg_locatie_code,
             alg_gebouw_code
        FROM aaxx_imp_dienst_loc_bld
       WHERE prs_dienst_omschrijving IS NOT NULL;

   v_oldcountbdlg      NUMBER;
   v_newcountbdlg      NUMBER;
   v_prs_bedrijf_key   NUMBER;
   v_prs_dienst_key    NUMBER;
   v_alg_locatie_key   NUMBER;
   v_alg_gebouw_key    NUMBER;
   v_errormsg          VARCHAR (1000);
   v_error_hint        VARCHAR (1000);
   oracle_err_mes      VARCHAR2 (150);
   oracle_err_num      VARCHAR2 (150);
   currentversion      fac_module.fac_module_version%TYPE;
BEGIN
   SELECT MAX (fac_module_version) INTO currentversion FROM fac_module;

   fac.imp_writelog (
      p_import_key,
      'I',
      'Arcadis Aqumen BedrijfDienstLocatieGebouw import version '
      || currentversion,
      '$Revision$');

   SELECT COUNT ( * ) INTO v_oldcountbdlg FROM aaxx_imp_dienst_loc_bld;

   IF v_oldcountbdlg = 0
   THEN
      fac.imp_writelog (
         p_import_key,
         'E',
         'Arcadis Aqumen BedrijfDienstLocatieGebouw import bevat geen records',
         '$Revision$');
      RETURN;
   END IF;

   -- How many active records are now present?
   SELECT COUNT ( * ) INTO v_oldcountbdlg FROM prs_bedrijfdienstlocatie;

   -- remove the existing records
   DELETE prs_bedrijfdienstlocatie;

   FOR rec IN cbdlg
   LOOP
      BEGIN
         v_errormsg :=
               'Kan dienst niet bepalen ['
            || rec.prs_dienst_omschrijving
            || '] ';

         SELECT prs_dienst_key
           INTO v_prs_dienst_key
           FROM prs_dienst
          WHERE UPPER (prs_dienst_omschrijving) =
                   UPPER (rec.prs_dienst_omschrijving);

         v_errormsg :=
            'Kan locatie niet bepalen [' || rec.alg_locatie_code || '] ';

         IF rec.alg_locatie_code IS NOT NULL
         THEN
            SELECT alg_locatie_key
              INTO v_alg_locatie_key
              FROM alg_v_aanweziglocatie
             WHERE UPPER (alg_locatie_code) = UPPER (rec.alg_locatie_code);
         ELSE
            v_alg_locatie_key := NULL;
         END IF;

         v_errormsg :=
            'Kan gebouw niet bepalen [' || rec.alg_gebouw_code || '] ';

         IF rec.alg_gebouw_code IS NOT NULL
         THEN
            SELECT alg_gebouw_key
              INTO v_alg_gebouw_key
              FROM alg_v_aanweziggebouw
             WHERE alg_gebouw_upper = UPPER (rec.alg_gebouw_code);

            v_alg_locatie_key := NULL;
         ELSE
            v_alg_gebouw_key := NULL;
         END IF;

         v_errormsg :=
               'Kan bedrijf niet bepalen ['
            || rec.prs_bedrijf_naam
            || '('
            || rec.prs_bedrijf_nr
            || ')'
            || '] ';

         SELECT prs_bedrijf_key
           INTO v_prs_bedrijf_key
           FROM prs_v_aanwezigbedrijf
          WHERE UPPER (prs_bedrijf_naam) = UPPER (rec.prs_bedrijf_naam);

         v_errormsg :=
               'Kan bedrijf/dienst/loc/bld niet wegschrijven ['
            || rec.prs_bedrijf_naam
            || '('
            || rec.prs_bedrijf_nr
            || ')'
            || '/'
            || rec.prs_dienst_omschrijving
            || '/'
            || rec.alg_locatie_code
            || '/'
            || rec.alg_gebouw_code
            || '] ';

         INSERT INTO prs_bedrijfdienstlocatie (prs_dienst_key,
                                               prs_bedrijf_key,
                                               alg_locatie_key,
                                               alg_gebouw_key)
             VALUES (v_prs_dienst_key,
                     v_prs_bedrijf_key,
                     v_alg_locatie_key,
                     v_alg_gebouw_key);

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

   SELECT COUNT ( * ) INTO v_newcountbdlg FROM aaxx_imp_dienst_loc_bld;

   fac.imp_writelog (
      p_import_key,
      'S',
         'Aantal BedrijfDienstLocBld vooraf: '
      || TO_CHAR (v_oldcountbdlg)
      || ' => nu: '
      || TO_CHAR (v_newcountbdlg),
      '');
END;
/


-------------------------------------------------------------------------------
-- RAPPORTAGES  aaxx_v_rap_gebruikers_auth
-------------------------------------------------------------------------------
CREATE OR REPLACE VIEW aaxx_v_rap_gebruikers_auth (
   naam,
   afdeling,
   functie,
   email,
   login,
   alt_login,
   auth_groep,
   last_login
   )
AS
   SELECT prs_perslid_naam_full,
          prs_afdeling_omschrijving,
          prs_srtperslid_omschrijving,
          prs_perslid_email,
          prs_perslid_oslogin,
          prs_perslid_oslogin2,
          fac_groep_omschrijving,
          prs_perslid_login
   FROM prs_v_aanwezigperslid p,
        prs_v_perslid_fullnames pf,
        fac_gebruikersgroep gg,
        prs_afdeling a,
        fac_groep g,
        prs_srtperslid sp
   WHERE     p.prs_perslid_key = pf.prs_perslid_key
         AND p.prs_perslid_key = gg.prs_perslid_key(+)
         AND p.prs_afdeling_key = a.prs_afdeling_key
         AND p.prs_srtperslid_key = sp.prs_srtperslid_key
         AND gg.fac_groep_key = g.fac_groep_key(+)
         AND (p.prs_perslid_oslogin IS NOT NULL
          OR  p.prs_perslid_oslogin2 IS NOT NULL)
         AND SUBSTR(COALESCE (p.prs_perslid_oslogin, 'QueQueLeQue'),1,1) <> '_';

-- Geatoriseerd voor ORDBO2 maar niet gekoppeld aan een bedrijf of AAFMer
CREATE OR REPLACE VIEW aaxx_v_rap_ordbo2_no_bdr
(
   prs_perslid_key,
   naam,
   login_naam,
   email,
   autorisatiegroep
)
AS
   SELECT DISTINCT pf.prs_perslid_key,
                   prs_perslid_naam_full,
                   prs_perslid_oslogin,
                   prs_perslid_email,
                   fac_groep_omschrijving
     FROM fac_groeprechten fgr,
          fac_functie ff,
          fac_gebruikersgroep fgg,
          fac_groep fg,
          prs_v_perslid_fullnames pf,
          prs_perslid p
    WHERE ff.fac_functie_key = fgr.fac_functie_key
      AND UPPER (fac_functie_code) = 'WEB_ORDBO2'
      AND (fac_gebruiker_prs_level_read < 9
        OR fac_gebruiker_alg_level_read < 9)
      AND fgr.fac_groep_key = fgg.fac_groep_key
      AND p.prs_perslid_key = fgg.prs_perslid_key
      AND fg.fac_groep_key = fgg.fac_groep_key
      AND p.prs_perslid_key = pf.prs_perslid_key
      AND UPPER (prs_perslid_oslogin) != '_FACILITOR'
      AND fgg.prs_perslid_key NOT IN
                (SELECT prs_perslid_key
                   FROM prs_contactpersoon pc, prs_bedrijf b
                  WHERE prs_contactpersoon_verwijder IS NULL
                    AND pc.prs_bedrijf_key = b.prs_bedrijf_key
                    AND b.prs_bedrijf_verwijder IS NULL
                    AND pc.prs_perslid_key IS NOT NULL)
      AND NOT EXISTS
             (SELECT prs_afdeling_key
                FROM prs_afdeling a
               WHERE a.prs_afdeling_key = p.prs_afdeling_key
                 AND a.prs_afdeling_omschrijving = 'AAFM');


CREATE OR REPLACE VIEW aaxx_v_rap_dienst_loc_bld (fclt_f_bedrijfnaam
                                                , fclt_f_bedrijf_nr
                                                , fclt_f_dienst
                                                , fclt_f_locatie_code
                                                , fclt_f_gebouw_code
                                                )
AS
SELECT prs_bedrijf_naam bedrijfnaam,
       prs_leverancier_nr bedrijfnummer,
       prs_dienst_omschrijving dienst,
       alg_locatie_code locatie_code,
       alg_gebouw_upper gebouw_code
FROM prs_v_aanwezigbedrijf b,
     prs_dienst d,
     alg_locatie l,
     alg_gebouw g,
     prs_bedrijfdienstlocatie bdl
WHERE     b.prs_bedrijf_key = bdl.prs_bedrijf_key(+)
      AND bdl.prs_dienst_key = d.prs_dienst_key(+)
      AND bdl.alg_locatie_key = l.alg_locatie_key(+)
      AND bdl.alg_gebouw_key = g.alg_gebouw_key(+)
      AND COALESCE (b.prs_bedrijf_intern, 0) = 0;


CREATE OR REPLACE VIEW aaxx_v_rap_bdl_contract
(
   fclt_f_profiel,
   fclt_f_bedrijfnaam,
   fclt_f_bedrijf_nr,
   fclt_f_dienst,
   fclt_f_locatie_code,
   fclt_f_gebouw_code,
   fclt_f_contract
)
AS
   SELECT 'Contract',
          prs_bedrijf_naam,
          prs_leverancier_nr,
          prs_dienst_omschrijving,
          (SELECT alg_locatie_code
             FROM alg_locatie l
            WHERE l.alg_locatie_key =
                     COALESCE (cpl.alg_locatie_key, cpg.alg_locatie_key)),
          (SELECT alg_gebouw_upper
             FROM alg_gebouw g1
            WHERE g1.alg_gebouw_key = cpg.alg_gebouw_key),
          c.cnt_contract_nummer_intern
     FROM cnt_contract c,
          (SELECT cnt_contract_key, cnt_alg_plaats_key alg_locatie_key
             FROM cnt_contract_plaats cp
            WHERE cp.cnt_contract_plaats_verwijder IS NULL
              AND cp.cnt_alg_plaats_code = 'L') cpl,
          (SELECT cnt_contract_key, g.alg_locatie_key, g.alg_gebouw_key
             FROM cnt_contract_plaats cp, alg_gebouw g
            WHERE cp.cnt_alg_plaats_code = 'G'
              AND cnt_alg_plaats_key = g.alg_gebouw_key) cpg,
          prs_bedrijf b,
          prs_dienst d
    WHERE c.cnt_contract_key = cpl.cnt_contract_key(+)
      AND c.cnt_contract_key = cpg.cnt_contract_key(+)
      AND c.prs_dienst_key = d.prs_dienst_key(+)
      AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key(+)
      AND c.cnt_contract_looptijd_tot > SYSDATE
   UNION ALL
   SELECT 'Uitvoerder',
          prs_bedrijf_naam bedrijfnaam,
          prs_leverancier_nr bedrijfnummer,
          prs_dienst_omschrijving dienst,
          alg_locatie_code locatie_code,
          alg_gebouw_upper gebouw_code,
          NULL
     FROM prs_v_aanwezigbedrijf b,
          prs_dienst d,
          alg_locatie l,
          alg_gebouw g,
          prs_bedrijfdienstlocatie bdl
    WHERE b.prs_bedrijf_key = bdl.prs_bedrijf_key(+)
      AND bdl.prs_dienst_key = d.prs_dienst_key(+)
      AND bdl.alg_locatie_key = l.alg_locatie_key(+)
      AND bdl.alg_gebouw_key = g.alg_gebouw_key(+)
      AND COALESCE (b.prs_bedrijf_intern, 0) = 0;

CREATE OR REPLACE VIEW aaxx_v_rap_contractorders (
   contractorder,
   versie,
   fclt_f_gebouwcode,
   fclt_f_leverancier,
   fclt_f_beschrijving,
   fclt_f_pakket,
   ingangsdatum,
   einddatum,
   fclt_f_status,
   kosten,
   totaalkosten,
   gefactureerd,
   dienst,
   leveranciernr
   )
AS
   SELECT cnt_contract_nummer_intern contractorder,
          cnt_contract_versie,
          alg_gebouw_code gebouwcode,
          prs_bedrijf_naam leverancier,
          k.prs_kostensoort_opmerking beschrijving,
          (SELECT prs_kostensoortgrp_oms
           FROM prs_kostensoortgrp ksg
           WHERE ksg.prs_kostensoortgrp_key = k.prs_kostensoortgrp_key)
             pakket,
          TO_CHAR (c.cnt_contract_looptijd_van, 'DD-MM-YYYY') ingangsdatum,
          TO_CHAR (c.cnt_contract_looptijd_tot, 'DD-MM-YYYY') einddatum,
          DECODE (SIGN (cnt_contract_looptijd_van - SYSDATE),
                  1,
                  'Toekomst',
                  -1,
                  DECODE (SIGN (cnt_contract_looptijd_tot - SYSDATE),
                          1,
                          'Actueel',
                          -1,
                          'Verlopen'
                  )
          )
             status,
          COALESCE (ROUND ( DECODE (cnt_gew.cnt_contract_plaats_gewicht,
                                                               0,
                                                               1,
                                                               (cp.cnt_contract_plaats_gewicht
                                                                / cnt_gew.cnt_contract_plaats_gewicht)
                          * c.cnt_contract_kosten),
                           2
                    ),
                    0
          )
             kosten,
          c.cnt_contract_kosten orderbedrag,
          (SELECT SUM (fr.fin_factuurregel_totaal)
           FROM aaxx_v_aanwezigfactuur f, fin_factuurregel fr
           WHERE f.fin_factuur_key = fr.fin_factuur_key
                 AND f.cnt_contract_key = c.cnt_contract_key)
             gefactureerd,
          k.prs_kostensoort_refcode dienst,
          b.prs_leverancier_nr leveranciernr
   FROM cnt_contract c,
        cnt_discipline d,
        cnt_contract_plaats cp,
        prs_bedrijf b,
        prs_kostensoort k,
        prs_kostenplaats kp,
        prs_afdeling a,
        prs_perslid p,
        alg_locatie l,
        alg_gebouw g,
        prs_contactpersoon cop,
        (SELECT cnt_contract_key,
            SUM (cnt_contract_plaats_gewicht) cnt_contract_plaats_gewicht
           FROM cnt_contract_plaats
          GROUP BY cnt_contract_key) cnt_gew,
        (SELECT cp.cnt_contract_plaats_key, alg_locatie_key, alg_gebouw_key
         FROM alg_v_allonroerendgoed aog, cnt_contract_plaats cp
         WHERE aog.alg_type = cp.cnt_alg_plaats_code
               AND aog.alg_onroerendgoed_keys = cp.cnt_alg_plaats_key) cog
   WHERE     c.cnt_contract_key = cp.cnt_contract_key(+)
         AND c.cnt_contract_key = cnt_gew.cnt_contract_key(+)
         AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
         AND c.ins_discipline_key = d.ins_discipline_key
         AND d.prs_kostensoort_key = k.prs_kostensoort_key(+)
         AND c.prs_kostenplaats_key = kp.prs_kostenplaats_key(+)
         AND c.prs_afdeling_key_eig = a.prs_afdeling_key
         AND c.prs_perslid_key_beh = p.prs_perslid_key
         AND cp.cnt_contract_plaats_key = cog.cnt_contract_plaats_key(+)
         AND c.prs_contactpersoon_key = cop.prs_contactpersoon_key(+)
         AND cog.alg_locatie_key = l.alg_locatie_key(+)
         AND cog.alg_gebouw_key = g.alg_gebouw_key(+)
         AND cnt_contract_verwijder IS NULL;

-- eerst volgen de kopregels en de tweede union bevat de detailregels.
CREATE OR REPLACE VIEW aaxx_v_rap_imp_jaarcontract
(
   HIDE_F_VOLGORDE,
   GEBOUW,
   BEDRIJF,
   LEVNR,
   BESCHRIJVING,
   INGANGSDATUM,
   EINDDATUM,
   ORDEROMSCHRIJVING,
   BEDRAG,
   TERMIJNBEDRAG,
   DIENST,
   CONTRACTSOORT,
   CONTRACTNR,
   VERSIE,
   REGELNR,
   CONTRACTAFDELING,
   CONTRACTMANAGER,
   GEWIJZIGDDOOR,
   STATUS
)
AS
   SELECT COALESCE (fac.safe_to_number (cnt_contract_nummer_intern),
                    cs.ins_discipline_key * 1000 + b.prs_bedrijf_key)
          * 100,
          k.prs_kostenplaats_nr,
          prs_bedrijf_naam,
          prs_leverancier_nr,
          cnt_contract_omschrijving,
          TO_CHAR (ADD_MONTHS (cnt_contract_looptijd_van, 12), 'dd-mm-yyyy'),
          TO_CHAR (ADD_MONTHS (cnt_contract_looptijd_tot, 12), 'dd-mm-yyyy'),
          REPLACE (cnt_contract_document, '"', ' - '),
          cnt_contract_kosten,
          cnt_contract_termijnkosten,
          prs_dienst_omschrijving,
          cs.ins_discipline_omschrijving,
          cnt_contract_nummer_intern,
          COALESCE (fac.safe_to_number (cnt_contract_versie), 0) + 1,
          NULL,
          a.prs_afdeling_naam,
          p2.prs_perslid_oslogin,
          p.prs_perslid_oslogin,
          DECODE (SIGN(SYSDATE - c.cnt_contract_looptijd_tot), -1, 'Actief', 'Niet Actief') status
     FROM cnt_v_aanwezigcontract c,
          prs_kostenplaats k,
          prs_perslid p,
          prs_perslid p2,
          prs_afdeling a,
          prs_dienst d,
          prs_bedrijf b,
          ins_tab_discipline cs
    WHERE (SYSDATE BETWEEN c.cnt_contract_looptijd_van   -- TRUNC(SYSDATE, 'YEAR')
                      AND  c.cnt_contract_looptijd_tot
                 OR c.cnt_contract_looptijd_van >= TRUNC(SYSDATE, 'YEAR') )
          AND c.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
          AND c.prs_perslid_key_beh = p.prs_perslid_key
          AND c.prs_perslid_key_eig = p2.prs_perslid_key(+)
          AND c.prs_afdeling_key_eig = a.prs_afdeling_key
          AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
          AND c.prs_dienst_key = d.prs_dienst_key(+)
          AND c.ins_discipline_key = cs.ins_discipline_key
   UNION ALL
   SELECT (COALESCE (fac.safe_to_number (cnt_contract_nummer_intern),
                                         cs.ins_discipline_key * 1000 + b.prs_bedrijf_key)
          * 100)
          + aaxx_get_cnt_cont_plaats_index (cp.cnt_contract_plaats_key),
          alg_gebouw_code,
          prs_bedrijf_naam,
          prs_leverancier_nr,
          cnt_contract_omschrijving,
          TO_CHAR (ADD_MONTHS (cnt_contract_looptijd_van, 12), 'dd-mm-yyyy'),
          TO_CHAR (ADD_MONTHS (cnt_contract_looptijd_tot, 12), 'dd-mm-yyyy'),
          NULL,
          DECODE (
             cnt_gew.cnt_contract_plaats_gewicht,
             0,
             c.cnt_contract_kosten,
             ROUND (
                (cp.cnt_contract_plaats_gewicht
                 / cnt_gew.cnt_contract_plaats_gewicht)
                * c.cnt_contract_kosten,
                2)),
          NULL,
          prs_dienst_omschrijving,
          cs.ins_discipline_omschrijving,
          cnt_contract_nummer_intern,
          COALESCE (fac.safe_to_number (cnt_contract_versie), 0) + 1,
          aaxx_get_cnt_cont_plaats_index (cp.cnt_contract_plaats_key),
          a.prs_afdeling_naam,
          p2.prs_perslid_oslogin,
          p.prs_perslid_oslogin,
          DECODE (SIGN(SYSDATE - c.cnt_contract_looptijd_tot), -1, 'Actief', 'Niet Actief') status
     FROM cnt_v_aanwezigcontract c,
          prs_kostenplaats k,
          prs_perslid p,
          prs_perslid p2,
          prs_afdeling a,
          prs_dienst d,
          prs_bedrijf b,
          ins_tab_discipline cs,
          cnt_contract_plaats cp,
          alg_gebouw g,
          (  SELECT cnt_contract_key,
                    SUM (cnt_contract_plaats_gewicht)
                       cnt_contract_plaats_gewicht
               FROM cnt_contract_plaats
              WHERE cnt_contract_plaats_verwijder IS NULL
           GROUP BY cnt_contract_key) cnt_gew
    WHERE (SYSDATE BETWEEN c.cnt_contract_looptijd_van   -- TRUNC(SYSDATE, 'YEAR')
                      AND  c.cnt_contract_looptijd_tot
                 OR c.cnt_contract_looptijd_van >= TRUNC(SYSDATE, 'YEAR') )
          AND c.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
          AND c.prs_perslid_key_beh = p.prs_perslid_key
          AND c.prs_perslid_key_eig = p2.prs_perslid_key(+)
          AND c.prs_afdeling_key_eig = a.prs_afdeling_key
          AND c.cnt_prs_bedrijf_key = b.prs_bedrijf_key
          AND c.prs_dienst_key = d.prs_dienst_key(+)
          AND c.ins_discipline_key = cs.ins_discipline_key
          AND c.cnt_contract_key = cp.cnt_contract_key
          AND cp.cnt_alg_plaats_key = g.alg_gebouw_key
          AND cp.cnt_alg_plaats_code = 'G'
          AND c.cnt_contract_key = cnt_gew.cnt_contract_key;

-- rapportage om ruimteinformatie te exporteren / bewerken en importeren in Facilitor
CREATE OR REPLACE VIEW aaxx_v_rap_imp_ruimte
(
   fclt_f_locatie,
   fclt_f_gebouw,
   fclt_f_verdieping,
   alg_ruimte_key,
   alg_ruimte_nr,
   alg_ruimte_omschrijving,
   alg_srtruimte_omschrijving,
   mld_dienstniveau_omschr,
   alg_ruimte_bruto_vloeropp
)
AS
   SELECT alg_locatie_code,
          alg_gebouw_code,
          alg_verdieping_code,
          alg_ruimte_key,
          alg_ruimte_nr,
          alg_ruimte_omschrijving,
          sr.alg_srtruimte_omschrijving,
          d.mld_dienstniveau_omschr,
          r.alg_ruimte_bruto_vloeropp
     FROM alg_ruimte r,
          mld_dienstniveau d,
          alg_srtruimte sr,
          alg_verdieping v,
          alg_gebouw g,
          alg_locatie l
    WHERE r.mld_dienstniveau_key = d.mld_dienstniveau_key(+)
          AND r.alg_srtruimte_key = sr.alg_srtruimte_key(+)
          AND r.alg_verdieping_key = v.alg_verdieping_key
          AND v.alg_gebouw_key = g.alg_gebouw_key
          AND g.alg_locatie_key = l.alg_locatie_key
          AND r.alg_ruimte_verwijder IS NULL;


CREATE OR REPLACE VIEW aaxx_v_rap_stdmelding_gegbasis
(
   fclt_f_vakgroeptype,
   fclt_f_vakgroep,
   fclt_f_melding,
   groep,
   niet_zichtbaar_fe,
   acceptatietijd,
   uitvoertijd,
   kostensoort,
   kostensoort_code,
   fin_waarde,
   aanwijzing_nederlands,
   aanwijzing_english,
   aanwijzing_deutsch,
   aanwijzing_francais,
   dienst,
   vereist_dienst,
   opdrachttype,
   autoorder,
   alg_niveau,
   vervallen
)
AS
   SELECT sd.ins_srtdiscipline_omschrijving,
          d.ins_discipline_omschrijving,
          m.mld_stdmelding_omschrijving,
          g.mld_stdmeldinggroep_naam mld_stdmelding_groep,
          DECODE (m.mld_stdmelding_notfrontend, 1, 'Ja', 'Nee'),
          TO_CHAR (m.mld_stdmelding_t_accepttijd.tijdsduur)
          || m.mld_stdmelding_t_accepttijd.eenheid,
          TO_CHAR (m.mld_stdmelding_t_uitvoertijd.tijdsduur)
          || m.mld_stdmelding_t_uitvoertijd.eenheid,
          COALESCE (k2.prs_kostensoort_opmerking,
                    k.prs_kostensoort_opmerking),
          COALESCE (k2.prs_kostensoort_oms, k.prs_kostensoort_oms),
          COALESCE (k2.prs_kostensoort_refcode, k.prs_kostensoort_refcode),
          mld_stdmelding_hint,
          len.fac_locale_tekst,
          lde.fac_locale_tekst,
          lfr.fac_locale_tekst,
          d.prs_dienst_omschrijving,
          m.mld_stdmelding_vereisdienst,
          ot.mld_typeopdr_omschrijving,
          m.mld_stdmelding_autoorder,
          alg_onrgoed_niveau,
          mld_stdmelding_vervaldatum
     FROM mld_stdmelding m,
          mld_stdmeldinggroep g,
          mld_discipline d,
          ins_srtdiscipline sd,
          prs_kostensoort k,
          prs_kostensoort k2,
          prs_dienst d,
          mld_typeopdr ot,
          (SELECT fac_locale_kolomkeyval, fac_locale_tekst
             FROM fac_locale
            WHERE fac_locale_kolomnaam = 'MLD_STDMELDING_HINT'
              AND fac_locale_lang = 'EN') len,
          (SELECT fac_locale_kolomkeyval, fac_locale_tekst
             FROM fac_locale
            WHERE fac_locale_kolomnaam = 'MLD_STDMELDING_HINT'
              AND fac_locale_lang = 'DE') lde,
          (SELECT fac_locale_kolomkeyval, fac_locale_tekst
             FROM fac_locale
            WHERE fac_locale_kolomnaam = 'MLD_STDMELDING_HINT'
              AND fac_locale_lang = 'FR') lfr
    WHERE m.mld_stdmelding_verwijder IS NULL
      AND m.mld_ins_discipline_key = d.ins_discipline_key
      AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
      AND d.prs_kostensoort_key = k.prs_kostensoort_key(+)
      AND m.prs_kostensoort_key = k2.prs_kostensoort_key(+)
      AND m.prs_dienst_key = d.prs_dienst_key(+)
      AND m.mld_typeopdr_key = ot.mld_typeopdr_key(+)
      AND m.mld_stdmeldinggroep_key = g.mld_stdmeldinggroep_key(+)
      AND len.fac_locale_kolomkeyval(+) = m.mld_stdmelding_key
      AND lde.fac_locale_kolomkeyval(+) = m.mld_stdmelding_key
      AND lfr.fac_locale_kolomkeyval(+) = m.mld_stdmelding_key;

CREATE OR REPLACE VIEW aaxx_v_rap_stdmelding_gegevens
(
   fclt_f_vakgroeptype,
   fclt_f_vakgroep,
   fclt_f_melding,
   groep,
   niet_zichtbaar_fe,
   acceptatietijd,
   uitvoertijd,
   kostensoort,
   kostensoort_code,
   fin_waarde,
   aanwijzing_nederlands,
   aanwijzing_english,
   aanwijzing_deutsch,
   aanwijzing_francais,
   alg_niveau,
   vervallen,
   vereist_dienst,
   opdrachttype,
   autoorder,
   fclt_f_dienst,
   fclt_f_bedrijf,
   fclt_f_locatie_code,
   fclt_f_gebouw_code
)
AS
   SELECT sd.ins_srtdiscipline_omschrijving,
          d.ins_discipline_omschrijving,
          m.mld_stdmelding_omschrijving,
          g.mld_stdmeldinggroep_naam mld_stdmelding_groep,
          DECODE (m.mld_stdmelding_notfrontend, 1, 'Ja', 'Nee'),
          TO_CHAR (m.mld_stdmelding_t_accepttijd.tijdsduur)
          || m.mld_stdmelding_t_accepttijd.eenheid,
          TO_CHAR (m.mld_stdmelding_t_uitvoertijd.tijdsduur)
          || m.mld_stdmelding_t_uitvoertijd.eenheid,
          COALESCE (k2.prs_kostensoort_opmerking,
                    k.prs_kostensoort_opmerking),
          COALESCE (k2.prs_kostensoort_oms, k.prs_kostensoort_oms),
          COALESCE (k2.prs_kostensoort_refcode, k.prs_kostensoort_refcode),
          mld_stdmelding_hint,
          len.fac_locale_tekst,
          lde.fac_locale_tekst,
          lfr.fac_locale_tekst,
          alg_onrgoed_niveau,
          mld_stdmelding_vervaldatum,
          m.mld_stdmelding_vereisdienst,
          ot.mld_typeopdr_omschrijving,
          m.mld_stdmelding_autoorder,
          dl.dienst,
          dl.bedrijfnaam,
          dl.locatie_code,
          dl.gebouw_code
     FROM mld_stdmelding m,
          mld_stdmeldinggroep g,
          mld_discipline d,
          ins_srtdiscipline sd,
          prs_kostensoort k,
          prs_kostensoort k2,
          (SELECT d.prs_dienst_key,
                  prs_bedrijf_naam bedrijfnaam,
                  prs_dienst_omschrijving dienst,
                  alg_locatie_code locatie_code,
                  alg_gebouw_upper gebouw_code
             FROM prs_v_aanwezigbedrijf b,
                  prs_dienst d,
                  alg_locatie l,
                  alg_gebouw g,
                  prs_bedrijfdienstlocatie bdl
            WHERE b.prs_bedrijf_key = bdl.prs_bedrijf_key(+)
              AND bdl.prs_dienst_key = d.prs_dienst_key(+)
              AND bdl.alg_locatie_key = l.alg_locatie_key(+)
              AND bdl.alg_gebouw_key = g.alg_gebouw_key(+)
              AND COALESCE (b.prs_bedrijf_intern, 0) = 0) dl,
          mld_typeopdr ot,
          (SELECT fac_locale_kolomkeyval, fac_locale_tekst
             FROM fac_locale
            WHERE fac_locale_kolomnaam = 'MLD_STDMELDING_HINT'
              AND fac_locale_lang = 'EN') len,
          (SELECT fac_locale_kolomkeyval, fac_locale_tekst
             FROM fac_locale
            WHERE fac_locale_kolomnaam = 'MLD_STDMELDING_HINT'
              AND fac_locale_lang = 'DE') lde,
          (SELECT fac_locale_kolomkeyval, fac_locale_tekst
             FROM fac_locale
            WHERE fac_locale_kolomnaam = 'MLD_STDMELDING_HINT'
              AND fac_locale_lang = 'FR') lfr
    WHERE m.mld_stdmelding_verwijder IS NULL
      AND m.mld_ins_discipline_key = d.ins_discipline_key
      AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
      AND d.prs_kostensoort_key = k.prs_kostensoort_key(+)
      AND m.prs_kostensoort_key = k2.prs_kostensoort_key(+)
      AND m.prs_dienst_key = dl.prs_dienst_key(+)
      AND m.mld_typeopdr_key = ot.mld_typeopdr_key(+)
      AND m.mld_stdmeldinggroep_key = g.mld_stdmeldinggroep_key(+)
      AND len.fac_locale_kolomkeyval(+) = m.mld_stdmelding_key
      AND lde.fac_locale_kolomkeyval(+) = m.mld_stdmelding_key
      AND lfr.fac_locale_kolomkeyval(+) = m.mld_stdmelding_key;


-- Grafische thema's en labels voor de plattegrond met reserveringsinfo
CREATE OR REPLACE VIEW aaxx_v_cad_label_res_info
(
   alg_ruimte_key,
   waarde
)
AS
     SELECT rar.alg_ruimte_key,
             max(       TO_CHAR (res_rsv_ruimte_van, 'HH24:MI')
                || '-'
                || TO_CHAR (res_rsv_ruimte_tot, 'HH24:MI')
                || '~[s60]host: '
                || prs_perslid_naam
                || '~[s40][b]'
                || DECODE (COALESCE (INSTR (res_rsv_ruimte_omschrijving, ' ', 15),0),
                           0, res_rsv_ruimte_omschrijving,
                           SUBSTR (res_rsv_ruimte_omschrijving, 1, INSTR (res_rsv_ruimte_omschrijving, ' ', 15)-1)
                                  || chr(10)
                                  || '~[s40][b]' || SUBSTR(res_rsv_ruimte_omschrijving, INSTR(res_rsv_ruimte_omschrijving, ' ', 15)+1, 50))
             )  waarde
       FROM res_v_aanwezigrsv_ruimte rrr,
            res_ruimte_opstelling rro,
            res_ruimte rr,
            res_alg_ruimte rar,
            res_opstelling ro,
            prs_perslid pp
      WHERE     rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
            AND rro.res_ruimte_key = rr.res_ruimte_key
            AND rro.res_opstelling_key = ro.res_opstelling_key
            AND rar.res_ruimte_key = rr.res_ruimte_key
            AND SYSDATE BETWEEN res_rsv_ruimte_van - (1 / 96)      -- kwartier
                            AND  res_rsv_ruimte_tot
            AND pp.prs_perslid_key = res_rsv_ruimte_host_key
            AND (res_rsv_ruimte_bezoekers_shown IS NULL
                 OR res_rsv_ruimte_bezoekers_shown > 0)
      GROUP BY rar.alg_ruimte_key;


CREATE OR REPLACE VIEW aaxx_v_cad_thema_resinfo
(
   alg_ruimte_key,
   waarde
)
AS
   SELECT rar.alg_ruimte_key alg_ruimte_key,
          ROUND ( (res_rsv_ruimte_tot - SYSDATE) * 24, 2) waarde
     FROM res_v_aanwezigrsv_ruimte rrr,
          res_ruimte_opstelling rro,
          res_ruimte rr,
          res_alg_ruimte rar,
          res_opstelling ro
    WHERE     rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
          AND rro.res_ruimte_key = rr.res_ruimte_key
          AND rro.res_opstelling_key = ro.res_opstelling_key
          AND rar.res_ruimte_key = rr.res_ruimte_key
          AND SYSDATE BETWEEN res_rsv_ruimte_van AND res_rsv_ruimte_tot
          AND (res_rsv_ruimte_bezoekers_shown IS NULL
               OR res_rsv_ruimte_bezoekers_shown > 0)
   UNION
   -- binnenkort aanvangende reserveringen
   SELECT rar.alg_ruimte_key alg_ruimte_key,
          ROUND ( (SYSDATE - res_rsv_ruimte_van) * 24, 2) waarde
     FROM res_v_aanwezigrsv_ruimte rrr,
          res_ruimte_opstelling rro,
          res_ruimte rr,
          res_alg_ruimte rar,
          res_opstelling ro
    WHERE     rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
          AND rro.res_ruimte_key = rr.res_ruimte_key
          AND rro.res_opstelling_key = ro.res_opstelling_key
          AND rar.res_ruimte_key = rr.res_ruimte_key
          AND SYSDATE BETWEEN res_rsv_ruimte_van - (1 / 24)
                          AND  res_rsv_ruimte_tot
          AND SYSDATE < res_rsv_ruimte_van
          AND (res_rsv_ruimte_bezoekers_shown IS NULL
               OR res_rsv_ruimte_bezoekers_shown > 0)
   UNION
   -- voorlopig vrije ruimte
   SELECT rar.alg_ruimte_key alg_ruimte_key, 0 waarde
     FROM res_ruimte_opstelling rro,
          res_ruimte rr,
          res_alg_ruimte rar,
          res_opstelling ro
    WHERE     rro.res_ruimte_key = rr.res_ruimte_key
          AND rro.res_opstelling_key = ro.res_opstelling_key
          AND rar.res_ruimte_key = rr.res_ruimte_key
          AND NOT EXISTS
                (SELECT ''
                   FROM res_v_aanwezigrsv_ruimte rrr
                  WHERE rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
                        AND SYSDATE BETWEEN res_rsv_ruimte_van - (1 / 24)
                                        AND  res_rsv_ruimte_tot
                        AND (res_rsv_ruimte_bezoekers_shown IS NULL
                             OR res_rsv_ruimte_bezoekers_shown > 0));




-- view voor het exporteren van een catalogus. Deze kan later via de import ingelezen worden.
CREATE OR REPLACE VIEW aaxx_v_imp_bes_artikel_sync
(
   FCLT_F_CatalogusNaam,
   Leverancier,
   CatDatum,
   Artikelnr,
   Groep,
   Omschrijving,
   Prijs,
   Eenheid,
   Picture,
   Orderaantal,
   Tax,
   DueDate,
   Inkoopprijs,
   Minimum,
   Staffeltabel,
   Wijzigdagen,
   Annuleerdagen
)
AS
   SELECT   td.ins_discipline_omschrijving,
            b.prs_bedrijf_naam,
            TO_CHAR (td.ins_discipline_aanmaak, 'yyyymmdd'),
            sd.bes_srtdeel_nr,
            sg.bes_srtgroep_omschrijving,
            sd.bes_srtdeel_omschrijving,
            TO_CHAR (bes.getsrtdeelprijs (sd.bes_srtdeel_key, NULL)),
            sd.bes_srtdeel_eenheid,
            sd.bes_srtdeel_image,
            TO_CHAR (sd.bes_srtdeel_veelvoud),
            TO_CHAR (sd.bes_srtdeel_btw),
            TO_CHAR (sd.bes_srtdeel_vervaldatum, 'yyyymmdd'),
            TO_CHAR (bes.getsrtdeelinkprijs (sd.bes_srtdeel_key, NULL)),
            NULL,
            bs.bes_staffeltabel_naam,
            sd.bes_srtdeel_wijzigdagen,
            sd.bes_srtdeel_annuleerdagen
     FROM   ins_tab_discipline td,
            bes_srtgroep sg,
            bes_srtdeel sd,
            prs_bedrijf b,
            bes_staffeltabel bs
    WHERE       td.ins_discipline_module = 'BES'
            AND td.ins_discipline_verwijder IS NULL
            AND td.ins_discipline_key = sg.ins_discipline_key
            AND sg.bes_srtgroep_verwijder IS NULL
            AND sg.bes_srtgroep_key = sd.bes_srtgroep_key
            AND sd.bes_srtdeel_verwijder IS NULL
            AND sd.prs_bedrijf_key = b.prs_bedrijf_key
            AND bs.bes_staffeltabel_key(+) = sd.bes_staffeltabel_key;

CREATE OR REPLACE VIEW aaxx_v_rap_kostenmutatie
(
   opdracht,
   vakgroeptype,
   vakgroep,
   mutatie,
   fclt_d_datum,
   fclt_f_leverancier,
   persoon
)
AS
   SELECT o.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr opdracht,
          (SELECT ins_srtdiscipline_omschrijving
             FROM ins_srtdiscipline sd
            WHERE sd.ins_srtdiscipline_key = d.ins_srtdiscipline_key)
             Vakgroeptype,
          ins_discipline_omschrijving vakgroep,
          SUBSTR (
             fac_tracking_oms,
             INSTR (fac_tracking_oms, 'Totaal ex. BTW:'),
             DECODE (
                INSTR (fac_tracking_oms,
                       CHR (10),
                       INSTR (fac_tracking_oms, 'Totaal ex. BTW:')),
                0,
                10000,
                INSTR (fac_tracking_oms,
                       CHR (10),
                       INSTR (fac_tracking_oms, 'Totaal ex. BTW:')))
             - INSTR (fac_tracking_oms, 'Totaal ex. BTW:'))
             oud_nieuw,
          TO_CHAR (fac_tracking_datum, 'dd-mm-yyyy') datum,
          prs_bedrijf_naam leverancier,
          prs_perslid_naam_full persoon
     FROM fac_tracking t,
          mld_opdr o,
          mld_melding m,
          mld_stdmelding std,
          ins_tab_discipline d,
          prs_v_perslid_fullnames_all pf,
          prs_bedrijf b
    WHERE     fac_tracking_oms LIKE '%Totaal ex. BTW:%'
          AND t.fac_tracking_refkey = o.mld_opdr_key
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_stdmelding_key = std.mld_stdmelding_key
          AND std.mld_ins_discipline_key = d.ins_discipline_key
          AND t.prs_perslid_key = pf.prs_perslid_key(+)
          AND o.mld_uitvoerende_keys = b.prs_bedrijf_key(+)
          AND t.fac_tracking_datum BETWEEN mld.getopdrachtstatusdate (
                                              o.mld_opdr_key,
                                              6)   -- afgemeld
                                       AND  COALESCE (
                                               mld.getopdrachtstatusdate (
                                                  o.mld_opdr_key,
                                                  9),   -- afgerond
                                               SYSDATE);

CREATE OR REPLACE VIEW aaxx_v_rap_bedrijf_orderadres
(
   fclt_f_bedrijf,
   fclt_f_plaats,
   fclt_f_nummer,
   fclt_f_email,
   fclt_f_type,
   fclt_f_orderadres,
   stylesheet
)
AS
   SELECT   b.prs_bedrijf_naam,
            b.prs_bedrijf_bezoek_plaats,
            b.prs_leverancier_nr,
            b.prs_bedrijf_email,
            DECODE (a.prs_bedrijfadres_type,
                    'C', 'Contract',
                    'B', 'Bestelling',
                    'Opdracht')
            || ' '
            || ot.mld_typeopdr_omschrijving
               TYPE,
            a.prs_bedrijfadres_url,
            a.prs_bedrijfadres_xsl
     FROM   prs_bedrijf b, prs_bedrijfadres a, mld_typeopdr ot
    WHERE       b.prs_bedrijf_key = a.prs_bedrijf_key
            AND b.prs_bedrijf_verwijder IS NULL
            AND NVL (b.prs_bedrijf_intern, 0) <> 1
            AND a.mld_typeopdr_key = ot.mld_typeopdr_key(+);

-- view om offertestatus in dashbord te tonen
-- functionaliteit overgenomen uit mld.inc
CREATE OR REPLACE VIEW aaxx_v_rap_offerte_status
AS
   SELECT u.*,
          g.prs_perslid_key_verantw opdracht_gebouw_verantw_key,
          m.kostensoort kostensoort,
          subproductgroepgroep,
          DECODE (
             COALESCE (na.aantal, 0),
             1,
             'Offerte geaccepteerd',
             DECODE (COALESCE (nta.aantal, 0),
                     0, 'Niet opgelost',
                     'Offerte acceptatie'))
             offerte_status
     FROM mld_v_udr_opdracht u,
          alg_gebouw g,
          mld_v_udr_melding m,
          (  SELECT o.mld_melding_key, COUNT (o.mld_statusopdr_key) aantal
               FROM mld_opdr o
              WHERE o.mld_statusopdr_key = 6
                AND o.mld_opdr_key >
                       COALESCE (
                          (SELECT MAX (o1.mld_opdr_key)
                             FROM mld_opdr o1, mld_typeopdr mo1
                            WHERE o1.mld_typeopdr_key = mo1.mld_typeopdr_key
                              AND mo1.mld_typeopdr_isofferte = 0
                              AND o1.mld_melding_key = o.mld_melding_key),
                          0)
           GROUP BY o.mld_melding_key) nta,
          (  SELECT o.mld_melding_key, COUNT (o.mld_statusopdr_key) aantal
               FROM mld_opdr o
              WHERE o.mld_statusopdr_key = 9
                AND o.mld_opdr_key >
                       COALESCE (
                          (SELECT MAX (o1.mld_opdr_key)
                             FROM mld_opdr o1, mld_typeopdr mo1
                            WHERE o1.mld_typeopdr_key = mo1.mld_typeopdr_key
                              AND mo1.mld_typeopdr_isofferte = 0
                              AND o1.mld_melding_key = o.mld_melding_key),
                          0)
           GROUP BY o.mld_melding_key) na
    WHERE u.opdracht_gebouwcode = g.alg_gebouw_code
      AND u.melding_key = m.melding_key
      AND u.melding_key = na.mld_melding_key(+)
      AND u.melding_key = nta.mld_melding_key(+)
      AND u.opdracht_type = 'RFQ';


CREATE OR REPLACE VIEW aaxx_v_rap_trace_uitvoerder
(
   fclt_x_fm,
   fclt_x_tfm,
   html_opdracht,
   fclt_f_district,
   fclt_f_locatie,
   fclt_f_gebouw,
   fclt_f_bedrijf,
   opdracht_omschrijving,
   einddatum,
   t,
   m,
   e,
   notitie_datum,
   notitie_omschrijving
)
AS
   SELECT   COALESCE (p.prs_perslid_naam_full, 'Onbekend') fmer, -- verantwoordelijke FMer
            COALESCE (
               (SELECT   fac.getdomeinwaarde (fac_kenmerkdomein_key,
                                              alg_onrgoedkenmerk_waarde)
                  FROM   alg_kenmerk k, alg_onrgoedkenmerk ogk
                 WHERE   k.alg_kenmerk_key = ogk.alg_kenmerk_key
                         AND ogk.alg_onrgoed_key = g.alg_gebouw_key
                         AND k.alg_kenmerk_key =
                               DECODE (aaxx_get_user,
                                       'SITECH', 1160,
                                       'SABIC', 1180,
                                       -1)),
               'Onbekend'
            )
               tfmer,                      -- verantwoordelijke Technisch FMer
            '<a onclick=''FcltMgr.openDetail("Appl/MLD/mld_opdr.asp?urole=bo&'
            || 'opdr_key='
            || o.mld_opdr_key
            || ' ", "Opdracht '
            || o.mld_melding_key
            || '/'
            || o.mld_opdr_bedrijfopdr_volgnr
            || '")''>'
            || o.mld_melding_key
            || '/'
            || o.mld_opdr_bedrijfopdr_volgnr
            || '</a>'
               opdracht,
            d.alg_district_omschrijving,
            l.alg_locatie_omschrijving,
            g.alg_gebouw_omschrijving,
            prs_bedrijf_naam,
            mld_opdr_omschrijving,
            mld_opdr_einddatum,
            (SELECT   COUNT ( * )
               FROM   mld_opdr_note n3
              WHERE   n3.mld_opdr_key = o.mld_opdr_key
                      AND UPPER (n3.mld_opdr_note_omschrijving) LIKE '%#T%')
               nt,
            (SELECT   COUNT ( * )
               FROM   mld_opdr_note n3
              WHERE   n3.mld_opdr_key = o.mld_opdr_key
                      AND UPPER (n3.mld_opdr_note_omschrijving) LIKE '%#M%')
               nm,
            (SELECT   COUNT ( * )
               FROM   mld_opdr_note n3
              WHERE   n3.mld_opdr_key = o.mld_opdr_key
                      AND UPPER (n3.mld_opdr_note_omschrijving) LIKE '%#E%')
               ne,
            lastnote.mld_opdr_note_aanmaak,
            lastnote.mld_opdr_note_omschrijving omschrijving
     FROM   mld_opdr o,
            mld_melding m,
            mld_stdmelding std,
            prs_bedrijf b,
            alg_v_onroerendgoed alg,
            alg_gebouw g,
            alg_locatie l,
            alg_district d,
            prs_v_perslid_fullnames_all p,
            (SELECT   n.mld_opdr_key,
                      mld_opdr_note_aanmaak,
                      mld_opdr_note_omschrijving
               FROM   mld_opdr_note n
              WHERE   (   UPPER (n.mld_opdr_note_omschrijving) LIKE '%#T%'
                       OR UPPER (n.mld_opdr_note_omschrijving) LIKE '%#M%'
                       OR UPPER (n.mld_opdr_note_omschrijving) LIKE '%#E%')
                      AND NOT EXISTS
                            (SELECT   mld_opdr_note_key
                               FROM   mld_opdr_note n2
                              WHERE   n2.mld_opdr_note_aanmaak >
                                         n.mld_opdr_note_aanmaak
                                      AND n2.mld_opdr_key = n.mld_opdr_key))
            note,
            (SELECT   n.mld_opdr_key,
                      mld_opdr_note_aanmaak,
                      mld_opdr_note_omschrijving
               FROM   mld_opdr_note n
              WHERE   NOT EXISTS
                         (SELECT   mld_opdr_note_key
                            FROM   mld_opdr_note n2
                           WHERE   n2.mld_opdr_note_aanmaak >
                                      n.mld_opdr_note_aanmaak
                                   AND n2.mld_opdr_key = n.mld_opdr_key))
            lastnote
    WHERE       o.mld_opdr_einddatum < SYSDATE
            AND o.mld_opdr_key = note.mld_opdr_key(+)
            AND o.fac_activiteit_key IS NULL
            AND o.mld_opdr_key = lastnote.mld_opdr_key(+)
            AND m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_stdmelding_slabewaken = 1
            AND o.mld_statusopdr_key IN (5, 8)     -- Toegekend + Geaccepteerd
            AND b.prs_bedrijf_key = o.mld_uitvoerende_keys
            AND m.mld_melding_key = o.mld_melding_key
            AND g.prs_perslid_key_verantw = p.prs_perslid_key(+)
            AND m.mld_alg_onroerendgoed_keys = alg.alg_onroerendgoed_keys
            AND alg.alg_gebouw_key = g.alg_gebouw_key
            AND g.alg_locatie_key = l.alg_locatie_key
            AND l.alg_district_key = d.alg_district_key
            AND (note.mld_opdr_note_aanmaak IS NULL
                 OR note.mld_opdr_note_aanmaak < SYSDATE - 7);


CREATE OR REPLACE VIEW aaxx_v_rap_trace_uitv_z_tfm
(
   fclt_x_fm,
   html_opdracht,
   fclt_f_district,
   fclt_f_locatie,
   fclt_f_gebouw,
   fclt_f_bedrijf,
   opdracht_omschrijving,
   einddatum,
   t,
   m,
   e,
   notitie_datum,
   notitie_omschrijving
)
AS
   SELECT fclt_x_fm,
          html_opdracht,
          fclt_f_district,
          fclt_f_locatie,
          fclt_f_gebouw,
          fclt_f_bedrijf,
          opdracht_omschrijving,
          einddatum,
          t,
          m,
          e,
          notitie_datum,
          notitie_omschrijving
     FROM aaxx_v_rap_trace_uitvoerder;


/* Formatted on 19-7-2016 18:06:24 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW aaxx_v_rap_catering_export
(
   reservering,
   fclt_f_afdelingscode,
   afdelings_omschrijving,
   boekingsdatum,
   afmelddatum,
   fclt_f_periode,
   aanvrager,
   gebouw,
   aantal,
   artikel,
   btw,
   totaal
)
AS
   SELECT rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr
             reservering,
          k.prs_kostenplaats_nr,
          k.prs_kostenplaats_omschrijving,
          rra.res_rsv_artikel_levering,
          rra.res_rsv_artikel_afgemeld,
          TO_CHAR (ADD_MONTHS (rra.res_rsv_artikel_verwerkt, -1), 'yyyy-mm')
             periode,
          pf.prs_perslid_naam_full,
          g.alg_gebouw_code,
          rra.res_rsv_artikel_aantal,
          ra.res_artikel_omschrijving,
          ra.res_artikel_btw,
          rra.res_rsv_artikel_prijs
     FROM res_rsv_artikel rra,
          res_rsv_ruimte rrr,
          prs_kostenplaats k,
          prs_perslid p,
          alg_gebouw g,
          prs_afdeling a,
          prs_v_perslid_fullnames_all pf,
          res_artikel ra,
          (  SELECT res_rsv_ruimte_key, MAX (alg_gebouw_key) alg_gebouw_key
               FROM (SELECT rrr.res_rsv_ruimte_key,
                            (SELECT alg_gebouw_key
                               FROM alg_verdieping v, alg_ruimte r
                              WHERE v.alg_verdieping_key = r.alg_verdieping_key
                                    AND r.alg_ruimte_key = COALESCE (r2ar.alg_ruimte_key, rrr.alg_ruimte_key))
                               alg_gebouw_key
                       FROM res_v_rsv_ruimte_2_alg_ruimte r2ar,
                            res_v_aanwezigrsv_ruimte rrr
                      WHERE rrr.res_rsv_ruimte_key = r2ar.res_rsv_ruimte_key(+))
           GROUP BY res_rsv_ruimte_key) rg
    WHERE     rra.res_status_bo_key = 6
          AND rra.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
          AND rrr.prs_kostenplaats_key = k.prs_kostenplaats_key(+)
          AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
          AND p.prs_afdeling_key = a.prs_afdeling_key
          AND p.prs_perslid_key = pf.prs_perslid_key
          AND rra.res_artikel_key = ra.res_artikel_key
          AND rrr.res_rsv_ruimte_key = rg.res_rsv_ruimte_key
          AND rg.alg_gebouw_key = g.alg_gebouw_key(+);

CREATE OR REPLACE VIEW aaxx_v_rap_login_user (hide_f_datum, fclt_d_datum, aantal)
AS
   SELECT trunc(sysdate)-trunc(pl.login_datum),
          TO_CHAR (pl.login_datum, 'dd-mm-yyyy'),
          COUNT (prs_perslid_key)
   FROM aaxx_perslid_login pl
   GROUP BY trunc(sysdate)-trunc(pl.login_datum),
            TO_CHAR (pl.login_datum, 'dd-mm-yyyy');

CREATE OR REPLACE VIEW aaxx_v_rap_errorlog
(
   HIDE_F_IMP_LOG_DATUM,
   FCLT_F_APPLICATIE,
   FCLT_F_DATUM,
   TIJDSTIP,
   FCLT_F_NIVEAU,
   FCLT_F_OMSCHRIJVING
)
AS
   SELECT imp_log_datum hide_f_imp_log_datum,
          imp_log_applicatie,
          TO_CHAR (imp_log_datum, 'YYYYMMDD') fclt_f_datum,
          TO_CHAR (imp_log_datum, 'HH24:MI:SS') tijdstip,
          DECODE (imp_log_status,
                  'F', 'Fataal',
                  'E', 'Error',
                  'W', 'Waarschuwing',
                  'I', 'Informatief',
                  '-')
             fclt_f_niveau,
          imp_log_omschrijving fclt_f_omschrijving
     FROM imp_log;

CREATE OR REPLACE VIEW aaxx_v_rap_lang_stdmelding_oms
(
   key,
   vakgroeptype,
   vakgroep,
   melding_omschrijving,
   en,
   de
)
AS
   SELECT mld_stdmelding_key,
          ins_srtdiscipline_prefix,
          ins_discipline_omschrijving,
          mld_stdmelding_omschrijving,
          (SELECT fac_locale_tekst
             FROM fac_locale
            WHERE     fac_locale_kolomnaam = 'MLD_STDMELDING_OMSCHRIJVING'
                  AND fac_locale_lang = 'EN'
                  AND fac_locale_kolomkeyval = std.mld_stdmelding_key)
             EN,
          (SELECT fac_locale_tekst
             FROM fac_locale
            WHERE     fac_locale_kolomnaam = 'MLD_STDMELDING_OMSCHRIJVING'
                  AND fac_locale_lang = 'DE'
                  AND fac_locale_kolomkeyval = std.mld_stdmelding_key)
             DE
     FROM ins_tab_discipline d, mld_stdmelding std, ins_srtdiscipline sd
    WHERE     d.ins_discipline_key = std.mld_ins_discipline_key
          AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key(+)
          AND ins_discipline_verwijder IS NULL
          AND mld_stdmelding_verwijder IS NULL;

CREATE OR REPLACE VIEW aaxx_v_rap_lang_discipline_oms
(
   key,
   fclt_f_module,
   vakgroeptype,
   vakgroep,
   en,
   de
)
AS
   SELECT ins_discipline_key,
          ins_discipline_module,
          ins_srtdiscipline_prefix,
          ins_discipline_omschrijving,
          (SELECT fac_locale_tekst
             FROM fac_locale
            WHERE     fac_locale_kolomnaam = 'INS_DISCIPLINE_OMSCHRIJVING'
                  AND fac_locale_lang = 'EN'
                  AND fac_locale_kolomkeyval = d.ins_discipline_key)
             EN,
          (SELECT fac_locale_tekst
             FROM fac_locale
            WHERE     fac_locale_kolomnaam = 'INS_DISCIPLINE_OMSCHRIJVING'
                  AND fac_locale_lang = 'DE'
                  AND fac_locale_kolomkeyval = d.ins_discipline_key)
             DE
     FROM ins_tab_discipline d, ins_srtdiscipline sd
    WHERE d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key(+)
          AND ins_discipline_verwijder IS NULL;


-------------------------------------------------------------------------------
-- IMPORTFUNCTIE - MLD_LANG
-------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE aaxx_import_mld_lang (
   p_import_key IN NUMBER)
AS
   CURSOR c_cursor
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;

   v_newline          VARCHAR2 (1000);                          -- Import line
   v_field            VARCHAR2 (100);                          -- Import field
   v_fielddelimitor   VARCHAR2 (1);                         -- Field seperator
   v_errormsg         VARCHAR (200);
   v_errorhint        VARCHAR (200);
   oracle_err_num     NUMBER;
   oracle_err_mes     VARCHAR2 (200);
   v_skipfield        VARCHAR2 (100);
   v_dummy            VARCHAR2 (1000);
   -- De importvelden
   v_vakgroeptype_nl        VARCHAR2 (200);
   v_vakgroeptype_prefix    VARCHAR2 (200);
   v_vakgroep_nl            VARCHAR2 (200);
   v_stdmelding_nl          VARCHAR2 (200);
   v_stdmelding_hint_nl     VARCHAR2 (4000);
   v_vakgroeptype_en        VARCHAR2 (200);
   v_vakgroep_en            VARCHAR2 (200);
   v_stdmelding_en          VARCHAR2 (200);
   v_stdmelding_hint_en     VARCHAR2 (4000);
   header_found             BOOLEAN;
BEGIN
   -- Init
   header_found := FALSE;
   v_fielddelimitor := ';';

   -- Clear my previous imported rows
   DELETE FROM aaxx_imp_mld_lang;

   FOR rec1 IN c_cursor
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;

         IF SUBSTR (v_newline, 1, 3) = '?'
         THEN
            -- EF BB BF aangetroffen
            fac.imp_writelog (p_import_key,
                              'W',
                              'Byte Order Mark aangetroffen',
                              'Bestand heeft onbehandeld UTF-8 formaat.');
            v_newline := SUBSTR (v_newline, 4);
         END IF;
         --vakgroeptype NL;prefix;plaatsgegevens;objectgegevens;bestelgegevens;vakgroep NL;melding NL;aanwijzingen (NL)
         fac.imp_getfield (v_newline, v_fielddelimitor, v_vakgroeptype_nl);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_vakgroeptype_prefix);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_vakgroep_nl);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_stdmelding_nl);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_stdmelding_hint_nl);
         -- ;groep;kostensoort;acceptatietijd;uitvoertijd;uitvoertijd kritiek;uitvoertijd hoog;uitvoertijd laag;streeftijd;directklaar;dienst;Vakgroeptype EN;vakgroep EN;melding EN;aanwijzingen EN;
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_dummy);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_vakgroeptype_en);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_vakgroep_en);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_stdmelding_en);
         fac.imp_getfield (v_newline, v_fielddelimitor, v_stdmelding_hint_en);

         -- Skip until a valid header is found
         IF     UPPER (v_vakgroeptype_nl) = 'VAKGROEPTYPE NL'
            AND UPPER (v_vakgroeptype_prefix) = 'PREFIX'
            AND UPPER (v_vakgroep_nl) = 'VAKGROEP NL'
            AND UPPER (v_stdmelding_nl) = 'MELDING NL'
            AND UPPER (v_stdmelding_hint_nl) = 'AANWIJZINGEN (NL)'
            AND UPPER (v_vakgroeptype_en) = 'VAKGROEPTYPE EN'
            AND UPPER (v_vakgroep_en) = 'VAKGROEP EN'
            AND UPPER (v_stdmelding_en) = 'MELDING EN'
            AND UPPER (v_stdmelding_hint_en) = 'AANWIJZINGEN EN'
         THEN
            -- Sla de kopregel over.
            header_found := TRUE;
         ELSIF (header_found)
         THEN
            INSERT INTO aaxx_imp_mld_lang ( ins_srtdiscipline_omschrijving,
                                            ins_srtdiscipline_prefix,
                                            ins_discipline_omschrijving,
                                            mld_stdmelding_omschrijving,
                                            mld_stdmelding_hint,
                                            ins_srtdiscipline_omschr_en,
                                            ins_discipline_omschrijving_en,
                                            mld_stdmelding_omschrijving_en,
                                            mld_stdmelding_hint_en)
                VALUES (SUBSTR (v_vakgroeptype_nl, 1, 30),
                        SUBSTR (v_vakgroeptype_prefix, 1, 3),
                        SUBSTR (v_vakgroep_nl, 1, 30),
                        SUBSTR (v_stdmelding_nl, 1, 60),
                        SUBSTR (v_stdmelding_hint_nl, 1, 1000),
                        SUBSTR (v_vakgroeptype_en, 1, 30),
                        SUBSTR (v_vakgroep_en, 1, 30),
                        SUBSTR (v_stdmelding_en, 1, 60),
                        SUBSTR (v_stdmelding_hint_en, 1, 1000));
         ELSE  -- geen geldige header aangetroffen
            IF rec1.fac_imp_file_index = 1
            THEN
               fac.imp_writelog (p_import_key,
                     'I',
                     'Aangetroffen header',
                     SUBSTR( v_vakgroeptype_nl     || '-1-' ||
                             v_vakgroeptype_prefix || '-2-' ||
                             v_vakgroep_nl         || '-3-' ||
                             v_stdmelding_nl       || '-4-' ||
                             v_stdmelding_hint_nl  || '-5-' ||
                             v_vakgroeptype_en     || '-6-' ||
                             v_vakgroep_en         || '-7-' ||
                             v_stdmelding_en       || '-8-' ||
                             v_stdmelding_hint_en,1,1000));
            END IF;
         END IF;
         COMMIT;
      END;
   END LOOP;

   IF NOT header_found
   THEN
      fac.imp_writelog (
         p_import_key,
         'E',
         'Geen geldige header aangetroffen',
         'Bestand is geen geldig MLD vertaling importbestand.');
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
         'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.imp_writelog (p_import_key,
                        'E',
                        SUBSTR (v_errormsg, 1, 1000),
                        '');

      -- maak de importtabel leeg om te voorkomen dat er halve bestanden ingelezen worden.
      DELETE FROM aaxx_imp_mld_lang;
END;
/

CREATE OR REPLACE PROCEDURE aaxx_update_mld_lang (
   p_import_key IN NUMBER)
AS
   CURSOR c
   IS
      SELECT *
        FROM aaxx_imp_mld_lang
       WHERE ins_srtdiscipline_omschrijving IS NOT NULL;

   v_srtdiscipline_key NUMBER;
   v_discipline_key    NUMBER;
   v_stdmelding_key    NUMBER;
   v_errormsg          VARCHAR (1000);
   v_error_hint        VARCHAR (1000);
   v_tekst             VARCHAR (300);
   oracle_err_mes      VARCHAR2 (150);
   oracle_err_num      VARCHAR2 (150);
   currentversion      fac_module.fac_module_version%TYPE;

   PROCEDURE update_locale(p_kolom IN VARCHAR2, p_key IN NUMBER, p_lang IN VARCHAR, p_value IN VARCHAR)
   AS
   BEGIN
      BEGIN
         SELECT fac_locale_tekst
           INTO v_tekst
           FROM fac_locale
          WHERE UPPER(fac_locale_kolomnaam) = UPPER(p_kolom)
            AND fac_locale_kolomkeyval = p_key
            AND UPPER(fac_locale_lang) = UPPER(p_lang);
      EXCEPTION WHEN NO_DATA_FOUND
      THEN
         INSERT INTO fac_locale (fac_locale_kolomkeyval, fac_locale_kolomnaam, fac_locale_lang, fac_locale_tekst)
         VALUES (p_key, UPPER(p_kolom), UPPER(p_lang), SUBSTR(p_value,1,300));
         RETURN;
      END;

      UPDATE fac_locale SET fac_locale_tekst = SUBSTR(p_value,1,300)
       WHERE UPPER(fac_locale_kolomnaam) = UPPER(p_kolom)
         AND fac_locale_kolomkeyval = p_key
         AND UPPER(fac_locale_lang) = UPPER(p_lang);
      RETURN;
   END;

BEGIN

   SELECT MAX (fac_module_version) INTO currentversion FROM fac_module;

   fac.imp_writelog (
      p_import_key,
      'I',
      'AA-FM Melding vertaling import version '
      || currentversion,
      '$Revision$');

   FOR rec IN c
   LOOP
      BEGIN
         v_errormsg := 'Kan srtdiscipline [' || rec.ins_srtdiscipline_omschrijving || '] niet vinden.';

         SELECT ins_srtdiscipline_key
           INTO v_srtdiscipline_key
           FROM ins_srtdiscipline
          WHERE ins_srtdiscipline_verwijder IS NULL
            AND TRIM(UPPER (ins_srtdiscipline_omschrijving)) =
                   TRIM(UPPER (rec.ins_srtdiscipline_omschrijving));

         v_errormsg := 'Kan discipline [' || rec.ins_srtdiscipline_omschrijving || '-' || rec.ins_discipline_omschrijving || '] niet vinden.';

         SELECT ins_discipline_key
           INTO v_discipline_key
           FROM ins_tab_discipline
          WHERE ins_discipline_verwijder IS NULL
            AND ins_srtdiscipline_key = v_srtdiscipline_key
            AND TRIM(UPPER (ins_discipline_omschrijving)) = TRIM(UPPER (rec.ins_discipline_omschrijving));

         v_errormsg := 'Kan stdmelding [' || rec.ins_srtdiscipline_omschrijving || '-' || rec.ins_discipline_omschrijving || '-' || rec.mld_stdmelding_omschrijving || '] niet vinden.';

         SELECT mld_stdmelding_key
           INTO v_stdmelding_key
           FROM mld_stdmelding
          WHERE mld_stdmelding_verwijder IS NULL
            AND mld_ins_discipline_key = v_discipline_key
            AND TRIM(UPPER (mld_stdmelding_omschrijving)) = TRIM(UPPER (rec.mld_stdmelding_omschrijving));

         UPDATE mld_stdmelding SET mld_stdmelding_hint = rec.mld_stdmelding_hint WHERE mld_stdmelding_key = v_stdmelding_key;
         update_locale('INS_SRTDISCIPLINE_OMSCHRIJVING', v_srtdiscipline_key, 'EN', rec.ins_srtdiscipline_omschr_en);
         update_locale('INS_DISCIPLINE_OMSCHRIJVING', v_discipline_key, 'EN', rec.ins_discipline_omschrijving_en);
         update_locale('MLD_STDMELDING_OMSCHRIJVING', v_stdmelding_key, 'EN', rec.mld_stdmelding_omschrijving_en);
         update_locale('MLD_STDMELDING_HINT', v_stdmelding_key, 'EN', rec.mld_stdmelding_hint_en);

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

END;
/


-------------------------------------------------------------------------------
-- RAPPORTAGES  Projecturen
-- AAIT#22843 en AADS#22701
-------------------------------------------------------------------------------
-- Alle project-meldingen (srtdisc_key = 1)
CREATE OR REPLACE VIEW aaxx_v_project_boom_nodes
AS
   SELECT vt.ins_srtdiscipline_prefix,
          m.mld_melding_key,
          m.mld_melding_start_key,
          vg.ins_discipline_omschrijving,
          sm.mld_stdmelding_omschrijving,
          m.mld_melding_status
     FROM mld_melding m,
          mld_stdmelding sm,
          mld_discipline vg,
          ins_srtdiscipline vt
    WHERE     sm.mld_stdmelding_key = m.mld_stdmelding_key
          AND vg.ins_discipline_key = sm.mld_ins_discipline_key
          AND vt.ins_srtdiscipline_key = vg.ins_srtdiscipline_key
          AND vt.ins_srtdiscipline_omschrijving = 'Project';

-- Boomstructuur van projectmeldingen (vgl prs_v_afdelingsboom)
CREATE OR REPLACE VIEW aaxx_v_project_boom
(
   niveau,
   mld_melding_key,
   mld_melding_key1,
   mld_melding_key2,
   mld_melding_key3,
   mld_melding_key4
)
AS
   SELECT '1' Niveau,
          m1.mld_melding_key,
          m1.mld_melding_key,
          TO_NUMBER (NULL),
          TO_NUMBER (NULL),
          TO_NUMBER (NULL)
     FROM aaxx_v_project_boom_nodes m1
    WHERE m1.mld_melding_start_key IS NULL
      AND m1.mld_melding_status IN (2, 3, 4, 7)
   UNION
   SELECT '2' Niveau,
          m2.mld_melding_key,
          m1.mld_melding_key,
          m2.mld_melding_key,
          TO_NUMBER (NULL),
          TO_NUMBER (NULL)
     FROM aaxx_v_project_boom_nodes m1,
          aaxx_v_project_boom_nodes m2
    WHERE m2.mld_melding_start_key = m1.mld_melding_key
          AND m1.mld_melding_start_key IS NULL
          AND m2.mld_melding_status IN (2, 3, 4, 7)
   UNION
   SELECT '3' Niveau,
          m3.mld_melding_key,
          m1.mld_melding_key,
          m2.mld_melding_key,
          m3.mld_melding_key,
          TO_NUMBER (NULL)
     FROM aaxx_v_project_boom_nodes m1,
          aaxx_v_project_boom_nodes m2,
          aaxx_v_project_boom_nodes m3
    WHERE     m3.mld_melding_start_key = m2.mld_melding_key
          AND m2.mld_melding_start_key = m1.mld_melding_key
          AND m1.mld_melding_start_key IS NULL
          AND m3.mld_melding_status IN (2, 3, 4, 7)
   UNION
   SELECT '4' Niveau,
          m4.mld_melding_key,
          m1.mld_melding_key,
          m2.mld_melding_key,
          m3.mld_melding_key,
          m4.mld_melding_key
     FROM aaxx_v_project_boom_nodes m1,
          aaxx_v_project_boom_nodes m2,
          aaxx_v_project_boom_nodes m3,
          aaxx_v_project_boom_nodes m4
    WHERE     m4.mld_melding_start_key = m3.mld_melding_key
          AND m3.mld_melding_start_key = m2.mld_melding_key
          AND m2.mld_melding_start_key = m1.mld_melding_key
          AND m1.mld_melding_start_key IS NULL
          AND m4.mld_melding_status IN (2, 3, 4, 7);

-- Rapportageview
CREATE OR REPLACE VIEW aaxx_v_rap_projectboom
AS
   SELECT pb.mld_melding_key1||pb.mld_melding_key2||pb.mld_melding_key3||pb.mld_melding_key4||'/'||o.mld_opdr_bedrijfopdr_volgnr hide_f_srt,
          pbn.ins_srtdiscipline_prefix || pb.mld_melding_key1
             fclt_f_hoofdproject,
          CASE
             WHEN pb.mld_melding_key2 IS NULL THEN NULL
             ELSE pbn.ins_srtdiscipline_prefix || pb.mld_melding_key2
          END
             deelproject1,
          CASE
             WHEN pb.mld_melding_key3 IS NULL THEN NULL
             ELSE pbn.ins_srtdiscipline_prefix || pb.mld_melding_key3
          END
             deelproject2,
          CASE
             WHEN pb.mld_melding_key4 IS NULL THEN NULL
             ELSE pbn.ins_srtdiscipline_prefix || pb.mld_melding_key4
          END
             deelproject3,
          m.mld_melding_key hide_f_melding_key,
          km.mld_kenmerkmelding_waarde fclt_f_projectnaam,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/mld/mld_melding.asp?urole=bo&'
          || 'mld_key='
          || m.mld_melding_key
          || '")''>'
          || pbn.ins_srtdiscipline_prefix || m.mld_melding_key
          || '</a>'
             html_meldingnr,
          pf.prs_perslid_naam_full fclt_x_projectmedewerker,
          CASE
             WHEN o.mld_opdr_bedrijfopdr_volgnr IS NULL
             THEN
                NULL
             ELSE
                '<a class="details" onclick=''FcltMgr.openDetail("appl/mld/mld_opdr.asp?urole=bo&'
                || 'opdr_key='
                || o.mld_opdr_key
                || '")''>'
                || htf.escape_sc(pf.prs_perslid_naam_full)
                || '</a>'
          END
             html_projectmedewerker,
          so.mld_statusopdr_omschrijving statusopdr,
          o.mld_opdr_uren weekplanning,
          (SELECT SUM (mld_opdr_uren_besteed)
             FROM mld_opdr_uren
            WHERE mld_opdr_key = o.mld_opdr_key)
             uren_besteed
     FROM aaxx_v_project_boom pb,
          aaxx_v_project_boom_nodes pbn,
          mld_melding m,
          (SELECT *
             FROM mld_kenmerkmelding km, mld_kenmerk k
            WHERE km.mld_kenmerk_key = k.mld_kenmerk_key
              AND k.mld_srtkenmerk_key = 55) km,
          (SELECT *
             FROM mld_opdr
            WHERE mld_typeopdr_key = 7) o,
          mld_statusopdr so,
          prs_v_perslid_fullnames_all pf
    WHERE     m.mld_melding_key = pb.mld_melding_key
          AND pbn.mld_melding_key = pb.mld_melding_key
          AND km.mld_melding_key(+) = m.mld_melding_key
          AND o.mld_melding_key(+) = m.mld_melding_key
          AND pf.prs_perslid_key(+) = o.mld_uitvoerende_keys
          AND so.mld_statusopdr_key(+) = o.mld_statusopdr_key
          AND o.mld_statusopdr_key(+) != 1;


-- rapportage tbv SAS70. Verificatie van kosten in FACILITOR tov de BudgetTracker.
CREATE OR REPLACE PACKAGE AAXX_RAP
AS
   TYPE t_cursor IS REF CURSOR;

   PROCEDURE kostenoverzicht (user_key      IN     NUMBER,
                              p_datum_van   IN     VARCHAR2,
                              p_datum_tot   IN     VARCHAR2,
                              p_cursor         OUT t_cursor);
END;
/

CREATE OR REPLACE PACKAGE BODY AAXX_RAP
AS
   --
   --Rapportages
   --
   PROCEDURE kostenoverzicht (user_key      IN     NUMBER,
                              p_datum_van   IN     VARCHAR2, -- Let wel: formaat '13-05-2005'
                              p_datum_tot   IN     VARCHAR2,
                              p_cursor         OUT t_cursor)
   AS
      v_datum_van        DATE;
      v_datum_tot        DATE;
      v_alg_level_read   NUMBER;
   BEGIN
      v_datum_van := fac.safe_to_date (p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := fac.safe_to_date (p_datum_tot, 'dd-mm-yyyy');

      OPEN p_cursor FOR
          SELECT soort,
                 (SELECT prs_kostensoort_oms
                    FROM prs_kostensoort ks
                   WHERE v.prs_kostensoort_key = ks.prs_kostensoort_key)
                    kostensoort,
                 (SELECT prs_kostenplaats_omschrijving
                    FROM prs_kostenplaats kp
                   WHERE v.prs_kostenplaats_key = kp.prs_kostenplaats_key)
                    kostenplaats,
                 (SELECT alg_gebouw_omschrijving
                    FROM alg_gebouw g
                   WHERE v.alg_gebouw_key = g.alg_gebouw_key)
                    gebouw,
                 SUM (opdr_kosten) opdr_kosten,
                 SUM (fin_factuur_totaal) fin_kosten
            FROM (SELECT 'Opdracht' soort,
                         prs_kostensoort_key,
                         prs_kostenplaats_key,
                         alg_gebouw_key,
                         opdr_kosten,
                         fin_factuur_totaal
                    FROM (  SELECT COALESCE (
                                      f.prs_kostensoort_key,
                                      COALESCE (std.prs_kostensoort_key,
                                                d.prs_kostensoort_key))
                                      prs_kostensoort_key,
                                   o.prs_kostenplaats_key,
                                   alg_gebouw_key,
                                   o.mld_opdr_kosten opdr_kosten,
                                   SUM (f.fin_factuur_totaal) fin_factuur_totaal
                              FROM mld_opdr o,
                                   mld_typeopdr t,
                                   mld_melding m,
                                   mld_stdmelding std,
                                   ins_tab_discipline d,
                                   aaxx_v_aanwezigfactuur f,
                                   alg_v_onroerendgoed_gegevens og
                             WHERE     o.mld_typeopdr_key = t.mld_typeopdr_key
                                   AND t.mld_typeopdr_omschrijving = 'Workorder'
                                   AND o.mld_melding_key = m.mld_melding_key
                                   AND m.mld_stdmelding_key = std.mld_stdmelding_key
                                   AND std.mld_ins_discipline_key = d.ins_discipline_key
                                   AND o.mld_opdr_key = f.mld_opdr_key(+)
                                   AND m.mld_alg_onroerendgoed_keys =
                                         og.alg_onroerendgoed_keys(+)
                                   AND o.mld_opdr_datumbegin BETWEEN v_datum_van
                                                                 AND v_datum_tot
                          GROUP BY f.prs_kostensoort_key,
                                   std.prs_kostensoort_key,
                                   d.prs_kostensoort_key,
                                   o.prs_kostenplaats_key,
                                   alg_gebouw_key,
                                   o.mld_opdr_kosten
                          UNION ALL
                            SELECT COALESCE (f.prs_kostensoort_key,
                                             d.prs_kostensoort_key)
                                      prs_kostensoort_key,
                                   k.prs_kostenplaats_key,
                                   g.alg_gebouw_key,
                                   (SELECT SUM(bes_bestelopdr_item_aantal
                                               * bes_bestelopdr_item_prijs)
                                      FROM bes_bestelopdr_item boi
                                     WHERE boi.bes_bestelopdr_key = bo.bes_bestelopdr_key)
                                      opdr_prijs,
                                   SUM (f.fin_factuur_totaal)
                              FROM bes_bestelling b,
                                   prs_kostenplaats k,
                                   aaxx_v_aanwezigfactuur f,
                                   mld_adres ma,
                                   bes_bestelopdr bo,
                                   ins_tab_discipline d,
                                   alg_gebouw g,
                                   alg_locatie l,
                                   (SELECT DISTINCT
                                           bes_bestelling_key, bes_bestelopdr_key
                                      FROM bes_bestelling_item bi,
                                           bes_bestelopdr_item boi
                                     WHERE bi.bes_bestelopdr_item_key =
                                              boi.bes_bestelopdr_item_key) bes_opdr,
                                   (SELECT DISTINCT
                                           bes_bestelling_key, ins_discipline_key
                                      FROM bes_bestelling_item bi,
                                           bes_srtdeel sd,
                                           bes_srtgroep sg
                                     WHERE bi.bes_srtdeel_key = sd.bes_srtdeel_key
                                           AND sd.bes_srtgroep_key = sg.bes_srtgroep_key)
                                   cat,
                                   (  SELECT mld_adres_key,
                                             MAX (alg_gebouw_key) alg_gebouw_key
                                        FROM alg_gebouw
                                    GROUP BY mld_adres_key) adr_geb
                             WHERE b.prs_kostenplaats_key = k.prs_kostenplaats_key
                                   AND b.mld_adres_key_lev = ma.mld_adres_key
                                   AND b.bes_bestelling_key =
                                         bes_opdr.bes_bestelling_key(+)
                                   AND bes_opdr.bes_bestelopdr_key =
                                         bo.bes_bestelopdr_key(+)
                                   AND ma.alg_locatie_key = l.alg_locatie_key(+)
                                   AND b.bes_bestelling_key = cat.bes_bestelling_key
                                   AND cat.ins_discipline_key = d.ins_discipline_key
                                   AND ma.mld_adres_key = adr_geb.mld_adres_key(+)
                                   AND adr_geb.alg_gebouw_key = g.alg_gebouw_key(+)
                                   AND bo.bes_bestelopdr_key = f.bes_bestelopdr_key(+)
                                   AND bo.bes_bestelopdr_datum BETWEEN v_datum_van
                                                                   AND v_datum_tot
                          GROUP BY f.prs_kostensoort_key,
                                   d.prs_kostensoort_key,
                                   k.prs_kostenplaats_key,
                                   g.alg_gebouw_key,
                                   bo.bes_bestelopdr_key)
                  UNION ALL
                  SELECT 'Contract',
                         d.prs_kostensoort_key,
                         c.prs_kostenplaats_key,
                         g.alg_gebouw_key,
                         DECODE (
                            cnt_gew.cnt_contract_plaats_gewicht,
                            0,
                            TO_NUMBER (NULL),
                            COALESCE (
                               (cp.cnt_contract_plaats_gewicht
                                / cnt_gew.cnt_contract_plaats_gewicht)
                               * c.cnt_contract_kosten,
                               TO_NUMBER (NULL)))
                            opdr_kosten,
                         COALESCE (
                            DECODE (
                               cnt_gew.cnt_contract_plaats_gewicht,
                               0,
                               1,
                               (cp.cnt_contract_plaats_gewicht
                                / cnt_gew.cnt_contract_plaats_gewicht))
                            * fin.fin_factuur_totaal,
                            NULL)
                            fin_factuur_totaal
                    FROM cnt_contract c,
                         cnt_contract_plaats cp,
                         ins_tab_discipline d,
                         alg_locatie l,
                         alg_gebouw g,
                         (  SELECT cnt_contract_key,
                                   SUM (fin_factuur_totaal) fin_factuur_totaal
                              FROM aaxx_v_aanwezigfactuur f
                             WHERE f.fin_factuur_datum BETWEEN v_datum_van AND v_datum_tot
                          GROUP BY cnt_contract_key) fin,
                         (  SELECT cnt_contract_key,
                                   SUM (cnt_contract_plaats_gewicht)
                                      cnt_contract_plaats_gewicht
                              FROM cnt_contract_plaats
                             WHERE cnt_contract_plaats_verwijder IS NULL
                          GROUP BY cnt_contract_key) cnt_gew,
                         (SELECT cp.cnt_contract_plaats_key,
                                 alg_locatie_key,
                                 alg_gebouw_key
                            FROM alg_v_allonroerendgoed aog, cnt_contract_plaats cp
                           WHERE aog.alg_type = cp.cnt_alg_plaats_code
                                 AND aog.alg_onroerendgoed_keys = cp.cnt_alg_plaats_key)
                         cog
                   WHERE     c.ins_discipline_key = d.ins_discipline_key
                         AND c.cnt_contract_key = cp.cnt_contract_key(+)
                         AND c.cnt_contract_key = cnt_gew.cnt_contract_key(+)
                         AND cp.cnt_contract_plaats_key =
                               cog.cnt_contract_plaats_key(+)
                         AND c.cnt_contract_verwijder IS NULL
                         AND cp.cnt_contract_plaats_verwijder IS NULL
                         AND cog.alg_locatie_key = l.alg_locatie_key(+)
                         AND cog.alg_gebouw_key = g.alg_gebouw_key(+)
                         AND c.cnt_contract_key = fin.cnt_contract_key(+)
                         AND (v_datum_van BETWEEN c.cnt_contract_looptijd_van
                                               AND  c.cnt_contract_looptijd_tot
                              OR v_datum_tot BETWEEN c.cnt_contract_looptijd_van
                                             AND  c.cnt_contract_looptijd_tot)) v
        GROUP BY soort,
                 prs_kostensoort_key,
                 prs_kostenplaats_key,
                 alg_gebouw_key;
   END;
END;
/

-- VIEWS tbv RealTimeMonitor



CREATE OR REPLACE VIEW aaxx_v_graph_meldingpm
(
   FCLT_XAS_,
   FCLT_YAS_,
   VOLGORDE
)
AS
     SELECT DECODE (SUBSTR (TO_CHAR (mld_melding_datum, 'yyyymm'), 5),
                    '01', 'Januari',
                    '02', 'Februari',
                    '03', 'Maart',
                    '04', 'April',
                    '05', 'Mei',
                    '06', 'Juni',
                    '07', 'Juli',
                    '08', 'Augustus',
                    '09', 'September',
                    '10', 'Oktober',
                    '11', 'November',
                    'December'),
            COUNT (d.ins_discipline_omschrijving),
            TO_CHAR (mld_melding_datum, 'yyyymm')
       FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d
      WHERE mld_melding_datum BETWEEN ADD_MONTHS (
                                         TO_DATE (
                                            TO_CHAR (SYSDATE, 'yyyymm') || '01',
                                            'yyyymmdd'),
                                         -11)
                                  AND  SYSDATE
            AND m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_ins_discipline_key = d.ins_discipline_key
            AND (aaxx_get_user <> 'IT' OR d.ins_srtdiscipline_key = 22)                    -- IT helpdesk
   GROUP BY TO_CHAR (mld_melding_datum, 'yyyymm');


CREATE OR REPLACE VIEW aaxx_v_graph_openst_behand
(
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_YAS2_OP_TIJD
)
AS
     SELECT COALESCE (behandelaar, 'Onbekend') behandelaar,
            COUNT (mld_key) - SUM (uitvoeringoptijd) totaal,
            SUM (uitvoeringoptijd) op_tijd
       FROM (SELECT DISTINCT
                    m.mld_melding_key mld_key,
                    CASE
                       WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NULL
                       THEN
                          CASE SIGN(fac.datumtijdplusuitvoertijd (
                                       m.mld_melding_datum,
                                       m.mld_melding_t_uitvoertijd.tijdsduur,
                                       m.mld_melding_t_uitvoertijd.eenheid)
                                    - COALESCE (
                                         fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                                         fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
                                         SYSDATE))
                             WHEN -1
                             THEN
                                0
                             ELSE
                                1
                          END
                       ELSE
                          1
                    END
                       uitvoeringoptijd,
                    DECODE (
                       mld_melding_status,
                       7,
                       (SELECT MAX (prs_bedrijf_naam)
                          FROM mld_opdr o, prs_bedrijf b
                         WHERE     o.mld_melding_key = m.mld_melding_key
                               AND O.MLD_UITVOERENDE_KEYS = b.prs_bedrijf_key
                               AND O.MLD_STATUSOPDR_KEY IN (3, 4, 5, 8)), -- 3- Ter fiattering, 4-Gefiatteerd, 5-Uitgegeven, 8-Geaccepteerd
                       4,
                       COALESCE (
                          (SELECT MAX (prs_bedrijf_naam)
                             FROM mld_opdr o, prs_bedrijf b
                            WHERE o.mld_melding_key = m.mld_melding_key
                                  AND O.MLD_UITVOERENDE_KEYS =
                                        b.prs_bedrijf_key
                                  AND O.MLD_STATUSOPDR_KEY IN (3, 4, 5, 8)), -- 3- Ter fiattering, 4-Gefiatteerd, 5-Uitgegeven, 8-Geaccepteerd
                          (SELECT prs_perslid_naam_full
                             FROM prs_v_perslid_fullnames pf
                            WHERE pf.prs_perslid_key =
                                     M.MLD_MELDING_BEHANDELAAR_KEY)),
                       (SELECT prs_perslid_naam_full
                          FROM prs_v_perslid_fullnames pf
                         WHERE pf.prs_perslid_key =
                                  M.MLD_MELDING_BEHANDELAAR_KEY))
                       behandelaar
               FROM mld_melding m,
                    mld_discipline md,
                    prs_perslid p,
                    mld_stdmelding std
              WHERE     m.prs_perslid_key = p.prs_perslid_key
                    AND md.ins_discipline_key = std.mld_ins_discipline_key
                    AND std.mld_stdmelding_key = m.mld_stdmelding_key
                    AND mld_melding_status IN (2, 3, 4, 7, 0) -- 2-ingevoerd, 3-ingezien, 4-geaccepteerd, 7-uitgegeven, 0-pending
                    AND (aaxx_get_user <> 'IT' OR md.ins_srtdiscipline_key = 22))                   -- IT
   GROUP BY behandelaar;


CREATE OR REPLACE VIEW aaxx_v_graph_ppi_acc (FCLT_XAS_, FCLT_YAS_)
AS
   SELECT SUM (acceptoptijd) aantal, COUNT (mld_key) totaal
     FROM (SELECT DISTINCT
                  m.mld_melding_key mld_key,
                  CASE SIGN(fac.datumtijdplusuitvoertijd (
                               fac.gettrackingdate ('MLDNEW',
                                                    m.mld_melding_key),
                               std.mld_stdmelding_t_accepttijd.tijdsduur,
                               std.mld_stdmelding_t_accepttijd.eenheid)
                            - COALESCE (
                                 fac.gettrackingdate ('MLDREJ',
                                                      m.mld_melding_key),
                                 fac.gettrackingdate ('MLDAFM',
                                                      m.mld_melding_key),
                                 SYSDATE))
                     WHEN -1
                     THEN
                        0
                     ELSE
                        1
                  END
                     acceptoptijd
             FROM mld_melding m, mld_discipline md, mld_stdmelding std
            WHERE md.ins_discipline_key = std.mld_ins_discipline_key
                  AND std.mld_stdmelding_key = m.mld_stdmelding_key
                  AND (aaxx_get_user <> 'IT' OR md.ins_srtdiscipline_key = 22) -- IT helpdesk
                  AND mld_melding_status IN (2, 3)  -- 2-ingevoerd, 3-ingezien
                                                  );

CREATE OR REPLACE VIEW aaxx_v_graph_ppi_uitv
(
   FCLT_XAS_,
   FCLT_YAS_
)
AS
   SELECT SUM (uitvoeringoptijd) aantal, COUNT (mld_key) totaal
     FROM (SELECT DISTINCT
                  m.mld_melding_key mld_key,
                  CASE
                     WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NULL
                     THEN
                        CASE SIGN(fac.datumtijdplusuitvoertijd (
                                     m.mld_melding_datum,
                                     m.mld_melding_t_uitvoertijd.tijdsduur,
                                     m.mld_melding_t_uitvoertijd.eenheid)
                                  - COALESCE (
                                       fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                                       fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
                                       SYSDATE))
                           WHEN -1
                           THEN
                              0
                           ELSE
                              1
                        END
                     ELSE
                        1
                  END
                     uitvoeringoptijd
             FROM mld_melding m, mld_discipline md, mld_stdmelding std
            WHERE     md.ins_discipline_key = std.mld_ins_discipline_key
                  AND std.mld_stdmelding_key = m.mld_stdmelding_key
                  AND (aaxx_get_user <> 'IT' OR md.ins_srtdiscipline_key = 22)                    -- IT helpdesk
                  AND mld_melding_status IN (2, 3, 4, 7, 0) -- 2-ingevoerd, 3-ingezien, 4-geaccepteerd, 7-uitgegeven, 0-pending
                                                           );

CREATE OR REPLACE VIEW aaxx_v_graph_vakgroep_afg
(
   fclt_xas_,
   fclt_yas_,
   fclt_url,
   fclt_3d_discipline_key
)
AS
     SELECT d.ins_discipline_omschrijving,
            COUNT (d.ins_discipline_omschrijving),
            'appl/mld/mld_search.asp?urole=fo&autosearch=1&disc_key_str=',
            d.ins_discipline_key
       FROM mld_melding m,
            mld_stdmelding std,
            ins_tab_discipline d,
            fac_srtnotificatie sn,
            fac_tracking t
      WHERE m.mld_stdmelding_key = std.mld_stdmelding_key
        AND std.mld_ins_discipline_key = d.ins_discipline_key
        AND (aaxx_get_user <> 'IT' OR d.ins_srtdiscipline_key = 22) -- IT helpdesk
        AND t.fac_tracking_refkey = mld_melding_key
        AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
        AND sn.fac_srtnotificatie_code = 'MLDAFM'
        AND t.fac_tracking_datum > SYSDATE - 30
   GROUP BY d.ins_discipline_key, d.ins_discipline_omschrijving;


CREATE OR REPLACE VIEW aaxx_v_graph_vakgroep_open
(
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_URL,
   FCLT_3D_DISCIPLINE_KEY
)
AS
     SELECT d.ins_discipline_omschrijving,
            COUNT (d.ins_discipline_omschrijving),
            'appl/mld/mld_search.asp?urole=fo&autosearch=1&disc_key_str='
            || d.ins_discipline_key,
            d.ins_discipline_key
       FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d
      WHERE     m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_ins_discipline_key = d.ins_discipline_key
            AND mld_melding_status IN (2, 3, 4, 7, 0) -- 2-ingevoerd, 3-ingezien, 4-geaccepteerd, 7-uitgegeven, 0-pending
            AND (
                   (aaxx_get_user = 'GN' AND d.ins_srtdiscipline_key = 5)                     -- Storingen
                   OR
                   (aaxx_get_user = 'IT' AND d.ins_srtdiscipline_key = 22)                    -- IT helpdesk
                   OR
                   (aaxx_get_user <> 'GN' AND aaxx_get_user <> 'IT')
                )
   GROUP BY d.ins_discipline_key, d.ins_discipline_omschrijving
   ORDER BY COUNT (d.ins_discipline_omschrijving) DESC;


--
-- Notificatie jobs
--
-- AAES#25128: BEZMUT-notificatie ook naar bezoeker sturen.
-- Wat te doen om dit aan te zetten:
--     Notificatiejob AAXX_V_NOTI_BEZOEKERS
--     Stylesheet aanpassen
--     Key van het kenmerk email hieronder invullen
CREATE OR REPLACE VIEW aaxx_v_noti_bezoekers
(
   sender,
   receiver,
   text,
   code,
   fac_srtnotificatie_key,
   KEY,
   xkey,
   xemail,
   xmobile
)
AS
   SELECT NULL sender,
          NULL receiver,
          DECODE (aaxx_get_user, 'ESSENT', 'Essent',
                                 'ENEXIS', 'Enexis',
                                 'ARCADIS', 'Arcadis',
                                 'SABIC', 'Sabic',
                                 'AAFM')
          || ' bevestigingmail afspraak '
          || TO_CHAR (bez_afspraak_datum, 'dd-mm-yyyy') text,
          'CUST03' code,
          (SELECT fac_srtnotificatie_key
             FROM fac_srtnotificatie
            WHERE fac_srtnotificatie_code = 'CUST03') fac_srtnotificatie_key,
          b.bez_afspraak_key key,
          b.bez_bezoekers_key xkey,
          kw.bez_kenmerkwaarde_waarde xemail,
          NULL xmobile
     FROM fac_tracking t,
          bez_afspraak a,
          bez_bezoekers b,
          bez_kenmerkwaarde kw
    WHERE t.fac_srtnotificatie_key =
            (SELECT fac_srtnotificatie_key
               FROM fac_srtnotificatie
              WHERE fac_srtnotificatie_code = 'BEZMUT')
      AND t.fac_tracking_datum > (SELECT fac_notificatie_job_nextrun - fac_notificatie_job_interval/24
                                    FROM fac_notificatie_job
                                   WHERE fac_notificatie_job_view = 'AAXX_V_NOTI_BEZOEKERS')
      AND t.fac_tracking_datum < (SELECT fac_notificatie_job_nextrun
                                    FROM fac_notificatie_job
                                   WHERE fac_notificatie_job_view = 'AAXX_V_NOTI_BEZOEKERS')
      AND a.bez_afspraak_key = t.fac_tracking_refkey
      AND a.bez_afspraak_datum > SYSDATE
      AND b.bez_afspraak_key = t.fac_tracking_refkey
      AND b.bez_bezoekers_key = kw.bez_bezoekers_key
      AND kw.bez_kenmerk_key = DECODE (aaxx_get_user, 'ESSENT', 1001,
                                                      'IT',     1022,
                                                      'ARCADIS', 1003,
                                                      'ENEXIS', 1023,
                                                      'SABIC', 1000);


-- Rapportage t.b.v. Share & Meet
-- Share and Meet reserveringen zijn te herkennen aan een host die een login heeft met de volgende struktuur _<account>_<remote_prs_perslid_key>
-- bijvoorbeeld _AANS_4533
CREATE OR REPLACE VIEW aaxx_v_rap_share_meet_kosten
(
   reservering,
   afdelingscode,
   fclt_f_afdelings_omschrijving,
   verbruiksartikelen,
   boekingsdatum,
   afmelddatum,
   fclt_f_periode,
   aanvrager,
   locatie,
   gebouw,
   ruimtenaam,
   btw,
   stuksprijs,
   aantal,
   totaal
)
AS
   SELECT rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr resnr,
          a.prs_afdeling_naam,
          a.prs_afdeling_omschrijving,
          rrp.omschrijving,
          TO_CHAR (rrr.res_rsv_ruimte_van, 'dd-mm-yyyy'),
          TO_CHAR (rrp.afgemeld, 'dd-mm-yyyy'),
          TO_CHAR (rrp.afgemeld, 'yyyy-mm'),
          pf_h.prs_perslid_naam_full pfh,
          rg.alg_locatie_omschrijving,
          rg.alg_gebouw_omschrijving,
          rr.res_ruimte_nr,
          btw,
          rrp.artikel_prijs,
          rrp.aantal,
          rrp.prijs
     FROM res_rsv_ruimte rrr,
          (SELECT rrr.res_rsv_ruimte_key,
                  ra.res_artikel_omschrijving omschrijving,
                  rra.res_rsv_artikel_aantal aantal,
                  ROUND (
                     res.getartikelprijs (rra.res_rsv_artikel_key)
                     / rra.res_rsv_artikel_aantal,
                     2)
                     artikel_prijs,
                  rra.res_rsv_artikel_prijs prijs,
                  rra.res_rsv_artikel_afgemeld afgemeld,
                  ra.res_artikel_btw btw
             FROM res_rsv_ruimte rrr, res_rsv_artikel rra, res_artikel ra
            WHERE rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key
              AND rra.res_artikel_key = ra.res_artikel_key
              AND rra.res_rsv_artikel_verwijder IS NULL
           UNION
           SELECT fac_tracking_refkey res_rsv_ruimte_key,
                  'Zaalhuur',
                  1 aantal,
                  res_rsv_ruimte_prijs artikel_prijs,
                  res_rsv_ruimte_prijs prijs,
                  t.fac_tracking_datum afgemeld,
                  21 btw
             FROM res_rsv_ruimte rrr, fac_tracking t, fac_srtnotificatie sn
            WHERE res_rsv_ruimte_prijs <> 0
              AND rrr.res_rsv_ruimte_key = t.fac_tracking_refkey
              AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
              AND sn.fac_srtnotificatie_code = 'RESAFM'
              AND t.fac_tracking_oms IS NULL
              AND res_rsv_ruimte_verwijder IS NULL) rrp,
          prs_v_perslid_fullnames_all pf_h,
          res_ruimte rr,
          prs_afdeling a,
          prs_perslid p,
          (  SELECT MAX (alg_ruimte_key) alg_ruimte_key,
                    res_rsv_ruimte_key,
                    res_ruimte_key
               FROM res_v_rsv_ruimte_2_alg_ruimte
           GROUP BY res_rsv_ruimte_key, res_ruimte_key) r,
          alg_v_ruimte_gegevens rg
    WHERE rrp.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key
      AND rrr.res_rsv_ruimte_host_key = pf_h.prs_perslid_key
      AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key
      AND p.prs_afdeling_key = a.prs_afdeling_key
      AND r.res_ruimte_key = rr.res_ruimte_key
      AND rrr.res_rsv_ruimte_key = r.res_rsv_ruimte_key
      AND r.alg_ruimte_key = rg.alg_ruimte_key
      AND rrp.afgemeld IS NOT NULL
      AND p.prs_perslid_oslogin like '/_AA__/_%' escape '/';


-- AAIT#28929  notificaties t.b.v Share & Meet voor beoordeling dag later
CREATE OR REPLACE VIEW aaxx_v_noti_sm_resafm_reminder
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   XKEY
)
AS
   SELECT   'RESAFM',
            NULL,
            res_rsv_ruimte_contact_key,
               'Herinnering beoordeling reservering: '
            || res_reservering_key
            || '/'
            || res_rsv_ruimte_volgnr,
            rsv.res_reservering_key,
            rsv.res_rsv_ruimte_key
     FROM   res_rsv_ruimte rsv,
            res_activiteit ra,
            res_srtactiviteit rsr,
            fac_tracking tr,
            fac_srtnotificatie str
    WHERE       res_rsv_ruimte_verwijder IS NULL
            AND rsv.res_activiteit_key = ra.res_activiteit_key
            AND ra.res_srtactiviteit_key = rsr.res_srtactiviteit_key
            AND UPPER(rsr.res_srtactiviteit_omschrijving) = 'SHARE & MEET'
            AND tr.fac_srtnotificatie_key = str.fac_srtnotificatie_key
            AND tr.fac_tracking_refkey = res_rsv_ruimte_key
            AND str.fac_srtnotificatie_xmlnode IN
                     ('reservering', 'xreservering')
            AND fac_srtnotificatie_code = 'RESAFM'
            AND fac_tracking_oms IS NULL
            AND TO_DATE (fac_tracking_datum, 'DD-MM-YYYY') =
                  TO_DATE (SYSDATE-1, 'DD-MM-YYYY');

-- kenmerk key 1000: afspraak is prive (dus niet op infobord)
-- geld voor IT en Arcadis
CREATE OR REPLACE VIEW aaxx_v_rap_infobord
(
   item_type,
   item_key,
   aktief,
   bezoek_status,
   offset,
   dag,
   tijd_van,
   tijd_tot,
   ruimte,
   catalogus,
   aanvrager,
   gastheer,
   omschrijving,
   status,
   bezoeker,
   bedrijf,
   locatie_code,
   gebouw_code,
   verdieping_code,
   locatie_omschrijving,
   gebouw_omschrijving,
   verdieping_omschrijving,
   alg_locatie_key,
   alg_gebouw_key,
   alg_verdieping_key
)
AS
   SELECT 'RES',
          rrr.res_rsv_ruimte_key,
          (CASE
              WHEN res_rsv_ruimte_van > SYSDATE THEN 'expected'
              WHEN res_rsv_ruimte_tot < SYSDATE THEN 'passed'
              ELSE 'active'
           END)
             aktief,
          (CASE
              WHEN b.bez_bezoekers_out IS NOT NULL THEN 'out'
              WHEN b.bez_bezoekers_done IS NOT NULL THEN 'in'
              ELSE 'expected'
           END)
             bezoek_status,
          TRUNC ( (SYSDATE - res_rsv_ruimte_van) * 24 * 60) offset,
          TO_CHAR (res_rsv_ruimte_van, 'dd-mm-yyyy') dag,
          TO_CHAR (res_rsv_ruimte_van, 'hh24:mi') tijd_van,
          TO_CHAR (res_rsv_ruimte_tot, 'hh24:mi') tijd_tot,
          res_ruimte_nr ruimte,
          ins_discipline_omschrijving catalogus,
          aanvrager.prs_perslid_naam_full aanvrager,
          COALESCE (gastheer.prs_perslid_naam_full,
                    a.bez_afspraak_gastheer)
             gastheer,
          res_rsv_ruimte_omschrijving omschrijving,
          sf.res_status_fo_omschrijving status,
          b.bez_afspraak_naam,
          b.bez_afspraak_bedrijf,
          alg_locatie_code locatie_code,
          alg_gebouw_code gebouw_code,
          alg_verdieping_code verdieping_code,
          alg_locatie_omschrijving locatie_omschrijving,
          alg_gebouw_omschrijving gebouw_omschrijving,
          alg_verdieping_omschrijving verdieping_omschrijving,
          l.alg_locatie_key,
          g.alg_gebouw_key,
          v.alg_verdieping_key
     FROM res_v_aanwezigrsv_ruimte rrr,
          res_ruimte_opstelling rro,
          prs_v_perslid_fullnames aanvrager,
          prs_v_perslid_fullnames gastheer,
          res_v_res_ruimte_gegevens rrg,
          alg_locatie l,
          alg_gebouw g,
          alg_verdieping v,
          res_status_fo sf,
          res_discipline rd,
          bez_afspraak a,
          bez_bezoekers b,
          (SELECT * FROM bez_kenmerkwaarde
            WHERE bez_kenmerk_key = 1000
              AND bez_kenmerkwaarde_verwijder IS NULL) prive
    WHERE rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key
      AND rro.res_ruimte_key = rrg.res_ruimte_key
      AND rrr.res_rsv_ruimte_host_key = gastheer.prs_perslid_key(+)
      AND rrr.res_rsv_ruimte_contact_key = aanvrager.prs_perslid_key
      AND TRUNC (res_rsv_ruimte_van) = TRUNC (SYSDATE)
      AND rrg.alg_locatie_key = l.alg_locatie_key
      AND rrg.alg_gebouw_key = g.alg_gebouw_key
      AND rrg.alg_verdieping_key = v.alg_verdieping_key
      AND rrr.res_status_fo_key = sf.res_status_fo_key
      AND rrg.res_discipline_key = rd.ins_discipline_key
      AND rrr.res_rsv_ruimte_key = a.res_rsv_ruimte_key(+)
      AND a.bez_afspraak_key = b.bez_afspraak_key(+)
      AND prive.bez_bezoekers_key(+) = b.bez_bezoekers_key
      AND COALESCE(prive.bez_kenmerkwaarde_waarde, '0') = '0'
   UNION ALL
   SELECT 'BEZ',
          b.bez_afspraak_key,
          (CASE
              WHEN a.bez_afspraak_datum > SYSDATE THEN 'expected'
              WHEN a.bez_afspraak_eind < SYSDATE THEN 'passed'
              ELSE 'active'
           END)
             aktief,
          (CASE
              WHEN b.bez_bezoekers_out IS NOT NULL THEN 'out'
              WHEN b.bez_bezoekers_done IS NOT NULL THEN 'in'
              ELSE 'expected'
           END)
             bezoek_status,
          TRUNC ( (SYSDATE - bez_afspraak_datum) * 24 * 60) offset,
          TO_CHAR (bez_afspraak_datum, 'dd-mm-yyyy') dag,
          TO_CHAR (bez_afspraak_datum, 'hh24:mi') tijd_van,
          TO_CHAR (bez_afspraak_eind, 'hh24:mi') tijd_tot,
          NULL ruimte,
          NULL catalogus,
          aanvrager.prs_perslid_naam_full aanvrager,
          COALESCE (gastheer.prs_perslid_naam_full,
                    a.bez_afspraak_gastheer)
             gastheer,
          NULL omschrijving,
          NULL status,
          b.bez_afspraak_naam,
          b.bez_afspraak_bedrijf,
          alg_locatie_code locatie_code,
          alg_gebouw_code gebouw_code,
          NULL verdieping_code,
          alg_locatie_omschrijving locatie_omschrijving,
          alg_gebouw_naam gebouw_omschrijving,
          alg_verdieping_omschrijving verdieping_omschrijving,
          l.alg_locatie_key,
          ogg.alg_gebouw_key,
          ogg.alg_verdieping_key
     FROM bez_afspraak a,
          bez_bezoekers b,
          prs_v_perslid_fullnames aanvrager,
          alg_locatie l,
          alg_v_allonrgoed_gegevens ogg,
          prs_v_perslid_fullnames gastheer,
          (SELECT * FROM bez_kenmerkwaarde
            WHERE bez_kenmerk_key = 1000
              AND bez_kenmerkwaarde_verwijder IS NULL) prive
    WHERE a.bez_afspraak_key = b.bez_afspraak_key
      AND TRUNC(a.bez_afspraak_datum) = TRUNC(SYSDATE)
      AND a.bez_afspraak_host_key = gastheer.prs_perslid_key(+)
      AND a.bez_afspraak_contact_key = aanvrager.prs_perslid_key
      AND a.alg_locatie_key = l.alg_locatie_key
      AND a.alg_onrgoed_keys = ogg.alg_onroerendgoed_keys(+)
      AND a.res_rsv_ruimte_key IS NULL
      AND prive.bez_bezoekers_key(+) = b.bez_bezoekers_key
      AND COALESCE(prive.bez_kenmerkwaarde_waarde, '0') = '0';


-- AAES#24665/AANS#27628: In eerste instantie vormgegeven tbv. meldingen op
-- objecten. Later uitgebreid tbv. reserveringen.
/* Formatted on 10-10-2013 14:32:24 (QP5 v5.115.810.9015) */
CREATE OR REPLACE VIEW aaxx_v_rap_mld_qrc
(
   fclt_3d_locatie_key,
   fclt_3d_discipline_key,
   fclt_f_discipline,
   fclt_f_soortmelding,
   fclt_f_locatie,
   fclt_f_gebouw,
   fclt_f_verdieping,
   plaats,
   ruimte_key,
   ruimtefunctie,
   fclt_f_objectdiscipline,
   fclt_f_objectgroep,
   objectsoort_key,
   fclt_f_objectsoort,
   objectsoort_code,
   ins_deel_key,
   ins_deel_omschrijving,
   ins_deel_upper,
   hide_f_bookmark_id,
   variabele
)
AS
   SELECT   l.alg_locatie_key,
            disc.ins_discipline_key,
            disc.ins_discipline_omschrijving,
            msd.mld_stdmelding_omschrijving,
            l.alg_locatie_omschrijving,
            o.alg_gebouw_omschrijving,
            o.alg_verdieping_omschrijving,
            o.alg_plaatsaanduiding plaats,
            d.ins_alg_ruimte_key ruimte_key,
            sr.alg_srtruimte_omschrijving,
            disc.ins_discipline_omschrijving,
            sg.ins_srtgroep_omschrijving,
            sd.ins_srtdeel_key,
            sd.ins_srtdeel_omschrijving,
            sd.ins_srtdeel_code,
            d.ins_deel_key,
            d.ins_deel_omschrijving,
            d.ins_deel_upper,
            b.fac_bookmark_id,
            'INS_KEY'
     FROM   (SELECT   DECODE (
                         INSTR (
                            SUBSTR (
                               UPPER (fac_bookmark_query),
                               INSTR (UPPER (fac_bookmark_query),
                                      'STDM_KEY=')
                            ),
                            '&'
                         ),
                         0,
                         SUBSTR (
                            SUBSTR (
                               UPPER (fac_bookmark_query),
                               INSTR (UPPER (fac_bookmark_query),
                                      'STDM_KEY=')
                            ),
                            10
                         ),
                         SUBSTR (
                            SUBSTR (
                               UPPER (fac_bookmark_query),
                               INSTR (UPPER (fac_bookmark_query),
                                      'STDM_KEY=')
                            ),
                            10,
                            INSTR (
                               SUBSTR (
                                  UPPER (fac_bookmark_query),
                                  INSTR (UPPER (fac_bookmark_query),
                                         'STDM_KEY=')
                               ),
                               '&'
                            )
                            - 10
                         )
                      )
                         stdm_key,
                      fac_bookmark_id
               FROM   fac_bookmark
              WHERE   UPPER (fac_bookmark_path) = 'APPL/PDA/MELDING.ASP'
                      AND INSTR (UPPER (fac_bookmark_query), 'STDM_KEY') > 0)
            b,                                           -- stdm_key-bookmarks
            (SELECT   sm.mld_stdmelding_key,
                      sm.mld_stdmelding_omschrijving,
                      si.ins_srtinstallatie_key ins_srtdeel_key
               FROM   mld_stdmelding sm,
                      mld_stdmelding_srtinst si
              WHERE       sm.mld_stdmelding_key = si.mld_stdmelding_key
                      AND sm.mld_stdmelding_verwijder IS NULL
                      AND si.ins_srtinstallatie_niveau = 'S'
             UNION ALL
             SELECT   sm.mld_stdmelding_key,
                      sm.mld_stdmelding_omschrijving,
                      sd.ins_srtdeel_key
               FROM   mld_stdmelding sm,
                      mld_stdmelding_srtinst si,
                      ins_srtdeel sd
              WHERE       sm.mld_stdmelding_key = si.mld_stdmelding_key
                      AND sm.mld_stdmelding_verwijder IS NULL
                      AND si.ins_srtinstallatie_niveau = 'G'
                      AND si.ins_srtinstallatie_key = sd.ins_srtgroep_key
             UNION ALL
             SELECT   sm.mld_stdmelding_key,
                      sm.mld_stdmelding_omschrijving,
                      sd.ins_srtdeel_key
               FROM   mld_stdmelding sm,
                      mld_stdmelding_srtinst si,
                      ins_srtgroep sg,
                      ins_srtdeel sd
              WHERE       sm.mld_stdmelding_key = si.mld_stdmelding_key
                      AND sm.mld_stdmelding_verwijder IS NULL
                      AND si.ins_srtinstallatie_niveau = 'D'
                      AND si.ins_srtinstallatie_key = sg.ins_discipline_key
                      AND sg.ins_srtgroep_key = sd.ins_srtgroep_key) msd, -- object-meldingen
            ins_v_aanwezigdeel d,
            ins_srtdeel sd,
            ins_srtgroep sg,
            ins_discipline disc,
            ins_v_alg_overzicht o,
            alg_locatie l,
            alg_ruimte r,
            alg_srtruimte sr
    WHERE       fac.safe_to_number (b.stdm_key) = msd.mld_stdmelding_key
            AND msd.ins_srtdeel_key = d.ins_srtdeel_key
            AND d.ins_alg_ruimte_type IN ('T', 'R', 'W')
            AND d.ins_deel_parent_key IS NULL
            AND d.ins_srtdeel_key = sd.ins_srtdeel_key
            AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
            AND sg.ins_discipline_key = disc.ins_discipline_key
            AND d.ins_alg_ruimte_key = o.alg_onroerendgoed_keys
            AND d.ins_alg_ruimte_type = o.alg_onroerendgoed_type
            AND d.ins_alg_locatie_key = o.alg_locatie_key        -- redundant?
            AND o.alg_locatie_key = l.alg_locatie_key
            AND d.ins_alg_ruimte_key = r.alg_ruimte_key
            AND r.alg_srtruimte_key = sr.alg_srtruimte_key(+)
   UNION ALL
   SELECT   l.alg_locatie_key,
            disc.ins_discipline_key,
            disc.ins_discipline_omschrijving,
            'Reserveer ruimte',
            l.alg_locatie_omschrijving,
            o.alg_gebouw_omschrijving,
            o.alg_verdieping_omschrijving,
            rr.res_ruimte_nr plaats,
            rar.res_ruimte_key ruimte_key,
            sr.alg_srtruimte_omschrijving,
            NULL ins_discipline_omschrijving,
            NULL ins_srtgroep_omschrijving,
            NULL ins_srtdeel_key,
            NULL ins_srtdeel_omschrijving,
            NULL ins_srtdeel_code,
            NULL ins_deel_key,
            NULL ins_deel_omschrijving,
            NULL ins_deel_upper,
            b.fac_bookmark_id,
            'RES_RUIMTE_KEY'
     FROM   fac_bookmark b,
            res_ruimte rr,
            res_discipline disc,
            (  SELECT   res_ruimte_key, MAX (alg_ruimte_key) alg_ruimte_key
                 FROM   res_alg_ruimte
                WHERE   res_alg_ruimte_verwijder IS NULL
             GROUP BY   res_ruimte_key) rar,
            alg_ruimte r,
            alg_srtruimte sr,
            ins_v_alg_overzicht o,
            alg_locatie l
    WHERE   TRUNC (b.fac_bookmark_aanmaak) = TO_DATE ('10102013', 'ddmmyyyy')
            AND UPPER (b.fac_bookmark_path) = 'APPL/PDA/RESERVERINGEN.ASP'
            AND rr.res_discipline_key = disc.ins_discipline_key
            AND rr.res_ruimte_key = rar.res_ruimte_key
            AND rar.alg_ruimte_key = r.alg_ruimte_key
            AND r.alg_srtruimte_key = sr.alg_srtruimte_key(+)
            AND r.alg_ruimte_key = o.alg_onroerendgoed_keys
            AND o.alg_onroerendgoed_type = 'R'
            AND o.alg_locatie_key = l.alg_locatie_key;

-- AASA#37919
-- Rapport met opdrachtgegevens van hergoedkeuringsverzoeken incl gebouwverantwoordelijke
-- Status 10 = ter goedkeuring
CREATE OR REPLACE VIEW aaxx_v_udr_hergoedkeuren
AS
SELECT mld_opdr_key,
          srt.ins_srtdiscipline_prefix
       || o.mld_melding_key
       || '/'
       || mld_opdr_bedrijfopdr_volgnr
          opdrachtnr,
       mu.naam uitvoerende,
       ot.mld_typeopdr_omschrijving opdrachttype,
       mld_opdr_omschrijving omschrijving,
       k.prs_kostenplaats_nr || ' ' || prs_kostenplaats_omschrijving
          kostenplaats,
       mld_opdr_kosten kosten,
       pf1.prs_perslid_naam_full behandelaar,
       mld_opdr_opmerking afhandeling,
       mld_opdr_datumbegin opdrachtdatum,
       mld_opdr_einddatum einddatum,
       mld_opdr_plandatum plandatum,
       l.alg_locatie_code || aog.alg_plaatsaanduiding plaats,
       aog.alg_gebouw_key,
       aog.alg_gebouw_code gebouw_code,
       g.prs_perslid_key_verantw gebouw_verwantwoordelijke_key,
       pf2.prs_perslid_naam_full gebouw_verwantwoordelijke,
       aog.alg_verdieping_omschrijving verdieping_omschrijving,
       aog.alg_verdieping_code verdieping,
       aog.alg_ruimte_nr ruimte_nr,
       aog.alg_ruimte_omschrijving ruimte_omschrijving,
       std.mld_stdmelding_omschrijving melding,
       d.ins_discipline_omschrijving vakgroep,
       srt.ins_srtdiscipline_omschrijving vakgroeptype
  FROM mld_opdr o,
       mld_melding m,
       alg_v_allonrgoed_gegevens aog,
       alg_locatie l,
       alg_gebouw g,
       mld_stdmelding std,
       mld_discipline d,
       ins_srtdiscipline srt,
       mld_typeopdr ot,
       prs_v_perslid_fullnames_all pf1,
       prs_v_perslid_fullnames_all pf2,
       mld_v_uitvoerende mu,
       prs_kostenplaats k
 WHERE mld_statusopdr_key = 10
   AND mld_opdr_approved_refiat IS NOT NULL
   AND o.mld_melding_key = m.mld_melding_key
   AND o.fac_activiteit_key IS NULL
   AND aog.alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys
   AND aog.alg_locatie_key = l.alg_locatie_key
   AND g.alg_gebouw_key = aog.alg_gebouw_key
   AND m.mld_stdmelding_key = std.mld_stdmelding_key
   AND std.mld_ins_discipline_key = d.ins_discipline_key
   AND srt.ins_srtdiscipline_key = d.ins_srtdiscipline_key
   AND ot.mld_typeopdr_key = o.mld_typeopdr_key
   AND pf1.prs_perslid_key(+) = o.prs_perslid_key
   AND pf2.prs_perslid_key(+) = g.prs_perslid_key_verantw
   AND mu.mld_uitvoerende_key = o.mld_uitvoerende_keys
   AND o.prs_kostenplaats_key = k.prs_kostenplaats_key(+);

-- AAFM#26513 Notificatie goedgekeurde offerte naar autorisatiegroep "AAFM Servicedesk"'
--   Opdracht in status 9 (na ORDOOK)
--   'opdracht bij melding wanneer automatische offerteafhandeling uitgeschakeld is' --> mld_disc_params_offerteauto = 0
--   Opdracht (RFQ) sinds de vorige check goedgekeurd (eenmalig sturen)
--   Bestemming zijn de personen(0..n) in autorisatiegroep AAFM Servicedesk.
CREATE OR REPLACE VIEW aaxx_v_noti_offerte_accepted
(
   sender,
   receiver,
   text,
   code,
   key,
   xkey
)
AS
   SELECT DISTINCT NULL sender,
          gg.prs_perslid_key receiver,
             (SELECT fac_version_cust FROM fac_version)
          || ': Offerte '
          || m.mld_melding_key||'/'||o.mld_opdr_bedrijfopdr_volgnr
          || ' is geaccepteerd' text,
          'CUST04' code,
          o.mld_opdr_key key,
          NULL xkey
     FROM mld_opdr o,
          mld_melding m,
          mld_stdmelding s,
          mld_discipline d,
          mld_disc_params dp,
          fac_srtnotificatie sn,
          fac_tracking t,
          fac_groep g,
          fac_gebruikersgroep gg
    WHERE o.mld_statusopdr_key = 9
      AND m.mld_melding_key = o.mld_melding_key
      AND s.mld_stdmelding_key = m.mld_stdmelding_key
      AND d.ins_discipline_key = s.mld_ins_discipline_key
      AND dp.mld_ins_discipline_key = d.ins_discipline_key
      AND dp.mld_disc_params_offerteauto = 0
      AND sn.fac_srtnotificatie_code = 'ORDOOK'
      AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
      AND t.fac_tracking_refkey = o.mld_opdr_key
      AND t.fac_tracking_datum BETWEEN (SELECT fac_notificatie_job_nextrun - fac_notificatie_job_interval/24
                                          FROM fac_notificatie_job
                                         WHERE fac_notificatie_job_view = 'AAXX_V_NOTI_OFFERTE_ACCEPTED')
                                   AND (SELECT fac_notificatie_job_nextrun
                                          FROM fac_notificatie_job
                                         WHERE fac_notificatie_job_view = 'AAXX_V_NOTI_OFFERTE_ACCEPTED')
      AND g.fac_groep_upper = 'AAFM SERVICEDESK'
      AND gg.fac_groep_key = g.fac_groep_key;


-- AAHU#29410 Notificatie geregistreerde klacht naar groep "AAFM-FMer"
--   prefix KL is klacht
CREATE OR REPLACE VIEW aaxx_v_noti_klacht_reminder
(
   sender,
   receiver,
   text,
   code,
   key,
   xkey
)
AS
   SELECT NULL,
          fm.prs_perslid_key,
          'Er is een klacht geregistreerd met referentienummer: '
          || m.mld_melding_key,
          'MLDNEW',
          m.mld_melding_key,
          NULL
     FROM mld_melding m,
          mld_stdmelding std,
          mld_discipline d,
          ins_srtdiscipline srt,
          fac_tracking tr,
          fac_srtnotificatie str,
          (SELECT p.prs_perslid_key
             FROM fac_gebruikersgroep fg, fac_groep g, prs_perslid p
            WHERE g.fac_groep_key = fg.fac_groep_key
              AND p.prs_perslid_key = fg.prs_perslid_key
              AND UPPER (g.fac_groep_omschrijving) = 'AAFM FM-ER'
              AND prs_perslid_verwijder IS NULL
              AND prs_perslid_email IS NOT NULL) fm
    WHERE m.mld_stdmelding_key = std.mld_stdmelding_key
      AND std.mld_ins_discipline_key = d.ins_discipline_key
      AND d.ins_srtdiscipline_key = srt.ins_srtdiscipline_key
      AND srt.ins_srtdiscipline_module = 'MLD'
      AND srt.ins_srtdiscipline_prefix = 'KL'
      AND m.fac_activiteit_key IS NULL
      AND tr.fac_srtnotificatie_key = str.fac_srtnotificatie_key
      AND tr.fac_tracking_refkey = m.mld_melding_key
      AND str.fac_srtnotificatie_code = 'MLDNEW'
      AND tr.fac_tracking_datum > SYSDATE - 1 / 24;

-- AAAR#29457 notificatiejob voor nieuwe S&M-reserveringen naar receptie (groep "AAFM S&M")
-- Bij nieuwe reserveringen bericht naar alle personen (0..n) in autorisatiegroep AAFM S&M.
CREATE OR REPLACE VIEW aaxx_v_noti_sm_receptie
(
   code,
   sender,
   receiver,
   text,
   key,
   xkey
)
AS
   SELECT 'CUST06',
          NULL,
          fm.prs_perslid_key,
          'Let op: er is een Share & Meet reservering gemaakt met reserveringsnummer '
          || res_reservering_key
          || '/'
          || res_rsv_ruimte_volgnr,
          res_reservering_key,
          res_rsv_ruimte_key
     FROM res_rsv_ruimte r,
          res_activiteit a,
          (SELECT p.prs_perslid_key
             FROM fac_gebruikersgroep fg, fac_groep g, prs_perslid p
            WHERE g.fac_groep_key = fg.fac_groep_key
              AND p.prs_perslid_key = fg.prs_perslid_key
              AND g.fac_groep_upper = 'AAFM S&M'
              AND prs_perslid_verwijder IS NULL
              AND prs_perslid_email IS NOT NULL) fm
    WHERE r.res_activiteit_key = a.res_activiteit_key
      AND a.res_activiteit_omschrijving LIKE 'Share%'
      AND r.res_rsv_ruimte_aanmaak >
             (SELECT fac_notificatie_job_nextrun
                     - fac_notificatie_job_interval / 24
                FROM fac_notificatie_job
               WHERE fac_notificatie_job_view = 'AAXX_V_NOTI_SM_RECEPTIE');

-- AAFM#33840 notificatie tbv gepland bezoek
CREATE OR REPLACE VIEW aaxx_v_noti_plan_opdr
(
   sender,
   receiver,
   text,
   code,
   key,
   xkey,
   xemail,
   xmobile
)
AS
   SELECT NULL sender,
          NULL receiver,
             'Aankondiging werkzaamheden door '
          || b.prs_bedrijf_naam
          || ' op '
          || mld_opdr_plandatum
          || ' op uw locatie'
             text,
          'CUST08' code,
          mld_opdr_key key,
          NULL xkey,
          g.alg_gebouw_email xemail,
          NULL xmobile
     FROM mld_opdr o,
          mld_melding m,
          alg_v_allonrgoed_gegevens aog,
          alg_gebouw g,
          prs_bedrijf b
    WHERE ( (TRUNC (mld_opdr_plandatum) = TRUNC (SYSDATE + 1)
         AND fac.getweekdaynum (SYSDATE) != 6)
        OR (TRUNC (mld_opdr_plandatum) BETWEEN TRUNC (SYSDATE + 1)
                                           AND  TRUNC (SYSDATE + 3)
        AND fac.getweekdaynum (SYSDATE) = 6))
      AND mld_statusopdr_key NOT IN (1, 6, 7, 9)
      AND o.mld_melding_key = m.mld_melding_key
      AND aog.alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys
      AND o.mld_uitvoerende_keys = b.prs_bedrijf_key
      AND g.alg_gebouw_key = aog.alg_gebouw_key;

-- AAIT#31201 automatische notificatie naar melder van PR meldingen sturen
-- 2 weken voorafgaand aan de einddatum van een project (PR melding).
CREATE OR REPLACE VIEW aaxx_v_noti_mld_projecten
(
   sender,
   receiver,
   text,
   code,
   key,
   xkey
)
AS
   SELECT NULL sender,
          prs_perslid_key_voor,
             'Herinnering: Over 2 weken sluit projectnummer '
          || ins_srtdiscipline_prefix
          || mld_melding_key
             text,
          'MLDNEW' code,
          mld_melding_key key,
          NULL xkey
     FROM mld_melding m,
          mld_stdmelding std,
          mld_discipline d,
          ins_srtdiscipline srt
    WHERE m.mld_stdmelding_key = std.mld_stdmelding_key
      AND std.mld_ins_discipline_key = d.ins_discipline_key
      AND d.ins_srtdiscipline_key = srt.ins_srtdiscipline_key
      AND UPPER (ins_srtdiscipline_prefix) = 'PR'
      AND m.mld_melding_status NOT IN (1, 5, 6)
      AND m.mld_melding_einddatum BETWEEN SYSDATE + 13 AND SYSDATE + 14;

-- AAIT#32784 inzage in zoekgedrag. View te gebruiken icm 20151 rapport mogelijkheden.
CREATE OR REPLACE VIEW aaxx_v_gui_searchresults
(
   Zoekterm,
   Datum,
   Persoon,
   Keuze,
   Resultaat
)
AS
   SELECT   fgc.fac_gui_counter_info zoekterm,
            fac_gui_counter_date datum,
            prs_perslid_naam_full persoon,
            choice.fac_gui_counter_info keuze,
            result.fac_gui_counter_info resultaat
     FROM   fac_gui_counter fgc,
            prs_v_perslid_fullnames pf,
            (SELECT   fac_gui_counter_refkey, fac_gui_counter_info
               FROM   fac_gui_counter fgc
              WHERE   fac_gui_counter_info IS NOT NULL
                      AND fac_gui_counter_group = 'searchchoice') choice,
            (SELECT   fac_gui_counter_refkey, fac_gui_counter_info
               FROM   fac_gui_counter fgc
              WHERE   fac_gui_counter_info IS NOT NULL
                      AND fac_gui_counter_group = 'searchresult') result
    WHERE       fac_gui_counter_group = 'search'
            AND fgc.fac_gui_counter_info IS NOT NULL
            AND fgc.prs_perslid_key = pf.prs_perslid_key
            AND choice.fac_gui_counter_refkey(+) = fgc.fac_gui_counter_key
            AND result.fac_gui_counter_refkey(+) = fgc.fac_gui_counter_key;

-- procedure om ontvangen emails te processen. De klant specifieke eigenschappen, keys e.d. moeten
-- in de aanroep meegegeven worden.
CREATE OR REPLACE PROCEDURE aaxx_processemail (
   pfrom        IN VARCHAR2,
   pto          IN VARCHAR2,
   psubject     IN VARCHAR2,
   pbody        IN VARCHAR2,
   psessionid   IN VARCHAR2,
   puserkey     IN NUMBER DEFAULT NULL)
AS
   sender_key         prs_perslid.prs_perslid_key%TYPE;
   melder_key         prs_perslid.prs_perslid_key%TYPE;
   kostenplaats_key   prs_afdeling.prs_kostenplaats_key%TYPE;
   mldkey             mld_melding.mld_melding_key%TYPE;
   opdrkey            mld_opdr.mld_opdr_key%TYPE;
   stdmelding         mld_stdmelding.mld_stdmelding_key%TYPE;
   subject_regexp     fac_setting.fac_setting_default%TYPE;
   kkey               mld_kenmerk.mld_kenmerk_key%TYPE;
   errormsg           fac_result.fac_result_waarde%TYPE;
   behandelaar_key    mld_melding.mld_melding_behandelaar_key%TYPE;
   typeopdrkey        mld_typeopdr.mld_typeopdr_key%TYPE;
   mldnum             VARCHAR2 (4000);
   opdrnum            VARCHAR2 (4000);
   opdrvolgnr         NUMBER (10);
   srtdisc            VARCHAR2 (4000);
   cnt                NUMBER (10);
   v_flag_on_fenote   NUMBER (10);
   v_flag_on_bonote   NUMBER (10);
   v_from             VARCHAR2 (4000);
   v_body             VARCHAR2 (4000);
   v_subject          VARCHAR2 (1000);
   v_pos              NUMBER;
   v_result           NUMBER;
   v_factuur_key      fin_factuur.fin_factuur_key%TYPE;
   v_kenmerk_key      fin_kenmerk.fin_kenmerk_key%TYPE;
BEGIN
   errormsg := '(0x143)';

   -- de mailberichten worden doorgestuurd vanuit de AAFM exchange omgeving. Hierbij
   -- is het niet mogelijk de afzender te laten staan. Daarom wordt de afzender in het subject
   -- van de mail geplaatst. Scheidingsteken in de ';'.
   v_from := SUBSTR (psubject, 1, INSTR (psubject, ';') - 1);
   v_subject := SUBSTR (psubject, INSTR (psubject, ';') + 1);

   -- Verwijder de Bounce Address Tag Validation
   IF v_from LIKE 'prvs=%'
   THEN
      v_from := SUBSTR (v_from, INSTR (v_from, '=', -1) + 1);
   END IF;


   v_body :=
      v_from || ': ' || CHR (13) || CHR (10)
      || SUBSTR (
            v_subject || CHR (13) || CHR (10)
            || REPLACE (SUBSTR (pbody, 1, 3900 - (LENGTH (v_subject) + 2)),
                        CHR (13) || CHR (10) || CHR (13) || CHR (10),
                        CHR (13) || CHR (10)),
            1,
            3900);                             -- verwijder onnodige witregels

   --   DBMS_OUTPUT.PUT_LINE('v_from: '||v_from);

   errormsg := '(0x143a)';
   -- Valideer de sender in pfrom: kennen we deze?
   SELECT MIN (prs_perslid_key), MIN (d.prs_kostenplaats_key)
     INTO sender_key, kostenplaats_key
     FROM prs_perslid p, prs_afdeling d
    WHERE p.prs_afdeling_key = d.prs_afdeling_key
      AND prs_perslid_verwijder IS NULL
      AND UPPER (prs_perslid_email) = UPPER (v_from);

   errormsg := '(0x143b)';
   IF sender_key IS NULL
   THEN
      sender_key := 11;                -- prs_perslid_key onbekend mail adres.

      SELECT d.prs_kostenplaats_key
        INTO kostenplaats_key
        FROM prs_perslid p, prs_afdeling d
       WHERE p.prs_afdeling_key = d.prs_afdeling_key
         AND prs_perslid_verwijder IS NULL
         AND p.prs_perslid_key = sender_key;
   END IF;

   CASE
      WHEN UPPER (pto) LIKE 'INVOICES@%'
      THEN
         errormsg := '(0x143c)';
         INSERT INTO fin_factuur (fin_factuur_statuses_key,
                                  fin_factuur_datum,
                                  fin_factuur_totaal_btw,
                                  fin_factuur_nr,
                                  fin_factuur_bron)
             VALUES (3,
                     SYSDATE,
                     0,
                     '#',
                     2)
          RETURNING fin_factuur_key
               INTO v_factuur_key;

         -- Zet kenmerk laatste factuur op Ja
         errormsg := '(0x143d)';
         INSERT INTO fin_kenmerkfactuur (fin_factuur_key, fin_kenmerk_key, fin_kenmerkfactuur_waarde)
                                 VALUES (v_factuur_key, 2, 1);

         -- Bepaal de key van de bijlages
         errormsg := '(0x143e)';
         SELECT fin_kenmerk_key
           INTO v_kenmerk_key
           FROM fin_kenmerk
          WHERE fin_kenmerk_verwijder IS NULL
            AND UPPER(fin_kenmerk_omschrijving) = 'BIJLAGES';

         errormsg := '(0x143f)';
         INSERT INTO fac_result (fac_result_sessionid,
                                 fac_result_naam,
                                 fac_result_waarde)
             VALUES (psessionid,
                     'kenmerkpath',
                        'FIN\F'
                     || TO_CHAR (TRUNC (v_factuur_key / 1000), 'FM0000')
                     || '___\F'
                     || v_factuur_key
                     || '\'
                     || v_kenmerk_key
                     || '\');
      WHEN UPPER (pto) LIKE 'SERVICEDESK@%'
      THEN
         errormsg := '(0x145)';

         -- append (as a note?) to an existing melding if #key is found in the subject
         -- Alternatief was: scannen van fac_srtnotificatie_oms maar dat voelt ook niet echt lekker
         -- subject_regexp := fac.getsetting ('mld_reply_subject_regexp'); -- [[:alpha:]]*[[:digit:]]{3,}

         -- hebben we een referentie naar een opdracht of naar een melding?
         subject_regexp := '[[:digit:]]{3,}/[[:digit:]]*';
         opdrnum :=
            REGEXP_SUBSTR (v_subject,
                           subject_regexp,
                           1,
                           1,
                           'i');                                    -- MA12345

         DBMS_OUTPUT.put_line ('opdrnum: ' || opdrnum);

         -- Ja, nu komt het voor dat de opdracht/melding verward wordt met een
         -- bestelling/opdracht. Daarom gaan we kijken of er een bestelling of
         -- bestelopdracht is. Als deze er is dan kijken we naar de aanmaakdatum
         -- is deze nieuwe dan de aanmaakdatum van de melding/opdracht, dan doen
         -- we niets met de mail en hoort deze waarschijnlijk bij een bestelling.
         -- Voor opdrachten (eerste gedeelte) en meldingen (tweede gedeelte) wordt
         -- deze controle uitgevoerd zodra het melding/opdracht nummer bekend is.
         IF opdrnum IS NOT NULL
         THEN
            opdrvolgnr :=
               fac.safe_to_number (
                  SUBSTR (opdrnum, INSTR (opdrnum, '/') + 1));
            DBMS_OUTPUT.put_line ('opdrvolgnr: ' || opdrvolgnr);

            mldkey :=
               fac.safe_to_number (
                  SUBSTR (opdrnum, 1, INSTR (opdrnum, '/') - 1));
            DBMS_OUTPUT.put_line ('mldkey: ' || mldkey);

            SELECT MAX (SIGN (b_o.datum - m_o.datum))                                 -- 1 als b_o datum > m_o datum
              INTO v_result
              FROM (SELECT bes_bestelopdr_datum datum
                      FROM bes_bestelopdr
                     WHERE bes_bestelopdr_id = mldkey || '/' || opdrvolgnr) b_o,
                   (SELECT mld_opdr_datumbegin datum
                      FROM mld_opdr
                     WHERE mld_melding_key = mldkey AND mld_opdr_bedrijfopdr_volgnr = opdrvolgnr) m_o;

         ELSE
            subject_regexp := '[[:alpha:]]*[[:digit:]]{3,}';
            mldnum :=
               REGEXP_SUBSTR (v_subject,
                              subject_regexp,
                              1,
                              1,
                              'i');                                 -- MA12345
            srtdisc :=
               REGEXP_SUBSTR (mldnum,
                              '[[:alpha:]]*',
                              1,
                              1,
                              'i');                                      -- MA
            mldkey :=
               fac.safe_to_number (SUBSTR (mldnum, LENGTH (srtdisc) + 1));

            SELECT MAX (SIGN (b.datum - m.datum))                                 -- 1 als bes datum > mld datum
              INTO v_result
              FROM (SELECT bes_bestelling_datum datum
                      FROM bes_bestelling
                     WHERE bes_bestelling_key = mldkey) b,
                   (SELECT mld_melding_datum datum
                      FROM mld_melding
                     WHERE mld_melding_key = mldkey) m;
         END IF;

         IF v_result = 1 AND v_result IS NOT NULL
         THEN
            -- resultaat is 1 als de datum van de bestelling/opdracht groter is dan de datum van
            -- de melding/opdracht.
            DBMS_OUTPUT.put_line ('v_result: ' || v_result);
            RETURN;
         END IF;

         DBMS_OUTPUT.put_line ('mldnum: ' || mldnum);
         DBMS_OUTPUT.put_line ('srtdisc: ' || srtdisc);
         DBMS_OUTPUT.put_line ('mldkey: ' || mldkey);

         -- We eisen
         --   - Goed meldingnummer
         --   - Goede srtdiscipline
         --   - Afzender is degene voor wie de melding was
         -- suggested extensions: ook collega's toestaan?
         SELECT MIN (mm.mld_stdmelding_key), MIN (prs_perslid_key_voor)
           INTO stdmelding, melder_key
           FROM mld_melding mm,
                mld_stdmelding msm,
                ins_tab_discipline insd,
                ins_srtdiscipline isd
          WHERE mm.mld_melding_key = mldkey
            AND mm.mld_stdmelding_key = msm.mld_stdmelding_key
            AND msm.mld_ins_discipline_key = insd.ins_discipline_key
            AND insd.ins_srtdiscipline_key = isd.ins_srtdiscipline_key;

         -- Controle op srtdisc werkt niet goed. Mails worden na binnenkomst namelijk doorgezet
         -- naar de definitieve stdmelding(/discipline/srtdiscpline) en daarmee verandert de
         -- prefix letter
         --AND isd.ins_srtdiscipline_prefix = srtdisc
         --AND mm.prs_perslid_key_voor = sender;  -- Mogen anderen ook reageren?

         DBMS_OUTPUT.put_line (
            'mld_stdmelding_key: ' || TO_CHAR (stdmelding));

         -- kijk of de referentie naar de opdracht wel correct is:
         IF opdrvolgnr IS NOT NULL
         THEN
            BEGIN
               SELECT mld_opdr_key, mld_typeopdr_key
                 INTO opdrkey, typeopdrkey
                 FROM mld_opdr
                WHERE mld_melding_key = mldkey
                  AND mld_opdr_bedrijfopdr_volgnr = opdrvolgnr;
            EXCEPTION
               WHEN OTHERS
               THEN
                  opdrkey := NULL;
            END;
         END IF;

         BEGIN
            IF opdrkey IS NOT NULL
            THEN
               SELECT o.prs_perslid_key
                 INTO behandelaar_key
                 FROM mld_opdr o, prs_perslid p
                WHERE o.mld_opdr_key = opdrkey
                  AND o.prs_perslid_key = p.prs_perslid_key
                  AND p.prs_perslid_email IS NOT NULL
                  AND p.prs_perslid_verwijder IS NULL;
            ELSE
               SELECT mld_melding_behandelaar_key
                 INTO behandelaar_key
                 FROM mld_melding m, prs_perslid p
                WHERE mld_melding_key = mldkey
                  AND mld_melding_behandelaar_key = p.prs_perslid_key
                  AND p.prs_perslid_email IS NOT NULL
                  AND p.prs_perslid_verwijder IS NULL;
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               behandelaar_key := NULL;
         END;

         IF (stdmelding IS NOT NULL)
         THEN                                           -- Bestaande opdracht.
            IF opdrkey IS NOT NULL
            THEN
               INSERT INTO mld_opdr_note (mld_opdr_key,
                                          mld_opdr_note_omschrijving,
                                          prs_perslid_key)
                   VALUES (opdrkey, v_body, sender_key);

               fac.trackaction ('ORDUPD',
                                opdrkey,
                                sender_key,
                                NULL,
                                '#Notitie toegevoegd vanuit e-mail'); -- # voorkomt notificatie
               DBMS_OUTPUT.put_line ('Notitie toegevoegd.');
            ELSE
               INSERT INTO mld_melding_note (mld_melding_key,
                                             mld_melding_note_omschrijving,
                                             prs_perslid_key,
                                             mld_melding_note_flag)
                   VALUES (mldkey,
                           v_body,
                           sender_key,
                           DECODE (sender_key, melder_key, 1, 0)); -- 1 is zichtbaar FE want zelf ingevoerd.

               fac.trackaction ('MLDNOT',
                                mldkey,
                                sender_key,
                                NULL,
                                '#Notitie toegevoegd vanuit e-mail'); -- # voorkomt notificatie
               DBMS_OUTPUT.put_line ('Notitie toegevoegd.');

               INSERT INTO fac_result (fac_result_sessionid,
                                       fac_result_naam,
                                       fac_result_waarde)
                   VALUES (psessionid,
                           'maillog',
                           'Als notitie toegevoegd aan melding ' || mldkey);

               IF behandelaar_key IS NOT NULL
               THEN
                  -- Notificatie naar behandelaar
                  fac.putnotificationsrtprio (
                     NULL,
                     behandelaar_key,
                     'MLDNOB',
                     mldkey,
                     'Melding ' || mldkey || ' is door de klant aangepast.',
                     2,
                     NULL,
                     NULL,
                     NULL,
                     2,
                     NULL);
               END IF;
            END IF;

            -- Vlaggetjes zetten zoals mld_edit_note.asp dat doet
            BEGIN
               v_flag_on_fenote := fac.getsetting ('mld_flag_on_fenote');
               v_flag_on_bonote := fac.getsetting ('mld_flag_on_bonote');

               IF v_flag_on_fenote <> 0 AND v_flag_on_fenote IS NOT NULL
               THEN
                  UPDATE mld_melding
                     SET mld_melding_flag =
                            DECODE (opdrkey,
                                    NULL, v_flag_on_fenote,
                                    v_flag_on_bonote)
                   WHERE mld_melding_key = mldkey
                     AND ( (mld_melding_flag = v_flag_on_bonote)
                       OR (mld_melding_flag = 0 OR mld_melding_flag IS NULL));

                  DBMS_OUTPUT.put_line ('Flag gezet.');
               END IF;
            EXCEPTION
               WHEN OTHERS
               THEN
                  DBMS_OUTPUT.put_line(   'Niet gelukt om flag '
                                       || v_flag_on_fenote
                                       || ' te zetten.');
            END;
         ELSE
            -- suggested extensions:
            -- check for MLDUSE-write autorisations
            -- parse the subject to find an appropriate stdmelding, if uniquely possible
            errormsg := '(0x148)';

            BEGIN
               stdmelding :=
                  fac.safe_to_number (fac.getsetting ('defaultstdmelding'));

               INSERT INTO mld_melding (mld_melding_module,
                                        mld_meldbron_key,
                                        mld_melding_datum,
                                        mld_melding_omschrijving,
                                        mld_melding_status,
                                        mld_melding_t_uitvoertijd,
                                        mld_stdmelding_key,
                                        prs_perslid_key,
                                        prs_perslid_key_voor,
                                        prs_kostenplaats_key,
                                        mld_melding_spoed)
                   VALUES ('MLD',
                           4,                                         -- email
                           SYSDATE,
                           v_body,
                           NULL,
                           mld_t_uitvoertijd (2, 'D'),
                           stdmelding,
                           sender_key,
                           sender_key,
                           kostenplaats_key,
                           3)
                RETURNING mld_melding_key
                     INTO mldkey;

               --                DBMS_OUTPUT.PUT_LINE('Melding toegevoegd: ' || mldkey);
               errormsg := '(0x165)';
               mld.setmeldingstatus (mldkey, 2, sender_key);

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

         IF opdrkey IS NULL
         THEN
            -- Zoek het laagste bijlagen kenmerk key (AAEN#34590) om de bijlagen onder te stoppen
            errormsg := '(0x151)';

            SELECT MIN (mld_kenmerk_key)
              INTO kkey
              FROM mld_kenmerk k,
                   mld_srtkenmerk sk,
                   mld_stdmelding std,
                   ins_tab_discipline d
             WHERE mld_srtkenmerk_kenmerktype = 'M'
               AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
               AND std.mld_stdmelding_key = stdmelding
               AND std.mld_ins_discipline_key = d.ins_discipline_key
               AND ( (k.mld_stdmelding_key = std.mld_stdmelding_key
                  AND k.mld_kenmerk_niveau = 'S')
                 OR (k.mld_stdmelding_key = d.ins_discipline_key
                 AND k.mld_kenmerk_niveau = 'D')
                 OR (k.mld_stdmelding_key = d.ins_srtdiscipline_key
                 AND k.mld_kenmerk_niveau = 'T'))
               AND k.mld_kenmerk_verwijder IS NULL
               AND NOT EXISTS
                      (SELECT mld_kenmerk_volgnummer
                         FROM mld_kenmerk k1,
                              mld_srtkenmerk sk1,
                              mld_stdmelding std1,
                              ins_tab_discipline d1
                        WHERE sk1.mld_srtkenmerk_kenmerktype = 'M'
                          AND sk1.mld_srtkenmerk_key = k1.mld_srtkenmerk_key
                          AND std1.mld_stdmelding_key = stdmelding
                          AND std1.mld_ins_discipline_key =
                                 d1.ins_discipline_key
                          AND ( (k1.mld_stdmelding_key =
                                    std1.mld_stdmelding_key
                             AND k1.mld_kenmerk_niveau = 'S')
                            OR (k1.mld_stdmelding_key = d1.ins_discipline_key
                            AND k1.mld_kenmerk_niveau = 'D')
                            OR (k1.mld_stdmelding_key =
                                   d1.ins_srtdiscipline_key
                            AND k1.mld_kenmerk_niveau = 'T'))
                          AND k1.mld_kenmerk_verwijder IS NULL
                          AND k1.mld_kenmerk_key < k.mld_kenmerk_key);

            errormsg := '(0x153)';

            IF kkey IS NOT NULL
            THEN
               --               DBMS_OUTPUT.PUT_LINE('Bijlagen kenmerk: ' || kkey);
               errormsg := '(0x157)';

               INSERT INTO fac_result (fac_result_sessionid,
                                       fac_result_naam,
                                       fac_result_waarde)
                   VALUES (psessionid,
                           'kenmerkpath',
                              'MLD\M'
                           || TO_CHAR (TRUNC (mldkey / 1000), 'FM0000')
                           || '___\M'
                           || mldkey
                           || '\'
                           || kkey
                           || '\');
            END IF;
         ELSE
            -- Zoek het laagste bijlagen kenmerk om de bijlagen onder te stoppen
            errormsg := '(0x152)';

            SELECT MIN (mld_kenmerk_key)
              INTO kkey
              FROM mld_kenmerk k, mld_srtkenmerk sk
             WHERE sk.mld_srtkenmerk_kenmerktype = 'M'
               AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key
               AND k.mld_typeopdr_key = typeopdrkey
               AND k.mld_kenmerk_niveau = 'O'
               AND k.mld_kenmerk_verwijder IS NULL
               AND NOT EXISTS
                      (SELECT mld_kenmerk_volgnummer
                         FROM mld_kenmerk k1, mld_srtkenmerk sk1
                        WHERE sk1.mld_srtkenmerk_kenmerktype = 'M'
                          AND sk1.mld_srtkenmerk_key = k1.mld_srtkenmerk_key
                          AND k1.mld_typeopdr_key = typeopdrkey
                          AND k1.mld_kenmerk_niveau = 'O'
                          AND k1.mld_kenmerk_verwijder IS NULL
                          AND k1.mld_kenmerk_volgnummer <
                                 k.mld_kenmerk_volgnummer);

            errormsg := '(0x154)';

            IF kkey IS NOT NULL
            THEN
               --               DBMS_OUTPUT.PUT_LINE('Bijlagen kenmerk: ' || kkey);
               errormsg := '(0x157)';

               INSERT INTO fac_result (fac_result_sessionid,
                                       fac_result_naam,
                                       fac_result_waarde)
                   VALUES (psessionid,
                           'kenmerkpath',
                              'MLD\O'
                           || TO_CHAR (TRUNC (opdrkey / 1000), 'FM0000')
                           || '___\O'
                           || opdrkey
                           || '\'
                           || kkey
                           || '\');
            END IF;
         END IF;
      ELSE
         errormsg := '(0x188)';

         INSERT INTO fac_result (fac_result_sessionid,
                                 fac_result_naam,
                                 fac_result_waarde)
             VALUES (psessionid,
                     'errormsg',
                     'Database fout - Neem contact op met uw systeembeheerder '
                     || errormsg);
   END CASE;
EXCEPTION
   WHEN OTHERS
   THEN
      --      DBMS_OUTPUT.PUT_LINE('Mail niet geaccepteerd: ' || 'OTHERS (error ' ||  SQLCODE  || '/' || SUBSTR (SQLERRM, 1, 100) || ')');
      INSERT INTO fac_result (fac_result_sessionid,
                              fac_result_naam,
                              fac_result_waarde)
          VALUES (psessionid,
                  'errormsg',
                  'Database fout - Neem contact op met uw systeembeheerder '
                  || errormsg);

      fac.writelog (
         'PROCESSEMAIL',
         'E',
            'Mail kon niet ingelezen worden afzender:'
         || v_from
         || '['
         || errormsg
         || ']'
         || psubject,
            'OTHERS (error '
         || SQLCODE
         || '/'
         || SUBSTR (SQLERRM, 1, 100)
         || ')');
END;
/


-------------------------------------------------------------------------------
-- GRANTS naar AAFM database.
-------------------------------------------------------------------------------
GRANT SELECT ON aaxx_v_dwh_prs_bedrijf TO aafm;
GRANT SELECT ON aaxx_v_dwh_prs_bedrijfadres TO aafm;
GRANT SELECT ON aaxx_v_dwh_cnt_contract TO aafm;
GRANT SELECT ON aaxx_v_dwh_cnt_contract_scope TO aafm;
GRANT SELECT ON aaxx_v_dwh_cnt_contract_mantel TO aafm;
GRANT SELECT ON aaxx_v_dwh_kenmerk_contract TO aafm;
GRANT SELECT ON aaxx_v_dwh_mld_melding TO aafm;
GRANT SELECT ON aaxx_v_dwh_res_reservering TO aafm;
GRANT SELECT ON aaxx_v_dwh_bes_bestelling TO aafm;
GRANT SELECT ON aaxx_v_dwh_bez_bezoekers TO aafm;
GRANT SELECT ON aaxx_v_dwh_kenmerk_melding TO aafm;
GRANT SELECT ON aaxx_v_dwh_kenmerk_opdracht TO aafm;
GRANT SELECT ON aaxx_v_dwh_kenmerk_reservering TO aafm;
GRANT SELECT ON aaxx_v_dwh_kenmerk_bestelling TO aafm;
GRANT SELECT ON aaxx_v_dwh_fin_factuur TO aafm;
GRANT SELECT ON aaxx_v_dwh_prs_kostenplaats TO aafm;
GRANT SELECT ON aaxx_v_dwh_prs_kostensoort TO aafm;
GRANT SELECT ON aaxx_v_dwh_prs_perslid TO aafm;
GRANT SELECT ON aaxx_v_dwh_fac_groeprechten TO aafm;
GRANT SELECT ON aaxx_v_dwh_prs_afdeling TO aafm;
GRANT SELECT ON aaxx_v_dwh_kenmerk_prs TO aafm;
GRANT SELECT ON aaxx_v_dwh_alg_onrgoed TO aafm;
GRANT SELECT ON aaxx_v_dwh_kenmerk_onrgoed TO aafm;
GRANT SELECT ON aaxx_v_dwh_ins_sensor_status TO aafm;
GRANT SELECT ON aaxx_v_dwh_inspectie TO aafm;
GRANT SELECT ON aaxx_v_dwh_ins_object TO aafm;
GRANT SELECT ON aaxx_v_dwh_kenmerk_inspectie TO aafm;
GRANT SELECT ON aaxx_v_dwh_uren TO aafm;
GRANT SELECT ON aaxx_v_dwh_uren_improd TO aafm;
GRANT SELECT ON aaxx_v_dwh_tracking TO aafm;
GRANT SELECT ON aaxx_v_dwh_budget_tracker TO aafm;
GRANT SELECT ON AAXX_V_DWH_GUI_COUNTER TO aafm;

-- views tbv user telling
GRANT SELECT ON aaxx_v_lcrap_key_stats TO aafm;
GRANT SELECT ON fac_v_lcrap_fe_vs_key TO aafm;

GRANT SELECT ON aaxx_exp_uren_dekking TO aait;
GRANT SELECT ON aaxx_exp_uren_dekking TO aait_test;


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