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

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

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

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

--------------------------------------------------------------------------------------------------
------------------------------- LEGACY-MEUK, M.N. VOOR OUTLETBEHEER ------------------------------
--------------------------------------------------------------------------------------------------
-- Utilities
-- De totalen aan verhuurbare ruimte(Opp) per CompanyCode,Afdeling,Soort
CREATE OR REPLACE PACKAGE AKZ AS
   FUNCTION akz_f_cad_ruimte_bezetting(pBezettingswaarde IN NUMBER) RETURN NUMBER;
   FUNCTION akz_f_pct_gemeensch(VerdiepingKey IN NUMBER) RETURN NUMBER;

   PROCEDURE Ins_Update_Kenmerkdeel(kenmerkdeel_key IN NUMBER,
                                    deel_key        IN NUMBER,
                                    kenmerk_key     IN NUMBER,
                                    waarde          IN VARCHAR2,
                                    historymode     IN VARCHAR2,
                                    mselect         IN VARCHAR2);
   PROCEDURE Kmd_Update_Kenmerkdeel(kenmerkdeel_key IN NUMBER,
                                    deel_key        IN NUMBER,
                                    kenmerk_key     IN NUMBER,
                                    waarde          IN VARCHAR2,
                                    historymode     IN VARCHAR2,
                                    mselect         IN VARCHAR2);
   PROCEDURE Kmd_Insert(p_deel_key    IN NUMBER,
                        p_kenmerk_key IN NUMBER,
                        p_waarde      IN VARCHAR2,
                        p_historymode IN VARCHAR2);
   PROCEDURE Kmd_Delete(p_kenmerkdeel_key IN NUMBER,
                        p_historymode     IN VARCHAR2);
   PROCEDURE Kmd_Update(p_kenmerkdeel_key IN NUMBER,
                        p_waarde          IN VARCHAR2,
                        p_historymode     IN VARCHAR2);
   PROCEDURE Ins_Update_Kenmerkdeel_WEB(kenmerkdeel_key IN NUMBER,
                                        deel_key        IN NUMBER,
                                        kenmerk_key     IN NUMBER,
                                        waarde          IN VARCHAR2,
                                        historymode     IN VARCHAR2,
                                        mselect         IN VARCHAR2);

   PRAGMA RESTRICT_REFERENCES (akz_f_pct_gemeensch,WNDS, WNPS);
END akz;
/


CREATE OR REPLACE PACKAGE BODY AKZ
AS
   FUNCTION akz_f_cad_ruimte_bezetting (pBezettingswaarde IN NUMBER)
      RETURN NUMBER
   IS
      -- PRE: pBezettingswaarde IS NOT NULL
      v_result   NUMBER (3, 0);
   BEGIN
      IF (pBezettingswaarde <= 0)
      THEN
         v_result := 0;
      ELSE
         IF (pBezettingswaarde > 0) AND (pBezettingswaarde < 100)
         THEN
            v_result := 50;
         ELSE
            v_result := 100;
         END IF;
      END IF;

      RETURN v_result;
   END akz_f_cad_ruimte_bezetting;

   FUNCTION akz_f_pct_gemeensch (VerdiepingKey IN NUMBER)
      RETURN NUMBER
   IS
      GebouwKey                   NUMBER (10, 2);
      opp_verhuurbaar_ver         NUMBER (10, 2);
      opp_verhuurbaar_hor         NUMBER (10, 2);
      opp_gemeenschappelijk_ver   NUMBER (10, 2);
      opp_gemeenschappelijk_hor   NUMBER (10, 2);
   BEGIN
      -- Levert het percentage van de ruimte dat van gebouw met de gegeven key gemeenschappelijk
      -- zijnde de opp_gemeenschappelijk/opp_netto. Hiermee kan de bruto oppervlakte van een
      -- netto oppervlakte worden berekend met bruto=netto+ pct*netto = (1+pct)*netto
      SELECT ALG_GEBOUW_KEY
        INTO GebouwKey
        FROM ALG_VERDIEPING
       WHERE ALG_VERDIEPING_KEY = VerdiepingKey;

      SELECT NVL (SUM (alg_ruimte_bruto_vloeropp), 1) -- minstens 1 tegen het delen door nul
        INTO opp_verhuurbaar_ver
        FROM alg_v_aanwezigruimte R, alg_srtruimte SR, alg_verdieping V
       WHERE     V.alg_gebouw_key = GebouwKey
             AND V.alg_verdieping_key = R.alg_verdieping_key
             AND R.alg_srtruimte_key = SR.alg_srtruimte_key
             AND SR.prs_verhuurbaar IS NOT NULL
             AND SR.prs_bevat_werkplek IS NOT NULL;

      SELECT NVL (SUM (alg_ruimte_bruto_vloeropp), 1) -- minstens 1 tegen het delen door nul
        INTO opp_verhuurbaar_hor
        FROM alg_v_aanwezigruimte R, alg_srtruimte SR, alg_verdieping V
       WHERE     V.alg_verdieping_key = VerdiepingKey -- Alleen deze verdieping
             AND V.alg_verdieping_key = R.alg_verdieping_key
             AND R.alg_srtruimte_key = SR.alg_srtruimte_key
             AND SR.prs_verhuurbaar IS NOT NULL
             AND SR.prs_bevat_werkplek IS NOT NULL;

      SELECT NVL (SUM (alg_ruimte_bruto_vloeropp), 0)
        INTO opp_gemeenschappelijk_ver
        FROM alg_v_aanwezigruimte R, alg_srtruimte SR, alg_verdieping V
       WHERE     V.alg_gebouw_key = GebouwKey
             AND V.alg_verdieping_key = R.alg_verdieping_key
             AND R.alg_srtruimte_key = SR.alg_srtruimte_key
             AND SR.prs_verhuurbaar IS NOT NULL
             AND SR.alg_srtruimte_upper LIKE '%VERTICAAL%'
             AND SR.prs_bevat_werkplek IS NULL;

      SELECT NVL (SUM (alg_ruimte_bruto_vloeropp), 0)
        INTO opp_gemeenschappelijk_hor
        FROM alg_v_aanwezigruimte R, alg_srtruimte SR, alg_verdieping V
       WHERE     V.alg_verdieping_key = VerdiepingKey
             AND V.alg_verdieping_key = R.alg_verdieping_key
             AND R.alg_srtruimte_key = SR.alg_srtruimte_key
             AND SR.prs_verhuurbaar IS NOT NULL
             AND SR.alg_srtruimte_upper LIKE '%HORIZONTAAL%'
             AND SR.prs_bevat_werkplek IS NULL;

      RETURN (opp_gemeenschappelijk_ver / opp_verhuurbaar_ver)
             + (opp_gemeenschappelijk_hor / opp_verhuurbaar_hor);
   END akz_f_pct_gemeensch;

   PROCEDURE Ins_Update_Kenmerkdeel (kenmerkdeel_key   IN NUMBER,
                                     deel_key          IN NUMBER,
                                     kenmerk_key       IN NUMBER,
                                     waarde            IN VARCHAR2,
                                     historymode       IN VARCHAR2,
                                     mselect           IN VARCHAR2)
   IS
      v_history_mode   fac_message.fac_message_text%TYPE;
   BEGIN
      -- Het is eigenlijk voldoende om hier alleen Kmd_Update()
      -- aan te roepen omdat daar alle situaties worden
      -- gecontroleerd en de bijbehorende actie wordt uitgevoerd.
      -- De onderstaande Select zorgt er dus alleen voor dat
      -- indien er geen actueel record bestaat, of een die
      -- vandaag is gesloten er een nieuw record wordt gemaakt,
      -- hetgeen in Kmd_Update() ook wordt gedaan zodat de tweede
      -- insert een foutmelding geeft.
      -- Daarom alleen Kmd_Update() aanroepen met een dummy waarde
      -- voor ins_kenmerkdeel_key.
      --
      IF historymode IS NULL
      THEN
         BEGIN
            SELECT DECODE (fac_message_text, 'TRUE', '1', 'FALSE', '0', '0')
              INTO v_history_mode
              FROM fac_message
             WHERE fac_message_code = 'FAC_HISTORYMODE_VALUE';
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               v_history_mode := '0';
         END;
      ELSE
         v_history_mode := historymode;
      END IF;

      AKZ.Kmd_Update_Kenmerkdeel (kenmerkdeel_key,
                                  deel_key,
                                  kenmerk_key,
                                  waarde,
                                  v_history_mode,
                                  mselect);
   END Ins_Update_Kenmerkdeel;

   PROCEDURE Kmd_Insert (p_deel_key      IN NUMBER,
                         p_kenmerk_key   IN NUMBER,
                         p_waarde        IN VARCHAR2,
                         p_historymode   IN VARCHAR2)
   IS
   BEGIN
      IF p_waarde IS NOT NULL
      THEN
         INSERT INTO ins_kenmerkdeel (ins_kenmerk_key,
                                      ins_deel_Key,
                                      ins_kenmerkdeel_waarde)
             VALUES (p_kenmerk_key, p_deel_key, p_waarde);
      END IF;
   END Kmd_Insert;

   PROCEDURE Kmd_Delete (p_kenmerkdeel_key   IN NUMBER,
                         p_historymode       IN VARCHAR2)
   IS
   BEGIN
      IF p_historymode = '0'
      THEN
         --NON HISTORY MODE
         DELETE FROM ins_kenmerkdeel
               WHERE ins_kenmerkdeel_key = p_kenmerkdeel_key;
      ELSE
         --HISTORY MODE
         UPDATE ins_kenmerkdeel
            SET ins_kenmerkdeel_verwijder = SYSDATE
          WHERE ins_kenmerkdeel_key = p_kenmerkdeel_key;
      END IF;
   END Kmd_Delete;

   PROCEDURE Kmd_update (p_kenmerkdeel_key   IN NUMBER,
                         p_waarde            IN VARCHAR2,
                         p_historymode       IN VARCHAR2)
   IS
   BEGIN
      UPDATE ins_kenmerkdeel
         SET ins_kenmerkdeel_waarde = p_waarde,
             ins_kenmerkdeel_verwijder = NULL
       WHERE ins_kenmerkdeel_key = p_kenmerkdeel_key;
   END Kmd_Update;

   PROCEDURE Kmd_Update_Kenmerkdeel (kenmerkdeel_key   IN NUMBER,
                                     deel_key          IN NUMBER,
                                     kenmerk_key       IN NUMBER,
                                     waarde            IN VARCHAR2,
                                     historymode       IN VARCHAR2,
                                     mselect           IN VARCHAR2)
   IS
      v_kenmerkdeelkey   NUMBER (10);
   BEGIN
      IF historymode = '0'
      THEN
         IF waarde IS NOT NULL
         THEN
            IF kenmerkdeel_key IS NOT NULL AND mselect = '0'
            THEN
               AKZ.Kmd_Update (kenmerkdeel_key, waarde, historymode);
            ELSIF kenmerkdeel_key IS NULL AND mselect = '1'
            THEN
               -- kenmerkdeel vanuit form in mselectmode is null
               -- deelkey komt uit fac_selectie daar kan kenmerkdeel niet aan toegevoegd worden.
               -- Oplossing : zoek a.h.v. Deelkey en Kenmerkkey de kenmerkdeel_key
               -- Bij Insert is kenmerkdeel_key ook NULL, maar dit gaat goed aangezien mselect daar nooit '1' kan zijn.
               BEGIN
                  SELECT ins_kenmerkdeel_Key
                    INTO v_kenmerkdeelkey
                    FROM ins_v_aanwezigkenmerkdeel
                   WHERE ins_deel_key = deel_key
                         AND ins_kenmerk_key = kenmerk_key;

                  AKZ.Kmd_Update (v_kenmerkdeelkey, waarde, historymode);
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     AKZ.Kmd_Insert (deel_key,
                                     kenmerk_key,
                                     waarde,
                                     historymode);
               END;
            ELSE
               AKZ.Kmd_Insert (deel_key,
                               kenmerk_key,
                               waarde,
                               historymode);
            END IF;
         ELSE
            AKZ.Kmd_Delete (kenmerkdeel_key, historymode);
         END IF;
      ELSIF historymode = '1'
      THEN
         DECLARE
            -- Zoek alle records voor een gegeven object en kenmerk
            -- en zet de meest recente bovenaan.
            --
            CURSOR c_kenmerkdeel (
               p_kenmerk_key   IN            NUMBER,
               p_deel_key      IN            NUMBER)
            IS
                 SELECT ins_kenmerkdeel_key,
                        TRUNC (ins_kenmerkdeel_aanmaak) ins_kenmerkdeel_aanmaak,
                        TRUNC (ins_kenmerkdeel_verwijder)
                           ins_kenmerkdeel_verwijder,
                        ins_kenmerkdeel_waarde
                   FROM ins_kenmerkdeel
                  WHERE ins_kenmerk_key = p_kenmerk_key
                        AND ins_deel_key = p_deel_key
               ORDER BY ins_kenmerkdeel_key DESC;

            r_kenmerkdeel   c_kenmerkdeel%ROWTYPE;
         BEGIN
            OPEN c_kenmerkdeel (kenmerk_key, deel_key);

            FETCH c_kenmerkdeel INTO r_kenmerkdeel;

            IF c_kenmerkdeel%NOTFOUND
            THEN
               -- Voor dit object en kenmerk bestaat nog geen record
               -- dus toevoegen. Behalve als de toe te voegen waarde
               -- null is, dan wil je niets toevoegen dus dan ook
               -- geen actie.
               IF waarde IS NOT NULL
               THEN
                  AKZ.Kmd_Insert (deel_key,
                                  kenmerk_key,
                                  waarde,
                                  historymode);
               END IF;
            ELSE
               -- Er bestaat een record voor het object en kenmerk.
               --
               IF waarde IS NOT NULL
               THEN
                  -- Er is een nieuwe waarde voor een bepaald object en kenmerk.
                  --
                  IF r_kenmerkdeel.ins_kenmerkdeel_aanmaak <= TRUNC (SYSDATE)
                     AND r_kenmerkdeel.ins_kenmerkdeel_verwijder IS NULL
                  THEN
                     -- Het record is nog actueel, dus moet eerst gesloten worden
                     -- door het als verwijderd te markeren.
                     --
                     AKZ.Kmd_Delete (r_kenmerkdeel.ins_kenmerkdeel_key,
                                     historymode);
                  END IF;

                  --
                  -- Er bestaat nu tijdelijk geen actueel record meer voor
                  -- het object en kenmerk !!
                  --
                  IF r_kenmerkdeel.ins_kenmerkdeel_aanmaak < TRUNC (SYSDATE)
                     AND (r_kenmerkdeel.ins_kenmerkdeel_verwijder <=
                             TRUNC (SYSDATE)
                          OR r_kenmerkdeel.ins_kenmerkdeel_verwijder IS NULL)
                  THEN
                     -- Het laatste record voor kenmerk bij een object heeft langer
                     -- dan een dag bestaan. Voeg daarom een nieuwe toe.
                     --
                     AKZ.Kmd_Insert (deel_key,
                                     kenmerk_key,
                                     waarde,
                                     historymode);
                  ELSIF r_kenmerkdeel.ins_kenmerkdeel_aanmaak =
                           TRUNC (SYSDATE)
                  THEN
                     -- Het record voor kenmerk bij een object is vandaag
                     -- aangemaakt dus wordt er geen nieuwe toegevoegd maar
                     -- de huidige aangepast.
                     --
                     AKZ.Kmd_Update (r_kenmerkdeel.ins_kenmerkdeel_key,
                                     waarde,
                                     historymode);
                  END IF;
               ELSE
                  -- De nieuwe waarde voor het object en kenmerk is leeg, dus
                  -- moet het als verwijderd gemarkeerd worden.
                  -- Behalve als er in MSelect-mode gewijzigd wordt.
                  --
                  IF mselect = '0'
                  THEN
                     AKZ.Kmd_Delete (r_kenmerkdeel.ins_kenmerkdeel_key,
                                     historymode);
                  END IF;
               END IF;
            END IF;

            CLOSE c_kenmerkdeel;
         END;
      END IF;
   END Kmd_Update_Kenmerkdeel;

   PROCEDURE Ins_Update_Kenmerkdeel_WEB (kenmerkdeel_key   IN NUMBER,
                                         deel_key          IN NUMBER,
                                         kenmerk_key       IN NUMBER,
                                         waarde            IN VARCHAR2,
                                         historymode       IN VARCHAR2,
                                         mselect           IN VARCHAR2)
   IS
      k_key     NUMBER (10);
      waarde2   VARCHAR2 (255);
   BEGIN
      k_key := kenmerkdeel_key;
      waarde2 := NULL;

      IF kenmerkdeel_key IS NULL
      THEN
         BEGIN
            SELECT ins_kenmerkdeel_key, ins_kenmerkdeel_waarde
              INTO k_key, waarde2
              FROM ins_kenmerkdeel
             WHERE     INS_KENMERKDEEL_VERWIJDER IS NULL
                   AND INS_KENMERK_KEY = kenmerk_key
                   AND INS_DEEL_KEY = deel_key;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               NULL;
         END;
      END IF;

      IF (waarde IS NOT NULL AND waarde2 IS NOT NULL AND waarde <> waarde2)
         OR (waarde IS NOT NULL AND waarde2 IS NULL)
         OR (waarde IS NULL AND waarde2 IS NOT NULL)
      THEN
         akz.Ins_Update_Kenmerkdeel (k_key,
                                     deel_key,
                                     kenmerk_key,
                                     waarde,
                                     historymode,
                                     mselect);
      END IF;
   END Ins_Update_Kenmerkdeel_WEB;
END AKZ;
/

--------------------------------------------------------------------------------------------------
------------------------------- BASISVIEWS -------------------------------------------------------
--------------------------------------------------------------------------------------------------

-- BELANGRIJKE VIEW, wordt veelal gebruikt ipv kostenplaats-tabel!
-- Eerste woord van kostenplaatsgroep-omschrijving = debiteurnr voor doorbelastingsexport
CREATE OR REPLACE VIEW akza_v_kostenplaats
AS
   SELECT k.prs_kostenplaats_key,
          DECODE( INSTR (prs_kostenplaats_nr, '('),
                  0, TRIM (prs_kostenplaats_nr),
                  TRIM (SUBSTR (prs_kostenplaats_nr, 1, INSTR (prs_kostenplaats_nr, '(') - 2) )
                ) prs_kostenplaats_nr,
          UPPER( DECODE( INSTR (prs_kostenplaats_nr, '('),
                                0, TRIM (prs_kostenplaats_nr),
                                TRIM (SUBSTR (prs_kostenplaats_nr, 1, INSTR (prs_kostenplaats_nr, '(') - 2) ) )
                ) prs_kostenplaats_upper,
          prs_kostenplaats_nr fclt_kostenplaats_nr,
          prs_kostenplaats_omschrijving,
          COALESCE( SUBSTR(prs_kostenplaatsgrp_oms, 1, INSTR(prs_kostenplaatsgrp_oms, ' ')-1 ),
                    'ONBEKEND') debiteurnr,
          prs_kostenplaatsgrp_oms,
--          a.companycode,
          k.prs_perslid_key, prs_kostenplaats_module, prs_kostenplaats_begin, prs_kostenplaats_eind,
          k.prs_kostenplaatsgrp_key, prs_kostenplaats_aanmaak, prs_kostenplaats_verwijder,
          kg.prs_perslid_key grp_prs_perslid_key
     FROM prs_kostenplaats k,
          prs_kostenplaatsgrp kg
    WHERE kg.prs_kostenplaatsgrp_key(+) = k.prs_kostenplaatsgrp_key;

-- Mapping van afdeling naar company (top-level afdeling)
CREATE OR REPLACE VIEW akza_v_afdelingcompany
AS
   SELECT a.prs_afdeling_key,
          a.prs_afdeling_naam,
          a.prs_afdeling_upper,
          a.prs_afdeling_omschrijving,
          c.prs_afdeling_key company_key,
          c.prs_afdeling_naam companycode,
          c.prs_afdeling_omschrijving company_oms,
          a.prs_afdeling_aanmaak,
          a.prs_afdeling_verwijder,
          a.prs_kostenplaats_key
     FROM prs_afdeling a,
          prs_afdeling c,
          prs_v_afdeling_boom ab
    WHERE ab.prs_afdeling_key = a.prs_afdeling_key
      AND c.prs_afdeling_key = ab.prs_afdeling_key1;

-- AKZA#494: rapportage "doorbelasting outlets" uses this table
CREATE OR REPLACE VIEW prs_eenheid
(prs_eenheid_key, prs_eenheid_code, prs_eenheid_upper, prs_eenheid_omschrijving,
 prs_eenheid_aanmaak, prs_eenheid_verwijder, prs_bedrijf_key)
AS
   SELECT a.prs_afdeling_key,
          a.prs_afdeling_naam,
          a.prs_afdeling_upper,
          a.prs_afdeling_omschrijving,
          a.prs_afdeling_aanmaak,
          a.prs_afdeling_verwijder,
          a.prs_bedrijf_key
     FROM prs_afdeling a
    WHERE a.prs_afdeling_parentkey IS NULL;

CREATE OR REPLACE VIEW AKZA_V_PERSLID
(
    PRS_PERSLID_KEY,
    PRS_PERSLID_MODULE,
    PRS_SRTPERSLID_KEY,
    PRS_AFDELING_KEY,
    PRS_PERSLID_NAAM,
    PRS_PERSLID_UPPER,
    PRS_PERSLID_VOORLETTERS,
    PRS_PERSLID_VOORNAAM,
    PRS_PERSLID_TITEL,
    PRS_PERSLID_NR,
    PRS_PERSLID_DIENSTVERBAND,
    PRS_PERSLID_OPP,
    PRS_PERSLID_INGANGSDATUM,
    PRS_PERSLID_EINDDATUM,
    PRS_PERSLID_UURLOON,
    PRS_PERSLID_TELEFOONNR,
    PRS_PERSLID_AANMAAK,
    PRS_PERSLID_VERWIJDER,
    PRS_PERSLID_INITIALEN,
    PRS_PERSLID_INIT_UPPER,
    PRS_PERSLID_OSLOGIN,
    PRS_PERSLID_TUSSENVOEGSEL,
    FAC_PROFIEL_KEY,
    MLD_ADRES_KEY,
    PRS_PERSLID_LOGIN,
    PRS_PERSLID_MOBIEL,
    PRS_PERSLID_EMAIL,
    PRS_PERSLID_SRTNOTI_MODE,
    PRS_PERSLID_WACHTWOORD_EXP,
    PRS_PERSLID_AUTHENTICATIE,
    PRS_PERSLID_AUTHENTICATIE_EXP,
    PRS_PERSLID_LANG,
    PRS_PERSLID_OSLOGIN2,
    PRS_PERSLID_GESLACHT,
    PRS_PERSLID_INGIDS,
    PRS_PERSLID_SALT,
    PRS_PERSLID_WACHTWOORD_HASH,
    PRS_PERSLID_SYSTEEMADRES,
    ALG_ONROERENDGOED_KEYS,
    ALG_ONROERENDGOED_TYPE,
    PRS_PERSLID_BEZETDATUM,
    PRS_PERSLID_FLAGS,
    PRS_PERSLID_APIKEY,
    PRS_PERSLID_OPTIONS,
    PRS_PERSLID_OTPSECRET,
    PRS_PERSLID_OTPCOUNTER,
    PRS_PERSLID_CREDENTIALS_DATUM,
    PRS_PERSLID_TERMS_DATUM,
    PRS_PERSLID_TERMS_VERSION,
    PRS_PERSLID_TIMEZONE,
    PRS_PERSLID_EXTERNID,
    PRS_PERSLID_INACTIEF,
    PRS_PERSLID_EXTERNOSLOGIN,
    PRS_PERSLID_LOGLEVEL,
    PRS_PERSLID_STRING
)
BEQUEATH DEFINER
AS
    SELECT p."PRS_PERSLID_KEY",
           p."PRS_PERSLID_MODULE",
           p."PRS_SRTPERSLID_KEY",
           p."PRS_AFDELING_KEY",
           p."PRS_PERSLID_NAAM",
           p."PRS_PERSLID_UPPER",
           p."PRS_PERSLID_VOORLETTERS",
           p."PRS_PERSLID_VOORNAAM",
           p."PRS_PERSLID_TITEL",
           p."PRS_PERSLID_NR",
           p."PRS_PERSLID_DIENSTVERBAND",
           p."PRS_PERSLID_OPP",
           p."PRS_PERSLID_INGANGSDATUM",
           p."PRS_PERSLID_EINDDATUM",
           p."PRS_PERSLID_UURLOON",
           p."PRS_PERSLID_TELEFOONNR",
           p."PRS_PERSLID_AANMAAK",
           p."PRS_PERSLID_VERWIJDER",
           p."PRS_PERSLID_INITIALEN",
           upper (p.PRS_PERSLID_INITIALEN) PRS_PERSLID_INIT_UPPER,
           p."PRS_PERSLID_OSLOGIN",
           p."PRS_PERSLID_TUSSENVOEGSEL",
           p."FAC_PROFIEL_KEY",
           p."MLD_ADRES_KEY",
           p."PRS_PERSLID_LOGIN",
           p."PRS_PERSLID_MOBIEL",
           p."PRS_PERSLID_EMAIL",
           p."PRS_PERSLID_SRTNOTI_MODE",
           p."PRS_PERSLID_WACHTWOORD_EXP",
           p."PRS_PERSLID_AUTHENTICATIE",
           p."PRS_PERSLID_AUTHENTICATIE_EXP",
           p."PRS_PERSLID_LANG",
           p."PRS_PERSLID_OSLOGIN2",
           p."PRS_PERSLID_GESLACHT",
           p."PRS_PERSLID_INGIDS",
           p."PRS_PERSLID_SALT",
           p."PRS_PERSLID_WACHTWOORD_HASH",
           p."PRS_PERSLID_SYSTEEMADRES",
           p."ALG_ONROERENDGOED_KEYS",
           p."ALG_ONROERENDGOED_TYPE",
           p."PRS_PERSLID_BEZETDATUM",
           p."PRS_PERSLID_FLAGS",
           p."PRS_PERSLID_APIKEY",
           p."PRS_PERSLID_OPTIONS",
           p."PRS_PERSLID_OTPSECRET",
           p."PRS_PERSLID_OTPCOUNTER",
           p."PRS_PERSLID_CREDENTIALS_DATUM",
           p."PRS_PERSLID_TERMS_DATUM",
           p."PRS_PERSLID_TERMS_VERSION",
           p."PRS_PERSLID_TIMEZONE",
           p."PRS_PERSLID_EXTERNID",
           p."PRS_PERSLID_INACTIEF",
           p."PRS_PERSLID_EXTERNOSLOGIN",
           p."PRS_PERSLID_LOGLEVEL",
              p.prs_perslid_naam
           || NVL2 (p.prs_perslid_voorletters,
                    ', ' || p.prs_perslid_voorletters,
                    '')
           || NVL2 (p.prs_perslid_tussenvoegsel,
                    ' ' || p.prs_perslid_tussenvoegsel,
                    '')
           || NVL2 (p.prs_perslid_voornaam,
                    ' (' || p.prs_perslid_voornaam || ')',
                    '')
           || DECODE (p.prs_perslid_geslacht,  1, ' (M)',  0, ' (V)',  '')    prs_perslid_string
      FROM prs_perslid p
     WHERE     prs_perslid_upper NOT LIKE '[%'
           AND prs_perslid_upper NOT LIKE 'LEEG [%';


CREATE OR REPLACE VIEW akz_v_aanwezigperslid
AS
   SELECT *
     FROM akza_v_perslid
    WHERE prs_perslid_verwijder IS NULL;

-- Kenmerkdomeinen voor objectenbeheer (Deventer): LoD's, logische objecten etc
CREATE OR REPLACE VIEW akza_v_list_lods
AS
   SELECT d.ins_deel_key,
          d.ins_deel_omschrijving,
          d.ins_deel_opmerking,
          d.ins_deel_omschrijving||' '||d.ins_deel_opmerking ins_deel_aanduiding,
          d.ins_deel_verwijder
     FROM ins_deel d
    WHERE ins_discipline_key = 1625;

CREATE OR REPLACE VIEW akza_v_list_logische_obj
AS
   SELECT d.ins_deel_key,
          d.ins_deel_omschrijving,
          d.ins_deel_opmerking,
          d.ins_deel_omschrijving||' '||d.ins_deel_opmerking ins_deel_aanduiding,
          d.ins_deel_verwijder
     FROM ins_deel d
    WHERE ins_discipline_key = 1645;


--------------------------------------------------------------------------------------------------
------------------------------- RUIMTEDOORBELASTING EN SCHOONMAAK --------------------------------
--------------------------------------------------------------------------------------------------

CREATE OR REPLACE VIEW akz_ruimte_eenheid
(
   alg_ruimte_key,
   prs_afdeling_eenheid
)
AS
     SELECT w.prs_alg_ruimte_key "ALG_RUIMTE_KEY", 'NIETVERH' prs_afdeling_eenheid
       FROM prs_perslidwerkplek pw,
            prs_werkplek w,
            prs_afdeling a,
            prs_afdeling e,
            prs_perslid p
      WHERE a.prs_afdeling_parentkey = e.prs_afdeling_key
        AND e.prs_afdeling_parentkey IS NULL
        AND pw.prs_werkplek_key = w.prs_werkplek_key
        AND a.prs_afdeling_verwijder IS NULL
        AND a.prs_afdeling_naam = 'NIET VERH'
        AND p.prs_perslid_verwijder IS NULL
        AND pw.prs_perslid_key = p.prs_perslid_key
        AND p.prs_afdeling_key = a.prs_afdeling_key
   GROUP BY prs_alg_ruimte_key
   UNION
     SELECT w.prs_alg_ruimte_key "ALG_RUIMTE_KEY",
            MAX (e.prs_afdeling_naam) prs_afdeling_eenheid
       FROM prs_perslidwerkplek pw,
            prs_werkplek w,
            prs_afdeling a,
            prs_afdeling e,
            prs_perslid p
      WHERE a.prs_afdeling_parentkey = e.prs_afdeling_key
        AND e.prs_afdeling_parentkey IS NULL
        AND pw.prs_werkplek_key = w.prs_werkplek_key
        AND a.prs_afdeling_verwijder IS NULL
        AND a.prs_afdeling_naam <> 'NIET VERH'
        AND p.prs_perslid_verwijder IS NULL
        AND pw.prs_perslid_key = p.prs_perslid_key
        AND p.prs_afdeling_key = a.prs_afdeling_key
   GROUP BY prs_alg_ruimte_key;

-- Now with 3D authorization on Building
CREATE OR REPLACE VIEW akz_verdiepingopp
(FCLT_F_GEBOUW, HIDE_F_VOLGNR, VERDIEPING, FCLT_3D_GEBOUW_KEY, OPPERVLAKTE)
AS
     SELECT    l.alg_locatie_code || '-'
            || alg_gebouw_omschrijving fclt_f_gebouw,
            v.alg_verdieping_volgnr,
            v.alg_verdieping_omschrijving,
            g.alg_gebouw_key,
            SUM (r.alg_ruimte_bruto_vloeropp) oppervlakte
       FROM alg_v_aanweziggebouw g,
            alg_v_aanwezigverdieping v,
            alg_v_aanwezigruimte r,
            alg_v_aanweziglocatie l
      WHERE v.alg_gebouw_key = g.alg_gebouw_key
        AND r.alg_verdieping_key = v.alg_verdieping_key
        AND g.alg_locatie_key = l.alg_locatie_key
   GROUP BY l.alg_locatie_code || '-' || alg_gebouw_omschrijving,v.alg_verdieping_volgnr,v.alg_verdieping_omschrijving,g.alg_gebouw_key;

-- Now with 3D authorization on Building
CREATE OR REPLACE VIEW akz_gebouwopp
(FCLT_F_GEBOUW, FCLT_3D_GEBOUW_KEY, OPPERVLAKTE)
AS
   SELECT l.alg_locatie_code || '-' || g.alg_gebouw_omschrijving,
          g.alg_gebouw_key,
          SUM (r.alg_ruimte_bruto_vloeropp) oppervlakte
     FROM alg_v_aanweziggebouw g,
          alg_v_aanwezigverdieping v,
          alg_v_aanwezigruimte r,
          alg_v_aanweziglocatie l
    WHERE v.alg_gebouw_key = g.alg_gebouw_key
      AND r.alg_verdieping_key = v.alg_verdieping_key
      AND g.alg_locatie_key = l.alg_locatie_key
 GROUP BY l.alg_locatie_code || '-' || alg_gebouw_omschrijving, g.alg_gebouw_key;

-- Now with 3D authorization on Building and organization
CREATE OR REPLACE VIEW akz_gebruiker_per_ruimte
(FCLT_F_GEBOUW, BOUWLAAG, RUIMTE, FCLT_F_AFDELING, GEBRUIKER,
 OPPERVLAKTE, BEZETTINGSGRAAD, BEZETOPP, TELEFOON, FCLT_3D_GEBOUW_KEY, FCLT_3D_AFDELING_KEY)
AS
   SELECT w.alg_gebouw_omschrijving gebouw, w.alg_verdieping_code bouwlaag,
          w.alg_ruimte_nr ruimte, a.prs_afdeling_naam afdeling,
          w.prs_afd_perslid_naam gebruiker,
          ROUND (w.prs_werkplek_opp, 2) oppervlakte,
          w.prs_perslidwerkplek_bezetting bezettingsgraad,
          ROUND (w.prs_werkplek_opp * w.prs_perslidwerkplek_bezetting / 100,
                 2
                ) bezetopp,
          p.prs_perslid_telefoonnr telefoon,
          w.alg_gebouw_key,
          a.prs_afdeling_key
     FROM prs_v_perslidwerkplek_gegevens w,
          prs_v_aanwezigafdeling a,
          prs_v_aanwezigperslid p
    WHERE p.prs_afdeling_key = a.prs_afdeling_key
      AND w.prs_perslid_key = p.prs_perslid_key;

CREATE OR REPLACE VIEW akz_v_ruimte_gegevens
AS
   SELECT r.*,
          (  (akz.akz_f_pct_gemeensch (r.alg_verdieping_key) + 1)
           * (NVL (r.alg_ruimte_bruto_vloeropp, 0))
          ) alg_ruimte_bruto_vloeropp_vh
     FROM alg_ruimte r, alg_srtruimte sr
    WHERE alg_ruimte_verwijder IS NULL
      AND sr.alg_srtruimte_key = r.alg_srtruimte_key
      AND sr.prs_verhuurbaar IS NOT NULL
      AND sr.prs_bevat_werkplek IS NOT NULL;

-- Now with 3D authorization on Building
CREATE OR REPLACE VIEW akz_verhruimte_per_gebouw (fclt_f_locatie,
                                                  fclt_f_gebouw,
                                                  fclt_3d_gebouw_key,
                                                  oppervlakte,
                                                  oppervlakte_bruto,
                                                  fclt_3d_locatie_key
                                                 )
AS
   SELECT   l.alg_locatie_code locatie,
            g.alg_gebouw_omschrijving gebouw, g.alg_gebouw_key,
            SUM (NVL (r.alg_ruimte_bruto_vloeropp, 0)) oppervlakte,
            SUM (NVL (r.alg_ruimte_bruto_vloeropp_vh, 0)) oppervlakte_bruto,
            g.alg_locatie_key
       FROM alg_locatie l, alg_gebouw g, alg_verdieping v, akz_v_ruimte_gegevens r
      WHERE r.alg_verdieping_key = v.alg_verdieping_key
        AND v.alg_gebouw_key = g.alg_gebouw_key
        AND l.alg_locatie_key = g.alg_locatie_key
   GROUP BY g.alg_gebouw_omschrijving, g.alg_gebouw_key, g.alg_locatie_key, l.alg_locatie_code;

-- Now with 3D authorization on Building and organization
CREATE OR REPLACE VIEW akz_huur_verhuurbaar_ruimte
(
   FCLT_F_COMPANYCODE,
   HIDE_F_COMPANYNAAM,
   FCLT_F_KOSTENPLAATS,
   AFDELING,
   FCLT_X_LOCATIE,
   FCLT_F_GEBOUW,
   VERDIEPING,
   RUIMTENR,
   RUIMTESOORT,
   FCLT_3D_GEBOUW_KEY,
   FCLT_3D_AFDELING_KEY,
   BVO
)
AS
     SELECT e.prs_afdeling_naam companycode,
            e.prs_afdeling_omschrijving companynaam,
            kp.prs_kostenplaats_nr,
            a.prs_afdeling_omschrijving,
            rg.alg_locatie_omschrijving||' ('||rg.alg_locatie_code||')',
            rg.alg_gebouw_omschrijving,
            rg.alg_verdieping_code,
            rg.alg_ruimte_nr,
            sr.alg_srtruimte_omschrijving,
            rg.alg_gebouw_key,
            a.prs_afdeling_key,
            ROUND( SUM( COALESCE( rg.alg_ruimte_bruto_vloeropp * ra.prs_ruimteafdeling_bezetting / 100,
                                  0)),
                   1)
               bvo
       FROM prs_v_aanwezigafdeling a,
            prs_v_aanwezigafdeling e,
            prs_v_aanwezigruimteafdeling ra,
            alg_v_ruimte_gegevens rg,
            alg_srtruimte sr,
            akza_v_kostenplaats kp
      WHERE     a.prs_afdeling_parentkey = e.prs_afdeling_key(+)
            AND e.prs_afdeling_parentkey IS NULL
            AND kp.prs_kostenplaats_key(+) = a.prs_kostenplaats_key
            AND ra.prs_afdeling_key = a.prs_afdeling_key(+)
            AND rg.alg_ruimte_key = ra.alg_ruimte_key(+)
            AND sr.alg_srtruimte_key = rg.alg_srtruimte_key
   GROUP BY e.prs_afdeling_naam,
            e.prs_afdeling_omschrijving,
            kp.prs_kostenplaats_nr,
            a.prs_afdeling_omschrijving,
            rg.alg_locatie_code,
            rg.alg_locatie_omschrijving,
            rg.alg_gebouw_omschrijving,
            rg.alg_gebouw_key,
            rg.alg_verdieping_volgnr,
            rg.alg_verdieping_code,
            rg.alg_ruimte_nr,
            sr.alg_srtruimte_omschrijving,
            a.prs_afdeling_key;

CREATE OR REPLACE VIEW akz_huur_verhuurbaar
AS
   SELECT fclt_f_companycode,
          hide_f_companynaam fclt_f_companynaam,
          fclt_f_kostenplaats,
          afdeling,
          fclt_x_locatie,
          fclt_f_gebouw,
          ruimtesoort,
          fclt_3d_gebouw_key,
          fclt_3d_afdeling_key,
          SUM(bvo) bvo
     FROM akz_huur_verhuurbaar_ruimte
 GROUP BY fclt_f_companycode,
          hide_f_companynaam,
          fclt_f_kostenplaats,
          afdeling,
          fclt_x_locatie,
          fclt_f_gebouw,
          ruimtesoort,
          fclt_3d_gebouw_key,
          fclt_3d_afdeling_key;

-- Now with 3D authorization on Building
CREATE OR REPLACE VIEW akz_schoonmaakrapport (fclt_f_gebouw,
                                                    hide_f_verdieping_volgnummer,
                                                    verdieping,
                                                    ruimte,
                                                    omschrijving,
                                                    opp,
                                                    fclt_f_vloerafwerking,
                                                    fclt_f_schoonmaakniveau,
                                                    kosten,
                                                    fclt_3d_gebouw_key)
AS
   SELECT   alg_g.alg_gebouw_omschrijving fclt_f_gebouw,
            alg_v.alg_verdieping_volgnr,
            alg_v.alg_verdieping_omschrijving verdieping,
            'R' || alg_r.alg_ruimte_nr ruimte,
            alg_r.alg_ruimte_omschrijving omschrijving,
            alg_r.alg_ruimte_bruto_vloeropp opp,
            u.fac_usrdata_omschr fclt_f_vloerafwerking,
            n.fac_usrdata_omschr fclt_f_schoonmaakniveau,
            ROUND(n.fac_usrdata_prijs * alg_r.alg_ruimte_bruto_vloeropp,2) kosten,
            alg_g.alg_gebouw_key
       FROM alg_v_aanweziggebouw alg_g,
            alg_v_aanwezigverdieping alg_v,
            alg_v_aanwezigruimte alg_r,
            alg_onrgoedkenmerk alg_k1,
            alg_onrgoedkenmerk alg_k2,
            (SELECT * FROM fac_usrdata WHERE fac_usrtab_key = 470) n,
            (SELECT * FROM fac_usrdata WHERE fac_usrtab_key = 1) u
      WHERE alg_v.alg_gebouw_key = alg_g.alg_gebouw_key
        AND alg_v.alg_verdieping_key = alg_r.alg_verdieping_key
        AND alg_r.alg_ruimte_key = alg_k1.alg_onrgoed_key(+)
        AND alg_k1.alg_kenmerk_key(+) = 1001                            --nivo
        AND alg_k1.alg_onrgoedkenmerk_waarde = TO_CHAR(n.fac_usrdata_key)
        AND alg_r.alg_ruimte_key = alg_k2.alg_onrgoed_key(+)
        AND alg_k2.alg_kenmerk_key(+) = 2                          -- srtvloer
        AND alg_k2.alg_onrgoedkenmerk_waarde = u.fac_usrdata_key(+)
        AND u.fac_usrtab_key(+) = 1
   ORDER BY alg_v.alg_verdieping_volgnr, alg_r.alg_ruimte_upper_nr;

-- AKZA#476/AKZA#669
CREATE OR REPLACE VIEW akz_v_jaarkosten_per_ordernr (fclt_f_ordernr,
                                                           gebouw,
                                                           fclt_f_jaar,
                                                           besteding)
AS
   SELECT   ordernr fclt_f_ordernr,
            MIN (   gebouw_omschrijving
                 || DECODE ((SELECT COUNT (alg_gebouw_omschrijving)
                               FROM ALG_GEBOUW
                              WHERE alg_gebouw_ordernr = ordernr),
                            '1', '',
                            ', .....'
                           )
                ) gebouw,
            jaar fclt_f_jaar, SUM (besteding_som) besteding
       FROM (SELECT   g.alg_gebouw_ordernr ordernr,
                      g.alg_gebouw_omschrijving gebouw_omschrijving,
                      TO_CHAR (m.mld_melding_datum, 'YYYY') jaar,
                      SUM
                         (  o.mld_opdr_kosten
                          + NVL
                               ((SELECT Fac.safe_to_number
                                                       (mld_kenmerkopdr_waarde)
                                   FROM MLD_KENMERKOPDR ko
                                  WHERE mld_kenmerk_key = 2
                                    AND mld_kenmerkopdr_verwijder IS NULL
                                    AND o.mld_opdr_key = ko.mld_opdr_key),
                                0
                               )
                         ) besteding_som
                 FROM MLD_MELDING m,
                      MLD_OPDR o,
                      ALG_GEBOUW g,
                      alg_v_onroerendgoed og,
                      akza_v_kostenplaats k
                WHERE m.mld_melding_key = o.mld_melding_key
                  AND og.alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys
                  AND og.alg_gebouw_key = g.alg_gebouw_key
                  AND o.prs_kostenplaats_key = k.prs_kostenplaats_key
                  AND k.prs_kostenplaats_module = 'ALG'
             GROUP BY g.alg_gebouw_ordernr,
                      g.alg_gebouw_omschrijving,
                      TO_CHAR (m.mld_melding_datum, 'YYYY'))
   GROUP BY ordernr, jaar
   UNION ALL
   SELECT   ordernr fclt_f_ordernr,
            MIN
               (   terein_omschrijving
                || DECODE ((SELECT COUNT (alg_terreinsector_omschrijving)
                              FROM ALG_TERREINSECTOR
                             WHERE alg_terreinsector_ordernr = ordernr),
                           '1', '',
                           ', .....'
                          )
               ) terrein,
            jaar fclt_f_jaar, SUM (besteding_som) besteding
       FROM (SELECT   g.alg_terreinsector_ordernr ordernr,
                      g.alg_terreinsector_omschrijving terein_omschrijving,
                      TO_CHAR (m.mld_melding_datum, 'YYYY') jaar,
                      SUM
                         (  o.mld_opdr_kosten
                          + NVL
                               ((SELECT Fac.safe_to_number
                                                       (mld_kenmerkopdr_waarde)
                                   FROM MLD_KENMERKOPDR ko
                                  WHERE mld_kenmerk_key = 2
                                    AND mld_kenmerkopdr_verwijder IS NULL
                                    AND o.mld_opdr_key = ko.mld_opdr_key),
                                0
                               )
                         ) besteding_som
                 FROM MLD_MELDING m,
                      MLD_OPDR o,
                      ALG_TERREINSECTOR g,
                      alg_v_onroerendgoed og,
                      akza_v_kostenplaats k
                WHERE m.mld_melding_key = o.mld_melding_key
                  AND og.alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys
                  AND og.alg_terreinsector_key = g.alg_terreinsector_key
                  AND o.prs_kostenplaats_key = k.prs_kostenplaats_key
                  AND k.prs_kostenplaats_module = 'ALG'
             GROUP BY g.alg_terreinsector_ordernr,
                      g.alg_terreinsector_omschrijving,
                      TO_CHAR (m.mld_melding_datum, 'YYYY'))
   GROUP BY ordernr, jaar

--------------------------------------------------------------------------------------------------
------------------------------- GRAPHICS THEMA'S -------------------------------------------------
--------------------------------------------------------------------------------------------------

CREATE OR REPLACE VIEW akza_v_ruimtecode
(ALG_RUIMTE_KEY, RUIMTECODE)
AS
   SELECT r.alg_ruimte_key, v.alg_verdieping_code || '.' || SUBSTR(r.alg_ruimte_nr,2) ruimtecode
     FROM alg_ruimte r, alg_verdieping v
    WHERE r.alg_verdieping_key = v.alg_verdieping_key
      AND r.alg_ruimte_nr LIKE '0%'
    UNION
   SELECT r.alg_ruimte_key, v.alg_verdieping_code || '.' || r.alg_ruimte_nr
     FROM alg_ruimte r, alg_verdieping v
    WHERE r.alg_verdieping_key = v.alg_verdieping_key
      AND r.alg_ruimte_nr NOT LIKE '0%';

CREATE OR REPLACE VIEW cad_v_alg_ruimte
(ALG_RUIMTE_KEY, ALG_VERDIEPING_KEY, ALG_RUIMTE_CADLABEL, ALG_RUIMTE_NR, ALG_RUIMTE_OMSCHRIJVING,
 ALG_RUIMTE_OPPERVLAKTE, ALG_SRTRUIMTE_OMSCHRIJVING, AKZA_RUIMTECODE)
AS
   SELECT r.alg_ruimte_key, r.alg_verdieping_key, r.alg_ruimte_nr,
          r.alg_ruimte_nr, r.alg_ruimte_omschrijving,
          TO_CHAR (alg_ruimte_bruto_vloeropp) || ' m2',
          sr.alg_srtruimte_omschrijving, ar.ruimtecode
     FROM alg_v_aanwezigruimte r, alg_srtruimte sr, akza_v_ruimtecode ar
    WHERE sr.alg_srtruimte_key(+) = r.alg_srtruimte_key
          AND r.alg_ruimte_key = ar.alg_ruimte_key;

--- voor room_dep thema
CREATE OR REPLACE VIEW akza_v_cad_ruimte_eenheid (parentkey, code, waarde)
AS
     SELECT   r.alg_verdieping_key, r.alg_ruimte_nr, 'NIETVERH'
       FROM   prs_perslidwerkplek pw,
              prs_werkplek w,
              prs_afdeling a,
              prs_afdeling e,
              prs_perslid p,
              alg_ruimte r
      WHERE   a.prs_afdeling_parentkey = e.prs_afdeling_key
          AND w.prs_alg_ruimte_key = r.alg_ruimte_key
          AND e.prs_afdeling_parentkey IS NULL
          AND pw.prs_werkplek_key = w.prs_werkplek_key
          AND a.prs_afdeling_verwijder IS NULL
          AND a.prs_afdeling_naam = 'NIET VERH'
          AND p.prs_perslid_verwijder IS NULL
          AND pw.prs_perslid_key = p.prs_perslid_key
          AND p.prs_afdeling_key = a.prs_afdeling_key
   GROUP BY   r.alg_verdieping_key, r.alg_ruimte_nr
   UNION
     SELECT   r.alg_verdieping_key, r.alg_ruimte_nr, MAX (e.prs_afdeling_naam)
       FROM   prs_perslidwerkplek pw,
              prs_werkplek w,
              prs_afdeling a,
              prs_afdeling e,
              prs_perslid p,
              alg_ruimte r
      WHERE   a.prs_afdeling_parentkey = e.prs_afdeling_key
          AND w.prs_alg_ruimte_key = r.alg_ruimte_key
          AND e.prs_afdeling_parentkey IS NULL
          AND pw.prs_werkplek_key = w.prs_werkplek_key
          AND a.prs_afdeling_verwijder IS NULL
          AND a.prs_afdeling_naam <> 'NIET VERH'
          AND p.prs_perslid_verwijder IS NULL
          AND pw.prs_perslid_key = p.prs_perslid_key
          AND p.prs_afdeling_key = a.prs_afdeling_key
   GROUP BY   r.alg_verdieping_key, r.alg_ruimte_nr;

--- voor room_cyl thema
CREATE OR REPLACE VIEW akza_v_cad_ruimte_gasfles (ALG_RUIMTE_KEY, WAARDE)
AS
SELECT   r.alg_ruimte_key, COUNT (d.ins_deel_key)
       FROM alg_v_aanwezigruimte r, ins_v_aanwezigdeel d
      WHERE r.alg_ruimte_key = d.ins_alg_ruimte_key AND d.ins_srtdeel_key = 425
   GROUP BY r.alg_ruimte_key;

CREATE OR REPLACE VIEW akza_v_cad_ruimte_bezetting
(
   ALG_RUIMTE_KEY,
   WAARDE
)
AS
     SELECT ar.alg_ruimte_key,
            -- bepaal bezetting: wel/niet verhuurd, alle/een paar/geen werkplekken vrij
            TO_CHAR(DECODE (
                       SUM (bezetting) / (COUNT (prs_werkplek_key) * 100),
                       0,
                       -- 150 = geen afdeling toegewezen, dus niet verhuurd
                       --   0 = wel een afdeling, maar alle werkplekken vrij
                       DECODE ( (  SELECT COUNT (prs_afdeling_key)
                                     FROM prs_v_aanwezigruimteafdeling ara
                                    WHERE ara.alg_ruimte_key = ar.alg_ruimte_key
                                 GROUP BY alg_ruimte_key),
                               NULL, 150,
                               0, 150,
                               0),
                       -- alles tussen 0 en 100 wordt 50 ('deels bezet')
                       akz.akz_f_cad_ruimte_bezetting (
                          SUM (bezetting) / (COUNT (prs_werkplek_key)))))
       FROM (  SELECT awp.prs_alg_ruimte_key alg_ruimte_key,
                      awp.prs_werkplek_key,
                      SUM (COALESCE (prs_perslidwerkplek_bezetting, 0)) bezetting,
                      a2.prs_afdeling_key
                 FROM alg_v_aanwezigruimte ar,
                      prs_werkplek awp,
                      prs_perslidwerkplek apwp,
                      prs_v_aanwezigperslid ap,
                      prs_afdeling a1,
                      prs_afdeling a2,
                      prs_v_aanwezigruimteafdeling ara
                WHERE     awp.prs_alg_ruimte_key = ar.alg_ruimte_key
                      AND apwp.prs_werkplek_key(+) = awp.prs_werkplek_key
                      AND ap.prs_perslid_key(+) = apwp.prs_perslid_key
                      AND a1.prs_afdeling_key(+) = ap.prs_afdeling_key
                      AND ara.alg_ruimte_key(+) = ar.alg_ruimte_key
                      AND a2.prs_afdeling_key(+) = ara.prs_afdeling_key
             GROUP BY prs_alg_ruimte_key,
                      awp.prs_werkplek_key,
                      a2.prs_afdeling_key) x,
            alg_v_aanwezigruimte ar
      WHERE ar.alg_ruimte_key = x.alg_ruimte_key
   GROUP BY ar.alg_ruimte_key;

CREATE OR REPLACE VIEW akza_v_thema_ruimteafd
(
   ALG_RUIMTE_KEY,
   WAARDE,
   WAARDE_KEY
)
AS
   SELECT x.alg_ruimte_key,
          DECODE (y.aantal,
                  NULL, '[Leegstand]',
                  1, SUBSTR (y.sp, 1, 60),
                  '[Meerdere afdelingen]'),
          DECODE (y.aantal, NULL, -1, 1, y.sp_key, NULL)
     FROM    (SELECT r.alg_ruimte_key
                FROM alg_v_aanwezigruimte r,
                     alg_v_aanwezigsrtruimte sr
               WHERE r.alg_srtruimte_key = sr.alg_srtruimte_key
                 AND sr.prs_verhuurbaar IS NOT NULL
                 AND sr.alg_srtruimte_upper NOT LIKE '%VERKEER%') x
          LEFT JOIN
             (  SELECT ra.alg_ruimte_key,
                       MIN (a.prs_afdeling_naam1) sp,
                       MIN (a.prs_afdeling_key) sp_key,
                       COUNT (ra.prs_afdeling_key) aantal
                  FROM prs_v_aanwezigruimteafdeling ra,
                       prs_v_aanwezigafdeling a
                 WHERE ra.prs_afdeling_key = a.prs_afdeling_key
              GROUP BY ra.alg_ruimte_key) y
          ON x.alg_ruimte_key = y.alg_ruimte_key
   UNION ALL
   SELECT NULL, SUBSTR (a.prs_afdeling_naam1, 1, 60), a.prs_afdeling_key
     FROM prs_v_aanwezigafdeling a
    WHERE NOT EXISTS (SELECT ra.prs_afdeling_key
                        FROM prs_v_aanwezigruimteafdeling ra
                       WHERE ra.prs_afdeling_key = a.prs_afdeling_key);

--- voor room_cov thema
CREATE OR REPLACE VIEW akza_v_cad_ruimte_vloersoort (ALG_RUIMTE_KEY, WAARDE)
AS
   SELECT r.alg_ruimte_nr, COUNT (d.ins_deel_key)
     FROM alg_v_aanwezigruimte r, ins_v_aanwezigdeel d
    WHERE r.alg_ruimte_key = d.ins_alg_ruimte_key AND d.ins_srtdeel_key = 425
 GROUP BY r.alg_ruimte_nr;

-- AKZA#13268 Reserverings Plattegrond
-- dd. 18-10-2007 tonen we alles wat het komende uur komt of wat bezig is.
CREATE OR REPLACE VIEW akza_v_cad_thema_reservering
(ALG_RUIMTE_KEY, WAARDE)
AS
SELECT rar.alg_ruimte_key alg_ruimte_key, '1' 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;


-- dd. 18-10-2007 tonen we alles wat het komende uur komt of wat bezig is.
-- Let op: bij eventuele overlap pakken we de laatste van de twee (de aanstaande)
--         toevallig redden we eenvoudig dat door de strak gedefinieerde tekst
CREATE OR REPLACE VIEW akza_v_cad_ruimte_reservering
(ALG_RUIMTE_KEY, WAARDE)
AS
   SELECT   rar.alg_ruimte_key,
            MAX (   res_ruimte_nr
                 || '~'
                 || TO_CHAR (res_rsv_ruimte_van, 'HH24:MI')
                 || '-'
                 || TO_CHAR (res_rsv_ruimte_tot, 'HH24:MI')
                 || '~[s60]host: '
                 || prs_perslid_naam
                 || '~[s80][b]'
                 || res_rsv_ruimte_omschrijving
                ) 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 / 24) AND res_rsv_ruimte_tot
        AND pp.prs_perslid_key = res_rsv_ruimte_host_key
   GROUP BY rar.alg_ruimte_key;

-- AKZA#22941: Schoonmaak(nivo) in Graphics
CREATE OR REPLACE VIEW akza_v_thema_schnivo
(
   alg_ruimte_key,
   waarde,
   waarde_key
)
AS
   SELECT a.alg_ruimte_key,
          COALESCE (b.schnivo, '[Onbekend]'),
          COALESCE (b.schnivo_key, -1)
     FROM (SELECT r.alg_ruimte_key
             FROM alg_v_aanwezigruimte r
            WHERE alg_srtruimte_key != 961) a      -- 'Fictieve ruimte'
          LEFT JOIN
          (SELECT ok.alg_onrgoed_key,
                  ud.fac_usrdata_omschr schnivo,
                  ud.fac_usrdata_key schnivo_key
             FROM alg_onrgoedkenmerk ok, fac_usrdata ud
            WHERE ok.alg_kenmerk_key = 1001     -- schoonmaakniveau
              AND ok.alg_onrgoed_niveau = 'R'
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL
              AND ok.alg_onrgoedkenmerk_waarde = TO_CHAR(ud.fac_usrdata_key) ) b
          ON a.alg_ruimte_key = b.alg_onrgoed_key
   UNION ALL
   SELECT NULL,
          ud.fac_usrdata_omschr schnivo,
          ud.fac_usrdata_key schnivo_key
     FROM fac_usrdata ud
    WHERE ud.fac_usrtab_key = 470
      AND NOT EXISTS
            (SELECT 1
               FROM alg_onrgoedkenmerk ok
              WHERE ok.alg_kenmerk_key = 1001      -- schoonmaakniveau
                AND ok.alg_onrgoedkenmerk_waarde = ud.fac_usrdata_key);

CREATE OR REPLACE TRIGGER akza_t_thema_schnivo_i_iu
   INSTEAD OF INSERT OR UPDATE
   ON akza_v_thema_schnivo
BEGIN
   IF UPDATING           -- oude hard weggooien; dus DELETE (lekker opruimen)!
   THEN
      DELETE alg_onrgoedkenmerk
       WHERE alg_onrgoed_key = :new.alg_ruimte_key
         AND alg_onrgoed_niveau = 'R'
         AND alg_kenmerk_key = 1001;            -- schoonmaakniveau
   END IF;

   BEGIN
      IF :new.waarde_key != -1
      THEN
         INSERT INTO alg_onrgoedkenmerk (alg_onrgoed_key,
                                         alg_onrgoed_niveau,
                                         alg_kenmerk_key,
                                         alg_onrgoedkenmerk_waarde)
         VALUES (:new.alg_ruimte_key,
                 'R',
                 1001,                                 -- schoonmaakniveau
                 :new.waarde_key);
      END IF;
   EXCEPTION
      WHEN DUP_VAL_ON_INDEX                            -- was al aanwezig
      THEN
         NULL;
   END;
END;
/


--------------------------------------------------------------------------------------------------
------------------------------- SERVICEDESK RAPPORTAGE FUNCTIES ----------------------------------
--------------------------------------------------------------------------------------------------

-- 001 Uitgegeven aan uitvoerende: Servicedesk.
CREATE OR REPLACE VIEW akza_v_rap_uitg_servicedesk
(
   fclt_f_uitvoerende,
   fclt_f_mldnr,
   omschrijving,
   fclt_f_meldernaam,
   begindatum,
   dagen,
   afmelddatum
)
AS
   SELECT   prs_bedrijf_naam fclt_f_uitvoerende,
            TO_CHAR (m.mld_melding_key) fclt_f_mldnr,
            o.mld_opdr_omschrijving omschrijving,
            pf.prs_perslid_naam_full fclt_f_meldernaam,
            TO_CHAR (o.mld_opdr_datumbegin, 'DD-MM-YYYY') begindatum,
            TO_CHAR (fac.count_Work_Days(o.mld_opdr_datumbegin, o.mld_opdr_einddatum)) dagen,
            TO_CHAR (fac.gettrackingdate ('MLDAFM', m.mld_melding_key), 'DD-MM-YYYY') afmelddatum
     FROM   mld_opdr o, prs_bedrijf b, mld_melding m, prs_v_perslid_fullnames_all pf
    WHERE       o.mld_uitvoerende_keys = b.prs_bedrijf_key
            AND o.mld_melding_key = m.mld_melding_key
            AND pf.prs_perslid_key = m.prs_perslid_key
            AND (b.prs_bedrijf_key IN (7665, 7651, 7648))
            AND o.mld_statusopdr_key = 5;

-- 002 Uitgegeven aan uitvoerenden: Schoonmaak.
CREATE OR REPLACE VIEW akza_v_rap_uitg_schoonmaak
(
   fclt_f_uitvoerende,
   fclt_f_mldnr,
   omschrijving,
   fclt_f_meldernaam,
   begindatum,
   dagen,
   afmelddatum
)
AS
   SELECT   prs_bedrijf_naam fclt_f_uitvoerende,
            TO_CHAR (m.mld_melding_key) fclt_f_mldnr,
            o.mld_opdr_omschrijving omschrijving,
            pf.prs_perslid_naam_full fclt_f_meldernaam,
            TO_CHAR (o.mld_opdr_datumbegin, 'DD-MM-YYYY') begindatum,
            TO_CHAR (fac.count_Work_Days(o.mld_opdr_datumbegin, o.mld_opdr_einddatum)) dagen,
            TO_CHAR (fac.gettrackingdate ('MLDAFM', m.mld_melding_key), 'DD-MM-YYYY') afmelddatum
     FROM   mld_opdr o, prs_bedrijf b, mld_melding m, prs_v_perslid_fullnames_all pf
    WHERE       o.mld_uitvoerende_keys = b.prs_bedrijf_key
            AND o.mld_melding_key = m.mld_melding_key
            AND pf.prs_perslid_key = m.prs_perslid_key
            AND o.mld_statusopdr_key = 5
            AND (b.prs_bedrijf_key IN (7622, 8062));

-- 003 Uitgegeven aan uitvoerenden: Verhuizen and Kantoorbeheer.
CREATE OR REPLACE VIEW akza_v_rap_uitg_kantoorbeheer
(
   fclt_f_uitvoerende,
   fclt_f_mldnr,
   omschrijving,
   fclt_f_meldernaam,
   begindatum,
   dagen,
   afmelddatum
)
AS
   SELECT   prs_bedrijf_naam fclt_f_uitvoerende,
            TO_CHAR (m.mld_melding_key) fclt_f_mldnr,
            o.mld_opdr_omschrijving omschrijving,
            pf.prs_perslid_naam_full fclt_f_meldernaam,
            TO_CHAR (o.mld_opdr_datumbegin, 'DD-MM-YYYY') begindatum,
            TO_CHAR (fac.count_Work_Days(o.mld_opdr_datumbegin, o.mld_opdr_einddatum)) dagen,
            TO_CHAR (fac.gettrackingdate ('MLDAFM', m.mld_melding_key), 'DD-MM-YYYY') afmelddatum
     FROM   mld_opdr o, prs_bedrijf b, mld_melding m, prs_v_perslid_fullnames_all pf
    WHERE       o.mld_uitvoerende_keys = b.prs_bedrijf_key
            AND o.mld_melding_key = m.mld_melding_key
            AND pf.prs_perslid_key = m.prs_perslid_key
            AND b.prs_bedrijf_key IN (7643, 7644, 7646, 7654, 7662)
            AND o.mld_statusopdr_key = 5;

-- 004 Uitgegeven aan ALF Elektro uitvoerenden.
CREATE OR REPLACE VIEW akza_v_rap_uitg_electro_alf
(
   fclt_f_uitvoerende,
   fclt_f_mldnr,
   omschrijving,
   fclt_f_meldernaam,
   begindatum,
   dagen,
   afmelddatum
)
AS
   SELECT   prs_bedrijf_naam fclt_f_uitvoerende,
            TO_CHAR (m.mld_melding_key) fclt_f_mldnr,
            o.mld_opdr_omschrijving omschrijving,
            pf.prs_perslid_naam_full fclt_f_meldernaam,
            TO_CHAR (o.mld_opdr_datumbegin, 'DD-MM-YYYY') begindatum,
            TO_CHAR (fac.count_Work_Days(o.mld_opdr_datumbegin, o.mld_opdr_einddatum)) dagen,
            TO_CHAR (fac.gettrackingdate ('MLDAFM', m.mld_melding_key), 'DD-MM-YYYY') afmelddatum
     FROM   mld_opdr o, prs_bedrijf b, mld_melding m, prs_v_perslid_fullnames_all pf
    WHERE       o.mld_uitvoerende_keys = b.prs_bedrijf_key
            AND o.mld_melding_key = m.mld_melding_key
            AND pf.prs_perslid_key = m.prs_perslid_key
            AND b.prs_bedrijf_key IN (7667, 7672, 7676, 7683, 7960, 12393)
            AND o.mld_statusopdr_key = 5;

-- 005 Uitgegeven aan uitvoerenden: vakgroepbeheer Elektro.
CREATE OR REPLACE VIEW akza_v_rap_uitg_electro
(
   fclt_f_mldnr,
   begindatum,
   dagen,
   opdrachtomschrijving,
   fclt_f_uitvoerende,
   afmelddatum
)
AS
   SELECT   TO_CHAR (m.mld_melding_key) fclt_f_mldnr,
            TO_CHAR (o.mld_opdr_datumbegin, 'DD-MM-YYYY') begindatum,
            TO_CHAR (fac.count_Work_Days(o.mld_opdr_datumbegin, o.mld_opdr_einddatum)) dagen,
            o.mld_opdr_omschrijving opdrachtomschrijving,
            prs_bedrijf_naam fclt_f_uitvoerende,
            TO_CHAR (fac.gettrackingdate ('MLDAFM', m.mld_melding_key), 'DD-MM-YYYY') afmelddatum
     FROM   mld_melding m, mld_opdr o, prs_bedrijf b, prs_v_perslid_fullnames_all pf
    WHERE       m.mld_melding_key = o.mld_melding_key
            AND o.mld_uitvoerende_keys = b.prs_bedrijf_key
            AND pf.prs_perslid_key = m.prs_perslid_key
            AND (UPPER (pf.prs_perslid_naam_full) LIKE 'PELGRIM%')
            AND o.mld_statusopdr_key = 5;

-- 006 Uitgegeven aan uitvoerenden: accountmanager "Terrein & Derden".
CREATE OR REPLACE VIEW akza_v_rap_uitg_accman_td
(
   fclt_f_mldnr,
   begindatum,
   dagen,
   opdrachtomschrijving,
   fclt_f_order_nr,
   fclt_f_uitvoerende,
   afmelddatum
)
AS
     SELECT   TO_CHAR (m.mld_melding_key) fclt_f_mldnr,
              TO_CHAR (o.mld_opdr_datumbegin, 'DD-MM-YYYY') begindatum,
              TO_CHAR (fac.count_Work_Days(o.mld_opdr_datumbegin, o.mld_opdr_einddatum)) dagen,
              o.mld_opdr_omschrijving opdrachtomschrijving,
              o.mld_opdr_ordernr fclt_f_order_nr,
              prs_bedrijf_naam fclt_f_uitvoerende,
              TO_CHAR (fac.gettrackingdate ('MLDAFM', m.mld_melding_key), 'DD-MM-YYYY') afmelddatum
       FROM   mld_melding m, mld_opdr o, prs_bedrijf b, prs_v_perslid_fullnames_all pf
      WHERE       m.mld_melding_key = o.mld_melding_key
              AND o.mld_uitvoerende_keys = b.prs_bedrijf_key
              AND pf.prs_perslid_key = m.prs_perslid_key
              AND (UPPER (pf.prs_perslid_naam_full) LIKE 'SWEERS%')
              AND o.mld_statusopdr_key = 5
   ORDER BY   b.prs_bedrijf_naam;

-- 007 Uitgegeven aan uitvoerenden: accountmanager "AHQ".
CREATE OR REPLACE VIEW akza_v_rap_uitg_accman_ahq
AS
   SELECT b.prs_bedrijf_naam hide_f_prs_bedrijf_naam,
          TO_CHAR (o.mld_melding_key) fclt_f_meldnr,
          TO_CHAR (o.mld_opdr_datumbegin, 'DD-MM-YYYY') opdr_datum,
          TO_CHAR (fac.count_Work_Days(o.mld_opdr_datumbegin, o.mld_opdr_einddatum)) uitv_dgn, o.mld_opdr_omschrijving meldtekst,
          g.alg_gebouw_naam gebouw, b.prs_bedrijf_naam fclt_f_uitvoerende,
          g.alg_verdieping_omschrijving verdieping,
          o.mld_opdr_ordernr fclt_f_int_ord_nr
     FROM mld_melding m, mld_opdr o, prs_bedrijf b, alg_v_allonrgoed_gegevens g, prs_v_perslid_fullnames_all pf
    WHERE m.mld_melding_key = o.mld_melding_key
      AND o.mld_uitvoerende_keys = b.prs_bedrijf_key
      AND m.mld_alg_onroerendgoed_keys = g.alg_onroerendgoed_keys
      AND pf.prs_perslid_key = m.prs_perslid_key
      AND (UPPER (pf.prs_perslid_naam_full) LIKE 'RUTJES J%')
      AND o.mld_statusopdr_key = 5;

-- 008 Kosten op internal- of bewonersordernummer per periode.
CREATE OR REPLACE VIEW akza_v_rap_kosten_pp
(
   fclt_f_ord_nr,
   melddatum,
   datumverw,
   mldnr,
   meldernaam,
   uitvoerder,
   meldtekst,
   meldstatus,
   kosten_k,
   kosten
)
AS
   SELECT   o.mld_opdr_ordernr fclt_f_ord_nr,
            o.mld_opdr_datumbegin melddatum,
            fac.gettrackingdate ('MLDVER', m.mld_melding_key) datumverw,
            TO_CHAR (o.mld_melding_key) mldnr,
            pf.prs_perslid_naam_full meldernaam,
            b.prs_bedrijf_naam uitvoerder,
            o.mld_opdr_omschrijving meldtekst,
            o.mld_statusopdr_key || '. ' || mld_statusopdr_omschrijving meldstatus,
            m.mld_kosten_klant kosten_k,
            o.mld_opdr_kosten
            + NVL (
                 (SELECT   fac.safe_to_number (mld_kenmerkopdr_waarde)
                    FROM   mld_kenmerkopdr ko
                   WHERE       mld_kenmerk_key = 2
                           AND mld_kenmerkopdr_verwijder IS NULL
                           AND o.mld_opdr_key = ko.mld_opdr_key),
                 0
              )
               kosten
     FROM   mld_melding m, mld_opdr o, prs_bedrijf b, mld_statusopdr so, prs_v_perslid_fullnames_all pf
    WHERE       m.mld_melding_key = o.mld_melding_key
            AND o.mld_uitvoerende_keys = b.prs_bedrijf_key
            AND so.mld_statusopdr_key = o.mld_statusopdr_key
            AND m.mld_melding_status <> 6
            AND pf.prs_perslid_key = m.prs_perslid_key
            AND o.mld_statusopdr_key = 6
            AND o.mld_opdr_kosten
               + (SELECT   NVL (fac.safe_to_number (mld_kenmerkopdr_waarde), 0)
                    FROM   mld_kenmerkopdr ko
                   WHERE       mld_kenmerk_key = 2
                           AND mld_kenmerkopdr_verwijder IS NULL
                           AND o.mld_opdr_key = ko.mld_opdr_key) > 0
            AND o.mld_opdr_ordernr IS NOT NULL
            AND (o.mld_opdr_ordernr LIKE 'B-%' OR o.mld_opdr_ordernr LIKE 'I-%' OR o.mld_opdr_ordernr LIKE 'O-%')
   UNION ALL                                                           -- ALL want anders worden dubbelen er uit gehaald
   SELECT   o.mld_opdr_ordernr fclt_f_ord_nr,
            o.mld_opdr_datumbegin melddatum,
            fac.gettrackingdate ('MLDVER', m.mld_melding_key) datumverw,
            TO_CHAR (o.mld_melding_key) mldnr,
            pf.prs_perslid_naam_full meldernaam,
            b.prs_bedrijf_naam uitvoerder,
            o.mld_opdr_omschrijving meldtekst,
            o.mld_statusopdr_key || '. ' || mld_statusopdr_omschrijving meldstatus,
            m.mld_kosten_klant kosten_k,
            o.mld_opdr_kosten
            + NVL (
                 (SELECT   fac.safe_to_number (mld_kenmerkopdr_waarde)
                    FROM   mld_kenmerkopdr ko
                   WHERE       mld_kenmerk_key = 2
                           AND mld_kenmerkopdr_verwijder IS NULL
                           AND o.mld_opdr_key = ko.mld_opdr_key),
                 0
              )
               kosten
     FROM   mld_melding m, mld_opdr o, prs_bedrijf b, mld_statusopdr so, prs_v_perslid_fullnames_all pf
    WHERE       m.mld_melding_key = o.mld_melding_key
            AND o.mld_uitvoerende_keys = b.prs_bedrijf_key
            AND so.mld_statusopdr_key = o.mld_statusopdr_key
            AND pf.prs_perslid_key = m.prs_perslid_key
            AND TO_CHAR (fac.gettrackingdate ('MLDVER', m.mld_melding_key), 'YYYY') > '2001'
            AND o.mld_statusopdr_key = 7
            AND o.mld_opdr_kosten
               + (SELECT   NVL (fac.safe_to_number (mld_kenmerkopdr_waarde), 0)
                    FROM   mld_kenmerkopdr ko
                   WHERE       mld_kenmerk_key = 2
                           AND mld_kenmerkopdr_verwijder IS NULL
                           AND o.mld_opdr_key = ko.mld_opdr_key) > 0
            AND o.mld_opdr_ordernr IS NOT NULL
            AND (o.mld_opdr_ordernr LIKE 'B-%' OR o.mld_opdr_ordernr LIKE 'I-%' OR o.mld_opdr_ordernr LIKE 'O-%');

CREATE OR REPLACE VIEW akza_v_rap_uitg
(
   fclt_f_uitvoerende,
   fclt_f_mldnr,
   omschrijving,
   fclt_f_meldernaam,
   begindatum,
   dagen,
   afmelddatum
)
AS
   SELECT   prs_bedrijf_naam fclt_f_uitvoerende,
            TO_CHAR (m.mld_melding_key) fclt_f_mldnr,
            o.mld_opdr_omschrijving omschrijving,
            pf.prs_perslid_naam_full fclt_f_meldernaam,
            o.mld_opdr_datumbegin begindatum,
            TO_CHAR (fac.count_Work_Days(o.mld_opdr_datumbegin, o.mld_opdr_einddatum)) dagen,
            fac.gettrackingdate ('MLDAFM', m.mld_melding_key) afmelddatum
     FROM   mld_opdr o, prs_bedrijf b, mld_melding m, prs_v_perslid_fullnames_all pf
    WHERE       o.mld_uitvoerende_keys = b.prs_bedrijf_key
            AND o.mld_melding_key = m.mld_melding_key
            AND pf.prs_perslid_key = m.prs_perslid_key
            AND o.mld_statusopdr_key = 5;

-- 010 Uitgegeven aan uitvoerenden: vakgroepbeheer Werktuigbouw
--aka Toms view
CREATE OR REPLACE VIEW akza_v_rap_uitg_wtb
(
   fclt_f_uitvoerende,
   fclt_f_mldnr,
   melding_opdracht_omschrijving,
   datum_opdr,
   dagen,
   afgemeld,
   fclt_f_meldernaam
)
AS
   SELECT   prs_bedrijf.prs_bedrijf_naam,
            TO_CHAR (mld_opdr.mld_melding_key),
            mld_opdr.mld_opdr_omschrijving,
            TO_CHAR (mld_opdr.mld_opdr_datumbegin, 'DD-MM-YYYY') mld_opdr_datumbegin,
            TO_CHAR (fac.count_Work_Days(mld_opdr.mld_opdr_datumbegin, mld_opdr.mld_opdr_einddatum)),
            TO_CHAR (fac.gettrackingdate ('MLDAFM', m.mld_melding_key), 'DD-MM-YYYY') mld_melding_afgemeld,
            pf.prs_perslid_naam_full
     FROM   mld_opdr, prs_bedrijf, mld_melding m, prs_v_perslid_fullnames_all pf
    WHERE       mld_opdr.mld_uitvoerende_keys = prs_bedrijf.prs_bedrijf_key
            AND mld_opdr.mld_melding_key = m.mld_melding_key
            AND pf.prs_perslid_key = m.prs_perslid_key
            AND mld_opdr.mld_statusopdr_key = 5
            AND (   prs_bedrijf.prs_bedrijf_key = 7657
                 OR prs_bedrijf.prs_bedrijf_key = 8143
                 OR prs_bedrijf.prs_bedrijf_key = 8144);

-- AKZA#22617: afgemelde meldingen en opdrachten, met kosten.
-- key 18 = MLDAFM, key 26 = ORDAFM
CREATE OR REPLACE VIEW akza_v_rap_afmelders_kosten
AS
  SELECT m.mld_melding_key||'/'||o.mld_opdr_bedrijfopdr_volgnr hide_f_srt
        ,vg.ins_discipline_key fclt_3d_discipline_key
        ,m.mld_alg_locatie_key fclt_3d_locatie_key
        ,TO_CHAR(m.mld_melding_key) meldingnr
        ,vg.ins_discipline_omschrijving fclt_f_vakgroep
        ,sm.mld_stdmelding_omschrijving melding
        ,TO_CHAR(ft.fac_tracking_datum, 'DD-MM-YYYY') fclt_d_afgemeld
        ,pf.prs_perslid_naam_full door
        ,CASE
            WHEN o.mld_opdr_key IS NULL THEN NULL
            ELSE m.mld_melding_key||'/'||o.mld_opdr_bedrijfopdr_volgnr
         END
             opdracht
        ,so.mld_statusopdr_omschrijving opdrachtstatus
        ,(SELECT pf.prs_perslid_naam_full
            FROM fac_tracking ft
                ,prs_v_perslid_fullnames pf
           WHERE     ft.fac_srtnotificatie_key = 26
                 AND ft.fac_tracking_refkey = o.mld_opdr_key
                 AND pf.prs_perslid_key = ft.prs_perslid_key)
            afmelder
        ,o.mld_opdr_kosten kosten
    FROM fac_tracking ft
        ,mld_melding m
        ,mld_stdmelding sm
        ,mld_discipline vg
        ,mld_opdr o
        ,mld_statusopdr so
        ,prs_v_perslid_fullnames pf
   WHERE     ft.fac_srtnotificatie_key = 18
         AND pf.prs_perslid_key = ft.prs_perslid_key
         AND m.mld_melding_key = ft.fac_tracking_refkey
         AND sm.mld_stdmelding_key = m.mld_stdmelding_key
         AND vg.ins_discipline_key = sm.mld_ins_discipline_key
         AND o.mld_melding_key(+) = m.mld_melding_key
         AND so.mld_statusopdr_key(+) = o.mld_statusopdr_key;

--------------------------------------------------------------------------------------------------
------------------------------- OUTLETBEHEER -----------------------------------------------------
--------------------------------------------------------------------------------------------------

-- AKZA#22294: Voor indienstredingsworkflows
-- 646: Outlet
CREATE OR REPLACE VIEW akza_v_outlets
AS
   SELECT ins_deel_key, ins_deel_omschrijving
     FROM ins_deel
    WHERE ins_srtdeel_key = 646
      AND ins_deel_verwijder IS NULL
      AND ins_deel_parent_key IS NOT NULL;

-- views for report INS039
CREATE OR REPLACE VIEW akz_v_outlet_prijs
(INS_DEEL_KEY, INS_DEEL_OMSCHRIJVING, INS_DEEL_UPPER, ALG_PLAATSAANDUIDING,
 AANSLUITTYPE_PRIJS, NETWERK_PRIJS, OPTIE2_PRIJS, OPTIE3_PRIJS, OPTIE4_PRIJS, KAMERHUB_PRIJS,
 TOTAALPRIJS, AANSLUITTYPE)
AS
   SELECT   od.ins_deel_key,
            od.ins_deel_omschrijving,
            od.ins_deel_upper,
            (SELECT alg_l.alg_locatie_code
                    ||  '-'
                    ||  alg_g.alg_gebouw_code
                    ||  '-'
                    ||  alg_v.alg_verdieping_code
                    ||  '-'
                    ||  alg_r.alg_ruimte_nr
               FROM alg_ruimte alg_r,
                    alg_verdieping alg_v,
                    alg_gebouw alg_g,
                    alg_locatie alg_l
              WHERE alg_r.alg_verdieping_key = alg_v.alg_verdieping_key
                AND alg_v.alg_gebouw_key = alg_g.alg_gebouw_key
                AND alg_g.alg_locatie_key = alg_l.alg_locatie_key
                AND alg_r.alg_ruimte_key = od.ins_alg_ruimte_key) alg_plaatsaanduiding,
            NVL(fuda.fac_usrdata_prijs, 0) aansluittype_prijs,
            NVL(fudn.fac_usrdata_prijs, 0) netwerk_prijs,
            NVL(fudo2.fac_usrdata_prijs, 0) optie2_prijs,
            NVL(fudo3.fac_usrdata_prijs, 0) optie3_prijs,
            NVL(fudo4.fac_usrdata_prijs, 0) optie4_prijs,
            NVL(fudk.fac_usrdata_prijs, 0) kamerhub_prijs,
            (NVL(fuda.fac_usrdata_prijs, 0)
             + NVL(fudn.fac_usrdata_prijs, 0)
             + NVL(fudk.fac_usrdata_prijs, 0)
             + NVL(fudo2.fac_usrdata_prijs, 0)
             + NVL(fudo3.fac_usrdata_prijs, 0)
             + NVL(fudo4.fac_usrdata_prijs, 0)) totaalprijs,
            fuda.fac_usrdata_omschr aansluittype
       FROM ins_v_aanwezigkenmerkdeel kd,
            ins_v_aanwezigkenmerkdeel ka,
            ins_v_aanwezigkenmerkdeel kn,
            ins_v_aanwezigkenmerkdeel kk,
            ins_v_aanwezigkenmerkdeel ko2,
            ins_v_aanwezigkenmerkdeel ko3,
            ins_v_aanwezigkenmerkdeel ko4,
            fac_usrdata fuda,
            fac_usrdata fudn,
            fac_usrdata fudk,
            fac_usrdata fudo2,
            fac_usrdata fudo3,
            fac_usrdata fudo4,
            ins_deel od
      WHERE od.ins_deel_key = kd.ins_deel_key
        AND od.ins_deel_key = ka.ins_deel_key(+)
        AND od.ins_deel_key = kn.ins_deel_key(+)
        AND od.ins_deel_key = kk.ins_deel_key(+)
        AND od.ins_deel_key = ko2.ins_deel_key(+)
        AND od.ins_deel_key = ko3.ins_deel_key(+)
        AND od.ins_deel_key = ko4.ins_deel_key(+)
        AND od.ins_deel_verwijder IS NULL
        AND kd.ins_kenmerkdeel_waarde = TO_CHAR (181)  -- doorbelasten_key is ja
        AND kd.ins_kenmerk_key = 51 -- doorbelasten
        AND ka.ins_kenmerk_key(+) = 48 -- type aansluiting
        AND kn.ins_kenmerk_key(+) = 53 -- netwerk
        AND kk.ins_kenmerk_key(+) = 54 -- KamerHUB
        AND ko2.ins_kenmerk_key(+) = 55 -- optie2
        AND ko3.ins_kenmerk_key(+) = 56 -- optie3
        AND ko4.ins_kenmerk_key(+) = 57 -- optie4
        AND ka.ins_kenmerkdeel_waarde = TO_CHAR(fuda.fac_usrdata_key(+))
        AND kn.ins_kenmerkdeel_waarde = TO_CHAR(fudn.fac_usrdata_key(+))
        AND kk.ins_kenmerkdeel_waarde = TO_CHAR(fudk.fac_usrdata_key(+))
        AND ko2.ins_kenmerkdeel_waarde = TO_CHAR(fudo2.fac_usrdata_key(+))
        AND ko3.ins_kenmerkdeel_waarde = TO_CHAR(fudo3.fac_usrdata_key(+))
        AND ko4.ins_kenmerkdeel_waarde = TO_CHAR(fudo4.fac_usrdata_key(+))
        AND od.ins_srtdeel_key = 646 --'OUTLET'
   ORDER BY 1;

CREATE OR REPLACE VIEW akz_v_outlet_kostpl
(INS_DEEL_KEY, INS_DEEL_OMSCHRIJVING, KOSTENPLAATS)
AS
   SELECT   ins_deel_key, ins_deel_omschrijving,
            NVL (rkostenplaats, skostenplaats) kostenplaats
       FROM (SELECT od.ins_deel_key, od.ins_deel_omschrijving,
                    (select k.prs_kostenplaats_nr from akza_v_kostenplaats k where k.prs_kostenplaats_key = pa.prs_kostenplaats_key) skostenplaats,
                    NULL rkostenplaats, 1 speciaal
               FROM ins_deel od, prs_afdeling pa, ins_v_aanwezigkenmerkdeel ik
              WHERE pa.prs_afdeling_key =
                                   fac.safe_to_number (ik.ins_kenmerkdeel_waarde)
                AND ik.ins_kenmerk_key = 47
                AND ik.ins_deel_key = od.ins_deel_key
                AND od.ins_deel_parent_key IS NOT NULL
                AND od.ins_deel_verwijder IS NULL
                AND od.ins_srtdeel_key = 646 --'OUTLET'
             UNION
             SELECT od.ins_deel_key, od.ins_deel_omschrijving,
                    NULL skostenplaats,
                    (select k.prs_kostenplaats_nr from akza_v_kostenplaats k where k.prs_kostenplaats_key = pa.prs_kostenplaats_key) rkostenplaats, 0 speciaal
               FROM ins_deel od, prs_afdeling pa, prs_v_werkplekafdeling_geg wa
              WHERE pa.prs_afdeling_key = wa.prs_afdeling_key
                AND wa.alg_ruimte_key = od.ins_alg_ruimte_key
                AND od.ins_alg_ruimte_type IN ('R', 'W')
                AND od.ins_deel_parent_key IS NOT NULL
                AND od.ins_deel_verwijder IS NULL
                AND od.ins_srtdeel_key = 646 --'OUTLET'
                AND od.ins_deel_key NOT IN (
                       SELECT od.ins_deel_key
                         FROM ins_deel od,
                              prs_afdeling pa,
                              ins_v_aanwezigkenmerkdeel ik
                        WHERE pa.prs_afdeling_key =
                                   fac.safe_to_number (ik.ins_kenmerkdeel_waarde)
                          AND ik.ins_kenmerk_key = 47
                          AND ik.ins_deel_key = od.ins_deel_key
                          AND od.ins_deel_parent_key IS NOT NULL
                          AND od.ins_deel_verwijder IS NULL
                          AND od.ins_srtdeel_key = 646) --'OUTLET'
            )
   ORDER BY 1;

CREATE OR REPLACE VIEW akz_v_outlet_prijs_kostpl
(FCLT_F_KOSTENPLAATS, AANTAL, AANSLUITTYPE, TOTAALPRIJS)
AS
   SELECT ok.kostenplaats,
          COUNT(*) aantal,
          op.aansluittype,
          SUM(op.totaalprijs)
     FROM akz_v_outlet_prijs op,
          akz_v_outlet_kostpl ok
    WHERE op.ins_deel_key = ok.ins_deel_key
   GROUP BY ok.kostenplaats, op.aansluittype;

-- views for report INS040
CREATE OR REPLACE VIEW akz_v_wallplate_plaats_kenm
(INS_DEEL_KEY, INS_DEEL_OMSCHRIJVING, MODULE, POORT, NETWERK,
 ALG_PLAATSAANDUIDING, OUTLETTYPE, OPMERKING, ALG_GEBOUW_KEY, ALG_GEBOUW_OMSCHRIJVING,
 ALG_VERDIEPING_KEY, ALG_VERDIEPING_OMSCHRIJVING, ALG_RUIMTE_KEY)
AS
   SELECT   od.ins_deel_key,
            od.ins_deel_omschrijving,
            UPPER(a.ins_deel_hub),
            UPPER(a.ins_deel_poort),
            fud2.fac_usrdata_omschr netwerk,
            l.alg_locatie_code
             ||  '-'
             ||  g.alg_gebouw_code
             ||  '-'
             ||  v.alg_verdieping_code
             ||  '-'
             ||  r.alg_ruimte_nr,
            fud.fac_usrdata_omschr outlettype,
            k3.ins_kenmerkdeel_waarde opmerking,
            g.alg_gebouw_key,
            g.alg_gebouw_omschrijving,
            v.alg_verdieping_key alg_verdieping_key,
            v.alg_verdieping_omschrijving,
            od.ins_alg_ruimte_key
       FROM ins_deel od,
            alg_locatie l,
            alg_gebouw g,
            alg_verdieping v,
            alg_ruimte r,
            -- type aansluiting
            ins_v_aanwezigkenmerkdeel k1,
            fac_usrdata fud,
            -- module
            ins_v_aanwezigkenmerkdeel k2,
            ins_v_ins_poorten a,
            -- opmerking
            ins_v_aanwezigkenmerkdeel k3,
            -- netwerk
            ins_v_aanwezigkenmerkdeel k4,
            fac_usrdata fud2
      WHERE od.ins_deel_verwijder IS NULL
        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 l.alg_locatie_key = od.ins_alg_locatie_key
        AND r.alg_ruimte_key = od.ins_alg_ruimte_key
        AND od.ins_srtdeel_key = 646 --'OUTLET'
        -- type aansluiting
        AND od.ins_deel_key = k1.ins_deel_key(+)
        AND k1.ins_kenmerk_key(+) = 48
        AND k1.ins_kenmerkdeel_waarde = TO_CHAR (fud.fac_usrdata_key(+))
        -- module
        AND od.ins_deel_key = k2.ins_deel_key(+)
        AND k2.ins_kenmerkdeel_waarde = TO_CHAR (a.ins_deel_key(+))
        AND k2.ins_kenmerk_key(+) = 50
        -- opmerking
        AND od.ins_deel_key = k3.ins_deel_key(+)
        AND k3.ins_kenmerk_key(+) = 58
        -- netwerk
        AND od.ins_deel_key = k4.ins_deel_key(+)
        AND k4.ins_kenmerk_key(+) = 53
        AND k4.ins_kenmerkdeel_waarde = TO_CHAR (fud2.fac_usrdata_key(+))
   ORDER BY od.ins_deel_omschrijving;

CREATE OR REPLACE VIEW akz_v_wallplate_huurder
(INS_DEEL_KEY, HUURDER)
AS
   SELECT   g_outlet.ins_deel_key, MIN (wa.prs_afdeling_naam) huurder
       FROM ins_deel g_outlet,
            (SELECT prs_a.prs_afdeling_naam, prs_w.prs_alg_ruimte_key alg_ruimte_key,
                    prs_w.prs_werkplek_volgnr
               FROM prs_perslidwerkplek prs_pw,
                    prs_perslid prs_p,
                    prs_afdeling prs_a,
                    prs_werkplek prs_w
              WHERE prs_pw.prs_perslid_key = prs_p.prs_perslid_key
                AND prs_p.prs_afdeling_key = prs_a.prs_afdeling_key
                AND prs_pw.prs_werkplek_key = prs_w.prs_werkplek_key
             UNION
             SELECT to_char(null), alg_ruimte_key,-1 FROM alg_v_aanwezigruimte) wa
      WHERE g_outlet.ins_deel_verwijder IS NULL
        and g_outlet.ins_deel_parent_key IS NOT NULL
        AND g_outlet.ins_alg_ruimte_key = wa.alg_ruimte_key(+)
        AND g_outlet.ins_srtdeel_key = 646                                                   -- OUTLET
        AND wa.prs_werkplek_volgnr =
               NVL((SELECT MIN (prs_werkplek_volgnr)
                  FROM prs_perslidwerkplek prs_pw, prs_werkplek prs_w
                 WHERE g_outlet.ins_alg_ruimte_key = prs_w.prs_alg_ruimte_key
                   AND prs_pw.prs_werkplek_key = prs_w.prs_werkplek_key),-1)
   GROUP BY g_outlet.ins_deel_key;

CREATE OR REPLACE VIEW akz_v_wallplate_rapport
(FCLT_F_OUTLET, FCLT_F_MODULE, FCLT_F_POORT, FCLT_F_RUIMTE, FCLT_F_HUURDER,
 FCLT_F_TYPE_OUTLET, FCLT_F_NETWERK, OPMERKING, FCLT_3D_GEBOUW, FCLT_3D_VERDIEPING)
AS
   SELECT wpk.ins_deel_omschrijving outlet,
          wpk.module module,
          wpk.poort poort,
          wpk.alg_plaatsaanduiding ruimte,
          wh.huurder fclt_f_huurder,
          wpk.outlettype fclt_f_type_outlet,
         wpk.netwerk,
          wpk.opmerking opmerking,
          wpk.alg_gebouw_key,
          wpk.alg_verdieping_key
     FROM akz_v_wallplate_plaats_kenm wpk,
          akz_v_wallplate_huurder wh
    WHERE wpk.ins_deel_key = wh.ins_deel_key;

--------------------------------------------------------------------------------------------------
------------------------------- RITTENADMINISTRATIE ----------------------------------------------
--------------------------------------------------------------------------------------------------

CREATE OR REPLACE VIEW akza_v_rit_adres
AS
   SELECT mld_adres_key,
          mld_adres_naam,
          mld_adres_upper,
          mld_adres_bezoek_adres,
          mld_adres_bezoek_plaats,
          mld_adres_bezoek_plaats || ', ' || mld_adres_bezoek_adres
          || DECODE (SUBSTR (mld_adres_naam, 1, 5),
                     SUBSTR (mld_adres_bezoek_plaats, 1, 5), '',
                     ', ' || mld_adres_naam)
             mld_adres_plaats_adres_naam
     FROM mld_adres
    WHERE mld_adres_verwijder IS NULL;

-- Rittentariefgroep, die uit 3 kosten kan bestaan: constante kosten (c_tarief),
-- km-kosten (km_tarief) en uur-kosten (uur_tarief).
CREATE OR REPLACE VIEW akza_v_rit_tariefgroep
as select fac_usrdata_key akza_v_rit_tariefgroep_key, fac_usrdata_code akza_v_rit_tariefgroep_naam,
					fac.safe_to_number(trim(substr(fac_usrdata_omschr, 1, instr(fac_usrdata_omschr, '-', 1, 1) - 1))) c_tarief,
					fac.safe_to_number(trim(substr(fac_usrdata_omschr, instr(fac_usrdata_omschr, '-', 1, 1) + 1, instr(fac_usrdata_omschr, '-', 1, 2) - 1 - instr(fac_usrdata_omschr, '-', 1, 1) ))) km_tarief,
					fac.safe_to_number(trim(substr(fac_usrdata_omschr, instr(fac_usrdata_omschr, '-', 1, 2) + 1))) uur_tarief
from fac_usrdata
where fac_usrtab_key = 460
and fac_usrdata_volgnr > 0
and fac_usrdata_verwijder is null;

CREATE OR REPLACE VIEW akza_v_ritten_reservering
as select res.res_reservering_key
from res_v_aanwezigreservering res, res_v_aanwezigrsv_ruimte ruim
where res.res_reservering_key = ruim.res_reservering_key
-- key van activiteit Rit
and ruim.res_activiteit_key = 41;

CREATE OR REPLACE VIEW akza_v_ritten_reservering_geg
AS SELECT   res.res_reservering_key,
            ruim.res_rsv_ruimte_key,
            ruim.res_rsv_ruimte_volgnr,
            chauf.res_ruimte_nr AS chauffeur,
            ruim.res_rsv_ruimte_omschrijving AS omschrijving,
            ruim.res_rsv_ruimte_opmerking AS opmerking,
            auto.ins_deel_omschrijving AS auto,
            ruim.res_rsv_ruimte_van datum_van,
            TO_CHAR (ruim.res_rsv_ruimte_van, 'HH24:MI') tijd_van,
            ruim.res_rsv_ruimte_tot datum_tot,
            TO_CHAR (ruim.res_rsv_ruimte_tot, 'HH24:MI') tijd_tot,
            p.prs_perslid_naam
            || DECODE (COALESCE (p.prs_perslid_voorletters, ''),
                       '', '',
                       ', ' || p.prs_perslid_voorletters)
            || DECODE (COALESCE (p.prs_perslid_tussenvoegsel, ''),
                       '', '',
                       ' ' || p.prs_perslid_tussenvoegsel)
            || DECODE (COALESCE (p.prs_perslid_voornaam, ''),
                       '', '',
                       ' (' || p.prs_perslid_voornaam || ')')
               gastheervrouw,
            p.prs_perslid_key,
            afd.prs_afdeling_naam,
            kpl.prs_kostenplaats_nr,
            kpl.prs_kostenplaats_omschrijving
     FROM   res_v_aanwezigreservering res,
            res_v_aanwezigrsv_ruimte ruim,
            res_v_aanwezigrsv_deel deel,
            (SELECT   INS_DI.ins_discipline_key,
                      INS_SG.ins_srtgroep_key,
                      INS_SD.ins_srtdeel_key,
                         INS_SD.ins_srtdeel_code
                      || ' - '
                      || INS_SD.ins_srtdeel_omschrijving,
                      INS_DE.ins_alg_locatie_key,
                      INS_AO.alg_gebouw_key,
                      INS_AO.alg_verdieping_key,
                      INS_AO.alg_ruimte_key,
                      INS_AO.prs_werkplek_key,
                      INS_AO.alg_terreinsector_key,
                      INS_AO.alg_plaatsaanduiding,
                      INS_DE.ins_deel_key,
                      INS_DE.ins_deel_omschrijving,
                      RES_DE.res_deel_key,
                      RES_DE.res_deel_eenheid,
                      RES_DE.res_deel_prijs,
                      DECODE (RES_DE.res_deel_key, NULL, 0, 1)
               FROM   ins_v_aanwezigdeel INS_DE,
                      ins_tab_discipline INS_DI,
                      ins_v_alg_overzicht INS_AO,
                      ins_srtdeel INS_SD,
                      ins_srtgroep INS_SG,
                      res_v_aanwezigdeel RES_DE
              WHERE       INS_DE.ins_deel_key = RES_DE.res_ins_deel_key(+)
                      AND INS_DE.ins_deel_module = 'INS'
                      AND INS_DE.ins_deel_parent_key IS NULL
                      AND INS_AO.alg_onroerendgoed_keys =
                            INS_DE.ins_alg_ruimte_key
                      AND INS_AO.alg_onroerendgoed_type =
                            INS_DE.ins_alg_ruimte_type
                      AND INS_AO.alg_locatie_key = INS_DE.ins_alg_locatie_key
                      AND INS_SD.ins_srtdeel_key = INS_DE.ins_srtdeel_key
                      AND INS_SG.ins_srtgroep_key = INS_SD.ins_srtgroep_key
                      AND INS_DI.ins_discipline_key =
                            INS_DE.ins_discipline_key
                      AND INS_DE.ins_discipline_key IN
                               (SELECT   ins_discipline_key
                                  FROM   ins_discipline)) auto,
            res_ruimte_opstelling opstel,
            res_ruimte chauf,
            prs_perslid p,
            prs_afdeling afd,
            prs_kostenplaats kpl
    WHERE       res.res_reservering_key = ruim.res_reservering_key
            AND ruim.res_rsv_ruimte_key = deel.res_rsv_ruimte_key(+)
            AND deel.res_deel_key = auto.res_deel_key(+)
            AND ruim.res_ruimte_opstel_key = opstel.res_ruimte_opstel_key
            AND opstel.res_ruimte_key = chauf.res_ruimte_key
            AND p.prs_perslid_key = ruim.res_rsv_ruimte_host_key
            AND p.prs_afdeling_key = afd.prs_afdeling_key
            AND ruim.prs_kostenplaats_key = kpl.prs_kostenplaats_key(+)
            -- activiteit Rit
            AND ruim.res_activiteit_key = 41;

CREATE OR REPLACE VIEW akza_v_ritten_rapportage
AS
   SELECT ritres.res_reservering_key,
          ritres.res_rsv_ruimte_volgnr,
          ritres.res_rsv_ruimte_key,
          ritres.chauffeur,
          ritres.omschrijving,
          ritres.opmerking,
          ritres.auto,
          ritres.datum_van,
          ritres.tijd_van,
          ritres.datum_tot,
          ritres.tijd_tot,
          ritres.prs_perslid_key,
          ritres.gastheervrouw,
          ritres.prs_afdeling_naam,
          ritres.prs_kostenplaats_nr,
          ritres.prs_kostenplaats_omschrijving,
          -- 'Vertrektijd (afwijkend)'
          (SELECT fd.fac_usrdata_omschr
             FROM fac_usrdata fd, res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 87
                  AND fac.safe_to_number (k.res_kenmerkreservering_waarde) = fd.fac_usrdata_key)
             afwijkend_van_tijd,
          -- 'Via-tijd'
          (SELECT fd.fac_usrdata_omschr
             FROM fac_usrdata fd, res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 127
                  AND fac.safe_to_number (k.res_kenmerkreservering_waarde) = fd.fac_usrdata_key)
             via_tijd,
          -- 'Aankomsttijd (afwijkend)'
          (SELECT fd.fac_usrdata_omschr
             FROM fac_usrdata fd, res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 94
                  AND fac.safe_to_number (k.res_kenmerkreservering_waarde) = fd.fac_usrdata_key)
             afwijkend_tot_tijd,
          -- 'Standaard vertrekplaats'
          (SELECT van.mld_adres_plaats_adres_naam
             FROM res_kenmerkwaarde k, akza_v_rit_adres van
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 82
                  AND fac.safe_to_number (k.res_kenmerkreservering_waarde) = van.mld_adres_key)
             standaard_van,
          -- 'Standaard vertrekplaats'
          (SELECT van.mld_adres_bezoek_plaats
             FROM res_kenmerkwaarde k, akza_v_rit_adres van
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 82
                  AND fac.safe_to_number (k.res_kenmerkreservering_waarde) = van.mld_adres_key)
             standaard_van_plaatsnaam,
          -- 'Vertrekplaatsnaam (afwijkend)'
          (SELECT k.res_kenmerkreservering_waarde
             FROM res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 85)
             afwijkend_van_plaats,
          -- 'Vertrekadres (afwijkend)'
          (SELECT k.res_kenmerkreservering_waarde
             FROM res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 86)
             afwijkend_van_adres,
          -- 'Standaard via-adres'
          (SELECT van.mld_adres_plaats_adres_naam
             FROM res_kenmerkwaarde k, akza_v_rit_adres van
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 124
                  AND fac.safe_to_number (k.res_kenmerkreservering_waarde) = van.mld_adres_key)
             standaard_via,
          -- 'Standaard via-adres'
          (SELECT van.mld_adres_bezoek_plaats
             FROM res_kenmerkwaarde k, akza_v_rit_adres van
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 124
                  AND fac.safe_to_number (k.res_kenmerkreservering_waarde) = van.mld_adres_key)
             standaard_via_plaatsnaam,
          -- 'Via-plaatsnaam (afwijkend)'
          (SELECT k.res_kenmerkreservering_waarde
             FROM res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 126)
             afwijkend_via_plaats,
          -- 'Via-adres (afwijkend)'
          (SELECT k.res_kenmerkreservering_waarde
             FROM res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 125)
             afwijkend_via_adres,
          -- 'Standaard aankomstplaats'
          (SELECT naar.mld_adres_plaats_adres_naam
             FROM akza_v_rit_adres naar, res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 89
                  AND fac.safe_to_number (k.res_kenmerkreservering_waarde) = naar.mld_adres_key)
             standaard_naar,
          -- 'Standaard aankomstplaats'
          (SELECT naar.mld_adres_bezoek_plaats
             FROM akza_v_rit_adres naar, res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 89
                  AND fac.safe_to_number (k.res_kenmerkreservering_waarde) = naar.mld_adres_key)
             standaard_naar_plaatsnaam,
          -- 'Aankomstplaatsnaam (afwijkend)'
          (SELECT k.res_kenmerkreservering_waarde
             FROM res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 92)
             afwijkend_naar_plaats,
          -- 'Aankomstadres (afwijkend)'
          (SELECT k.res_kenmerkreservering_waarde
             FROM res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 93)
             afwijkend_naar_adres,
          -- 'Vertrektijd (werkelijk)'
          (SELECT fd.fac_usrdata_omschr
             FROM fac_usrdata fd, res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 96
                  AND fac.safe_to_number (k.res_kenmerkreservering_waarde) = fd.fac_usrdata_key)
             chauff_van_tijd,
          -- 'Aankomsttijd (werkelijk)'
          (SELECT fd.fac_usrdata_omschr
             FROM fac_usrdata fd, res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 97
                  AND fac.safe_to_number (k.res_kenmerkreservering_waarde) = fd.fac_usrdata_key)
             chauff_tot_tijd,
          -- 'Gereden km'
          (SELECT fac.safe_to_number (
                     REPLACE (k.res_kenmerkreservering_waarde, ',', '.'))
             FROM res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 98)
             chauff_km,
          -- 'Aantal uren'
          (SELECT fac.safe_to_number (
                     REPLACE (k.res_kenmerkreservering_waarde, ',', '.'))
             FROM res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 101)
             doorbelast_uren,
          -- 'Aantal km'
          (SELECT fac.safe_to_number (
                     REPLACE (k.res_kenmerkreservering_waarde, ',', '.'))
             FROM res_kenmerkwaarde k
            WHERE k.res_rsv_ruimte_key = ritres.res_rsv_ruimte_key
                  AND k.res_kenmerk_key = 100)
             doorbelast_km
     FROM akza_v_ritten_reservering_geg ritres;

CREATE OR REPLACE VIEW akza_v_ritten_doorbelasting
AS
   SELECT res.res_reservering_key,
          ruim.res_rsv_ruimte_volgnr,
          ruim.res_rsv_ruimte_key,
          stat.res_status_bo_omschrijving status,
          tariefgrp.akza_v_rit_tariefgroep_naam tariefgroep,
          tariefgrp.c_tarief,
          tariefgrp.km_tarief,
          tariefgrp.uur_tarief
     FROM res_v_aanwezigreservering res,
          res_v_aanwezigrsv_ruimte ruim,
          res_status_bo stat,
          akza_v_rit_tariefgroep tariefgrp,
          res_kenmerkwaarde k_tariefgrp
    WHERE res.res_reservering_key = ruim.res_reservering_key
          AND ruim.res_status_bo_key = stat.res_status_bo_key
          -- key van kenmerk Tariefgroep
          AND k_tariefgrp.res_kenmerk_key = 102
          AND fac.safe_to_number (k_tariefgrp.res_kenmerkreservering_waarde) =
                tariefgrp.akza_v_rit_tariefgroep_key
          AND ruim.res_rsv_ruimte_key = k_tariefgrp.res_rsv_ruimte_key
          -- key van activiteit Rit
          AND ruim.res_activiteit_key = 41;

-- key van de special prs_perslid "Non resident passenger"
CREATE OR REPLACE VIEW akza_v_rit_nonresident_pass
AS
   SELECT 43667 prs_perslid_key
     FROM DUAL;

CREATE OR REPLACE VIEW akza_v_ritten_all_doorbelast
AS
   SELECT rit_rap.*,
          rit_doorb.status,
          rit_doorb.tariefgroep,
          rit_doorb.c_tarief,
          rit_doorb.km_tarief,
          rit_doorb.uur_tarief,
          ROUND (
             (rit_doorb.c_tarief
              + (rit_doorb.km_tarief
                 * COALESCE (fac.safe_to_number (rit_rap.doorbelast_km), 0))
              + (rit_doorb.uur_tarief
                 * COALESCE (fac.safe_to_number (rit_rap.doorbelast_uren), 0))),
             2)
             AS totaal
     FROM akza_v_ritten_rapportage rit_rap,
          akza_v_ritten_doorbelasting rit_doorb
    WHERE rit_rap.res_rsv_ruimte_key = rit_doorb.res_rsv_ruimte_key(+);

CREATE OR REPLACE VIEW akza_v_ritten_doorbelast_sap
AS
   SELECT a.*, b.prs_perslid_key AS rit_nonresidentpass
     FROM akza_v_ritten_all_doorbelast a, akza_v_rit_nonresident_pass b
    WHERE a.prs_perslid_key = b.prs_perslid_key(+);

CREATE OR REPLACE VIEW akza_v_rit_km_spec
AS
   SELECT chauffeur AS fclt_f_chauffeur,
          auto AS fclt_f_voertuig,
          DECODE (TO_CHAR (datum_van, 'D'),
                  1, 'Zondag',
                  2, 'Maandag',
                  3, 'Dinsdag',
                  4, 'Woensdag',
                  5, 'Donderdag',
                  6, 'Vrijdag',
                  7, 'Zaterdag',
                  '')
             AS Dag,
          datum_van datum,
          chauff_van_tijd AS Vertrek,
          chauff_tot_tijd AS Aankomst,
          prs_afdeling_naam AS fclt_f_Opdrachtgever,
          DECODE (afwijkend_van_plaats || ', ' || afwijkend_van_adres,
                  ', ', standaard_van,
                  afwijkend_van_plaats || ', ' || afwijkend_van_adres)
             AS Van,
          DECODE (afwijkend_naar_plaats || ', ' || afwijkend_naar_adres,
                  ', ', standaard_naar,
                  afwijkend_naar_plaats || ', ' || afwijkend_naar_adres)
             AS Naar,
          TO_NUMBER (chauff_km) AS Kilometers
     FROM akza_v_ritten_rapportage;

CREATE OR REPLACE VIEW akza_v_rit_geplande_ritten
AS
   SELECT datum_van datum,
          DECODE (TO_CHAR (datum_van, 'D'),
                  1, 'Zondag',
                  2, 'Maandag',
                  3, 'Dinsdag',
                  4, 'Woensdag',
                  5, 'Donderdag',
                  6, 'Vrijdag',
                  7, 'Zaterdag',
                  '')
             AS Dag,
          COALESCE (chauff_van_tijd, afwijkend_van_tijd, tijd_van) AS Starttijd,
          via_tijd AS Viatijd,
          COALESCE (chauff_tot_tijd, afwijkend_tot_tijd, tijd_tot) AS Tottijd,
          DECODE (afwijkend_van_plaats || ', ' || afwijkend_van_adres,
                  ', ', standaard_van,
                  afwijkend_van_plaats || ', ' || afwijkend_van_adres)
             AS Van,
          DECODE (afwijkend_via_plaats || ', ' || afwijkend_via_adres,
                  ', ', standaard_via,
                  afwijkend_via_plaats || ', ' || afwijkend_via_adres)
             AS Via,
          DECODE (afwijkend_naar_plaats || ', ' || afwijkend_naar_adres,
                  ', ', standaard_naar,
                  afwijkend_naar_plaats || ', ' || afwijkend_naar_adres)
             AS Naar,
          prs_afdeling_naam AS fclt_f_Opdrachtgever,
          chauffeur AS fclt_f_chauffeur,
          auto AS fclt_f_auto,
          opmerking AS Toelichtingen,
          res_reservering_key AS hide_f_reserveringkey,
          res_rsv_ruimte_volgnr AS hide_f_reserveringvolgnr,
          gastheervrouw AS hide_f_gastheervrouw,
          prs_kostenplaats_nr || ' ' || prs_kostenplaats_omschrijving
             AS fclt_f_kostenplaats,
          prs_afdeling_naam AS hide_f_afdeling
     FROM akza_v_ritten_rapportage;

CREATE OR REPLACE VIEW akza_v_rit_kostenoverzicht
AS
   SELECT TO_CHAR (res_reservering_key) AS Code,
          datum_van datum,
          COALESCE (afwijkend_van_plaats, standaard_van_plaatsnaam) AS Van,
          COALESCE (afwijkend_naar_plaats, standaard_naar_plaatsnaam) AS Naar,
          chauffeur AS fclt_f_chauffeur,
          auto AS fclt_f_voertuig,
          prs_afdeling_naam AS fclt_f_Opdrachtgever,
          fac.safe_to_number (doorbelast_km) AS Km,
          fac.safe_to_number (doorbelast_uren) AS Uren,
          status,
          tariefgroep,
          totaal
     FROM akza_v_ritten_all_doorbelast;


--------------------------------------------------------------------------------------------------
------------------------------------ COPIER RAPPORTAGE FUNCTIES ----------------------------------
--------------------------------------------------------------------------------------------------

DROP TABLE AKZA_COPY_XLS;
CREATE TABLE AKZA_COPY_XLS -- Temporary for copiers
(
  COMPANY           VARCHAR2(110),
  KOSTENPLAATS      VARCHAR2(110),
  EIGENAAR          VARCHAR2(130),
  COPIER            VARCHAR2(150),
  BEHEERSKOSTEN     NUMBER(9,2),
  TIKKOSTEN_ZW      NUMBER(9,2),
  TIKKOSTEN_KL      NUMBER(9,2),
  TOTAAL_TIKKEN     NUMBER(9,2),
  PAPIER_A3_NR      NUMBER(9),
  PAPIER_A3         NUMBER(9,2),
  PAPIER_A4_NR      NUMBER(9),
  PAPIER_A4         NUMBER(9,2),
  TOTAAL_PAPIER     NUMBER(9,2),
  GEBRUIKSKOSTEN    NUMBER(9,2),
  HUUR_BASIS        NUMBER(9,2),
  HUUR_MODULES      NUMBER(9,2),
  BASISHUUR         NUMBER(9,2),
  TOTAAL_NASHUATEC  NUMBER(9,2),
  TOTAAL_COPIER     NUMBER(9,2),
  TOTAAL_EIGENAAR   VARCHAR2(80),
  TOTAAL_COMPANY    VARCHAR2(50)
);

CREATE OR REPLACE PACKAGE AKZA_P_COPIERS AS
  -- PACKAGES voor de AKZA specifieke COPIER rapportages
  TYPE t_cursor IS REF CURSOR;
  PROCEDURE akza_copiers (user_key IN NUMBER, p_session   IN VARCHAR2, p_datum_van IN VARCHAR2, p_datum_tot IN VARCHAR2, p_srt_export IN VARCHAR2, p_all_owner IN BOOLEAN);
  PROCEDURE akza_cop_prn (user_key IN NUMBER, p_datum_van IN VARCHAR2, p_datum_tot IN VARCHAR2, p_cursor OUT t_cursor);
  PROCEDURE akza_cop_xls (user_key IN NUMBER, p_datum_van IN VARCHAR2, p_datum_tot IN VARCHAR2, p_cursor OUT t_cursor);
  PROCEDURE akza_cop_all (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 AKZA_P_COPIERS AS
  v_srt_layout         VARCHAR2(3);
  v_tmp_aanmaak        DATE;
  v_tmp_datum_van      DATE;
  v_tmp_datum_tot      DATE;
  v_tmp_company        VARCHAR2(10);
  v_tmp_kostenplaats   VARCHAR2(30);
  v_tmp_eigenaar       VARCHAR2(60);
  v_tmp_copier         VARCHAR2(50);
  v_tmp_papier_a3_nr   NUMBER(12);
  v_tmp_papier_a4_nr   NUMBER(12);
  v_tmp_beheerskosten  NUMBER(12,2);
  v_tmp_tikkosten_zw   NUMBER(12,2);
  v_tmp_tikkosten_kl   NUMBER(12,2);
  v_tmp_papier_a3      NUMBER(12,2);
  v_tmp_papier_a4      NUMBER(12,2);
  v_tmp_gebruikskosten NUMBER(12,2);
  v_tmp_huur_basis     NUMBER(12,2);
  v_tmp_huur_modules   NUMBER(12,2);
  v_tmp_basishuur      NUMBER(12,2);
  v_tmp_totaalcopier   NUMBER(12,2);
  v_tmp_totaaleigenaar NUMBER(12,2);
  v_tmp_totaalcompany  NUMBER(12,2);

  -- Algemene procedures en functies.
  FUNCTION PrintReplicate(cKarakter IN VARCHAR2
                         ,nLengte   IN NUMBER
                         ) RETURN VARCHAR2 IS
    cRegel VARCHAR2(132);
  BEGIN
    cRegel := cKarakter;
    RETURN (RPAD(cRegel, nLengte, cKarakter));
  END;
  --
  FUNCTION RPadEnNvl(cString IN VARCHAR2
                    ,nAantal IN NUMBER
                    ) RETURN VARCHAR2 IS
  BEGIN
    RETURN NVL(RPAD(cString, nAantal), PrintReplicate(' ', nAantal));
  END;
  --
  FUNCTION LPadEnNvl(cString IN VARCHAR2
                    ,nAantal IN NUMBER
                    ) RETURN VARCHAR2 IS
  BEGIN
    RETURN NVL(LPAD(cString, nAantal), PrintReplicate(' ', nAantal));
  END;
  --
  FUNCTION schrijf_rapport_regel(p_sessionid IN VARCHAR2
                                ,p_regelnr   IN NUMBER
                                ,p_tekst     IN VARCHAR2
                                ) RETURN NUMBER IS
  BEGIN
    INSERT INTO fac_rapport
    VALUES(p_sessionid,p_regelnr,p_tekst,1);
    RETURN p_regelnr + 1;
  END;
  --
  FUNCTION delete_rapport_regel(p_sessionid     IN VARCHAR2
                                ,p_regelnr_van  IN NUMBER
                                ,p_regelnr_tm   IN NUMBER
                                ) RETURN NUMBER IS
  BEGIN
    DELETE fac_rapport
     WHERE fac_rapport_node    = p_sessionid
       AND fac_rapport_volgnr >= p_regelnr_van
       AND fac_rapport_volgnr <= p_regelnr_tm;
    RETURN p_regelnr_van;
  END;
  --
  FUNCTION schrijf_sap_regel(p_sessionid IN VARCHAR2
                            ,p_regelnr   IN NUMBER
                            ) RETURN NUMBER IS
    v_regel             VARCHAR2(2000);
    i                   NUMBER(10);
    v_totaal_tikken     NUMBER(12,2);
    v_totaal_papier     NUMBER(12,2);
    v_totaal_nashuatec  NUMBER(12,2);
  BEGIN
    v_totaal_tikken    := v_tmp_tikkosten_zw + v_tmp_tikkosten_kl;
    v_totaal_papier    := v_tmp_papier_a3    + v_tmp_papier_a4;
    v_totaal_nashuatec := v_tmp_basishuur    + v_totaal_tikken;
    v_regel := RPadEnNvl(v_tmp_company     , 6)
            || RPadEnNvl(v_tmp_kostenplaats,10)
            || RPadEnNvl(v_tmp_copier      ,10)
            || 'EUR'
            || SUBSTR(REPLACE(TO_CHAR(NVL(v_tmp_beheerskosten ,0),'999990.90'),'.',''),2,8)
            || SUBSTR(REPLACE(TO_CHAR(NVL(v_totaal_nashuatec  ,0),'999990.90'),'.',''),2,8)
            || SUBSTR(REPLACE(TO_CHAR(NVL(v_totaal_papier     ,0),'999990.90'),'.',''),2,8)
            || SUBSTR(REPLACE(TO_CHAR(NVL(ABS(v_tmp_totaalcopier)  ,0),'999990.90'),'.',''),2,8)
            || '2'
            || RPadEnNvl('Verrekening Kopieermachines',30);
    IF v_tmp_totaalcopier >= 0
    THEN
        v_regel := v_regel || '40';
    ELSE
        v_regel := v_regel || '50'; -- AKZA#545: Het schijnt nog wel eens negatief te kunnen zijn
    END IF;
    i := schrijf_rapport_regel(p_sessionid,p_regelnr,v_regel);
    RETURN i;
  END;

  -- Merk op dat schrijf_xls_regel nog altijd gewoon FAC_RAPPORT vult. Die vulling
  -- wordt verder niet gebruikt, er wordt namelijk van akza_copy_xls gebruik gemaakt.
  FUNCTION schrijf_xls_regel(p_sessionid IN VARCHAR2
                            ,p_regelnr   IN NUMBER
                            ) RETURN NUMBER IS
    v_regel             VARCHAR2(2000);
    i                   NUMBER(10);
    v_totaal_tikken     NUMBER(12,2);
    v_totaal_papier     NUMBER(12,2);
    v_totaal_nashuatec  NUMBER(12,2);
  BEGIN
    v_totaal_tikken    := v_tmp_tikkosten_zw + v_tmp_tikkosten_kl;
    v_totaal_papier    := v_tmp_papier_a3    + v_tmp_papier_a4;
    v_totaal_nashuatec := v_tmp_basishuur    + v_totaal_tikken;
    v_regel := RPadEnNvl(v_tmp_company     ,10)
       ||','|| RPadEnNvl(v_tmp_kostenplaats,10)
       ||','|| RPadEnNvl(v_tmp_eigenaar    ,30)
       ||','|| RPadEnNvl(v_tmp_copier      ,50)
       ||','|| TO_CHAR(NVL(v_tmp_beheerskosten ,0),'99990.90')
       ||','|| TO_CHAR(NVL(v_tmp_tikkosten_zw  ,0),'99990.90')
       ||','|| TO_CHAR(NVL(v_tmp_tikkosten_kl  ,0),'99990.90')
       ||','|| TO_CHAR(NVL(v_totaal_tikken     ,0),'99990.90')
       ||','|| TO_CHAR(NVL(v_tmp_papier_a3_nr  ,0),'99990')
       ||','|| TO_CHAR(NVL(v_tmp_papier_a3     ,0),'99990.90')
       ||','|| TO_CHAR(NVL(v_tmp_papier_a4_nr  ,0),'99990')
       ||','|| TO_CHAR(NVL(v_tmp_papier_a4     ,0),'99990.90')
       ||','|| TO_CHAR(NVL(v_totaal_papier     ,0),'99990.90')
       ||','|| TO_CHAR(NVL(v_tmp_gebruikskosten,0),'99990.90')
       ||','|| TO_CHAR(NVL(v_tmp_huur_basis    ,0),'99990.90')
       ||','|| TO_CHAR(NVL(v_tmp_huur_modules  ,0),'99990.90')
       ||','|| TO_CHAR(NVL(v_tmp_basishuur     ,0),'99990.90')
       ||','|| TO_CHAR(NVL(v_totaal_nashuatec  ,0),'99990.90')
       ||','|| TO_CHAR(NVL(v_tmp_totaalcopier  ,0),'99990.90')
       ||','|| v_tmp_eigenaar ||'_totaal'
       ||','|| v_tmp_company  ||'_totaal';
    i := schrijf_rapport_regel(p_sessionid,p_regelnr,v_regel);
    INSERT INTO akza_copy_xls
         VALUES (v_tmp_company, v_tmp_kostenplaats, v_tmp_eigenaar,
                 v_tmp_copier, v_tmp_beheerskosten, v_tmp_tikkosten_zw,
                 v_tmp_tikkosten_kl, v_totaal_tikken, v_tmp_papier_a3_nr,
                 v_tmp_papier_a3, v_tmp_papier_a4_nr, v_tmp_papier_a4,
                 v_totaal_papier, v_tmp_gebruikskosten, v_tmp_huur_basis,
                 v_tmp_huur_modules, v_tmp_basishuur, v_totaal_nashuatec,
                 v_tmp_totaalcopier, v_tmp_eigenaar || '_totaal',
                 v_tmp_company || '_totaal');
                 RETURN i;
  END;
  --
  FUNCTION f_kenmerk(p_code IN VARCHAR2,
                     p_deel_key IN NUMBER
                    ) RETURN NUMBER IS
    v_kenmerk_key  INS_KENMERK.ins_kenmerk_key%TYPE;
    v_dimensie     VARCHAR2(100);
  BEGIN
    BEGIN
      SELECT K.ins_kenmerk_key
      ,      S.ins_srtkenmerk_dimensie
      INTO   v_kenmerk_key
      ,      v_dimensie
      FROM   INS_KENMERK K
      ,      INS_SRTKENMERK S
      ,      INS_SRTDEEL SD
      ,      INS_DEEL D
      WHERE  S.ins_srtkenmerk_key   = K.ins_srtkenmerk_key
      AND    S.ins_srtkenmerk_upper = p_code
	  AND    sd.ins_srtgroep_key    = K.ins_srtinstallatie_key
      AND    D.ins_srtdeel_key      = sd.ins_srtdeel_key
      AND    d.ins_deel_key         = p_deel_key;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN -- Perhaps on srt-level defined?
       BEGIN
          SELECT K.ins_kenmerk_key
          ,      S.ins_srtkenmerk_dimensie
          INTO   v_kenmerk_key
          ,      v_dimensie
          FROM   INS_KENMERK K
          ,      INS_SRTKENMERK S
          ,      INS_DEEL D
          WHERE  S.ins_srtkenmerk_key   = K.ins_srtkenmerk_key
          AND    S.ins_srtkenmerk_upper = p_code
          AND    D.ins_srtdeel_key      = K.ins_srtinstallatie_key
          AND    d.ins_deel_key         = p_deel_key;
        EXCEPTION
          WHEN NO_DATA_FOUND THEN v_kenmerk_key := -1;
          WHEN TOO_MANY_ROWS THEN v_kenmerk_key := -2;
       END;
    END;
    RETURN v_kenmerk_key;
  END;
  --
  FUNCTION f_dimensie(p_code IN VARCHAR2
                     ) RETURN VARCHAR2 IS
    v_dimensie  INS_SRTKENMERK.ins_srtkenmerk_dimensie%TYPE;
  BEGIN
    BEGIN
      SELECT ins_srtkenmerk_dimensie
      INTO   v_dimensie
      FROM   INS_SRTKENMERK
      WHERE  ins_srtkenmerk_verwijder IS NULL
      AND    ins_srtkenmerk_upper      = p_code;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN v_dimensie := '?';
      WHEN TOO_MANY_ROWS THEN v_dimensie := '?';
    END;
    RETURN UPPER(v_dimensie);
  END;
  --
  FUNCTION f_dagprijs(p_dimensie     IN VARCHAR2
                     ,p_module_prijs IN NUMBER
                     ) RETURN NUMBER IS
    v_dagprijs  NUMBER(12,4);
  BEGIN
    IF    p_dimensie = 'JAAR'
    THEN
      v_dagprijs := (p_module_prijs / 365);
    ELSIF p_dimensie = 'MAAND'
    THEN
      v_dagprijs := (p_module_prijs * 12)/365;
    ELSIF p_dimensie = 'WEEK'
    THEN
      v_dagprijs := (p_module_prijs /7);
    ELSE
      -- Ga ervan uit dat de prijs per maand is indien
      -- er niets is ingevuld voor ins_srtdeel_eenheid.
      v_dagprijs := (p_module_prijs * 12)/365;
    END IF;
    RETURN NVL(v_dagprijs,0);
  END;
  --
  FUNCTION f_onderdeel(p_parent_key IN NUMBER
                      ,p_code       IN VARCHAR2
                      ) RETURN NUMBER IS
    v_onderdeel_key  INS_DEEL.ins_deel_key%TYPE;
  BEGIN
    BEGIN
      SELECT ins_deel_key
      INTO   v_onderdeel_key
      FROM   INS_DEEL
      WHERE  ins_deel_parent_key = p_parent_key
      AND    ins_srtdeel_key     = (SELECT ins_srtdeel_key
                                    FROM   ins_v_aanwezigsrtdeel
                                    WHERE  ins_srtdeel_code_upper = p_code
                                   );
    EXCEPTION
      WHEN NO_DATA_FOUND THEN v_onderdeel_key := -1;
      WHEN TOO_MANY_ROWS THEN v_onderdeel_key := -2;
    END;
    RETURN v_onderdeel_key;
  END;
  --
  FUNCTION f_srtdeel(p_deel_key IN NUMBER
                    ) RETURN VARCHAR2 IS
    v_srtdeel_naam  INS_SRTDEEL.ins_srtdeel_omschrijving%TYPE;
  BEGIN
    BEGIN
      SELECT ins_srtdeel_omschrijving
      INTO   v_srtdeel_naam
      FROM   INS_DEEL    D
      ,      INS_SRTDEEL S
      WHERE  D.ins_srtdeel_key = S.ins_srtdeel_key
      AND    D.ins_deel_key    = p_deel_key;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN v_srtdeel_naam := '';
      WHEN TOO_MANY_ROWS THEN v_srtdeel_naam := '';
    END;
    RETURN v_srtdeel_naam;
  END;
  --
  FUNCTION f_srtdeel_prijs(p_deel_key IN NUMBER
                          ) RETURN NUMBER IS
    v_srtdeel_prijs  INS_SRTDEEL.ins_srtdeel_prijs%TYPE;
  BEGIN
    BEGIN
      SELECT ins_srtdeel_prijs
      INTO   v_srtdeel_prijs
      FROM   INS_DEEL    D
      ,      INS_SRTDEEL S
      WHERE  D.ins_srtdeel_key = S.ins_srtdeel_key
      AND    D.ins_deel_key    = p_deel_key;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN v_srtdeel_prijs := 0;
      WHEN TOO_MANY_ROWS THEN v_srtdeel_prijs := 0;
    END;
    RETURN v_srtdeel_prijs;
  END;

  -- Subprocedures voor het rapport kostenoverzicht.
  FUNCTION akzacopiers_6_basis(p_session    IN VARCHAR2
                              ,p_regelnr    IN NUMBER
                              ,p_deel_key   IN NUMBER
                              ,p_datum_van  IN DATE
                              ,p_datum_tot  IN DATE
                              ,p_berekening IN BOOLEAN
                              ,p_kosten     IN OUT NUMBER
                              ) RETURN NUMBER IS
    CURSOR c_basis(p_deel_key IN NUMBER
                  ) IS
      SELECT S.ins_srtdeel_omschrijving      naam
      ,      S.ins_srtdeel_prijs             prijs
      ,      S.ins_srtdeel_eenheid           dimensie
      ,      TRUNC(D.ins_deel_aanmaak)       begindatum
      ,      TRUNC(D.ins_deel_verwijder)     einddatum
      ,      TRUNC(S.ins_srtdeel_aanmaak)    srt_begindatum
      ,      TRUNC(S.ins_srtdeel_verwijder)  srt_einddatum
      FROM   INS_DEEL     D
      ,      INS_SRTDEEL  S
      WHERE  D.ins_srtdeel_key = S.ins_srtdeel_key
      AND    D.ins_deel_key    = p_deel_key
      ;
    CURSOR c_modules(p_deel_key IN NUMBER
                    ) IS
      SELECT S.ins_srtdeel_omschrijving      naam
      ,      S.ins_srtdeel_prijs             prijs
      ,      S.ins_srtdeel_eenheid           dimensie
      ,      TRUNC(D.ins_deel_aanmaak)       begindatum
      ,      TRUNC(D.ins_deel_verwijder)     einddatum
      ,      TRUNC(S.ins_srtdeel_aanmaak)    srt_begindatum
      ,      TRUNC(S.ins_srtdeel_verwijder)  srt_einddatum
      FROM   INS_DEEL     D
      ,      INS_SRTDEEL  S
      ,      INS_SRTGROEP G
      WHERE  D.ins_srtdeel_key     = S.ins_srtdeel_key
      AND    S.ins_srtgroep_key    = G.ins_srtgroep_key
      AND    D.ins_deel_parent_key = p_deel_key
      AND    G.ins_srtgroep_upper  = 'MODULES'
      ;
    v_dimensie        INS_SRTDEEL.ins_srtdeel_eenheid%TYPE;
    v_module_prijs    INS_SRTDEEL.ins_srtdeel_prijs%TYPE;
    v_controle_regel  VARCHAR2(200);
    v_dagprijs        NUMBER(12,4);
    v_periode_kosten  NUMBER(12,4);
    v_totaal_object   NUMBER(12,4);
    v_begindatum      DATE;
    v_einddatum       DATE;
    v_beginperiode    DATE;
    v_eindeperiode    DATE;
    v_dagen           NUMBER(12);
    i                 NUMBER(12);
    lab_basis         VARCHAR2(50);
    lab_object        VARCHAR2(50);
    --
    FUNCTION f_startperiode(p_datum1 IN DATE
                           ,p_datum2 IN DATE
                           ) RETURN DATE IS
      v_startperiode  DATE;
    BEGIN
      IF p_datum1 < p_datum2
      THEN
        v_startperiode := p_datum2;
      ELSE
        v_startperiode := p_datum1;
      END IF;
      RETURN v_startperiode;
    END;
    --
    FUNCTION f_eindeperiode(p_datum1 IN DATE
                           ,p_datum2 IN DATE
                           ) RETURN DATE IS
      v_eindeperiode  DATE;
    BEGIN
      IF p_datum2 IS NULL
      THEN
        v_eindeperiode := p_datum1;
      ELSE
        IF p_datum1 >= p_datum2
        THEN
          v_eindeperiode := p_datum2;
        ELSE
          v_eindeperiode := p_datum1 + 1;
        END IF;
      END IF;
      RETURN v_eindeperiode;
    END;
    --
  BEGIN
    -- function: akzacopiers_6_basis
    -- Bereken de kosten die verbonden zijn zijn aan de huur
    -- van de basismodulen die bij de printer horen.
    --
    i                  := p_regelnr;
    v_totaal_object    := 0;
    v_tmp_huur_basis   := 0;
    v_tmp_huur_modules := 0;
    lab_object      := SUBSTR('Totaal Basishuur',1,50);
    --
    FOR r_basis IN c_basis(p_deel_key)
    LOOP
      lab_basis        := SUBSTR('Basishuur' ||' '|| r_basis.naam,1,50);
      v_dimensie       := UPPER(r_basis.dimensie);
      v_module_prijs   := r_basis.prijs;
      v_begindatum     := r_basis.begindatum;
      v_einddatum      := r_basis.einddatum;
      v_dagprijs       := f_dagprijs(v_dimensie,v_module_prijs);
      v_beginperiode   := f_startperiode(p_datum_van,v_begindatum);
      v_eindeperiode   := f_eindeperiode(p_datum_tot,v_einddatum);
      IF v_eindeperiode < v_beginperiode
      THEN
        v_dagen := 0;
      ELSE
        v_dagen := v_eindeperiode - v_beginperiode;
      END IF;
      v_periode_kosten := v_dagen * v_dagprijs;
      v_totaal_object  := v_totaal_object + v_periode_kosten;
      v_tmp_huur_basis := v_tmp_huur_basis + v_periode_kosten;
      IF v_srt_layout = 'PRN'
      THEN
        IF p_berekening
        THEN
          v_controle_regel := NVL(TO_CHAR(v_begindatum    ,'dd-mm-yyyy'),'00-00-0000')
                     ||'  '|| NVL(TO_CHAR(v_einddatum     ,'dd-mm-yyyy'),'00-00-0000')
                     ||'  '|| NVL(TO_CHAR(v_module_prijs  ,'999990.90'),' .........')
                     ||'  '|| NVL(TO_CHAR(v_dagprijs      ,'9990.9990'),' .........')
                     ||'  '|| NVL(TO_CHAR(v_beginperiode  ,'dd-mm-yyyy'),'00-00-0000')
                     ||'  '|| NVL(TO_CHAR(v_eindeperiode  ,'dd-mm-yyyy'),'00-00-0000')
                     ||'  '|| NVL(TO_CHAR(v_dagen         ,'9990'),' ....')
                     ||'  '|| NVL(TO_CHAR(v_periode_kosten,'99990.90'),' ........');
          i := schrijf_rapport_regel(p_session,i,RPadEnNvl('* '|| v_controle_regel,98) ||' *');
        END IF;
        i:= schrijf_rapport_regel(p_session,i,PrintReplicate(' ',16)
                                           || RPadEnNvl(lab_basis,60)||': '
                                           || TO_CHAR(v_periode_kosten,'99990.90'));
      END IF;
    END LOOP;
    --
    FOR r_modules IN c_modules(p_deel_key)
    LOOP
      lab_basis      := SUBSTR('Basishuur' ||' '|| r_modules.naam,1,50);
      v_dimensie     := UPPER(r_modules.dimensie);
      v_module_prijs := r_modules.prijs;
      --
      IF r_modules.srt_begindatum > r_modules.begindatum
      THEN
        v_begindatum := r_modules.srt_begindatum;
      ELSE
        v_begindatum := r_modules.begindatum;
      END IF;
      IF r_modules.srt_einddatum  > r_modules.einddatum
      OR r_modules.srt_einddatum IS NULL
      THEN
        v_einddatum := r_modules.einddatum;
      ELSE
        v_einddatum := r_modules.srt_einddatum;
      END IF;
      --
      v_begindatum     := r_modules.begindatum;
      v_einddatum      := r_modules.einddatum;
      v_dagprijs       := f_dagprijs(v_dimensie,v_module_prijs);
      v_beginperiode   := f_startperiode(p_datum_van,v_begindatum);
      v_eindeperiode   := f_eindeperiode(p_datum_tot,v_einddatum);
      --
      IF v_eindeperiode < v_beginperiode
      THEN
        -- Als een module binnen de periode niet gebruikt is
        -- dan deze ook niet vermelden.
        v_dagen := 0;
      ELSE
        v_dagen := v_eindeperiode - v_beginperiode;
        --
        v_periode_kosten   := v_dagen * v_dagprijs;
        v_totaal_object    := v_totaal_object + v_periode_kosten;
        v_tmp_huur_modules := v_tmp_huur_modules + v_periode_kosten;
        --
        IF v_srt_layout = 'PRN'
        THEN
          IF p_berekening
          THEN
            v_controle_regel := NVL(TO_CHAR(v_begindatum    ,'dd-mm-yyyy'),'00-00-0000')
                       ||'  '|| NVL(TO_CHAR(v_einddatum     ,'dd-mm-yyyy'),'00-00-0000')
                       ||'  '|| NVL(TO_CHAR(v_module_prijs  ,'999990.90'),' .........')
                       ||'  '|| NVL(TO_CHAR(v_dagprijs      ,'9990.9990'),' .........')
                       ||'  '|| NVL(TO_CHAR(v_beginperiode  ,'dd-mm-yyyy'),'00-00-0000')
                       ||'  '|| NVL(TO_CHAR(v_eindeperiode  ,'dd-mm-yyyy'),'00-00-0000')
                       ||'  '|| NVL(TO_CHAR(v_dagen         ,'9990'),' ....')
                       ||'  '|| NVL(TO_CHAR(v_periode_kosten,'99990.90'),' ........');
            i := schrijf_rapport_regel(p_session,i,RPadEnNvl('* '|| v_controle_regel,98) ||' *');
          END IF;
          i:= schrijf_rapport_regel(p_session,i,PrintReplicate(' ',16)
                                             || RPadEnNvl(lab_basis,60)||': '
                                             || TO_CHAR(v_periode_kosten,'99990.90'));
        END IF;
      END IF;
    END LOOP;
    --
    IF v_srt_layout = 'PRN'
    THEN
      i := schrijf_rapport_regel(p_session,i,PrintReplicate(' ',16)
                                          || PrintReplicate(' ',22)
                                          || RPadEnNvl(lab_object,28)||': '
                                          || TO_CHAR(v_totaal_object,'99990.90'));
    END IF;
    p_kosten := v_totaal_object;
    RETURN i;
  END;  -- function: akzacopiers_6_basis
  --
  FUNCTION akzacopiers_5_papier(p_session    IN VARCHAR2
                               ,p_regelnr    IN NUMBER
                               ,p_deel_key   IN NUMBER
                               ,p_datum_van  IN DATE
                               ,p_datum_tot  IN DATE
                               ,p_berekening IN BOOLEAN
                               ,p_kosten     IN OUT NUMBER
                               ) RETURN NUMBER IS
    CURSOR c_onderdeel(p_parent_key IN NUMBER
                      ) IS
      SELECT ins_deel_key
      FROM   INS_DEEL
      WHERE  ins_deel_parent_key  = p_parent_key
      AND    ins_srtdeel_key     IN (SELECT ins_srtdeel_key
                                     FROM   ins_v_aanwezigsrtdeel
                                     WHERE  ins_srtdeel_code_upper IN ('PA3','PA4')
                                    )
      ;
    CURSOR c_leverdata(p_ins_deel_key IN NUMBER
                      ,p_geleverd_key IN NUMBER
                      ,p_datum_van    IN DATE
                      ,p_datum_tot    IN DATE
                      ) IS
      SELECT ins_kenmerkdeel_aanmaak   van
      ,      ins_kenmerkdeel_verwijder tot
      ,      ins_kenmerkdeel_key       sleutel
      ,      ins_kenmerkdeel_waarde    aantal
      FROM   INS_KENMERKDEEL
      WHERE  ins_deel_key             = p_ins_deel_key
      AND    ins_kenmerk_key          = p_geleverd_key
      AND    ins_kenmerkdeel_aanmaak >= p_datum_van
      AND    ins_kenmerkdeel_aanmaak <  p_datum_tot
      ;
    i                   NUMBER(12);
    v_periode_dozen     NUMBER(12);
    v_totaaldozen       NUMBER(12);
    v_leveringprijs     NUMBER(12,2);
    v_prijs             NUMBER(12,2);
    v_totaalprijs       NUMBER(12,2);
    v_papier_kosten     NUMBER(12,2);
    v_datum_van         DATE;
    v_datum_tot         DATE;
    v_srtdeel_naam      INS_SRTDEEL.ins_srtdeel_omschrijving%TYPE;
    v_onderdeel_key     INS_DEEL.ins_deel_key%TYPE;
    v_geleverd_key      INS_KENMERK.ins_kenmerk_key%TYPE;
    v_doosprijs_key     INS_KENMERK.ins_kenmerk_key%TYPE;
    v_controle_regel    VARCHAR2(200);
    lab_aantal          VARCHAR2(50);
    lab_kosten          VARCHAR2(50);
    --
    FUNCTION f_laatste_waarde(p_deel_key      IN NUMBER
                             ,p_kenmerk_key   IN NUMBER
                             ,p_datum_aanmaak IN DATE
                             ) RETURN VARCHAR2 IS
      CURSOR c_laatste_waarde(p_ins_deel_key    IN NUMBER
                             ,p_ins_kenmerk_key IN NUMBER
                             ,p_datum_aanmaak   IN DATE
                             ) IS
        SELECT ins_kenmerkdeel_waarde     waarde
        ,      ins_kenmerkdeel_aanmaak    van
        ,      ins_kenmerkdeel_verwijder  tot
        FROM   INS_KENMERKDEEL
        WHERE  ins_deel_key             = p_ins_deel_key
        AND    ins_kenmerk_key          = p_ins_kenmerk_key
        AND    ins_kenmerkdeel_aanmaak <= p_datum_aanmaak
        ORDER BY ins_kenmerkdeel_aanmaak ASC
        ;
      v_return          INS_KENMERKDEEL.ins_kenmerkdeel_waarde%TYPE;
      r_laatste_waarde  c_laatste_waarde%ROWTYPE;
    BEGIN
      OPEN c_laatste_waarde(p_deel_key
                           ,p_kenmerk_key
                           ,p_datum_aanmaak);
      FETCH c_laatste_waarde INTO r_laatste_waarde;
      IF c_laatste_waarde%NOTFOUND
      THEN
        v_return := NULL;
      ELSE
        v_return := r_laatste_waarde.waarde;
      END IF;
      CLOSE c_laatste_waarde;
      RETURN v_return;
    END;
    --
  BEGIN
    -- function: akzacopiers_5_papier
    -- Bereken het aantal dozen A4 en A3 papier die bij de printer in
    -- de opgegeven periode geleverd zijn, met de daarbijbehorende kosten.
    --
    i                  := p_regelnr;
    v_datum_van        := TO_DATE(TO_CHAR(p_datum_van,'dd-mm-yyyy')||' 00:00:00','dd-mm-yyyy hh24:mi:ss');
    v_datum_tot        := TO_DATE(TO_CHAR(p_datum_tot,'dd-mm-yyyy')||' 00:00:00','dd-mm-yyyy hh24:mi:ss');
    v_papier_kosten    := 0;
    v_tmp_papier_a3    := 0;
    v_tmp_papier_a4    := 0;
    v_tmp_papier_a3_nr := 0;
    v_tmp_papier_a4_nr := 0;
    --
    FOR r_onderdeel IN c_onderdeel(p_deel_key)
    LOOP
      v_onderdeel_key := r_onderdeel.ins_deel_key;
      v_geleverd_key     := f_kenmerk('AANTAL GELEVERD', v_onderdeel_key);
      v_doosprijs_key    := f_kenmerk('PRIJS PER DOOS', v_onderdeel_key);
      v_prijs         := 0;
      v_leveringprijs := 0;
      v_totaalprijs   := 0;
      v_totaaldozen   := 0;
      --
      FOR r_leverdata IN c_leverdata(v_onderdeel_key
                                    ,v_geleverd_key
                                    ,v_datum_van
                                    ,v_datum_tot)
      LOOP
        v_periode_dozen := r_leverdata.aantal;
        --
        --IF v_doosprijs_key = -1  -- kenmerk voor prijs per doos bestaat niet !
        --THEN
        v_prijs := f_srtdeel_prijs(r_onderdeel.ins_deel_key);
        --ELSE
        --  v_prijs := to_number(f_laatste_waarde(v_onderdeel_key,v_doosprijs_key,r_wijzigdata.van));
        --END IF;
        --
        -- Berekening van kosten papier.
        v_leveringprijs := v_periode_dozen * v_prijs;
        v_totaalprijs   := v_totaalprijs   + v_leveringprijs;
        v_totaaldozen   := v_totaaldozen   + v_periode_dozen;
        --
        IF v_srt_layout = 'PRN'
        THEN
          IF p_berekening
          THEN
            v_controle_regel := NVL(TO_CHAR(r_leverdata.van        ,'dd-mm-yyyy'),'00-00-0000')
                       ||'  '|| NVL(TO_CHAR(r_leverdata.tot        ,'dd-mm-yyyy'),'00-00-0000')
                       ||'  '|| NVL(TO_CHAR(v_periode_dozen        ,'9999999990'),' ..........')
                       ||'  '|| NVL(TO_CHAR(v_prijs                ,'99990.9990'),' ..........')
                       ||'  '|| NVL(TO_CHAR(v_leveringprijs        ,'99990.9990'),' ..........')
                       ||'  '|| NVL(TO_CHAR(v_totaaldozen          ,'9999999990'),' ..........')
                       ||'  '|| NVL(TO_CHAR(v_totaalprijs          ,'9999990.90'),' ..........')
                              ;
            i := schrijf_rapport_regel(p_session,i,RPadEnNvl('* '|| v_controle_regel,98) ||' *');
          END IF;
        END IF;
      END LOOP;
      v_papier_kosten := v_papier_kosten + v_totaalprijs;
      v_srtdeel_naam  := f_srtdeel(r_onderdeel.ins_deel_key);
      --
      IF    INSTR(v_srtdeel_naam,'A3') > 0
      THEN
        v_tmp_papier_a3_nr := v_totaaldozen;
        v_tmp_papier_a3    := v_totaalprijs;
      ELSIF INSTR(v_srtdeel_naam,'A4') > 0
      THEN
        v_tmp_papier_a4_nr := v_totaaldozen;
        v_tmp_papier_a4    := v_totaalprijs;
      END IF;
      --
      lab_aantal      := 'Aantal '|| v_srtdeel_naam;
      lab_kosten      := 'Kosten';
      IF v_srt_layout = 'PRN'
      THEN
        i := schrijf_rapport_regel(p_session,i,PrintReplicate(' ',16)
                                            || RPadEnNvl(lab_aantal,22)||': '
                                            || TO_CHAR(v_totaaldozen,'99999990')
                                            || PrintReplicate(' ', 5)
                                            || RPadEnNvl(lab_kosten,22)||': '
                                            || TO_CHAR(v_totaalprijs,'99990.90'));
      END IF;
    END LOOP;
    p_kosten := v_papier_kosten;
    RETURN i;
  END;  -- function: akzacopiers_5_papier
  --
  FUNCTION akzacopiers_4_tikken(p_session    IN VARCHAR2
                               ,p_regelnr    IN NUMBER
                               ,p_deel_key   IN NUMBER
                               ,p_datum_van  IN DATE
                               ,p_datum_tot  IN DATE
                               ,p_berekening IN BOOLEAN
                               ,p_kosten     IN OUT NUMBER
                               ) RETURN NUMBER IS
    CURSOR c_afdruk(p_ins_deel_key      IN NUMBER
                   ,p_ins_kenmerk_key_1 IN NUMBER
                   ,p_ins_kenmerk_key_2 IN NUMBER
                   ) IS
      SELECT DISTINCT
             ins_kenmerk_key
      FROM   INS_KENMERKDEEL
      WHERE  ins_deel_key     = p_ins_deel_key
      AND    ins_kenmerk_key IN (p_ins_kenmerk_key_1,p_ins_kenmerk_key_2)
      ;
    CURSOR c_wijzigdata(p_ins_deel_key    IN NUMBER
                       ,p_tellerstand_key IN NUMBER
                       ,p_datum_van       IN DATE
                       ,p_datum_tot       IN DATE
                       ) IS
      SELECT ins_kenmerkdeel_waarde  waarde
      ,      ins_kenmerkdeel_aanmaak van
      FROM   INS_KENMERKDEEL
      WHERE  ins_deel_key             = p_ins_deel_key
      AND    ins_kenmerk_key          = p_tellerstand_key
      AND    ins_kenmerkdeel_aanmaak >= p_datum_van
      AND    ins_kenmerkdeel_aanmaak <= p_datum_tot
      ;
    v_tellerstand_key  INS_KENMERK.ins_kenmerk_key%TYPE;
    v_prijspertik_key  INS_KENMERK.ins_kenmerk_key%TYPE;
    v_eerste_record    BOOLEAN;
    v_controle_regel   VARCHAR2(200);
    v_periode_van      DATE;
    v_periode_tot      DATE;
    v_datumvan         DATE;
    v_huidige_datum    DATE;
    i                  NUMBER(12);
    v_subtotaal_tik    NUMBER(12);
    v_totaal_tikken    NUMBER(12);
    v_aantal_tikken    NUMBER(12);
    v_begin_stand      NUMBER(12);
    v_einde_stand      NUMBER(12);
    v_huidige_stand    NUMBER(12);
    v_vorige_stand     NUMBER(12);
    v_tikkosten        NUMBER(12,4);
    v_prijs            NUMBER(12,4);
    v_totaalprijs      NUMBER(12,4);
    v_totaal_zw_kl     NUMBER(12,4);
    v_afdruk           VARCHAR2(10);
    lab_aantal         VARCHAR2(50);
    lab_kosten         VARCHAR2(50);
    --
    FUNCTION f_laatste_waarde(p_deel_key      IN NUMBER
                             ,p_kenmerk_key   IN NUMBER
                             ,p_datum_aanmaak IN OUT DATE
                             ) RETURN NUMBER IS
      CURSOR c_laatste_waarde(p_ins_deel_key    IN NUMBER
                             ,p_ins_kenmerk_key IN NUMBER
                             ,p_datum_aanmaak   IN DATE
                             ) IS
        SELECT ins_kenmerkdeel_waarde   waarde
        ,      ins_kenmerkdeel_aanmaak  van
        FROM   INS_KENMERKDEEL
        WHERE  ins_deel_key             = p_ins_deel_key
        AND    ins_kenmerk_key          = p_ins_kenmerk_key
        AND    ins_kenmerkdeel_aanmaak <= p_datum_aanmaak
        ORDER BY ins_kenmerkdeel_aanmaak ASC
        ;
      v_return  NUMBER;
    BEGIN
      v_return := NULL;
      FOR r_laatste_waarde IN c_laatste_waarde(p_deel_key
                                              ,p_kenmerk_key
                                              ,p_datum_aanmaak)
      LOOP
        BEGIN
          v_return := TO_NUMBER(r_laatste_waarde.waarde);
        EXCEPTION
          WHEN OTHERS THEN v_return := 0; -- Indien er geen getal in Waarde staat.
        END;
        p_datum_aanmaak := r_laatste_waarde.van;
      END LOOP;
      --
      IF v_return IS NULL
      THEN
        v_return := 0;
        p_datum_aanmaak := p_datum_aanmaak;
      END IF;
      RETURN v_return;
    END;
    --
  BEGIN
    -- function: akzacopiers_4_tikken
    -- Bereken het aantal tikken dat de printer in de
    -- opgegeven periode heeft verwerkt.
    --
    i                  := p_regelnr;
    v_totaal_tikken    := 0;
    v_totaal_zw_kl     := 0;
    v_tmp_tikkosten_zw := 0;
    v_tmp_tikkosten_kl := 0;
    FOR r_afdruk IN c_afdruk(p_deel_key
                            ,f_kenmerk('TELLERSTAND', p_deel_key)
                            ,f_kenmerk('TELLERSTAND KLEUR', p_deel_key)
                            )
    LOOP
      IF r_afdruk.ins_kenmerk_key = f_kenmerk('TELLERSTAND', p_deel_key)
      THEN
        v_afdruk          := 'z/w';
        v_tellerstand_key := f_kenmerk('TELLERSTAND', p_deel_key);
        v_prijspertik_key := f_kenmerk('PRIJS PER TIK', p_deel_key);
      ELSE
        v_afdruk          := 'kleur';
        v_tellerstand_key := f_kenmerk('TELLERSTAND KLEUR', p_deel_key);
        v_prijspertik_key := f_kenmerk('PRIJS PER TIK KLEUR', p_deel_key);
      END IF;
      --
      v_periode_van   := TO_DATE(TO_CHAR(p_datum_van,'dd-mm-yyyy')||' 00:00:00','dd-mm-yyyy hh24:mi:ss');
      v_periode_tot   := TO_DATE(TO_CHAR(p_datum_tot,'dd-mm-yyyy')||' 23:59:59','dd-mm-yyyy hh24:mi:ss');
      v_eerste_record := TRUE;
      lab_aantal      := 'Aantal Tikken';
      lab_kosten      := 'Kosten';
      v_totaal_tikken := 0;
      v_subtotaal_tik := 0;
      v_huidige_stand := 0;
      v_vorige_stand  := 0;
      v_prijs         := 0;
      v_aantal_tikken := 0;
      v_tikkosten     := 0;
      v_totaalprijs   := 0;
      --
      -- Bepalen van begin- en einddatum van de periode
      -- waaruit de gegevens moeten worden gehaald.
      --
      v_begin_stand := f_laatste_waarde(p_deel_key,v_tellerstand_key,v_periode_van);
      v_einde_stand := f_laatste_waarde(p_deel_key,v_tellerstand_key,v_periode_tot);
      FOR r_wijzigdata IN c_wijzigdata(p_deel_key
                                      ,v_tellerstand_key
                                      ,v_periode_van
                                      ,v_periode_tot)
      LOOP
        v_huidige_datum := r_wijzigdata.van;
        v_huidige_stand := r_wijzigdata.waarde;
        v_datumvan      := v_huidige_datum;
        v_tikkosten     := f_laatste_waarde(p_deel_key,v_prijspertik_key,v_datumvan);
        --
        IF v_eerste_record
        THEN
          v_vorige_stand  := v_huidige_stand;
          v_eerste_record := FALSE;
        END IF;
        --
        -- Berekenen van kosten tikken.
        --
        v_aantal_tikken := v_huidige_stand - v_vorige_stand;
        v_prijs         := v_aantal_tikken * v_tikkosten;
        v_totaalprijs   := v_totaalprijs + v_prijs;
        --
        -- Tonen van de tijdsopbouw van de kosten.
        --
        IF v_srt_layout = 'PRN'
        THEN
          IF p_berekening
          THEN
            v_controle_regel := NVL(TO_CHAR(v_periode_van   ,'dd-mm-yyyy'),'00-00-0000')
                       ||'  '|| NVL(TO_CHAR(v_periode_tot   ,'dd-mm-yyyy'),'00-00-0000')
                       ||'  '|| NVL(TO_CHAR(v_huidige_datum ,'dd-mm-yyyy'),'00-00-0000')
                       ||'  '|| NVL(TO_CHAR(v_huidige_stand ,   '9999990'),  ' .......')
                       ||'  '|| NVL(TO_CHAR(v_tikkosten     ,   '90.9990'),  ' .......')
                       ||' ('|| NVL(TO_CHAR(v_datumvan      ,'dd-mm-yyyy'),'00-00-0000')
                       ||') '|| NVL(TO_CHAR(v_aantal_tikken ,   '9999990'),  ' .......')
                       ||'  '|| NVL(TO_CHAR(v_prijs         ,   '9990.90'),  ' .......')
                       ||'  '|| NVL(TO_CHAR(v_totaalprijs   ,   '9990.90'),  ' .......');
            i := schrijf_rapport_regel(p_session,i,RPadEnNvl('* '|| v_controle_regel,98) ||' *');
          END IF;
        END IF;
        v_subtotaal_tik := v_subtotaal_tik + v_aantal_tikken;
        v_vorige_stand  := v_huidige_stand;
      END LOOP;
      v_totaal_tikken := v_totaal_tikken + v_subtotaal_tik;
      --
      IF    v_afdruk = 'z/w'
      THEN
        v_tmp_tikkosten_zw := v_totaalprijs;
      ELSIF v_afdruk = 'kleur'
      THEN
        v_tmp_tikkosten_kl := v_totaalprijs;
      END IF;
      --
      IF v_srt_layout = 'PRN'
      THEN
        i := schrijf_rapport_regel(p_session,i,PrintReplicate(' ',16)
                                            || RPadEnNvl(lab_aantal ||' '|| v_afdruk,22)||': '
                                            || TO_CHAR(NVL(v_totaal_tikken,0) ,'99999990')
                                            || PrintReplicate(' ', 5)
                                            || RPadEnNvl(lab_kosten,22)||': '
                                            || TO_CHAR(NVL(v_totaalprijs,0)   ,'99990.90'));
      END IF;
      v_totaal_zw_kl := v_totaal_zw_kl + v_totaalprijs;
    END LOOP;
    p_kosten := v_totaal_zw_kl;
    RETURN i;
  END;  -- function: akzacopiers_4_tikken
  --
  FUNCTION akzacopiers_3_norm(p_session    IN VARCHAR2
                             ,p_regelnr    IN NUMBER
                             ,p_deel_key   IN NUMBER
                             ,p_datum_van  IN DATE
                             ,p_datum_tot  IN DATE
                             ,p_berekening IN BOOLEAN
                             ) RETURN NUMBER IS
    CURSOR c_laatste_waarde(p_ins_deel_key    IN NUMBER
                           ,p_ins_kenmerk_key IN NUMBER
                           ,p_datum_aanmaak   IN DATE
                           ) IS
      SELECT ins_kenmerkdeel_waarde     waarde
      ,      ins_kenmerkdeel_aanmaak    van
      ,      ins_kenmerkdeel_verwijder  tot
      FROM   INS_KENMERKDEEL
      WHERE  ins_deel_key             = p_ins_deel_key
      AND    ins_kenmerk_key          = p_ins_kenmerk_key
      AND    ins_kenmerkdeel_aanmaak <= p_datum_aanmaak
      ORDER BY ins_kenmerkdeel_aanmaak ASC
      ;
    v_normverbruik_key  INS_KENMERK.ins_kenmerk_key%TYPE;
    i                   NUMBER(12);
    v_normverbruik      NUMBER(12) := 0;
    lab_norm            VARCHAR2(50);
    v_datum_tot         DATE;
  BEGIN
    -- function: akzacopiers_3_norm
    -- Bepaal het norm aantal afdrukken voor een printer.
    --
    i                  := p_regelnr;
    lab_norm           := 'Normverbruik';
    v_datum_tot        := TO_DATE(TO_CHAR(p_datum_tot,'dd-mm-yyyy')||' 00:00:00','dd-mm-yyyy hh24:mi:ss');
    v_normverbruik_key := f_kenmerk('NORMVERBRUIK', p_deel_key);
    --
    FOR r_normverbruik IN c_laatste_waarde(p_deel_key
                                          ,v_normverbruik_key
                                          ,v_datum_tot
                                          )
    LOOP
      v_normverbruik := TO_NUMBER(r_normverbruik.waarde);
    END LOOP;
    --
    IF v_srt_layout = 'PRN'
    THEN
      i := schrijf_rapport_regel(p_session,i,PrintReplicate(' ',16)
                                          || RPadEnNvl(lab_norm,22)||': '
                                          || TO_CHAR(v_normverbruik,'99999990'));
    END IF;
    --
    RETURN i;
  END;  -- function: akzacopiers_3_norm
  --
  FUNCTION akzacopiers_2_beheer(p_session    IN VARCHAR2
                               ,p_regelnr    IN NUMBER
                               ,p_deel_key   IN NUMBER
                               ,p_datum_van  IN DATE
                               ,p_datum_tot  IN DATE
                               ,p_berekening IN BOOLEAN
                               ,p_kosten     IN OUT NUMBER
                               ) RETURN NUMBER IS
    CURSOR c_wijzigdata(p_ins_deel_key IN NUMBER
                       ,p_kenmerk_key1 IN NUMBER
                       ,p_datum_van    IN DATE
                       ,p_datum_tot    IN DATE
                       ) IS
      SELECT TRUNC(ins_kenmerkdeel_aanmaak)  van
      ,      ins_kenmerkdeel_key             sleutel
      FROM   INS_KENMERKDEEL
      WHERE  ins_deel_key     = p_ins_deel_key
      AND    ins_kenmerk_key IN (p_kenmerk_key1)
      AND(  (ins_kenmerkdeel_aanmaak <= p_datum_van)
         OR (ins_kenmerkdeel_aanmaak <= p_datum_tot)
         )
      AND(  (  (ins_kenmerkdeel_verwijder >= p_datum_van)
            OR (ins_kenmerkdeel_verwijder >= p_datum_tot)
            )
         OR ins_kenmerkdeel_verwijder IS NULL
         )
      ;
    CURSOR c_laatste_waarde(p_ins_deel_key    IN NUMBER
                           ,p_ins_kenmerk_key IN NUMBER
                           ,p_datum_aanmaak   IN DATE
                           ) IS
      SELECT ins_kenmerkdeel_waarde            waarde
      ,      TRUNC(ins_kenmerkdeel_aanmaak)    van
      ,      TRUNC(ins_kenmerkdeel_verwijder)  tot
      FROM   INS_KENMERKDEEL
      WHERE  ins_deel_key                    = p_ins_deel_key
      AND    ins_kenmerk_key                 = p_ins_kenmerk_key
      AND    TRUNC(ins_kenmerkdeel_aanmaak) <= TRUNC(p_datum_aanmaak)
      ORDER BY ins_kenmerkdeel_aanmaak ASC
      ;
    v_beheerkosten_key  INS_KENMERK.ins_kenmerk_key%TYPE;
    v_periode_kosten    NUMBER(12,4);
    v_beheer_kosten     NUMBER(12,4);
    v_dimensie          VARCHAR2(100);
    v_dagkosten         NUMBER(12,4);
    v_totaal_beheer     NUMBER(12,4);
    v_controle_regel    VARCHAR2(200);
    v_begindatum        DATE;
    v_einddatum         DATE;
    v_beginperiode      DATE;
    v_eindeperiode      DATE;
    v_dagen             NUMBER(12);
    lab_beheer          VARCHAR2(50);
    i                   NUMBER(12);
  BEGIN
    -- function: akzacopiers_2_beheer
    -- Subfunctie voor het berekenen van de beheerkosten per printer.
    --
    i                  := p_regelnr;
    v_beheerkosten_key := f_kenmerk('BEHEERSKOSTEN', p_deel_key);
    v_dimensie         := f_dimensie('BEHEERSKOSTEN');
    v_totaal_beheer    := 0;
    FOR r_wijzigdata IN c_wijzigdata(p_deel_key
                                    ,v_beheerkosten_key
                                    ,p_datum_van
                                    ,p_datum_tot
                                    )
    LOOP
      SELECT ins_kenmerkdeel_aanmaak
      ,      ins_kenmerkdeel_verwijder
      ,      TO_NUMBER(NVL(ins_kenmerkdeel_waarde,'0'))
      INTO   v_begindatum
      ,      v_einddatum
      ,      v_beheer_kosten
      FROM   INS_KENMERKDEEL
      WHERE  ins_kenmerkdeel_key = r_wijzigdata.sleutel;
      --
      IF    v_dimensie = 'EURO P JR'
      THEN
        v_dagkosten := (v_beheer_kosten / 365);
      ELSIF v_dimensie = 'EURO P MND'
      THEN
        v_dagkosten := (v_beheer_kosten * 12)/365;
      ELSIF v_dimensie = 'EURO P WK'
      THEN
        v_dagkosten := (v_beheer_kosten /7);
      ELSIF v_dimensie = 'EURO P DAG'
      THEN
        v_dagkosten := v_beheer_kosten;
      ELSE
        -- Ga ervan uit dat indien er geen eenheid is ingevuld
        -- hiervoor een maand bedoeld wordt.
        v_dagkosten := (v_beheer_kosten * 12)/365;
      END IF;
      --
      IF p_datum_van < v_begindatum
      THEN
        v_beginperiode := v_begindatum;
      ELSE
        v_beginperiode := p_datum_van;
      END IF;
      --
      IF p_datum_tot >= v_einddatum
      THEN
        v_eindeperiode := v_einddatum;
      ELSE
        v_eindeperiode := p_datum_tot;
      END IF;
      --
      IF v_eindeperiode < v_beginperiode
      THEN
        v_dagen := 0;
      ELSE
        v_dagen := TRUNC(v_eindeperiode) - TRUNC(v_beginperiode);
      END IF;
      --
      v_periode_kosten := v_dagen * v_dagkosten;
      v_totaal_beheer  := v_totaal_beheer + v_periode_kosten;
      --
      IF v_srt_layout = 'PRN'
      THEN
        IF p_berekening
        THEN
          v_controle_regel := NVL(TO_CHAR(v_begindatum    ,'dd-mm-yyyy'),'00-00-0000')
                     ||'  '|| NVL(TO_CHAR(v_einddatum     ,'dd-mm-yyyy'),'00-00-0000')
                     ||'  '|| NVL(TO_CHAR(v_beheer_kosten ,'999990.90'),' .........')
                     ||'  '|| NVL(TO_CHAR(v_dagkosten     ,'9990.9990'),' .........')
                     ||'  '|| NVL(TO_CHAR(v_beginperiode  ,'dd-mm-yyyy'),'00-00-0000')
                     ||'  '|| NVL(TO_CHAR(v_eindeperiode  ,'dd-mm-yyyy'),'00-00-0000')
                     ||'  '|| NVL(TO_CHAR(v_dagen         ,'9990'),' ....')
                     ||'  '|| NVL(TO_CHAR(v_periode_kosten,'99990.90'),' ........');
          i := schrijf_rapport_regel(p_session,i,RPadEnNvl('* '|| v_controle_regel,98)||' *');
        END IF;
      END IF;
    END LOOP;
    lab_beheer := 'Beheerskosten';
    --
    IF v_srt_layout = 'PRN'
    THEN
      i := schrijf_rapport_regel(p_session,i,PrintReplicate(' ',54)
                                          || RPadEnNvl(lab_beheer,22)||': '
                                          || TO_CHAR(v_totaal_beheer,'99990.90'));
    END IF;
    v_tmp_beheerskosten := v_totaal_beheer;
    p_kosten            := v_totaal_beheer;
    RETURN i;
  END;  -- function: akzacopiers_2_beheer
  --
  FUNCTION akzacopiers_1_eigenaar(user_key         IN NUMBER
                                 ,p_session        IN VARCHAR2
                                 ,p_regelnr        IN NUMBER
                                 ,p_datum_van      IN DATE
                                 ,p_datum_tot      IN DATE
                                 ,p_berekening     IN BOOLEAN
                                 ,p_alle_eigenaren IN BOOLEAN
                                 ) RETURN NUMBER
  AS
    CURSOR c_owner_copier (p_eigenaar IN NUMBER)
    IS
      SELECT DISTINCT
             w.ins_kenmerkdeel_waarde,
             w.ins_deel_key,
             k.ins_kenmerk_key,
             s.ins_srtkenmerk_key,
             s.fac_kenmerkdomein_key,
             s.ins_srtkenmerk_kenmerktype,
             r.fac_kenmerkdomein_objectnaam,
             r.fac_kenmerkdomein_kolomnaam,
             r.fac_kenmerkdomein_kolomtxt
        FROM ins_kenmerkdeel    w,
             ins_kenmerk        k,
             ins_srtkenmerk     s,
             fac_kenmerkdomein  r
       WHERE w.ins_kenmerk_key         = k.ins_kenmerk_key
         AND s.ins_srtkenmerk_key      = k.ins_srtkenmerk_key
         AND s.fac_kenmerkdomein_key   = r.fac_kenmerkdomein_key
         AND s.ins_srtkenmerk_upper    = 'EIGENAAR'
         AND k.ins_kenmerk_niveau      = 'G'
         AND k.ins_srtinstallatie_key  = (SELECT ins_srtgroep_key
                                            FROM ins_srtgroep
                                           WHERE ins_srtgroep_upper = 'KOPIEERMACHINES')
         AND w.ins_kenmerkdeel_waarde  = DECODE(p_eigenaar,
                                                0, w.ins_kenmerkdeel_waarde,
                                                p_eigenaar);

    CURSOR c_copier (p_deel_key IN NUMBER)
    IS
      SELECT ins_deel_omschrijving     object,
             ins_srtdeel_omschrijving  objectsoort
        FROM ins_deel               d,
             ins_v_aanwezigsrtdeel  s
       WHERE d.ins_srtdeel_key = s.ins_srtdeel_key
         AND d.ins_deel_key    = p_deel_key;

    TYPE cursor_type IS REF CURSOR;
    c_company          cursor_type;
    c_eigenaren        cursor_type;
    v_regel            VARCHAR2(2000);
    i                  NUMBER(10);
    i_machine_start    NUMBER(10);
    i_eigenaar_start   NUMBER(10);
    i_company_start    NUMBER(10);
    v_eerste           BOOLEAN := TRUE;
    v_afdelingen       VARCHAR2(2000);
    v_Sql_company      VARCHAR2(2000);
    v_Sql_afdeling     VARCHAR2(2000);
    v_company_code     VARCHAR2(10);
    v_kostenplaats     VARCHAR2(30);
    v_company_key      NUMBER(10);
    v_eigenaar         VARCHAR2(60);
    v_ownerkey         NUMBER(10);
    lab_company        VARCHAR2(30);
    lab_eigenaar       VARCHAR2(30);
    lab_machine        VARCHAR2(30);
    lab_gebruik        VARCHAR2(30);
    lab_totaal_machine VARCHAR2(30);
    lab_totaal         VARCHAR2(30);
    v_ins_deel_key     NUMBER(10);
    v_beheer_kosten    NUMBER(12,2) := 0;
    v_tikken_kosten    NUMBER(12,2) := 0;
    v_papier_kosten    NUMBER(12,2) := 0;
    v_gebruik_kosten   NUMBER(12,2) := 0;
    v_basis_kosten     NUMBER(12,2) := 0;
    v_totaal_machine   NUMBER(12,2) := 0;
    v_totaal_eigenaar  NUMBER(12,2) := 0;
    v_totaal_company   NUMBER(12,2) := 0;
    v_regel_eigenaar   NUMBER(10);
    v_regel_company    NUMBER(10);
    v_user_dep         NUMBER(10);
    v_periode_van      DATE;
    v_periode_tot      DATE;
    --
    FUNCTION p_periode_eigenaar(p_session   IN VARCHAR2
                               ,p_volgnr    IN NUMBER
                               ,p_owner_key IN NUMBER
                               ,p_deel_key  IN NUMBER
                               ,p_datum_van IN OUT DATE
                               ,p_datum_tot IN OUT DATE
                               ) RETURN NUMBER AS
      i                   NUMBER;
      v_kenmerk_eigenaar  NUMBER(10);
      v_datum_van         DATE;
      v_datum_tot         DATE;
      v_copier_van        DATE;
      v_copier_tot        DATE;
      v_periode_van       DATE;
      v_periode_tot       DATE;
    BEGIN
      -- Bereken de begin- en einddatum binnen de opgegeven periode
      -- dat de copier in het bezit was van de huidige eigenaar.
      i := p_volgnr;
      v_kenmerk_eigenaar := f_kenmerk('EIGENAAR', p_deel_key);
      v_copier_van       := TO_DATE(NULL);
      v_copier_tot       := TO_DATE(NULL);

      BEGIN
        SELECT k.ins_kenmerkdeel_aanmaak
        ,      k.ins_kenmerkdeel_verwijder
        ,      d.ins_deel_aanmaak
        ,      d.ins_deel_verwijder
        INTO   v_datum_van
        ,      v_datum_tot
        ,      v_copier_van
        ,      v_copier_tot
        FROM   ins_kenmerkdeel k
        ,      ins_deel        d
        WHERE  k.ins_deel_key    = d.ins_deel_key
        AND    k.ins_kenmerk_key = v_kenmerk_eigenaar
        AND    k.ins_deel_key    = p_deel_key
        AND    k.ins_kenmerkdeel_waarde = TO_CHAR(p_owner_key);
      EXCEPTION
        WHEN NO_DATA_FOUND THEN v_datum_van := p_datum_van;
                                v_datum_tot := p_datum_tot;
        WHEN TOO_MANY_ROWS THEN v_datum_van := p_datum_van;
                                v_datum_tot := p_datum_tot;
      END;
      --
      IF p_datum_van < v_datum_van
      THEN
        v_periode_van := v_datum_van;
      ELSE
        v_periode_van := p_datum_van;
      END IF;
      --
      -- Kan pas eigenaar zijn als de copier ook bestaat.
      IF v_copier_van > v_periode_van
      THEN
        v_periode_van := v_copier_van;
      END IF;
      --
      IF v_datum_tot IS NULL
      THEN
        v_periode_tot := p_datum_tot;
      ELSE
        IF p_datum_tot <= v_datum_tot
        THEN
          v_periode_tot := p_datum_tot;
        ELSE
          v_periode_tot := v_datum_tot -1;
        END IF;
      END IF;
      --
      -- Is geen eigenaar meer als copier is verwijderd.
      IF  v_copier_tot IS NOT NULL
      AND v_copier_tot < v_periode_tot
      THEN
        v_periode_tot := v_copier_tot;
      END IF;
      --
      p_datum_van := TRUNC(v_periode_van);
      p_datum_tot := TRUNC(v_periode_tot);
      RETURN i;
    END;
  BEGIN
    -- function: akzacopiers_1_eigenaar
    -- Maak fac_rapport regels aan voor een overzicht per gebruiker en
    -- kopieermachine met daarbij de kosten voor de opgegeven periode
    -- met betrekking tot papier- gebruik- en beheerkosten.
    --
    i                  := p_regelnr;
    lab_company        := 'Company code';
    lab_eigenaar       := 'Eigenaar';
    lab_machine        := 'Kopieermachine';
    lab_gebruik        := 'Gebruikskosten';
    lab_totaal_machine := 'Totaal machine';
    lab_totaal         := 'Totaal';

    IF v_srt_layout = 'XLS'
    THEN
      -- Kop van de xls-kolommen
      i := schrijf_rapport_regel(p_session,i,'Kostenoverzicht copiers');
      i := schrijf_rapport_regel(p_session,i,'Van ' ||TO_CHAR(p_datum_van,'dd-mm-yyyy')
                                           ||' Tot '||TO_CHAR(p_datum_tot,'dd-mm-yyyy')
                                );
      i := schrijf_rapport_regel(p_session,i,'Datum aanmaak: '||TO_CHAR(SYSDATE,'dd-mm-yyyy'));
      i := schrijf_rapport_regel(p_session,i,'');
      i := schrijf_rapport_regel(p_session,i,RPadEnNvl('Company.cd',10)
                                     ||','|| RPadEnNvl('Kostenplts',10)
                                     ||','|| RPadEnNvl('Eigenaar'  ,30)
                                     ||','|| RPadEnNvl('Copier'    ,50)
                                     ||','|| LPadEnNvl('Beheer'    , 9)
                                     ||','|| LPadEnNvl('Tik. z/w'  , 9)
                                     ||','|| LPadEnNvl('Tik. kl'   , 9)
                                     ||','|| LPadEnNvl('tot.Tik.'  , 9)
                                     ||','|| LPadEnNvl('Pak A3'    , 6)
                                     ||','|| LPadEnNvl('Kosten A3' , 9)
                                     ||','|| LPadEnNvl('DoosA4'    , 6)
                                     ||','|| LPadEnNvl('Kosten A4' , 9)
                                     ||','|| LPadEnNvl('totPapier' , 9)
                                     ||','|| LPadEnNvl('Gebruik'   , 9)
                                     ||','|| LPadEnNvl('Basis'     , 9)
                                     ||','|| LPadEnNvl('Modules'   , 9)
                                     ||','|| LPadEnNvl('Huur'      , 9)
                                     ||','|| LPadEnNvl('Nashuatec' , 9)
                                     ||','|| LPadEnNvl('tot.cop.'  , 9)
                                     ||','|| LPadEnNvl('tot.eig.'  ,13)
                                     ||','|| LPadEnNvl('tot.comp'  ,13));
      i := schrijf_rapport_regel(p_session,i,PrintReplicate('-',10)
                                     ||','|| PrintReplicate('-',10)
                                     ||','|| PrintReplicate('-',30)
                                     ||','|| PrintReplicate('-',50)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-', 6)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-', 6)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-', 9)
                                     ||','|| PrintReplicate('-',13)
                                     ||','|| PrintReplicate('-',13));
    END IF;

    -- Bepaal de afdeling waartoe de huidige gebruiker behoort
    -- of neem all afdelingen in het overzicht op.
    IF p_alle_eigenaren
    THEN
      v_user_dep := 0;
    ELSE
      BEGIN
        SELECT prs_afdeling_key
        INTO   v_user_dep
        FROM   prs_perslid
        WHERE  prs_perslid_key = user_key;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN v_user_dep := 0;
        WHEN TOO_MANY_ROWS THEN v_user_dep := 0;
      END;
    END IF;

    --DBMS_OUTPUT.PUT_LINE('v_user_dep = '||v_user_dep);

    -- Welke afdelingen en company-codes moeten in het
    -- overzicht worden meegenomen?
    v_afdelingen := 'AND A.prs_afdeling_key IN (-1';
    FOR r_eigenaar IN c_owner_copier(v_user_dep)
    LOOP
        v_afdelingen := v_afdelingen ||','|| r_eigenaar.ins_kenmerkdeel_waarde;
    END LOOP;

    --DBMS_OUTPUT.PUT_LINE('v_afdelingen = '||v_afdelingen);

    -- AKZA#489
    -- AKZA#534: ook als afdeling ondertussen al verwijderd toch in query laten voor doorbelasting
    v_Sql_company := 'SELECT DISTINCT a.prs_afdeling_parentkey prs_eenheid_key, e.prs_afdeling_upper company_code '
                  || '  FROM prs_afdeling a, prs_v_aanwezigafdeling e '
                  || ' WHERE a.prs_afdeling_parentkey = e.prs_afdeling_key '
                  || v_afdelingen
                  || ') '
              ||' ORDER BY e.prs_afdeling_upper';
    --
    -- Voor alle company-codes.
    OPEN c_company FOR v_Sql_company;
    LOOP
      v_totaal_company  := 0;
      i_company_start   := i;
      FETCH c_company INTO v_company_key,
                           v_company_code;
      IF c_company%NOTFOUND
      THEN
        --DBMS_OUTPUT.PUT_LINE('Einde c_company');
        EXIT;
      ELSE
        --DBMS_OUTPUT.PUT_LINE('v_company_key/code = '||v_company_key||'/'||v_company_code);
        v_totaal_company := 0;
        v_regel_company  := i;
        v_regel          := RPadEnNvl(lab_company,14)||': '|| v_company_code;
        IF    v_srt_layout = 'SAP'
        THEN
          v_tmp_company := v_company_code;
        ELSIF v_srt_layout = 'XLS'
        THEN
          v_tmp_company := v_company_code;
        ELSIF v_srt_layout = 'PRN'
        THEN
          i := schrijf_rapport_regel(p_session,i,v_regel);
          i := schrijf_rapport_regel(p_session,i,'');
          i := schrijf_rapport_regel(p_session,i,'');
        END IF;

        -- AKZA#534: ook als afdeling ondertussen al verwijderd toch in query laten voor doorbelasting
        v_Sql_afdeling := 'SELECT a.prs_afdeling_omschrijving tekst '
                       || ',      a.prs_afdeling_key          naam  '
                       || ',      (SELECT k.prs_kostenplaats_nr FROM akza_v_kostenplaats k WHERE k.prs_kostenplaats_key = a.prs_kostenplaats_key) kplts '
                       || 'FROM   prs_afdeling a '
                       || 'WHERE  a.prs_afdeling_parentkey = '|| v_company_key ||' '
                       || v_afdelingen
                       || ') ORDER BY a.prs_afdeling_omschrijving ';

        -- Voor alle eigenaren die kopieermachines bezitten.
        OPEN c_eigenaren FOR v_Sql_afdeling;
        LOOP
          v_totaal_eigenaar := 0;
          i_eigenaar_start  := i;
          FETCH c_eigenaren INTO v_eigenaar,
                                 v_ownerkey,
                                 v_kostenplaats;
          IF c_eigenaren%NOTFOUND
          THEN
            --DBMS_OUTPUT.PUT_LINE('Einde c_eigenaren');
            EXIT;
          ELSE
            --DBMS_OUTPUT.PUT_LINE('v_eigenaar/ownerkey/kostenplaats = '||v_eigenaar||'/'||v_ownerkey||'/'||v_kostenplaats);
            v_totaal_eigenaar := 0;
            v_regel_eigenaar  := i;
            v_regel           := RPadEnNvl(lab_eigenaar,14)||': '|| v_eigenaar;
            IF    v_srt_layout = 'SAP'
            THEN
              v_tmp_eigenaar     := v_eigenaar;
              v_tmp_kostenplaats := v_kostenplaats;
            ELSIF v_srt_layout = 'XLS'
            THEN
              v_tmp_eigenaar     := v_eigenaar;
              v_tmp_kostenplaats := v_kostenplaats;
            ELSIF v_srt_layout = 'PRN'
            THEN
              i := schrijf_rapport_regel(p_session,i,v_regel);
              i := schrijf_rapport_regel(p_session,i,'');
            END IF;

            -- Voor alle kopieermachines die de eigenaar heeft.
            FOR r_kopieermachine IN c_owner_copier(v_ownerkey)
            LOOP
              --DBMS_OUTPUT.PUT_LINE('r_kopieermachine - ins_deel_key = '||r_kopieermachine.ins_deel_key);
              v_ins_deel_key    := r_kopieermachine.ins_deel_key;
              v_totaal_machine  := 0;
              i_machine_start   := i;
              FOR r_copier IN c_copier(v_ins_deel_key)
              LOOP
                --DBMS_OUTPUT.PUT_LINE('r_copier object/objectsoort = '||r_copier.object||'/'||r_copier.objectsoort);
                v_regel := RPadEnNvl(lab_machine,14)||': ' || r_copier.object
                                                    ||' - '|| r_copier.objectsoort;
                IF    v_srt_layout = 'SAP'
                THEN
                  v_tmp_copier := SUBSTR(r_copier.object,1,10);
                ELSIF v_srt_layout = 'XLS'
                THEN
                  v_tmp_copier := SUBSTR(r_copier.object ||' - '|| r_copier.objectsoort,1,50);
                ELSIF v_srt_layout = 'PRN'
                THEN
                  i := schrijf_rapport_regel(p_session,i,v_regel);
                END IF;

                -- Bereken de begin- en einddatum binnen de opgegeven periode
                -- dat de copier in het bezit was van de huidige eigenaar.
                v_periode_van := p_datum_van;
                v_periode_tot := p_datum_tot;
                i := p_periode_eigenaar(p_session,i,v_ownerkey,v_ins_deel_key,v_periode_van,v_periode_tot);
                --
                i := akzacopiers_2_beheer (p_session,i,v_ins_deel_key,v_periode_van,v_periode_tot,p_berekening,v_beheer_kosten);
                --DBMS_OUTPUT.PUT_LINE('v_beheer_kosten = '||v_beheer_kosten);
                i := akzacopiers_3_norm   (p_session,i,v_ins_deel_key,v_periode_van,v_periode_tot,p_berekening);
                i := akzacopiers_4_tikken (p_session,i,v_ins_deel_key,v_periode_van,v_periode_tot,p_berekening,v_tikken_kosten);
                --DBMS_OUTPUT.PUT_LINE('v_tikken_kosten = '||v_tikken_kosten);
                i := akzacopiers_5_papier (p_session,i,v_ins_deel_key,v_periode_van,v_periode_tot,p_berekening,v_papier_kosten);
                --DBMS_OUTPUT.PUT_LINE('v_papier_kosten = '||v_papier_kosten);
                v_gebruik_kosten := v_beheer_kosten
                                  + v_tikken_kosten
                                  + v_papier_kosten;
                v_regel := PrintReplicate(' ',38)
                        || RPadEnNvl(lab_gebruik,26)||': '|| TO_CHAR(v_gebruik_kosten,'9999990.90');
                IF    v_srt_layout = 'SAP'
                THEN
                  v_tmp_gebruikskosten := v_gebruik_kosten;
                ELSIF v_srt_layout = 'XLS'
                THEN
                  v_tmp_gebruikskosten := v_gebruik_kosten;
                ELSIF v_srt_layout = 'PRN'
                THEN
                  i := schrijf_rapport_regel(p_session,i,v_regel);
                END IF;
                i := akzacopiers_6_basis  (p_session,i,v_ins_deel_key,v_periode_van,v_periode_tot,p_berekening,v_basis_kosten);
                --DBMS_OUTPUT.PUT_LINE('v_basis_kosten = '||v_basis_kosten);
                v_totaal_machine := v_gebruik_kosten
                                  + v_basis_kosten;
                v_regel := PrintReplicate(' ',54)
                        || RPadEnNvl(lab_totaal_machine,22)||':'|| TO_CHAR(v_totaal_machine,'999990.90');
                IF    v_srt_layout = 'SAP'
                THEN
                  v_tmp_basishuur    := v_basis_kosten;
                  v_tmp_totaalcopier := v_totaal_machine;
                  i := schrijf_sap_regel(p_session,i);
                ELSIF v_srt_layout = 'XLS'
                THEN
                  v_tmp_basishuur    := v_basis_kosten;
                  v_tmp_totaalcopier := v_totaal_machine;
                  IF (v_tmp_totaalcopier <> 0) THEN
                    i := schrijf_xls_regel(p_session,i);
                  END IF;
                ELSIF v_srt_layout = 'PRN'
                THEN
                  i := schrijf_rapport_regel(p_session,i,v_regel);
                  i := schrijf_rapport_regel(p_session,i,'');
                  i := schrijf_rapport_regel(p_session,i,'');
                END IF;
              END LOOP;
              IF (v_totaal_machine = 0) THEN
                i := delete_rapport_regel(p_session,i_machine_start,i);
              ELSE
                v_totaal_eigenaar := v_totaal_eigenaar + v_totaal_machine;
              END IF;
            END LOOP;
            v_totaal_company := v_totaal_company + v_totaal_eigenaar;
            --
            IF    v_srt_layout = 'SAP'
            THEN
              -- vervang de tekst <v_tmp_eigenaar>_totaal door het totaal bedrag
              -- aan kosten dat deze eigenaar voor het gebruik van zijn copiers
              -- moet betalen.
              -- Dus als een eigenaar meerdere copiers heeft, dan is het totaal-
              -- bedrag op elke regel van deze gebruiker hetzelfde, nl de som van
              -- de totaalkosten per copier.
              --
              v_tmp_totaaleigenaar := v_totaal_eigenaar;
              --DBMS_OUTPUT.PUT_LINE('v_totaal_eigenaar = '||v_totaal_eigenaar);
              UPDATE fac_rapport
              SET    fac_rapport_regel = REPLACE(fac_rapport_regel
                                                ,v_tmp_eigenaar ||'_totaal'
                                                ,TO_CHAR(v_totaal_eigenaar,'999999990.90'))
              WHERE  fac_rapport_node  = p_session
              AND    fac_rapport_volgnr BETWEEN v_regel_eigenaar AND (i-1)
              AND    fac_rapport_soort = 1;
            ELSIF v_srt_layout = 'XLS'
            THEN
              v_tmp_totaaleigenaar := v_totaal_eigenaar;
              UPDATE fac_rapport
              SET    fac_rapport_regel = REPLACE(fac_rapport_regel
                                                ,v_tmp_eigenaar ||'_totaal'
                                                ,TO_CHAR(v_totaal_eigenaar,'999999990.90'))
              WHERE  fac_rapport_node  = p_session
              AND    fac_rapport_volgnr BETWEEN v_regel_eigenaar AND (i-1)
              AND    fac_rapport_soort = 1;
              UPDATE akza_copy_xls
                 SET totaal_eigenaar = v_totaal_eigenaar
               WHERE eigenaar = v_tmp_eigenaar;

            ELSIF v_srt_layout = 'PRN'
            THEN
              i := schrijf_rapport_regel(p_session,i,'');
              i := schrijf_rapport_regel(p_session,i,'');
              v_regel := RPadEnNvl(RPadEnNvl(lab_eigenaar,14)||': '|| v_eigenaar,76)
                      || RPadEnNvl(lab_totaal,10) ||': '
                      || TO_CHAR(v_totaal_eigenaar,'999999990.90');
              --
              -- Zet nu achter de regel waarop de huidige eigenaar staat het totaal bedrag
              -- dat deze aan kosten voor kopieermachines heeft.
              UPDATE fac_rapport
              SET    fac_rapport_regel  = v_regel
              WHERE  fac_rapport_node   = p_session
              AND    fac_rapport_volgnr = v_regel_eigenaar
              AND    fac_rapport_soort  = 1;
            END IF;
            -- Verwijder de eigenaar regels als de kosten 0 zijn
            IF (v_totaal_eigenaar = 0) THEN
              i := delete_rapport_regel(p_session,i_eigenaar_start,i);
            END IF;
          END IF;
        END LOOP;
        CLOSE c_eigenaren;

        -- Totaal per company zetten.
        IF    v_srt_layout = 'SAP'
        THEN
          v_tmp_totaalcompany := v_totaal_company;
          UPDATE fac_rapport
          SET    fac_rapport_regel = REPLACE(fac_rapport_regel
                                            ,v_tmp_company ||'_totaal'
                                            ,TO_CHAR(v_totaal_company,'999999990.90'))
          WHERE  fac_rapport_node  = p_session
          AND    fac_rapport_volgnr BETWEEN v_regel_company AND (i-1)
          AND    fac_rapport_soort = 1;
        ELSIF v_srt_layout = 'XLS'
        THEN
          v_tmp_totaalcompany := v_totaal_company;
          UPDATE FAC_RAPPORT
          SET    fac_rapport_regel = REPLACE(fac_rapport_regel
                                            ,v_tmp_company ||'_totaal'
                                            ,TO_CHAR(v_totaal_company,'999999990.90'))
          WHERE  fac_rapport_node  = p_session
          AND    fac_rapport_volgnr BETWEEN v_regel_company AND (i-1)
          AND    fac_rapport_soort = 1;

          UPDATE AKZA_COPY_XLS
          SET totaal_company = v_totaal_company
          WHERE company = v_tmp_company;
        ELSIF v_srt_layout = 'PRN'
        THEN
          v_regel := RPadEnNvl(RPadEnNvl(lab_company,14)||': '|| v_company_code,76)
                  || RPadEnNvl(lab_totaal,10) ||': '
                  || TO_CHAR(v_totaal_company,'999999990.90');
          UPDATE FAC_RAPPORT
          SET    fac_rapport_regel  = v_regel
          WHERE  fac_rapport_node   = p_session
          AND    fac_rapport_volgnr = v_regel_company
          AND    fac_rapport_soort  = 1;
        END IF;

      END IF;
      -- Verwijdere de Company regels als de kosten 0 zijn
      IF (v_totaal_company = 0) THEN
        i := delete_rapport_regel(p_session,i_company_start,i);
      END IF;

    END LOOP;
    CLOSE c_company;
    --
    RETURN i;
  END;  -- function: akzacopiers_1_eigenaar

  -- Hoofdprocedure voor het rapport kostenoverzicht kopieermachines.
  PROCEDURE akza_copiers(user_key     IN NUMBER,
                         p_session    IN VARCHAR2,
                         p_datum_van  IN VARCHAR2,
                         p_datum_tot  IN VARCHAR2,
                         p_srt_export IN VARCHAR2,
                         p_all_owner  IN BOOLEAN)
  AS
    v_datum_van   DATE;
    v_datum_tot   DATE;
    v_berekening  BOOLEAN;
    i             NUMBER(12);
  BEGIN
    v_datum_van  := TO_DATE(p_datum_van,'dd-mm-yyyy');
    v_datum_tot  := TO_DATE(p_datum_tot,'dd-mm-yyyy');
    v_berekening := FALSE; -- JGL: Enable debugging??
    i := 1;

    v_srt_layout    := p_srt_export; -- globale variabele die ervoor zorgt op welke wijze wordt afgedrukt.
    v_tmp_aanmaak   := TRUNC(SYSDATE);
    v_tmp_datum_van := TRUNC(v_datum_van);
    v_tmp_datum_tot := TRUNC(v_datum_tot);
    i:= akzacopiers_1_eigenaar(user_key, p_session,
                               i, TRUNC(v_datum_van), TRUNC(v_datum_tot),
                               v_berekening, p_all_owner);

    COMMIT;
  END;

  -- Printer-versie van het kostenoverzicht kopieermachines.
  PROCEDURE akza_cop_prn(user_key IN NUMBER,
                         p_datum_van IN VARCHAR2,
                         p_datum_tot IN VARCHAR2,
                         p_cursor OUT t_cursor) AS
    v_srt_export  VARCHAR2(3);
    v_all_owners  BOOLEAN;
  BEGIN
    v_srt_export := 'PRN';
    v_all_owners := FALSE;
    -- Tijdelijk session 1 (mis)bruiken
    DELETE fac_rapport
     WHERE fac_rapport_node = TO_CHAR( USERENV('SESSIONID') );

    akza_copiers(user_key, TO_CHAR( USERENV('SESSIONID') ),
                 p_datum_van, p_datum_tot,
                 v_srt_export, v_all_owners);

    OPEN p_cursor FOR
         SELECT fac_rapport_regel FROM fac_rapport
          WHERE fac_rapport_node = TO_CHAR( USERENV('SESSIONID') )
       ORDER BY fac_rapport_volgnr;
  END;

  -- Printer-versie van het kostenoverzicht kopieermachines
  -- Alle eigenaren.
  PROCEDURE akza_cop_all(user_key IN NUMBER,
                         p_datum_van IN VARCHAR2,
                         p_datum_tot IN VARCHAR2,
                         p_cursor OUT t_cursor) AS
    v_srt_export  VARCHAR2(3);
    v_all_owners  BOOLEAN;
  BEGIN
    v_srt_export := 'PRN';
    v_all_owners := TRUE;
    DELETE fac_rapport
     WHERE fac_rapport_node = TO_CHAR( USERENV('SESSIONID') );

    akza_copiers(user_key, TO_CHAR( USERENV('SESSIONID') ),
                 p_datum_van, p_datum_tot,
                 v_srt_export, v_all_owners);

    OPEN p_cursor FOR
         SELECT fac_rapport_regel FROM fac_rapport
          WHERE fac_rapport_node = TO_CHAR( USERENV('SESSIONID') )
       ORDER BY fac_rapport_volgnr;
  END;

  -- EXCEL-export van het kostenoverzicht kopieermachines.
  PROCEDURE akza_cop_xls (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_srt_export  VARCHAR2(3);
    v_all_owners  BOOLEAN;
  BEGIN
    v_srt_export := 'XLS';
    v_all_owners := TRUE;
    DELETE akza_copy_xls; -- Vanwege session-pooling kan het nog gevuld zijn

    -- Merk op dat schrijf_xls_regel nog altijd gewoon FAC_RAPPORT vult. Die vulling
    -- wordt verder niet gebruikt, er wordt namelijk van akza_copy_xls gebruik gemaakt.
    DELETE fac_rapport
     WHERE fac_rapport_node = TO_CHAR( USERENV('SESSIONID') );

    akza_copiers(user_key, TO_CHAR( USERENV('SESSIONID') ),
                 p_datum_van, p_datum_tot,
                 v_srt_export, v_all_owners);

    OPEN p_cursor FOR
         SELECT * FROM akza_copy_xls;
   END;

END;
/

--- SAP-EXPORT (AKZA#419) ------------------------------------------------------

-- Prepare data for SAP-export copiers in table FAC_RAPPORT
CREATE OR REPLACE PROCEDURE akza_select_copiers_sap (p_applname IN VARCHAR2, p_applrun IN VARCHAR2)
AS
   p_datum_tot    DATE;

   v_srt_export   VARCHAR2(3);
   v_all_owners   BOOLEAN;
   v_datum_van    DATE;
   v_datum_tot    DATE;
   v_verwerken    BOOLEAN;
   i              NUMBER(12);
BEGIN
   DELETE fac_rapport -- Hierin wordt de data tijdelijk klaargezet
    WHERE fac_rapport_node = TO_CHAR( USERENV('SESSIONID') );

   -- Haal de einddatum van de laatste SAP-export op.
   SELECT MAX(akz_copiers_sap_eind)
     INTO v_datum_tot
     FROM akz_copiers_sap;

   p_datum_tot := ADD_MONTHS( v_datum_tot, 1 ); --15e volgende maand

   fac.writelog (p_applname, 'I',
                 'Overweeg SAP-export van ' || TO_CHAR(v_datum_tot) || ' tot en met ' || TO_CHAR(p_datum_tot),
                 '');

   IF (p_datum_tot - 8 >= SYSDATE)
   THEN -- Het is nog te vroeg. Dus niets doen. op 9/12 door PF op verzoek van 4 naar 8 gezet
      fac.writelog (p_applname, 'I',
                    'Het is nog te vroeg. Het is nog geen: ' || TO_CHAR(p_datum_tot-8),
                    ''
                    );
      COMMIT;
      v_verwerken := FALSE;
   ELSE
      -- Bereken de gegevens vanaf de datum van de laatste export tot en met
      -- een maand later.
      v_datum_van := v_datum_tot;
      v_datum_tot := p_datum_tot;
      v_verwerken := TRUE;
   END IF;

   IF v_verwerken
   THEN
      -- Bereken het kostenoverzicht en schrijf deze naar het aangegeven bestand.
      -- Sla vervolgens de periode van export op.
      v_srt_export := 'SAP';
      v_all_owners := TRUE;
      akza_p_copiers.akza_copiers(-1, TO_CHAR( USERENV('SESSIONID') ),
                                  TO_CHAR(v_datum_van,'dd-mm-yyyy'),
                                  TO_CHAR(v_datum_tot,'dd-mm-yyyy'),
                                  v_srt_export, v_all_owners);
      INSERT INTO akz_copiers_sap
         (akz_copiers_sap_start,
          akz_copiers_sap_eind)
      VALUES
         (v_datum_van,
          v_datum_tot);

      fac.writelog (p_applname, 'I',
                    'SAP-export is nu klaargezet van '|| v_datum_van ||' tot en met ' || v_datum_tot,
                    '');
    END IF;
  END;
/

-- Exporteer de data die door akza_select_copiers_sap is klaargezet in FAC_RAPPORT
CREATE OR REPLACE PROCEDURE akza_export_copiers_sap (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2)
AS
   Dummy BOOLEAN;
BEGIN
   -- Opruimen
   DELETE fac_rapport
    WHERE fac_rapport_node = TO_CHAR( USERENV('SESSIONID') );
END;
/

CREATE OR REPLACE VIEW akza_v_export_copiers_sap
(RESULT, RESULT_ORDER)
AS
   SELECT fac_rapport_regel, fac_rapport_volgnr
     FROM fac_rapport
    WHERE fac_rapport_node = TO_CHAR( USERENV('SESSIONID') );

--------------------------------------------------------------------------------------------------
--------- SAP-EXPORTS: DEELOPDRACHTEN, RESERVERINGEN, LOGISTIEK, SPECIFICATIE, FACTUREN ----------
--------------------------------------------------------------------------------------------------

--- BASISVIEWS RESERVERINGEN ---------------------------------------------------

--TODO: lege companycode? (wordt nu left outer join gedaan)
CREATE OR REPLACE VIEW akza_v_export_resdeel
(
   soort,
   res_rsv_ruimte_key,
   res_rsv_artikel_key,
   res_rsv_deel_key,
   res_rsv_ruimte_kosten_klant,
   res_rsv_ruimte_ordernr,
   ins_discipline_key,
   kostenplaatscode,
   debiteurnr,
   kostensoort,
   einddatum,
   bedrag,
   postkey,
   valuta,
   aantal,
   btw,
   res_reservering_key,
   res_rsv_ruimte_volgnr,
   datum,
   ruimte_art_oms,
   melder_key,
   melder,
   companycode,
   stukprijs,
   artikelgroep,
   catalogus,
   alg_locatie_key
)
AS
   SELECT   DISTINCT 'deel',
            rr.res_rsv_ruimte_key,
            rr.res_rsv_artikel_key,
            rr.res_rsv_deel_key,
            rr.res_rsv_ruimte_kosten_klant,
            res_rsv_ruimte_ordernr,
            akza_ea.ins_discipline_key,
            akza_k.prs_kostenplaats_nr kostenplaatscode,
            akza_k.debiteurnr,
            akza_ea.kostensoort,
            rr.res_rsv_ruimte_tot einddatum,
            ROUND (COALESCE (res.getdeelprijs (rr.res_rsv_deel_key), 0), 2) bedrag,
            '40' postkey,
            'EUR' valuta,
            akza_ea.aantal,
            '21' btw,
            rr.res_reservering_key,
            rr.res_rsv_ruimte_volgnr,
               TO_CHAR (rr.res_rsv_ruimte_van, 'dd-mm-yyyy')
            || DECODE (rr.res_rsv_ruimte_van, NULL, NULL, ' / ')
            || TO_CHAR (rr.res_rsv_ruimte_tot, 'dd-mm-yyyy')
               datum,
            TRIM(akza_ea.res_deel_omschrijving) ruimte_art_oms,
            pf.prs_perslid_key,
            -- Indien non-resident host, dan de omschrijving (waar externe gastheer wordt ingevuld) naar SAP.
            DECODE (pf.prs_perslid_key,
                    40727, COALESCE (res_rsv_ruimte_omschrijving, pf.prs_perslid_naam_full, ' '),
                    COALESCE (pf.prs_perslid_naam_full, ' ')
                   )
               melder,
            COALESCE(ac.companycode, 'LEEG') companycode,
            ROUND ( COALESCE (res.getdeelprijs (rr.res_rsv_deel_key), 0) / akza_ea.aantal, 2)
               stukprijs,
            '' artikelgroep,
            akza_ea.ins_discipline_omschrijving catalogus,
            rg.alg_locatie_key
     FROM   (SELECT   rr.*, CAST(NULL AS NUMBER) res_rsv_artikel_key, rd.res_rsv_deel_key
               FROM   res_rsv_ruimte rr, res_rsv_deel rd
              WHERE       1 = 1
                      AND res_rsv_ruimte_verwijder IS NULL
                      AND rr.res_rsv_ruimte_key = rd.res_rsv_ruimte_key
                      AND rd.res_status_bo_key = 5) rr,
            akza_v_kostenplaats akza_k,
            (SELECT * FROM prs_kenmerklink
              WHERE prs_kenmerk_key = 1380
                AND prs_kenmerklink_verwijder IS NULL) kl,
            akza_v_afdelingcompany ac,
            -- FSN#26359: res_deel_omschrijving is per DB19 een kolom in res_deel, dus we hoeven
            -- ins_deel_omschrijving er niet meer bij te halen
            (SELECT   rsv_d.res_rsv_deel_key,
                      rd.res_deel_omschrijving,
                      rsv_d.res_rsv_ruimte_key,
                      ins_discipline_key,
                      ins_discipline_omschrijving,
                      rsv_d.res_rsv_deel_aantal aantal,
                      ks.prs_kostensoort_oms kostensoort
               FROM   res_rsv_deel rsv_d, res_deel rd, res_discipline dis, prs_kostensoort ks
              WHERE   rsv_d.res_deel_key = rd.res_deel_key
                AND   rd.res_discipline_key = dis.ins_discipline_key
                AND   dis.prs_kostensoort_key = ks.prs_kostensoort_key(+) )
            akza_ea,
            (SELECT   l.alg_locatie_key,
                      rg.res_reservering_key,
                      rg.res_rsv_ruimte_key,
                      DECODE (
                         rg.res_ruimte_key,
                         NULL,
                            l.alg_locatie_code
                         || '-'
                         || g.alg_gebouw_code
                         || '-'
                         || v.alg_verdieping_volgnr
                         || '-'
                         || r.alg_ruimte_nr,
                         l.alg_locatie_code || '-' || rg.res_ruimte_nr
                      )
                         res_ruimte_omschrijving
               FROM   (SELECT   rr2.res_reservering_key,
                                rr2.res_rsv_ruimte_key,
                                rr.alg_ruimte_key,
                                rr.res_ruimte_key,
                                r.res_ruimte_nr res_ruimte_nr
                         FROM   res_v_rsv_ruimte_2_alg_ruimte rr, res_rsv_ruimte rr2, res_ruimte r
                        WHERE   rr2.res_rsv_ruimte_key = rr.res_rsv_ruimte_key AND rr.res_ruimte_key = r.res_ruimte_key
                       UNION
                       SELECT   rr2.res_reservering_key,
                                rr2.res_rsv_ruimte_key,
                                rr2.alg_ruimte_key,
                                NULL,
                                a.alg_ruimte_nr res_ruimte_nr
                         FROM   res_rsv_ruimte rr2, alg_ruimte a
                        WHERE   rr2.alg_ruimte_key IS NOT NULL AND rr2.alg_ruimte_key = a.alg_ruimte_key) rg,
                      alg_ruimte r,
                      alg_verdieping v,
                      alg_gebouw g,
                      alg_locatie l
              WHERE       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 rg.alg_ruimte_key = r.alg_ruimte_key) rg,
            prs_v_perslid_fullnames_all pf
    WHERE       1 = 1
            AND rr.res_rsv_ruimte_contact_key = pf.prs_perslid_key
            AND rr.prs_kostenplaats_key = akza_k.prs_kostenplaats_key
            AND kl.prs_kenmerklink_waarde(+) = akza_k.debiteurnr
            AND ac.prs_afdeling_key(+) = kl.prs_link_key
            AND akza_ea.res_rsv_deel_key(+) = rr.res_rsv_deel_key
            AND rr.res_rsv_ruimte_key = rg.res_rsv_ruimte_key(+);

-- De te exporteren catering met kostenplaats opgevoerd bij een ruimte reservering of losse catering reservering
-- Locatiekey wordt meegeleverd om later deeloverzicht/export te kunnen doen.
CREATE OR REPLACE VIEW akza_v_export_catering
(
   soort,
   res_rsv_ruimte_key,
   res_rsv_artikel_key,
   res_rsv_deel_key,
   res_rsv_ruimte_kosten_klant,
   res_rsv_ruimte_ordernr,
   ins_discipline_key,
   kostenplaatscode,
   debiteurnr,
   kostensoort,
   einddatum,
   bedrag,
   postkey,
   valuta,
   aantal,
   btw,
   res_reservering_key,
   res_rsv_ruimte_volgnr,
   datum,
   ruimte_art_oms,
   melder_key,
   melder,
   companycode,
   stukprijs,
   artikelgroep,
   catalogus,
   alg_locatie_key
)
AS
   SELECT   DISTINCT 'artikel',
            rr.res_rsv_ruimte_key,
            rr.res_rsv_artikel_key,
            rr.res_rsv_deel_key,
            rr.res_rsv_ruimte_kosten_klant,
            res_rsv_ruimte_ordernr,
            akza_ea.ins_discipline_key,
            akza_k.prs_kostenplaats_nr kostenplaatscode,
            akza_k.debiteurnr,
            akza_ea.kostensoort,
            rr.res_rsv_ruimte_tot einddatum,
            ROUND (COALESCE (res.getartikelprijs (rr.res_rsv_artikel_key), 0), 2) bedrag,
            '40' postkey,
            'EUR' valuta,
            akza_ea.aantal,
            TO_CHAR( COALESCE(akza_ea.res_artikel_btw, 0) ) btw,
            rr.res_reservering_key,
            rr.res_rsv_ruimte_volgnr,
               TO_CHAR (COALESCE (rr.res_rsv_ruimte_van, res_rsv_artikel_levering), 'dd-mm-yyyy')
            || DECODE (COALESCE (rr.res_rsv_ruimte_van, res_rsv_artikel_levering), NULL, NULL, ' / ')
            || TO_CHAR (COALESCE (rr.res_rsv_ruimte_tot, res_rsv_artikel_levering), 'dd-mm-yyyy')
               datum,
            TRIM (akza_ea.res_artikel_omschrijving) ruimte_art_oms,
            pf.prs_perslid_key,
            -- Indien non-resident host, dan de omschrijving (waar externe gastheer wordt ingevuld) naar SAP.
            DECODE(pf.prs_perslid_key, 40727, COALESCE(res_rsv_ruimte_omschrijving, pf.prs_perslid_naam_full, ' '), COALESCE (pf.prs_perslid_naam_full, ' ')  ) melder,
            COALESCE(ac.companycode, 'LEEG') companycode,
            ROUND (COALESCE (res.getartikelprijs (rr.res_rsv_artikel_key), 0) / akza_ea.aantal, 2)
               stukprijs,
            '    ' artikelgroep,
            akza_ea.ins_discipline_omschrijving catalogus,
            rg.alg_locatie_key
     FROM   (SELECT   rr.*, ra.res_rsv_artikel_key, CAST(NULL AS NUMBER) res_rsv_deel_key
               FROM   res_rsv_ruimte rr, res_rsv_artikel ra
              WHERE       1 = 1
                      AND res_rsv_ruimte_verwijder IS NULL
                      AND rr.res_rsv_ruimte_key = ra.res_rsv_ruimte_key
                      AND ra.res_status_bo_key = 5) rr,
            akza_v_kostenplaats akza_k,
            (SELECT * FROM prs_kenmerklink
              WHERE prs_kenmerk_key = 1380
                AND prs_kenmerklink_verwijder IS NULL) kl,
            akza_v_afdelingcompany ac,
            (SELECT   rsv_art.res_rsv_artikel_key,
                      art.res_artikel_omschrijving,
                      rsv_art.res_rsv_ruimte_key,
                      ins_discipline_key,
                      ins_discipline_omschrijving,
                      rsv_art.res_rsv_artikel_aantal aantal,
                      rsv_art.res_rsv_artikel_levering,
                      art.res_artikel_btw,
                      ks.prs_kostensoort_oms kostensoort
               FROM   res_rsv_artikel rsv_art, res_artikel art, res_discipline dis, prs_kostensoort ks
              WHERE       1 = 1
                      AND rsv_art.res_artikel_key = art.res_artikel_key
                      AND art.res_discipline_key = dis.ins_discipline_key
                      AND dis.prs_kostensoort_key = ks.prs_kostensoort_key(+) ) akza_ea,
            (SELECT   l.alg_locatie_key,
                      rg.res_reservering_key,
                      rg.res_rsv_ruimte_key,
                      DECODE (rg.res_ruimte_key,null,
                                  l.alg_locatie_code || '-' || g.alg_gebouw_code || '-' || v.alg_verdieping_volgnr || '-' || r.alg_ruimte_nr,
                                  l.alg_locatie_code || '-' || rg.res_ruimte_nr) res_ruimte_omschrijving
               FROM   (SELECT   rr2.res_reservering_key, rr2.res_rsv_ruimte_key, rr.alg_ruimte_key, rr.res_ruimte_key, r.res_ruimte_nr res_ruimte_nr
                         FROM   res_v_rsv_ruimte_2_alg_ruimte rr, res_rsv_ruimte rr2, res_ruimte r
                        WHERE   rr2.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                        AND     rr.res_ruimte_key = r.res_ruimte_key
                       UNION
                       SELECT   rr2.res_reservering_key, rr2.res_rsv_ruimte_key, rr2.alg_ruimte_key, null, a.alg_ruimte_nr res_ruimte_nr
                         FROM   res_rsv_ruimte rr2, alg_ruimte a
                        WHERE   rr2.alg_ruimte_key IS NOT NULL
                        AND     rr2.alg_ruimte_key = a.alg_ruimte_key) rg,
                      alg_ruimte r,
                      alg_verdieping v,
                      alg_gebouw g,
                      alg_locatie l
              WHERE   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 rg.alg_ruimte_key = r.alg_ruimte_key) rg,
            prs_v_perslid_fullnames_all pf
    WHERE       1 = 1
            AND rr.res_rsv_ruimte_contact_key = pf.prs_perslid_key
            AND rr.prs_kostenplaats_key = akza_k.prs_kostenplaats_key
            AND kl.prs_kenmerklink_waarde(+) = akza_k.debiteurnr
            AND ac.prs_afdeling_key(+) = kl.prs_link_key
            AND akza_ea.res_rsv_artikel_key(+) = rr.res_rsv_artikel_key
            AND rr.res_rsv_ruimte_key = rg.res_rsv_ruimte_key(+);


CREATE OR REPLACE VIEW akza_v_export_resruimten
(
   soort,
   res_rsv_ruimte_key,
   res_rsv_artikel_key,
   res_rsv_deel_key,
   res_rsv_ruimte_kosten_klant,
   res_rsv_ruimte_ordernr,
   ins_discipline_key,
   kostenplaatscode,
   debiteurnr,
   kostensoort,
   einddatum,
   bedrag,
   postkey,
   valuta,
   aantal,
   btw,
   res_reservering_key,
   res_rsv_ruimte_volgnr,
   datum,
   ruimte_art_oms,
   melder_key,
   melder,
   companycode,
   stukprijs,
   artikelgroep,
   catalogus,
   alg_locatie_key
)
AS
   SELECT   DISTINCT 'ruimte',
            rr.res_rsv_ruimte_key,
            rr.res_rsv_artikel_key,
            rr.res_rsv_deel_key,
            rr.res_rsv_ruimte_kosten_klant,
            res_rsv_ruimte_ordernr,
            akza_ea.ins_discipline_key,
            akza_k.prs_kostenplaats_nr kostenplaatscode,
            akza_k.debiteurnr,
            akza_ea.kostensoort,
            rr.res_rsv_ruimte_tot einddatum,
            ROUND (COALESCE (res.getruimteprijs (rr.res_rsv_ruimte_key), 0), 2)
               bedrag,
            '40' postkey,
            'EUR' valuta,
            1 aantal,
            '21' btw,
            rr.res_reservering_key,
            rr.res_rsv_ruimte_volgnr,
               TO_CHAR (rr.res_rsv_ruimte_van, 'dd-mm-yyyy')
            || DECODE (rr.res_rsv_ruimte_van, NULL, NULL, ' / ')
            || TO_CHAR (rr.res_rsv_ruimte_tot, 'dd-mm-yyyy')
               datum,
            TRIM (res_ruimte_omschrijving) ruimte_art_oms,
            pf.prs_perslid_key,
            -- Indien non-resident host, dan de omschrijving (waar externe gastheer wordt ingevuld) naar SAP.
            DECODE(pf.prs_perslid_key, 40727, COALESCE(res_rsv_ruimte_omschrijving, pf.prs_perslid_naam_full, ' '), COALESCE (pf.prs_perslid_naam_full, ' ')  ) melder,
            COALESCE(ac.companycode, 'LEEG') companycode,
            ROUND (COALESCE (res.getruimteprijs (rr.res_rsv_ruimte_key), 0), 2)
               stukprijs,
            '    ' artikelgroep,
            akza_ea.ins_discipline_omschrijving catalogus,
            rg.alg_locatie_key
     FROM   (SELECT   rr.*, CAST(NULL AS NUMBER) res_rsv_artikel_key, CAST(NULL AS NUMBER) res_rsv_deel_key
               FROM   (SELECT   rr.*, r.res_ruimte_key
                         FROM   res_rsv_ruimte rr, res_ruimte_opstelling ro, res_ruimte r
                        WHERE   rr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                                AND ro.res_ruimte_key = r.res_ruimte_key) rr
              WHERE   1 = 1 AND res_rsv_ruimte_verwijder IS NULL AND rr.res_status_bo_key = 5) rr,
            akza_v_kostenplaats akza_k,
            (SELECT * FROM prs_kenmerklink
              WHERE prs_kenmerk_key = 1380
                AND prs_kenmerklink_verwijder IS NULL) kl,
            akza_v_afdelingcompany ac,
            (SELECT   rg.res_discipline_key ins_discipline_key, d.ins_discipline_omschrijving, rg.res_ruimte_key,
                      ks.prs_kostensoort_oms kostensoort
               FROM   res_v_res_ruimte_gegevens rg, ins_tab_discipline d, prs_kostensoort ks
              WHERE   d.ins_discipline_key = rg.res_discipline_key
                      AND d.prs_kostensoort_key = ks.prs_kostensoort_key(+) ) akza_ea,
            (SELECT   l.alg_locatie_key,
                      rg.res_reservering_key,
                      rg.res_rsv_ruimte_key,
                      l.alg_locatie_code || '-' || rg.res_ruimte_nr res_ruimte_omschrijving
               FROM   (SELECT   rr2.res_reservering_key, rr2.res_rsv_ruimte_key, rr.alg_ruimte_key, rr.res_ruimte_key, r.res_ruimte_nr res_ruimte_nr
                         FROM   res_v_rsv_ruimte_2_alg_ruimte rr, res_rsv_ruimte rr2, res_ruimte r
                        WHERE   rr2.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
                        AND     rr.res_ruimte_key = r.res_ruimte_key) rg,
                      alg_ruimte r,
                      alg_verdieping v,
                      alg_gebouw g,
                      alg_locatie l
              WHERE   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 rg.alg_ruimte_key = r.alg_ruimte_key) rg,
            prs_v_perslid_fullnames_all pf
    WHERE       1 = 1
             AND rr.res_reservering_key NOT IN (SELECT res_reservering_key FROM akza_v_ritten_reservering)
            AND rr.res_rsv_ruimte_contact_key = pf.prs_perslid_key
            AND rr.prs_kostenplaats_key = akza_k.prs_kostenplaats_key
            AND kl.prs_kenmerklink_waarde(+) = akza_k.debiteurnr
            AND ac.prs_afdeling_key(+) = kl.prs_link_key
            AND akza_ea.res_ruimte_key(+) = rr.res_ruimte_key
            AND rr.res_rsv_ruimte_key = rg.res_rsv_ruimte_key(+);

CREATE OR REPLACE VIEW akza_v_export_resritten
(
   soort,
   res_rsv_ruimte_key,
   res_rsv_artikel_key,
   res_rsv_deel_key,
   res_rsv_ruimte_kosten_klant,
   res_rsv_ruimte_ordernr,
   ins_discipline_key,
   kostenplaatscode,
   debiteurnr,
   kostensoort,
   einddatum,
   bedrag,
   postkey,
   valuta,
   aantal,
   btw,
   res_reservering_key,
   res_rsv_ruimte_volgnr,
   datum,
   ruimte_art_oms,
   melder_key,
   melder,
   companycode,
   stukprijs,
   artikelgroep,
   catalogus,
   alg_locatie_key
)
AS
   SELECT   DISTINCT 'rit',
            rr.res_rsv_ruimte_key,
            rr.res_rsv_artikel_key,
            rr.res_rsv_deel_key,
            rr.res_rsv_ruimte_kosten_klant,
            res_rsv_ruimte_ordernr,
            akza_ea.ins_discipline_key,
            akza_k.prs_kostenplaats_nr kostenplaatscode,
            akza_k.debiteurnr,
            akza_ea.kostensoort,
            rr.res_rsv_ruimte_tot einddatum,
            ROUND ( COALESCE (rit_sap.totaal, 0), 2)
               bedrag,
            '40' postkey,
            'EUR' valuta,
            1 aantal,
            '21' btw,
            rr.res_reservering_key,
            rr.res_rsv_ruimte_volgnr,
               TO_CHAR (rr.res_rsv_ruimte_van, 'dd-mm-yyyy')
            || DECODE (rr.res_rsv_ruimte_van, NULL, NULL, ' / ')
            || TO_CHAR (rr.res_rsv_ruimte_tot, 'dd-mm-yyyy')
               datum,
            TRIM (rit_sap.chauffeur) ruimte_art_oms,
            pf.prs_perslid_key,
            DECODE(rit_sap.rit_nonresidentpass,
                   NULL, pf.prs_perslid_naam_full,
                   res_rsv_ruimte_omschrijving)
               melder,
            COALESCE(ac.companycode, 'LEEG') companycode,
            ROUND ( COALESCE (rit_sap.totaal, 0), 2)
               stukprijs,
            '' artikelgroep,
            akza_ea.ins_discipline_omschrijving catalogus,
            0 alg_locatie_key
     FROM   (SELECT   rr.*, CAST(NULL AS NUMBER) res_rsv_artikel_key, CAST(NULL AS NUMBER) res_rsv_deel_key
               FROM   (SELECT   rr.*, r.res_ruimte_key
                         FROM   res_rsv_ruimte rr, res_ruimte_opstelling ro, res_ruimte r
                        WHERE   rr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
                                AND ro.res_ruimte_key = r.res_ruimte_key) rr
              WHERE   1 = 1 AND res_rsv_ruimte_verwijder IS NULL AND rr.res_status_bo_key = 5) rr,
            akza_v_kostenplaats akza_k,
            (SELECT * FROM prs_kenmerklink
              WHERE prs_kenmerk_key = 1380
                AND prs_kenmerklink_verwijder IS NULL) kl,
            akza_v_afdelingcompany ac,
            (SELECT   rg.res_discipline_key ins_discipline_key, d.ins_discipline_omschrijving, rg.res_ruimte_key,
                      ks.prs_kostensoort_oms kostensoort
               FROM   res_v_res_ruimte_gegevens rg, ins_tab_discipline d, prs_kostensoort ks
              WHERE   d.ins_discipline_key = rg.res_discipline_key
                AND   d.prs_kostensoort_key = ks.prs_kostensoort_key(+) ) akza_ea,
            prs_v_perslid_fullnames_all pf,
            akza_v_ritten_doorbelast_sap rit_sap
    WHERE   rr.res_rsv_ruimte_contact_key = pf.prs_perslid_key
            AND rr.res_rsv_ruimte_key = rit_sap.res_rsv_ruimte_key
            AND rr.prs_kostenplaats_key = akza_k.prs_kostenplaats_key
            AND kl.prs_kenmerklink_waarde(+) = akza_k.debiteurnr
            AND ac.prs_afdeling_key(+) = kl.prs_link_key
            AND akza_ea.res_ruimte_key(+) = rr.res_ruimte_key;

--- BASISVIEWS LOGISTIEK -------------------------------------------------------

CREATE OR REPLACE VIEW akza_v_kpn_logistiek
AS
   SELECT prs_kostenplaats_key,
          prs_kostenplaats_omschrijving || ' - ' || prs_kostenplaats_nr kpn,
          prs_kostenplaats_verwijder
     FROM prs_kostenplaats;

-- AKZA#23427: Logistieke dienst / postkamer / expeditie
-- View voor berekening kosten/opbrengsten van door postkamer verleende diensten.
-- Views voor rapportage en doorbelasting.

----- PRIJSLIJST (Eigen tabel met vaste bedragen voor verleende diensten) -----
--    Bezorgen van goederen per levering
--    Bezorgen van goederen op afleveradres (p/levering)             1749
--    Bezorgen van goederen op pallet (p/levering)                   1750
--    Spoed bezorgen van goederen (p/levering)                       1751
--    Spoed bezorgen van goederen op pallet (p/levering)             1752
--    Bezorgen toner / papier (p/st)                                 1753
--    Expeditie transportkosten
--    Verzending voorbereiden binnen Europa                          1755
--    Verzending voorbereiden binnen Europa gevaarlijk               1756
--    Verzending voorbereiden binnenland                             1757
--    Verzending voorbereiden binnenland gevaarlijk                  1758
--    Verzending voorbereiden buiten Europa                          1759
--    Verzending voorbereiden buiten Europa gevaarlijk               1760
--    Koerierszendingen/aangetekende poststukken ex.verzendkosten
--    Koerier DHL met bekend adres in het systeem (p/st)             1764
--    Koerier DHL met onbekend adres in het systeem (p/st)           1765
--    Koerier DHL terugkoppeling (p/recu)                            1766
--    Afhandeling per levering
--    Afboeken van ontvangen goederen                                1769
--    Controleren van ontvangen goederen                             1770
--    Ontvangen/sorteren van goederen met naam                       1771
--    Ontvangen/sorteren van goederen zonder naam                    1772
--    Gecombineerd ophalen/bezorgen
--    Ophalen en bezorgen van bulkpakketten op pallet (OHZ)          1775
--    Ophalen en bezorgen van (lunch)pakketten (HZ)                  1774
--    Ophalen van goederen
--    Ophalen van pakketten (HZP)                                    1777
--    Ophalen van bulk pakketten op pallet (OHZP)                    1778
--    Algemene maandelijkse kosten
--    Opslagkosten kelder C2 (p/pallet)                              1780
--    Verwerkingskosten
--    Verwerkingstijd: mailing, verz.exp., ontv.goed. (p/kwartier)   1782
--    Toner/papier:
--    Bezorgen toner/papier (p/st)                                   2172
--    Vaste kosten:
--    Looprondes (p/maand)                                           2176
--    Dagblad bezorgen (p/maand)                                     2177
--    Opslag container                                               2197

-- View voor berekening kosten/opbrengsten van door postkamer verleende diensten.
-- Dit zijn diverse meldingen en opdrachten en bezorgde lunchpakketten (RES)
-- Voor (vrijwel) elke handeling geldt een bepaald basisbedrag, met daarbij een
-- aantal toeslagen (voor gevaarlijke goederen, spoed etc).
-- Deze view bevat alle benodigde gegevens voor de management info rapportages en
-- de view(s) voor doorbelasting.
-- Alleen afgehandelde zaken zijn relevant, dus de volgende statussen:
--    - melding:
--          5 Afgemeld
--          6 Historie
--    - opdracht:
--          6 Afgemeld
--          7 Verwerkt
--          9 Afgerond
--    - reservering:
--          5 Afgemeld
--          6 Verwerkt
-- Doorbelaste bedragen worden historisch vastgelegd in een read-only kenmerk bij
-- meldingen en opdrachten (kenmerksoort 462):
--    - vakgroeptype Logistiek:        kenmerk 562
--    - opdrachttype Verzending NL:    kenmerk 566
--    - opdrachttype Verzending EU:    kenmerk 565
--    - opdrachttype Verzending WW:    kenmerk 567
--TODO: crediteurnr = COALESCE( company_van(behandelaar), '0801')
CREATE OR REPLACE VIEW akza_v_logistiek_doorbel
AS
SELECT key,
       xmlnode,
       nummer,
       melder,
       melding,
       vakgroep,
       datum,
       status,
       einddatum,
       kostenplaats_key,
       kostenplaats_nr,
       kostenplaats_oms,
       ordernr,
       po_nr,
       kostensoort,
       stuks, gewicht, verwerkingstijd,
       opgehaald, onhandzaam, gevaarlijk, spoed,
       onb_adr,
       basistarief, afgeboekt, gecontroleerd, bezorgd,
       aangetekend, terugkoppel,
       mailing, couverteren,
       ophaalkosten, materiaalkosten,
       verwerkingskosten,
       totaal_kosten,
       doorbelast doorbelast_bedrag
  FROM (
      -- Ontvangst goederen:
      --    Goederen op naam           1041
      --    Goederen zonder naam       1042
      -- Kenmerken vakgroep:
      --    Onhandzaam pakket          521
      --    Aantal stuks               401
      --    Afgeboekt                  408
      --    Gecontroleerd              417
      --    Bezorgd                    413
      --    Verwerkingstijd            447
      --    PO-nummer                  434
      -- Prijslijst:
      --    Bezorgen van goederen per levering
      --    Bezorgen van goederen op afleveradres (p/levering)             1749
      --    Bezorgen van goederen op pallet (p/levering)                   1750
      --    Spoed bezorgen van goederen (p/levering)                       1751
      --    Spoed bezorgen van goederen op pallet (p/levering)             1752
      --    Afhandeling per levering
      --    Afboeken van ontvangen goederen                                1769
      --    Controleren van ontvangen goederen                             1770
      --    Ontvangen/sorteren van goederen met naam                       1771
      --    Ontvangen/sorteren van goederen zonder naam                    1772
      --    Verwerkingskosten
      --    Verwerkingstijd: mailing, verz.exp., ontv.goed. (p/kwartier)   1782
      SELECT key, 'melding' xmlnode, nummer, datum, einddatum, status, melder,
             melding, vakgroep, kostenplaats_key, kostenplaats_nr, kostenplaats_oms, ordernr, po_nr, kostensoort,
             stuks, NULL gewicht, verwerkingstijd,
             NULL opgehaald, onhandzaam, NULL gevaarlijk, spoed,
             NULL onb_adr,
             basistarief, afgeboekt, gecontroleerd, bezorgd,
             NULL aangetekend, NULL terugkoppel,
             NULL mailing, NULL couverteren,
             NULL ophaalkosten, NULL materiaalkosten,
             verwerkingskosten,
             basistarief + afgeboekt + gecontroleerd + bezorgd + verwerkingskosten totaal_kosten,
             doorbelast
        FROM (
         SELECT m.mld_melding_key key,
                'L'||m.mld_melding_key nummer,
                m.mld_melding_status status,
                m.mld_melding_datum datum,
                m.mld_melding_einddatum einddatum,
                s.mld_stdmelding_omschrijving melding,
                d.ins_discipline_omschrijving vakgroep,
                ak.prs_kostenplaats_key kostenplaats_key,
                ak.prs_kostenplaats_nr kostenplaats_nr,
                ak.prs_kostenplaats_omschrijving kostenplaats_oms,
                m.mld_melding_ordernr ordernr,
                po_nr.mld_kenmerkmelding_waarde po_nr,
                ks.prs_kostensoort_oms kostensoort,
                pf.prs_perslid_naam_full melder,
                fac.safe_to_number(stuks.mld_kenmerkmelding_waarde) stuks,
                fac.safe_to_number(ohz.mld_kenmerkmelding_waarde) onhandzaam,
                opzondernaam.fac_usrdata_prijs basistarief,
                DECODE(SIGN(2.5-m.mld_melding_spoed),
                       -1, NULL,
                        1, 1)
                  spoed,
                  COALESCE( fac.safe_to_number(afgeboekt.mld_kenmerkmelding_waarde), 0)
                * (SELECT fac_usrdata_prijs FROM fac_usrdata
                    WHERE fac_usrdata_key = 1769)
                  afgeboekt,
                  COALESCE( fac.safe_to_number(gecontroleerd.mld_kenmerkmelding_waarde), 0)
                * (SELECT fac_usrdata_prijs FROM fac_usrdata
                    WHERE fac_usrdata_key = 1770)
                  gecontroleerd,
                  COALESCE( fac.safe_to_number(bezorgd.mld_kenmerkmelding_waarde), 0)
                * (SELECT fac_usrdata_prijs FROM fac_usrdata
                    WHERE fac_usrdata_key =
                        DECODE(COALESCE( fac.safe_to_number(ohz.mld_kenmerkmelding_waarde), 0),
                               0, DECODE(SIGN(2.5-m.mld_melding_spoed),
                                         -1, 1749,       -- hz, norm
                                          1, 1751),      -- hz, spoed)
                               1, DECODE(SIGN(2.5-m.mld_melding_spoed),
                                         -1, 1750,       -- ohz
                                          1, 1752) ) )   -- ohz, spoed
                  bezorgd,
                COALESCE( fac.safe_to_number(verwerkingstijd.mld_kenmerkmelding_waarde), 0) verwerkingstijd,
                  COALESCE( fac.safe_to_number(verwerkingstijd.mld_kenmerkmelding_waarde), 0)
                * (SELECT fac_usrdata_prijs FROM fac_usrdata
                    WHERE fac_usrdata_key = 1782)
                  verwerkingskosten,
                fac.safe_to_number(doorbel.mld_kenmerkmelding_waarde) doorbelast
           FROM mld_melding m,
                mld_stdmelding s,
                mld_discipline d,
                prs_v_aanwezigkostenplaats ak,
                prs_kostensoort ks,
                prs_v_perslid_fullnames pf,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 521
                    AND mld_kenmerkmelding_verwijder IS NULL) ohz,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 401
                    AND mld_kenmerkmelding_verwijder IS NULL) stuks,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 408
                    AND mld_kenmerkmelding_verwijder IS NULL) afgeboekt,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 417
                    AND mld_kenmerkmelding_verwijder IS NULL) gecontroleerd,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 413
                    AND mld_kenmerkmelding_verwijder IS NULL) bezorgd,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 447
                    AND mld_kenmerkmelding_verwijder IS NULL) verwerkingstijd,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 434
                    AND mld_kenmerkmelding_verwijder IS NULL) po_nr,
                fac_usrdata opzondernaam,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 562
                    AND mld_kenmerkmelding_verwijder IS NULL) doorbel
          WHERE     m.mld_stdmelding_key IN (1041, 1042)
                AND m.mld_melding_status IN (5,6)
                AND s.mld_stdmelding_key = m.mld_stdmelding_key
                AND d.ins_discipline_key = s.mld_ins_discipline_key
                AND ak.prs_kostenplaats_key = m.prs_kostenplaats_key
                AND ks.prs_kostensoort_key = s.prs_kostensoort_key
                AND pf.prs_perslid_key = m.prs_perslid_key
                AND opzondernaam.fac_usrdata_key = DECODE(m.mld_stdmelding_key,
                                                          1042, 1772,
                                                          1771)
                AND ohz.mld_melding_key(+) = m.mld_melding_key
                AND stuks.mld_melding_key(+) = m.mld_melding_key
                AND afgeboekt.mld_melding_key(+) = m.mld_melding_key
                AND gecontroleerd.mld_melding_key(+) = m.mld_melding_key
                AND bezorgd.mld_melding_key(+) = m.mld_melding_key
                AND verwerkingstijd.mld_melding_key(+) = m.mld_melding_key
                AND po_nr.mld_melding_key(+) = m.mld_melding_key
                AND doorbel.mld_melding_key(+) = m.mld_melding_key
      )
      UNION ALL
      -- Intern pakket ophalen en bezorgen
      --    stdmelding_key             1043
      -- Kenmerken:
      --    Onhandzaam pakket          431
      -- Prijslijst:
      --    Ophalen en bezorgen van (lunch)pakketten (HZ)                  1774
      --    Ophalen en bezorgen van bulkpakketten op pallet (OHZ)          1775
      SELECT key, 'melding' xmlnode, nummer, datum, einddatum, status, melder,
             melding, vakgroep, kostenplaats_key, kostenplaats_nr, kostenplaats_oms, ordernr, NULL po_nr, kostensoort,
             NULL stuks, NULL gewicht, NULL verwerkingstijd,
             NULL opgehaald, onhandzaam, NULL gevaarlijk, NULL spoed,
             NULL onb_adr,
             totaal_kosten basistarief, NULL afgeboekt, NULL gecontroleerd, NULL bezorgd,
             NULL aangetekend,NULL  terugkoppel,
             NULL mailing, NULL couverteren,
             NULL ophaalkosten, NULL materiaalkosten,
             NULL verwerkingskosten,
             totaal_kosten,
             doorbelast
        FROM (
         SELECT m.mld_melding_key key,
                'L'||m.mld_melding_key nummer,
                m.mld_melding_status status,
                m.mld_melding_datum datum,
                m.mld_melding_einddatum einddatum,
                s.mld_stdmelding_omschrijving melding,
                d.ins_discipline_omschrijving vakgroep,
                ak.prs_kostenplaats_key kostenplaats_key,
                ak.prs_kostenplaats_nr kostenplaats_nr,
                ak.prs_kostenplaats_omschrijving kostenplaats_oms,
                m.mld_melding_ordernr ordernr,
                ks.prs_kostensoort_oms kostensoort,
                pf.prs_perslid_naam_full melder,
                COALESCE( fac.safe_to_number(ohz.mld_kenmerkmelding_waarde), 0) onhandzaam,
                (SELECT fac_usrdata_prijs FROM fac_usrdata
                    WHERE fac_usrdata_key =
                        DECODE(COALESCE( fac.safe_to_number(ohz.mld_kenmerkmelding_waarde), 0),
                               0, 1774,
                               1, 1775) )
                   totaal_kosten,
                fac.safe_to_number(doorbel.mld_kenmerkmelding_waarde) doorbelast
           FROM mld_melding m,
                mld_stdmelding s,
                mld_discipline d,
                prs_v_aanwezigkostenplaats ak,
                prs_kostensoort ks,
                prs_v_perslid_fullnames pf,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 431
                    AND mld_kenmerkmelding_verwijder IS NULL) ohz,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 562
                    AND mld_kenmerkmelding_verwijder IS NULL) doorbel
          WHERE     m.mld_stdmelding_key = 1043
                AND m.mld_melding_status IN (5,6)
                AND s.mld_stdmelding_key = m.mld_stdmelding_key
                AND d.ins_discipline_key = s.mld_ins_discipline_key
                AND ak.prs_kostenplaats_key = m.prs_kostenplaats_key
                AND ks.prs_kostensoort_key = s.prs_kostensoort_key
                AND pf.prs_perslid_key = m.prs_perslid_key
                AND ohz.mld_melding_key(+) = m.mld_melding_key
                AND doorbel.mld_melding_key(+) = m.mld_melding_key
      )
      UNION ALL
      -- Verzending koerier
      --    stdmelding_key             1044
      -- Kenmerken melding + usrtabs:
      --    Aangetekend verzenden      398
      --       Aangetekend                483
      --    Verzending terugkoppelen   449
      --    Onbekend adres             430
      -- Prijslijst:
      --    Koerier DHL met bekend adres in het systeem (p/st)             1764
      --    Koerier DHL met onbekend adres in het systeem (p/st)           1765
      --    Koerier DHL terugkoppeling (p/recu)                            1766
      SELECT key, 'melding' xmlnode, nummer, datum, einddatum, status, melder,
             melding, vakgroep, kostenplaats_key, kostenplaats_nr, kostenplaats_oms, ordernr, NULL po_nr, kostensoort,
             NULL stuks, NULL gewicht, NULL verwerkingstijd,
             NULL opgehaald, NULL onhandzaam, NULL gevaarlijk, NULL spoed,
             onb_adr,
             basistarief, NULL afgeboekt, NULL gecontroleerd, NULL bezorgd,
             aangetekend, terugkoppel,
             NULL mailing, NULL couverteren,
             NULL ophaalkosten, NULL materiaalkosten,
             NULL verwerkingskosten,
             basistarief + aangetekend + terugkoppel totaal_kosten,
             doorbelast
        FROM (
         SELECT m.mld_melding_key key,
                'L'||m.mld_melding_key nummer,
                m.mld_melding_status status,
                m.mld_melding_datum datum,
                m.mld_melding_einddatum einddatum,
                s.mld_stdmelding_omschrijving melding,
                d.ins_discipline_omschrijving vakgroep,
                ak.prs_kostenplaats_key kostenplaats_key,
                ak.prs_kostenplaats_nr kostenplaats_nr,
                ak.prs_kostenplaats_omschrijving kostenplaats_oms,
                m.mld_melding_ordernr ordernr,
                ks.prs_kostensoort_oms kostensoort,
                pf.prs_perslid_naam_full melder,
                COALESCE( fac.safe_to_number(onb_adr.mld_kenmerkmelding_waarde), 0) onb_adr,
                (SELECT fac_usrdata_prijs FROM fac_usrdata
                    WHERE fac_usrdata_key =
                        DECODE(COALESCE( fac.safe_to_number(onb_adr.mld_kenmerkmelding_waarde), 0),
                               1, 1765,
                               0, 1764) )
                   basistarief,
                ud.fac_usrdata_prijs aangetekend,
                  COALESCE( fac.safe_to_number(terugkoppel.mld_kenmerkmelding_waarde), 0)
                * (SELECT fac_usrdata_prijs FROM fac_usrdata
                    WHERE fac_usrdata_key = 1766)
                  terugkoppel,
                fac.safe_to_number(doorbel.mld_kenmerkmelding_waarde) doorbelast
           FROM mld_melding m,
                mld_stdmelding s,
                mld_discipline d,
                prs_v_aanwezigkostenplaats ak,
                prs_kostensoort ks,
                prs_v_perslid_fullnames pf,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 398
                    AND mld_kenmerkmelding_verwijder IS NULL) aangetekend,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 449
                    AND mld_kenmerkmelding_verwijder IS NULL) terugkoppel,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 430
                    AND mld_kenmerkmelding_verwijder IS NULL) onb_adr,
                (SELECT * FROM fac_usrdata WHERE fac_usrtab_key = 483) ud,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 562
                    AND mld_kenmerkmelding_verwijder IS NULL) doorbel
          WHERE     m.mld_stdmelding_key = 1044
                AND m.mld_melding_status IN (5,6)
                AND s.mld_stdmelding_key = m.mld_stdmelding_key
                AND d.ins_discipline_key = s.mld_ins_discipline_key
                AND ak.prs_kostenplaats_key = m.prs_kostenplaats_key
                AND ks.prs_kostensoort_key = s.prs_kostensoort_key
                AND pf.prs_perslid_key = m.prs_perslid_key
                AND aangetekend.mld_melding_key(+) = m.mld_melding_key
                AND ud.fac_usrdata_key(+) = fac.safe_to_number(aangetekend.mld_kenmerkmelding_waarde)
                AND terugkoppel.mld_melding_key(+) = m.mld_melding_key
                AND onb_adr.mld_melding_key(+) = m.mld_melding_key
                AND doorbel.mld_melding_key(+) = m.mld_melding_key
      )
      UNION ALL
      -- Mailing
      --    stdmelding_key             1045
      -- Kenmerken melding + usrtabs:
      --    Vellen                     443
      --       Mailing                    480
      --    Gewicht                    482
      --    Couverteren                480
      --       Couverteren                474
      --    Aantal stuks               483
      --    Verwerkingstijd            446
      -- Prijslijst:
      --    Verwerkingstijd: mailing, verz.exp., ontv.goed. (p/kwartier)   1782
      SELECT key,'melding' xmlnode,  nummer, datum, einddatum, status, melder,
             melding, vakgroep, kostenplaats_key, kostenplaats_nr, kostenplaats_oms, ordernr, NULL po_nr, kostensoort,
             stuks, gewicht, verwerkingstijd,
             NULL opgehaald, NULL onhandzaam, NULL gevaarlijk, NULL spoed,
             NULL onb_adr,
             0 basistarief, NULL afgeboekt, NULL gecontroleerd, NULL bezorgd,
             NULL aangetekend, NULL terugkoppel,
             gewicht * vellen mailing, stuks/100 * couverteren couverteren,
             NULL ophaalkosten, NULL materiaalkosten,
             verwerkingskosten,
             gewicht * vellen + stuks/100 * couverteren + verwerkingskosten totaal_kosten,
             doorbelast
        FROM (
         SELECT m.mld_melding_key key,
                'L'||m.mld_melding_key nummer,
                m.mld_melding_status status,
                m.mld_melding_datum datum,
                m.mld_melding_einddatum einddatum,
                s.mld_stdmelding_omschrijving melding,
                d.ins_discipline_omschrijving vakgroep,
                ak.prs_kostenplaats_key kostenplaats_key,
                ak.prs_kostenplaats_nr kostenplaats_nr,
                ak.prs_kostenplaats_omschrijving kostenplaats_oms,
                m.mld_melding_ordernr ordernr,
                ks.prs_kostensoort_oms kostensoort,
                pf.prs_perslid_naam_full melder,
                COALESCE( fac.safe_to_number(gewicht.mld_kenmerkmelding_waarde), 0) gewicht,
                COALESCE( fac.safe_to_number(stuks.mld_kenmerkmelding_waarde), 0) stuks,
                COALESCE( fac.safe_to_number(verwerkingstijd.mld_kenmerkmelding_waarde), 0) verwerkingstijd,
                mail.fac_usrdata_prijs vellen,
                couv.fac_usrdata_prijs couverteren,
                  COALESCE( fac.safe_to_number(verwerkingstijd.mld_kenmerkmelding_waarde), 0)
                * (SELECT fac_usrdata_prijs FROM fac_usrdata
                    WHERE fac_usrdata_key = 1782)
                  verwerkingskosten,
                fac.safe_to_number(doorbel.mld_kenmerkmelding_waarde) doorbelast
           FROM mld_melding m,
                mld_stdmelding s,
                mld_discipline d,
                prs_v_aanwezigkostenplaats ak,
                prs_kostensoort ks,
                prs_v_perslid_fullnames pf,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 443
                    AND mld_kenmerkmelding_verwijder IS NULL) vel,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 482
                    AND mld_kenmerkmelding_verwijder IS NULL) gewicht,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 480
                    AND mld_kenmerkmelding_verwijder IS NULL) couvert,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 483
                    AND mld_kenmerkmelding_verwijder IS NULL) stuks,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 446
                    AND mld_kenmerkmelding_verwijder IS NULL) verwerkingstijd,
                (SELECT * FROM fac_usrdata WHERE fac_usrtab_key = 480) mail,
                (SELECT * FROM fac_usrdata WHERE fac_usrtab_key = 474) couv,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 562
                    AND mld_kenmerkmelding_verwijder IS NULL) doorbel
          WHERE     m.mld_stdmelding_key = 1045
                AND m.mld_melding_status IN (5,6)
                AND s.mld_stdmelding_key = m.mld_stdmelding_key
                AND d.ins_discipline_key = s.mld_ins_discipline_key
                AND ak.prs_kostenplaats_key = m.prs_kostenplaats_key
                AND ks.prs_kostensoort_key = s.prs_kostensoort_key
                AND pf.prs_perslid_key = m.prs_perslid_key
                AND vel.mld_melding_key(+) = m.mld_melding_key
                AND mail.fac_usrdata_key(+) = fac.safe_to_number(vel.mld_kenmerkmelding_waarde)
                AND gewicht.mld_melding_key(+) = m.mld_melding_key
                AND couvert.mld_melding_key(+) = m.mld_melding_key
                AND couv.fac_usrdata_key(+) = fac.safe_to_number(couvert.mld_kenmerkmelding_waarde)
                AND stuks.mld_melding_key(+) = m.mld_melding_key
                AND verwerkingstijd.mld_melding_key(+) = m.mld_melding_key
                AND doorbel.mld_melding_key(+) = m.mld_melding_key
      )
      UNION ALL
      -- Maandrapportage postale diensten
      --    stdmelding_key             1046
      -- Kenmerken:
      --    Kostenplaats               420
      --    Bedrag                     411
      SELECT key, 'melding' xmlnode, nummer, datum, einddatum, status, melder,
             melding, vakgroep, kostenplaats_key, kostenplaats_nr, kostenplaats_oms, ordernr, NULL po_nr, kostensoort,
             NULL stuks, NULL gewicht, NULL verwerkingstijd,
             NULL opgehaald, NULL onhandzaam, NULL gevaarlijk, NULL spoed,
             NULL onb_adr,
             bedrag basistarief, NULL afgeboekt, NULL gecontroleerd, NULL bezorgd,
             NULL aangetekend, NULL terugkoppel,
             NULL mailing, NULL couverteren,
             NULL ophaalkosten, NULL materiaalkosten,
             NULL verwerkingskosten,
             bedrag totaal_kosten,
             doorbelast
        FROM (
         SELECT m.mld_melding_key key,
                'L'||m.mld_melding_key nummer,
                m.mld_melding_status status,
                m.mld_melding_datum datum,
                m.mld_melding_einddatum einddatum,
                s.mld_stdmelding_omschrijving melding,
                d.ins_discipline_omschrijving vakgroep,
                ak.prs_kostenplaats_key kostenplaats_key,
                ak.prs_kostenplaats_nr kostenplaats_nr,
                ak.prs_kostenplaats_omschrijving kostenplaats_oms,
                m.mld_melding_ordernr ordernr,
                ks.prs_kostensoort_oms kostensoort,
                pf.prs_perslid_naam_full melder,
                COALESCE( fac.safe_to_number(bedrag.mld_kenmerkmelding_waarde), 0) bedrag,
                fac.safe_to_number(doorbel.mld_kenmerkmelding_waarde) doorbelast
           FROM mld_melding m,
                mld_stdmelding s,
                mld_discipline d,
                prs_v_aanwezigkostenplaats ak,
                prs_kostensoort ks,
                prs_v_perslid_fullnames pf,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 420
                    AND mld_kenmerkmelding_verwijder IS NULL) kpn,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 411
                    AND mld_kenmerkmelding_verwijder IS NULL) bedrag,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 562
                    AND mld_kenmerkmelding_verwijder IS NULL) doorbel
          WHERE     m.mld_stdmelding_key = 1046
                AND m.mld_melding_status IN (5,6)
                AND s.mld_stdmelding_key = m.mld_stdmelding_key
                AND d.ins_discipline_key = s.mld_ins_discipline_key
                AND kpn.mld_melding_key(+) = m.mld_melding_key
                AND ak.prs_kostenplaats_key(+) = fac.safe_to_number(kpn.mld_kenmerkmelding_waarde)
                AND ks.prs_kostensoort_key = s.prs_kostensoort_key
                AND pf.prs_perslid_key = m.prs_perslid_key
                AND bedrag.mld_melding_key(+) = m.mld_melding_key
                AND doorbel.mld_melding_key(+) = m.mld_melding_key
      )
      UNION ALL
      -- Vaste kosten
      --    stdmelding_key             1101
      -- Kenmerken:
      --    Kostenplaats               564
      --    Postrondes                 561
      --    Dagbladen                  563
      --    Opslag containers          621
      -- Prijslijst:
      --    Looprondes (p/maand)                                           2176
      --    Dagblad bezorgen (p/maand)                                     2177
      --    Opslag container                                               2197
       SELECT key, 'melding' xmlnode, nummer, datum, einddatum, status, melder,
             melding, vakgroep, kostenplaats_key, kostenplaats_nr, kostenplaats_oms, ordernr, NULL po_nr, kostensoort,
             NULL stuks, NULL gewicht, NULL verwerkingstijd,
             NULL opgehaald, NULL onhandzaam, NULL gevaarlijk, NULL spoed,
             NULL onb_adr,
             postrondes + dagbladen + containers basistarief, NULL afgeboekt, NULL gecontroleerd, NULL bezorgd,
             NULL aangetekend, NULL terugkoppel,
             NULL mailing, NULL couverteren,
             NULL ophaalkosten, NULL materiaalkosten,
             NULL verwerkingskosten,
             postrondes + dagbladen + containers totaal_kosten,
             doorbelast
        FROM (
         SELECT m.mld_melding_key key,
                'L'||m.mld_melding_key nummer,
                m.mld_melding_status status,
                m.mld_melding_datum datum,
                m.mld_melding_einddatum einddatum,
                s.mld_stdmelding_omschrijving melding,
                d.ins_discipline_omschrijving vakgroep,
                ak.prs_kostenplaats_key kostenplaats_key,
                ak.prs_kostenplaats_nr kostenplaats_nr,
                ak.prs_kostenplaats_omschrijving kostenplaats_oms,
                m.mld_melding_ordernr ordernr,
                ks.prs_kostensoort_oms kostensoort,
                pf.prs_perslid_naam_full melder,
                COALESCE( fac.safe_to_number(pr.mld_kenmerkmelding_waarde), 0) postrondes,
                COALESCE( fac.safe_to_number(db.mld_kenmerkmelding_waarde), 0) dagbladen,
                COALESCE( fac.safe_to_number(oc.mld_kenmerkmelding_waarde), 0) containers,
                fac.safe_to_number(doorbel.mld_kenmerkmelding_waarde) doorbelast
           FROM mld_melding m,
                mld_stdmelding s,
                mld_discipline d,
                prs_v_aanwezigkostenplaats ak,
                prs_kostensoort ks,
                prs_v_perslid_fullnames pf,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 564
                    AND mld_kenmerkmelding_verwijder IS NULL) kpn,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 561
                    AND mld_kenmerkmelding_verwijder IS NULL) pr,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 563
                    AND mld_kenmerkmelding_verwijder IS NULL) db,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 621
                    AND mld_kenmerkmelding_verwijder IS NULL) oc,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 562
                    AND mld_kenmerkmelding_verwijder IS NULL) doorbel
          WHERE     m.mld_stdmelding_key = 1101
                AND m.mld_melding_status IN (5,6)
                AND s.mld_stdmelding_key = m.mld_stdmelding_key
                AND d.ins_discipline_key = s.mld_ins_discipline_key
                AND kpn.mld_melding_key(+) = m.mld_melding_key
                AND ak.prs_kostenplaats_key(+) = fac.safe_to_number(kpn.mld_kenmerkmelding_waarde)
                AND ks.prs_kostensoort_key = s.prs_kostensoort_key
                AND pf.prs_perslid_key = m.prs_perslid_key
                AND pr.mld_melding_key(+) = m.mld_melding_key
                AND oc.mld_melding_key(+) = m.mld_melding_key
                AND db.mld_melding_key(+) = m.mld_melding_key
                AND doorbel.mld_melding_key(+) = m.mld_melding_key
      )
      UNION ALL
      -- Toners/olie/nietjes
      --    stdmelding_key                1047
      -- Kenmerken melding + usrtabs:
      --    Kostenplaats                  415
      --    #Zwarte toner                 452
      --    #Rode toner                   440
      --    #Gele toner                   418
      --    #Blauwe toner                 414
      --    Olie                          429
      --    Nietjes                       428
      -- Prijslijst:
      --    Bezorgen toner/papier (p/st)  2172
      SELECT key, 'melding' xmlnode, nummer, datum, einddatum, status, melder,
             melding, vakgroep, kostenplaats_key, kostenplaats_nr, kostenplaats_oms, ordernr, NULL po_nr, kostensoort,
             (z+r+g+b+o+n) stuks, NULL gewicht, NULL verwerkingstijd,
             NULL opgehaald, NULL onhandzaam, NULL gevaarlijk, NULL spoed,
             NULL onb_adr,
             0 basistarief, NULL afgeboekt, NULL gecontroleerd, NULL bezorgd,
             NULL aangetekend, NULL terugkoppel,
             NULL mailing, NULL couverteren,
             NULL ophaalkosten, NULL materiaalkosten,
             NULL verwerkingskosten,
             (z+r+g+b+o+n) * stuksprijs totaal_kosten,
             doorbelast
        FROM (
         SELECT m.mld_melding_key key,
                'L'||m.mld_melding_key nummer,
                m.mld_melding_status status,
                m.mld_melding_datum datum,
                m.mld_melding_einddatum einddatum,
                s.mld_stdmelding_omschrijving melding,
                d.ins_discipline_omschrijving vakgroep,
                ak.prs_kostenplaats_key kostenplaats_key,
                ak.prs_kostenplaats_nr kostenplaats_nr,
                ak.prs_kostenplaats_omschrijving kostenplaats_oms,
                m.mld_melding_ordernr ordernr,
                ks.prs_kostensoort_oms kostensoort,
                pf.prs_perslid_naam_full melder,
                fac.safe_to_number(kpn.mld_kenmerkmelding_waarde) fkpn,
                m.prs_kostenplaats_key mkpn,
                COALESCE( fac.safe_to_number(zwart.mld_kenmerkmelding_waarde)  , 0 ) z,
                COALESCE( fac.safe_to_number(rood.mld_kenmerkmelding_waarde),    0 ) r,
                COALESCE( fac.safe_to_number(geel.mld_kenmerkmelding_waarde),    0 ) g,
                COALESCE( fac.safe_to_number(blauw.mld_kenmerkmelding_waarde),   0 ) b,
                COALESCE( fac.safe_to_number(olie.mld_kenmerkmelding_waarde),    0 ) o,
                COALESCE( fac.safe_to_number(nietjes.mld_kenmerkmelding_waarde), 0 ) n,
                (SELECT fac_usrdata_prijs FROM fac_usrdata WHERE fac_usrdata_key = 2172) stuksprijs,
                fac.safe_to_number(doorbel.mld_kenmerkmelding_waarde) doorbelast
           FROM mld_melding m,
                mld_stdmelding s,
                mld_discipline d,
                prs_v_aanwezigkostenplaats ak,
                prs_kostensoort ks,
                prs_v_perslid_fullnames pf,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 415
                    AND mld_kenmerkmelding_verwijder IS NULL) kpn,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 452
                    AND mld_kenmerkmelding_verwijder IS NULL) zwart,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 440
                    AND mld_kenmerkmelding_verwijder IS NULL) rood,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 418
                    AND mld_kenmerkmelding_verwijder IS NULL) geel,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 414
                    AND mld_kenmerkmelding_verwijder IS NULL) blauw,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 429
                    AND mld_kenmerkmelding_verwijder IS NULL) olie,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 428
                    AND mld_kenmerkmelding_verwijder IS NULL) nietjes,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 562
                    AND mld_kenmerkmelding_verwijder IS NULL) doorbel
          WHERE     m.mld_stdmelding_key = 1047
                AND m.mld_melding_status IN (5,6)
                AND s.mld_stdmelding_key = m.mld_stdmelding_key
                AND d.ins_discipline_key = s.mld_ins_discipline_key
                AND kpn.mld_melding_key(+) = m.mld_melding_key
                AND ak.prs_kostenplaats_key(+) = fac.safe_to_number(kpn.mld_kenmerkmelding_waarde)
                AND ks.prs_kostensoort_key = s.prs_kostensoort_key
                AND pf.prs_perslid_key = m.prs_perslid_key
                AND zwart.mld_melding_key(+) = m.mld_melding_key
                AND rood.mld_melding_key(+) = m.mld_melding_key
                AND geel.mld_melding_key(+) = m.mld_melding_key
                AND blauw.mld_melding_key(+) = m.mld_melding_key
                AND olie.mld_melding_key(+) = m.mld_melding_key
                AND nietjes.mld_melding_key(+) = m.mld_melding_key
                AND doorbel.mld_melding_key(+) = m.mld_melding_key
      )
      UNION ALL
      -- Papier
      --    stdmelding_key                1048
      -- Kenmerken melding + usrtabs:
      --    Kostenplaats                  415
      --    #dozen A4                     399
      --    #pakken A3                    400
      -- Prijslijst:
      --    Bezorgen toner/papier (p/st)  2172
      --    A4 (doos, inc bezorg, Teijin) 2173
      --    A3 (pak, inc bezorg, Teijin)  2174
      SELECT key, 'melding' xmlnode, nummer, datum, einddatum, status, melder,
             melding, vakgroep, kostenplaats_key, kostenplaats_nr, kostenplaats_oms, ordernr, NULL po_nr, kostensoort,
             (a4 + a3) stuks, NULL gewicht, NULL verwerkingstijd,
             NULL opgehaald, NULL onhandzaam, NULL gevaarlijk, NULL spoed,
             NULL onb_adr,
             0 basistarief, NULL afgeboekt, NULL gecontroleerd, NULL bezorgd,
             NULL aangetekend, NULL terugkoppel,
             NULL mailing, NULL couverteren,
             NULL ophaalkosten, NULL materiaalkosten,
             NULL verwerkingskosten,
             -- Papier wordt alleen aan Teijin doorbelast; Akzo betaalt alleen bezorging
             CASE
                WHEN prs_kostenplaats_key IN
                       (SELECT prs_kostenplaats_key
                          FROM prs_v_aanwezigkostenplaats
                         WHERE prs_kostenplaatsgrp_key IN (14,15) )
                THEN (a4 * prijs_a4) + (a3 * prijs_a3)
                ELSE (a4 + a3) * bezorging
             END
                totaal_kosten,
             doorbelast
        FROM (
         SELECT m.mld_melding_key key,
                'L'||m.mld_melding_key nummer,
                m.mld_melding_status status,
                m.mld_melding_datum datum,
                m.mld_melding_einddatum einddatum,
                s.mld_stdmelding_omschrijving melding,
                d.ins_discipline_omschrijving vakgroep,
                ak.prs_kostenplaats_key kostenplaats_key,
                ak.prs_kostenplaats_key,
                ak.prs_kostenplaats_nr kostenplaats_nr,
                ak.prs_kostenplaats_omschrijving kostenplaats_oms,
                m.mld_melding_ordernr ordernr,
                ks.prs_kostensoort_oms kostensoort,
                pf.prs_perslid_naam_full melder,
                COALESCE( fac.safe_to_number(a4.mld_kenmerkmelding_waarde), 0 ) a4,
                COALESCE( fac.safe_to_number(a3.mld_kenmerkmelding_waarde), 0 ) a3,
                (SELECT fac_usrdata_prijs FROM fac_usrdata WHERE fac_usrdata_key = 2172) bezorging,
                (SELECT fac_usrdata_prijs FROM fac_usrdata WHERE fac_usrdata_key = 2173) prijs_a4,
                (SELECT fac_usrdata_prijs FROM fac_usrdata WHERE fac_usrdata_key = 2174) prijs_a3,
                fac.safe_to_number(doorbel.mld_kenmerkmelding_waarde) doorbelast
           FROM mld_melding m,
                mld_stdmelding s,
                mld_discipline d,
                prs_v_aanwezigkostenplaats ak,
                prs_kostensoort ks,
                prs_v_perslid_fullnames pf,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 415
                    AND mld_kenmerkmelding_verwijder IS NULL) kpn,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 399
                    AND mld_kenmerkmelding_verwijder IS NULL) a4,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 400
                    AND mld_kenmerkmelding_verwijder IS NULL) a3,
                (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 562
                    AND mld_kenmerkmelding_verwijder IS NULL) doorbel
          WHERE     m.mld_stdmelding_key = 1048
                AND m.mld_melding_status IN (5,6)
                AND s.mld_stdmelding_key = m.mld_stdmelding_key
                AND d.ins_discipline_key = s.mld_ins_discipline_key
                AND kpn.mld_melding_key(+) = m.mld_melding_key
                AND ak.prs_kostenplaats_key(+) = fac.safe_to_number(kpn.mld_kenmerkmelding_waarde)
                AND ks.prs_kostensoort_key = s.prs_kostensoort_key
                AND pf.prs_perslid_key = m.prs_perslid_key
                AND a4.mld_melding_key(+) = m.mld_melding_key
                AND a3.mld_melding_key(+) = m.mld_melding_key
                AND doorbel.mld_melding_key(+) = m.mld_melding_key
      )
      UNION ALL
      -- Verzending Nederland/Europa/wereldwijd
      -- TODO: opdrachten groeperen per melding
      -- stdmelding_keys:
      --    Verzending Nederland    1049
      --    Verzending Europa       1050
      --    Verzending wereldwijd   1051
      -- typeopdr_keys:
      --    Verzending Nederland    1052
      --    Verzending Europa       1053
      --    Verzending wereldwijd   1054
      -- kenmerkmeldingen melding:
      --    Ophalen op WP           361
      --    Gevaarlijk              353
      --    Onhandzaam              360
      -- kenmerken melding:
      --    Vervoerder (NL)         502      (prijsoverrule DHL Europlus)
      -- kenmerkmeldingen opdracht:
      --    Aantal units            377
      -- prijslijst (usrtab_key 472):
      --    Verzending voorbereiden binnenland                             1757
      --    Verzending voorbereiden binnenland gevaarlijk                  1758
      --    Verzending voorbereiden binnen Europa                          1755
      --    Verzending voorbereiden binnen Europa gevaarlijk               1756
      --    Verzending voorbereiden buiten Europa                          1759
      --    Verzending voorbereiden buiten Europa gevaarlijk               1760
      --    Ophalen van pakketten (HZP)                                    1777
      --    Ophalen van bulk pakketten op pallet (OHZP)                    1778
      -- doorbelast bedrag:
      --    kenmerksoort   462
      --    kenmerken      566, 565, 567 (NL, EU, WW)
      SELECT key, 'opdracht' xmlnode, nummer, datum, einddatum, status, melder,
             melding, vakgroep, kostenplaats_key, kostenplaats_nr, kostenplaats_oms, ordernr, NULL po_nr, kostensoort,
             NULL stuks, NULL gewicht, NULL verwerkingstijd,
             opgehaald, onhandzaam, gevaarlijk, NULL spoed,
             NULL onb_adr,
             basistarief, NULL afgeboekt, NULL gecontroleerd, NULL bezorgd,
             NULL aangetekend, NULL terugkoppel,
             NULL mailing, NULL couverteren,
             ophaalkosten, materiaalkosten,
             NULL verwerkingskosten,
             basistarief + ophaalkosten + materiaalkosten totaal_kosten,
             doorbelast
        FROM (
         SELECT mld_opdr_key key,
                'L'||mld_melding_key||'/'||volgnr nummer,
                datum,
                einddatum,
                status,
                melder,
                melding,
                vakgroep,
                kostenplaats_key,
                kostenplaats_nr,
                kostenplaats_oms,
                ordernr,
                kostensoort,
                oph opgehaald, ohz onhandzaam, gvr gevaarlijk,
                  (SELECT fac_usrdata_prijs FROM fac_usrdata
                    WHERE fac_usrdata_key =
                        DECODE(gvr,
                         1, DECODE(mld_stdmelding_key,
                                   1051, 1760,
                                   1050, 1756,
                                   1049, 1758),
                         0, DECODE(mld_stdmelding_key,
                                   1051, 1759,
                                   1050, 1755,
                                   1049, DECODE(vervoerder,
                                                2165, 2165,
                                                1757)
                                  )
                        )
                   ) basistarief,
                   DECODE(oph,
                          1, (SELECT fac_usrdata_prijs FROM fac_usrdata
                               WHERE fac_usrdata_key = DECODE(ohz,
                                                              1, 1778,
                                                              1777) ),
                          0  ) ophaalkosten,
                mat materiaalkosten,
                doorbelast
           FROM (
            SELECT mldopdr.*,
                   COALESCE( fac.safe_to_number(ophalen.waarde), 0) oph,
                   COALESCE( fac.safe_to_number(gevaarlijk.waarde), 0) gvr,
                   COALESCE( fac.safe_to_number(onhandzaam.waarde), 0) ohz,
                   materiaal.kosten mat
              FROM (
               SELECT m.mld_melding_key,
                      m.mld_stdmelding_key,
                      s.mld_stdmelding_omschrijving melding,
                      d.ins_discipline_omschrijving vakgroep,
                      ak.prs_kostenplaats_key kostenplaats_key,
                      ak.prs_kostenplaats_nr kostenplaats_nr,
                      ak.prs_kostenplaats_omschrijving kostenplaats_oms,
                      m.mld_melding_ordernr ordernr,
                      ks.prs_kostensoort_oms kostensoort,
                      pf.prs_perslid_naam_full melder,
                      o.mld_opdr_bedrijfopdr_volgnr volgnr,
                      o.mld_opdr_key,
                      m.mld_melding_datum datum,
                      m.mld_melding_einddatum einddatum,
                      o.mld_statusopdr_key status,
                      o.mld_typeopdr_key,
                      t.mld_typeopdr_omschrijving,
                      fac.safe_to_number(nl.mld_kenmerkmelding_waarde) vervoerder,
                      fac.safe_to_number(doorbel.mld_kenmerkopdr_waarde) doorbelast
                 FROM mld_melding m,
                      mld_opdr o,
                      mld_typeopdr t,
                      mld_stdmelding s,
                      mld_discipline d,
                      prs_v_aanwezigkostenplaats ak,
                      prs_kostensoort ks,
                      prs_v_perslid_fullnames pf,
                      (SELECT * FROM mld_kenmerkmelding WHERE mld_kenmerk_key = 502) nl,
                      (SELECT * FROM mld_kenmerkopdr
                        WHERE mld_kenmerk_key IN (565, 566, 567)) doorbel
                WHERE     m.mld_stdmelding_key IN (1049, 1050, 1051)
                      AND m.mld_melding_status IN (5,6)
                      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 ak.prs_kostenplaats_key = o.prs_kostenplaats_key
                      AND ks.prs_kostensoort_key = s.prs_kostensoort_key
                      AND pf.prs_perslid_key = m.prs_perslid_key
                      AND o.mld_typeopdr_key IN (1052, 1053, 1054)
                      AND o.mld_statusopdr_key IN (6,7,9)
                      AND t.mld_typeopdr_key = o.mld_typeopdr_key
                      AND nl.mld_melding_key(+) = m.mld_melding_key
                      AND doorbel.mld_opdr_key(+) = o.mld_opdr_key ) mldopdr
            LEFT OUTER JOIN (
               SELECT km.mld_melding_key,
                      km.mld_kenmerk_key,
                      km.mld_kenmerkmelding_waarde waarde
                 FROM mld_kenmerkmelding km,
                      mld_kenmerk k
                WHERE     k.mld_srtkenmerk_key = 361
                      AND km.mld_kenmerk_key = k.mld_kenmerk_key
                      AND km.mld_kenmerkmelding_verwijder IS NULL ) ophalen
            ON ophalen.mld_melding_key = mldopdr.mld_melding_key
            LEFT OUTER JOIN (
               SELECT km.mld_melding_key,
                      km.mld_kenmerk_key,
                      km.mld_kenmerkmelding_waarde waarde
                 FROM mld_kenmerkmelding km,
                      mld_kenmerk k
                WHERE     k.mld_srtkenmerk_key = 353
                      AND km.mld_kenmerk_key = k.mld_kenmerk_key
                      AND km.mld_kenmerkmelding_verwijder IS NULL ) gevaarlijk
            ON gevaarlijk.mld_melding_key = mldopdr.mld_melding_key
            LEFT OUTER JOIN (
               SELECT km.mld_melding_key,
                      km.mld_kenmerk_key,
                      km.mld_kenmerkmelding_waarde waarde
                 FROM mld_kenmerkmelding km,
                      mld_kenmerk k
                WHERE     k.mld_srtkenmerk_key = 360
                      AND km.mld_kenmerk_key = k.mld_kenmerk_key
                      AND km.mld_kenmerkmelding_verwijder IS NULL) onhandzaam
            ON onhandzaam.mld_melding_key = mldopdr.mld_melding_key
            LEFT OUTER JOIN (
               SELECT om.mld_opdr_key,
                      SUM(mld_opdr_materiaal_aantal * mld_opdr_materiaal_prijs) kosten
                 FROM mld_opdr_materiaal om,
                      mld_opdr o
                WHERE om.mld_opdr_key = o.mld_opdr_key
                      AND o.mld_typeopdr_key IN (1052, 1053, 1054)
                      AND o.mld_statusopdr_key IN (6,7,9)
                      AND om.fac_usrdata_key IS NOT NULL
               GROUP BY om.mld_opdr_key) materiaal
            ON materiaal.mld_opdr_key = mldopdr.mld_opdr_key
         )
      )
      UNION ALL
      -- Bezorgen lunchpakketten
      -- catalogus "Te bezorgen lunchpakket SSCA"     875
      -- Prijslijst
      --    Ophalen en bezorgen van (lunch)pakketten (HZ)                  1774
      SELECT DISTINCT rr.res_rsv_ruimte_key key,
             'reservering' xmlnode,
             TO_CHAR(rr.res_reservering_key) nummer,
             ra.res_rsv_artikel_levering datum,
             rr.res_rsv_ruimte_tot einddatum,
             ra.res_status_bo_key status,
             pf.prs_perslid_naam_full melder,
             'Lunchpakket bezorgen' melding,
             'Reserveringen' vakgroep,
             ak.prs_kostenplaats_key kostenplaats_key,
             ak.prs_kostenplaats_nr kostenplaats_nr,
             ak.prs_kostenplaats_omschrijving kostenplaats_oms,
             rr.res_rsv_ruimte_ordernr ordernr,
             NULL po_nr,
             'SPOE' kostensoort,
             NULL stuks, NULL gewicht, NULL verwerkingstijd,
             NULL opgehaald, NULL onhandzaam, NULL gevaarlijk, NULL spoed,
             NULL onb_adr,
             ud.fac_usrdata_prijs basistarief, NULL afgeboekt, NULL gecontroleerd, NULL bezorgd,
             NULL aangetekend, NULL terugkoppel,
             NULL mailing, NULL couverteren,
             NULL ophaalkosten, NULL materiaalkosten,
             NULL verwerkingskosten,
             ud.fac_usrdata_prijs totaal_prijs,
             NULL doorbelast
        FROM res_artikel a,
             res_discipline d,
             res_rsv_artikel ra,
             res_rsv_ruimte rr,
             prs_v_aanwezigkostenplaats ak,
             prs_v_perslid_fullnames pf,
             fac_usrdata ud
       WHERE     a.res_discipline_key = 875
             AND d.ins_discipline_key = a.res_discipline_key
             AND ra.res_artikel_key = a.res_artikel_key
             AND ra.res_rsv_artikel_verwijder IS NULL
             AND ra.res_status_bo_key IN (5,6)
             AND TRUNC(ra.res_rsv_artikel_levering) BETWEEN TRUNC(TO_DATE('08-10-2012', 'DD-MM-YYYY'))
                                                        AND TRUNC(SYSDATE)
             AND rr.res_rsv_ruimte_key = ra.res_rsv_ruimte_key
             AND ak.prs_kostenplaats_key = rr.prs_kostenplaats_key
             AND pf.prs_perslid_key = rr.res_rsv_ruimte_contact_key
             AND ud.fac_usrdata_key = 1774);

--- PACKAGE MET REKENPROCEDURES; DEZE VULLEN DE EXPORTTABEL --------------------

CREATE OR REPLACE PACKAGE akza_p_sap
AS
   FUNCTION isnumber (pstring IN VARCHAR2) RETURN BOOLEAN;
   FUNCTION getBewonersOrdernr (pOpdracht_key IN NUMBER) RETURN VARCHAR2;
   FUNCTION getInternalOrdernr (pMelding_key IN NUMBER) RETURN VARCHAR2;

   PROCEDURE exp_mld       (p_applname IN VARCHAR2,
                            p_doUpdate IN BOOLEAN);
   PROCEDURE exp_res       (p_applname IN VARCHAR2,
                            p_doUpdate IN BOOLEAN);
   PROCEDURE exp_logistiek (p_applname IN VARCHAR2,
                            p_doUpdate IN BOOLEAN);
END;
/

CREATE OR REPLACE PACKAGE BODY akza_p_sap
AS
   FUNCTION isnumber (pstring IN VARCHAR2)
      RETURN BOOLEAN
   IS
      lnnumber NUMBER (10);
      lbisnumber BOOLEAN;
   BEGIN
      lbisnumber := TRUE;

      BEGIN
         lnnumber := fac.safe_to_number (pstring);
      EXCEPTION
         WHEN OTHERS
         THEN
            lbisnumber := FALSE;
      END;

      RETURN lbisnumber;
   END;

   FUNCTION getbewonersordernr (popdracht_key IN NUMBER)
      RETURN VARCHAR2
   IS
      lresult VARCHAR2 (1024);
   BEGIN
      BEGIN
         SELECT   mld_opdr_ordernr
           INTO   lresult
           FROM   mld_opdr
          WHERE   mld_opdr_key = popdracht_key;
      EXCEPTION
         WHEN OTHERS
         THEN
            lresult := '';
      END;

      RETURN lresult;
   END;

   FUNCTION getinternalordernr (pmelding_key IN NUMBER)
      RETURN VARCHAR2
   IS
      lresult VARCHAR2 (1024);
      lonroerendgoed_key NUMBER (10);
      lgebouw_key NUMBER (10);
      lterrien_key NUMBER (10);
      lonroerendgoed_type VARCHAR (2);
   BEGIN
      -- alg_gebouw_ordernr OR alg_terreinsector_ordernr
      BEGIN
         lresult := '';

         SELECT   mld_alg_onroerendgoed_keys
           INTO   lonroerendgoed_key
           FROM   mld_melding
          WHERE   mld_melding_key = pmelding_key;

         SELECT   alg_type, alg_terreinsector_key, alg_gebouw_key
           INTO   lonroerendgoed_type, lterrien_key, lgebouw_key
           FROM   alg_v_allonroerendgoed
          WHERE   alg_onroerendgoed_keys = lonroerendgoed_key;

         IF (lonroerendgoed_type = 'T')
         THEN
            SELECT   alg_terreinsector_ordernr
              INTO   lresult
              FROM   alg_terreinsector
             WHERE   alg_terreinsector_key = lterrien_key;
         ELSE                                                                    -- lOnroerendgoed_type in ('R','V','G')
            SELECT   alg_gebouw_ordernr
              INTO   lresult
              FROM   alg_gebouw
             WHERE   alg_gebouw_key = lgebouw_key;
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            lresult := '';
      END;

      RETURN lresult;
   END;

   -- Specify p_doUpdate to set TV/AV statusses in MLD
   -- Voorheen werd hier het leveranciernr (altijd bedrijf) opgehaald. Behandelaar lijkt me relevanter om
   -- te achterhalen wie de dienst geleverd heeft.
   PROCEDURE exp_mld (p_applname IN VARCHAR2, p_doUpdate IN BOOLEAN)
   IS
      -- Alle afgemelde deelopdrachten waarbij opdrachtkosten + aanneemsom != 0
      -- Alleen de Afvalverwijdering-opdrachten waarbij kenmerk "Correct op factuur" = "Ja"
      -- moeten worden geëxporteerd.
      -- mld_kenmerk     Aanneemsom                               2
      -- mld_typeopdr    Deelopdracht-afvalverwijdering         921
      -- mld_srtkenmerk  Correct op factuur aangetroffen?       208
      -- fac_usrdata     Reeds gefactureerd-->Ja               1236
      CURSOR sap_meldingen
      IS
           SELECT   m.mld_melding_key,
                    m.mld_alg_onroerendgoed_keys,
                    COALESCE( TRIM( ks.prs_kostensoort_oms), 'ONBEKEND') prs_kostensoort_oms,
                    pf.prs_perslid_naam_full,
                    k.prs_kostenplaats_nr,
                    k.prs_kostenplaats_key,
                    k.debiteurnr,
                    k.prs_kostenplaats_module,
                    d.ins_discipline_omschrijving||' / '||sm.mld_stdmelding_omschrijving
                       mld_stdmelding_omschrijving,
                    o.mld_opdr_key,
                       sd.ins_srtdiscipline_prefix
                    || TO_CHAR(m.mld_melding_key)||'/'
                    || TO_CHAR(o.mld_opdr_bedrijfopdr_volgnr)
                       nummer,
                    o.mld_uitvoerende_keys,
                    o.mld_opdr_kosten,
                    m.prs_perslid_key,
                    o.mld_typeopdr_key,
                    ac.companycode crediteurnr,
                    m.mld_melding_einddatum einddatum,
                    COALESCE(fac.safe_to_number(aanneemsom.mld_kenmerkopdr_waarde), 0) aanneemsom
             FROM   mld_melding m,
                    mld_stdmelding sm,
                    mld_discipline d,
                    ins_srtdiscipline sd,
                    mld_opdr o,
                    akza_v_kostenplaats k,
                    prs_kostensoort ks,
                    prs_v_perslid_fullnames_all pf,
                    prs_perslid p,
                    akza_v_afdelingcompany ac,
                    (SELECT * FROM mld_kenmerkopdr
                      WHERE mld_kenmerk_key = 2
                        AND mld_kenmerkopdr_verwijder IS NULL
                        AND mld_kenmerkopdr_waarde != '.00') aanneemsom,
                    (SELECT *
                       FROM mld_kenmerkopdr ko, mld_kenmerk k
                      WHERE k.mld_srtkenmerk_key = 208
                        AND k.mld_kenmerk_verwijder IS NULL
                        AND ko.mld_kenmerk_key = k.mld_kenmerk_key
                        AND ko.mld_kenmerkopdr_verwijder IS NULL
                        AND ko.mld_kenmerkopdr_waarde = '1236') correct
            WHERE       o.mld_statusopdr_key = 6
                    AND m.mld_melding_key = o.mld_melding_key
                    AND sm.mld_stdmelding_key = m.mld_stdmelding_key
                    AND d.ins_discipline_key = sm.mld_ins_discipline_key
                    AND sd.ins_srtdiscipline_key = d.ins_srtdiscipline_key
                    AND sd.ins_srtdiscipline_alg = 1                            -- AKZA#684
                    AND ks.prs_kostensoort_key(+) = d.prs_kostensoort_key
                    AND k.prs_kostenplaats_key(+) = o.prs_kostenplaats_key
                    AND p.prs_perslid_key = o.prs_perslid_key
                    AND ac.prs_afdeling_key = p.prs_afdeling_key
                    AND pf.prs_perslid_key = m.prs_perslid_key
                    AND aanneemsom.mld_opdr_key(+) = o.mld_opdr_key
                    AND correct.mld_opdr_key(+) = o.mld_opdr_key
                    -- Alleen als er kosten zijn
                    AND   o.mld_opdr_kosten + COALESCE(fac.safe_to_number(aanneemsom.mld_kenmerkopdr_waarde), 0) != 0
                    -- Als afvalverwijdering, dan ook correct op factuur
                    AND NOT (    o.mld_typeopdr_key = 921
                             AND (   correct.mld_kenmerkopdr_waarde IS NULL
                                  OR correct.mld_kenmerkopdr_waarde != '1236') )
         ORDER BY   m.mld_melding_key, o.mld_opdr_bedrijfopdr_volgnr;

      rec                        sap_meldingen%ROWTYPE;
      v_kostenplaats             VARCHAR2 (10);
      v_melding_key              NUMBER;
      v_debiteurnr               VARCHAR2 (12);
      v_companycode              VARCHAR2 (10);
      v_disciplinekostensoort    prs_kostensoort.prs_kostensoort_oms%TYPE;
      v_bewonersordernr          prs_kostenplaats.prs_kostenplaats_nr%TYPE;
      v_internalordernr          VARCHAR2 (255);
      v_opdrkosten               mld_opdr.mld_opdr_kosten%TYPE;
      v_leveranciernr            prs_bedrijf.prs_leverancier_nr%TYPE;
      v_opdrachten               NUMBER (10);
      v_aanneemsom               NUMBER (10, 2);
      v_count                    NUMBER;
      v_aanduiding               VARCHAR2(255);
      v_errormsg                 VARCHAR2(255);
      v_errorhint                VARCHAR2(255);
   BEGIN
      -- INIT
      v_errormsg   := 'init';
      v_errorhint  := 'init';
      v_aanduiding := 'init';

      DELETE akza_exp_sap
       WHERE soort = 'opdracht';

      DELETE imp_log
       WHERE imp_log_applicatie = p_applname
         AND imp_log_datum < SYSDATE - 185;

      FOR rec IN sap_meldingen
      LOOP
         BEGIN
            v_aanduiding := rec.nummer;
            v_debiteurnr := NULL;
            v_companycode := NULL;

            v_errormsg  :=   rec.prs_kostenplaats_module||'-kostenplaats '
                           ||rec.prs_kostenplaats_nr||' (#'||rec.prs_kostenplaats_key||')';

            v_errorhint := 'Fout bij overnemen gegevens';
            v_melding_key := rec.mld_melding_key;
            v_kostenplaats := rec.prs_kostenplaats_nr;
            v_disciplinekostensoort := rec.prs_kostensoort_oms;
            v_opdrkosten := rec.mld_opdr_kosten + rec.aanneemsom;

            -- Bepaal de Companycode adhv het bij de kostenplaatsgroep geregistreerde debiteurnr
            -- (verliep voorheen via kpn-->afdeling-->parent, maar dat levert soms meerdere resultaten)
            -- nu: kpn-->nr kpngroep = debiteurnr-->flexkenmerk "Debiteurnr" bij toplevel-afdeling = company
            v_errorhint := 'Geen debiteurnr en/of companycode gevonden!';
            SELECT DISTINCT k.debiteurnr, ac.companycode
              INTO v_debiteurnr, v_companycode
              FROM mld_opdr o,
                   akza_v_kostenplaats k,
                   prs_kenmerklink kl,
                   akza_v_afdelingcompany ac
             WHERE o.mld_opdr_key = rec.mld_opdr_key
               AND k.prs_kostenplaats_key = o.prs_kostenplaats_key
               AND kl.prs_kenmerklink_waarde = k.debiteurnr
               AND kl.prs_kenmerk_key = 1380
               AND kl.prs_kenmerklink_verwijder IS NULL
               AND ac.prs_afdeling_key = kl.prs_link_key;

            -- Eigenlijk is KostenKlant niet meer helemaal bepalend, het is meer of de gekozen kostenplaats
            -- een ALG of een PRS kostenplaats is!
            IF rec.prs_kostenplaats_module = 'PRS'
            THEN
               v_errormsg := 'PRS-kostenplaats';

               v_errorhint := 'Fout bij bepalen bewonersordernr';
               SELECT akza_p_sap.getbewonersordernr (rec.mld_opdr_key)
                 INTO v_bewonersordernr
                 FROM DUAL;

               -- PKO: (bewoners)ordernr wordt niet meer meegegeven in de export. In de nabije toekomst
               -- worden ordernrs als projectkostenplaatsen opgenomen. Daarom niet meer met kostenplaatsen
               -- en kostensoorten goochelen o.b.v. die ordernummers.
               IF 1=0
               THEN
                  IF     (SUBSTR (v_bewonersordernr, 1, 1) = 'B' OR SUBSTR (v_bewonersordernr, 1, 1) = 'b')
                     AND isnumber (SUBSTR (v_bewonersordernr, 3, 1))
                     AND fac.safe_to_number (SUBSTR (v_bewonersordernr, 3, 1)) >= 1
                     AND isnumber (SUBSTR (v_bewonersordernr, 6, 3))
                     AND fac.safe_to_number (SUBSTR (v_bewonersordernr, 6, 3)) >= 10
                     --AND v_companycode = defcompcode
                  THEN
                     --lgn('B');
                     --TODO: uit mail Erik van Asveld d.d. 25-02-2014: "Voor ‘bewoners orders’ (orders met een B,
                     --of zonder beginletter) is er geen één op één relatie meer. De meeboekrekening is de GL account
                     --waar de kosten uiteindelijk op de ontvangende kostenplaats terecht moet komen."
                     v_kostenplaats := '0000000';
                     v_disciplinekostensoort := '4310010';
                  ELSE
                     IF     (SUBSTR (v_bewonersordernr, 1, 1) = 'I' OR SUBSTR (v_bewonersordernr, 1, 1) = 'i')
                        AND isnumber (SUBSTR (v_bewonersordernr, 3, 1))
                        AND fac.safe_to_number (SUBSTR (v_bewonersordernr, 3, 1)) >= 1
                        AND isnumber (SUBSTR (v_bewonersordernr, 6, 3))
                        AND fac.safe_to_number (SUBSTR (v_bewonersordernr, 6, 3)) >= 10
                        --AND v_companycode = defcompcode
                     THEN
                        --lgn('I');
                        v_kostenplaats := '0000000';
                        v_disciplinekostensoort := '6999026';
                     ELSE
                        IF     (SUBSTR (v_bewonersordernr, 1, 1) = 'O' OR SUBSTR (v_bewonersordernr, 1, 1) = 'o')
                           AND isnumber (SUBSTR (v_bewonersordernr, 3, 1))
                           AND fac.safe_to_number (SUBSTR (v_bewonersordernr, 3, 1)) >= 1
                           AND isnumber (SUBSTR (v_bewonersordernr, 6, 3))
                           AND fac.safe_to_number (SUBSTR (v_bewonersordernr, 6, 3)) >= 10
                           --AND v_companycode = defcompcode
                        THEN
                           --lgn('O');
                           v_kostenplaats := '0000000';
                           v_disciplinekostensoort := '6999031';
                        END IF;
                     END IF;
                  END IF;
               END IF;

               -- PRS-kostenplaats, dus bewonersordernr gebruiken, niet internal ordernr.
               v_internalordernr := '';
            ELSE
               v_errormsg := 'ALG-kostenplaats';
               v_disciplinekostensoort := '4301001';
               -- ALG-kostenplaats, dus internal ordernr gebruiken, niet bewonersordernr.
               v_bewonersordernr := NULL;

               -- Zoek bij pand (of terrein) geregistreerd ordernr
               v_errorhint := 'Fout bij bepalen internal ordernr';
               SELECT SUBSTR( akza_p_sap.getinternalordernr (rec.mld_melding_key), 1, 6)
                 INTO v_internalordernr
                 FROM DUAL;
               IF fac.safe_to_number (SUBSTR (v_internalordernr, 1, 1)) >= 1
                  AND fac.safe_to_number (SUBSTR (v_internalordernr, 4, 3)) >= 10
               THEN
                  v_disciplinekostensoort := '4310010';
               END IF;
            END IF;

            IF v_opdrkosten != 0
            THEN
               v_errormsg := 'Insert record';
               v_errorhint := 'Invoegen record mislukt!';
               INSERT INTO akza_exp_sap
                  (soort,
                   crediteurnr,
                   debiteurnr,
                   companycode,
                   costcentre,
                   ordernr,
                   postingkey,
                   kostensoort,
                   key,
                   refnr,
                   einddatum,
                   bedrag_ex,
                   bedrag_inc,
                   btwcode,
                   omschrijving,
                   perslid)
               VALUES
                  ('opdracht',
                   rec.crediteurnr,
                   v_debiteurnr,
                   v_companycode,
                   v_kostenplaats,
                   COALESCE(v_bewonersordernr, v_internalordernr),
                   CASE
                      WHEN v_opdrkosten >= 0 THEN '40'
                      ELSE '50'
                   END,
                   v_disciplinekostensoort,
                   rec.mld_opdr_key,
                   rec.nummer,
                   COALESCE((SELECT MAX(fac_tracking_datum)
                               FROM fac_tracking
                              WHERE fac_tracking_refkey = rec.mld_opdr_key
                                AND fac_srtnotificatie_key = 26),
                            rec.einddatum),
                   v_opdrkosten,
                   ROUND(v_opdrkosten * 1.21, 2),
                   '21',
                   rec.mld_stdmelding_omschrijving,
                   rec.prs_perslid_naam_full);

               fac.writelog (p_applname, 'I',
                             v_aanduiding,
                             v_opdrkosten
                            );
            END IF;

            -- Zet de status van de melding op 'Verwerkt'.
            -- Als er opdrachten zijn dan moeten deze op 'Verwerkt' gezet worden,
            -- anders moet de melding zelf op 'Verwerkt' gezet worden.
            IF p_doUpdate
            THEN
               v_errormsg := 'p_doUpdate';
               v_errorhint := 'Fout bij zoeken opdrachten';

               SELECT   COUNT ( * )
                 INTO   v_opdrachten
                 FROM   mld_opdr
                WHERE   mld_melding_key = rec.mld_melding_key;

               IF v_opdrachten > 0                              -- Always true, since this is cursor criterium
               THEN
                  v_errorhint := 'Fout bij zetten opdrachtstatus';
                  FOR opdrrec
                     IN (SELECT   mld_opdr_key
                           FROM   mld_opdr
                          WHERE   mld_statusopdr_key = 6
                                  AND mld_melding_key = rec.mld_melding_key)
                  LOOP
                     v_errorhint := 'Opdracht #'||opdrrec.mld_opdr_key||' verwerken';
                     mld.setopdrachtstatus (opdrrec.mld_opdr_key, 7, NULL);
                  END LOOP;

                  -- Tel het aantal nog niet AV-verklaarde (verwerkte) opdrachten bij deze melding
                  -- Als dat er 0 zijn, moet de melding ook status Verwerkt krijgen
                  -- 981119/pf #2083
                  v_errorhint := 'Fout bij tellen opdrachten';
                  SELECT   COUNT ( * )
                    INTO   v_opdrachten
                    FROM   mld_opdr
                   WHERE   mld_melding_key = rec.mld_melding_key
                     AND   mld_statusopdr_key <> 7;

                  IF v_opdrachten = 0
                  THEN
                     v_errorhint := 'Fout bij verwerken melding '||rec.mld_melding_key;
                     mld.setmeldingstatus (rec.mld_melding_key, 6, NULL);
                     fac.writelog (p_applname, 'I',
                                   rec.mld_melding_key,
                                   'Verwerkt'
                                  );
                  END IF;
               ELSE
                  v_errorhint := 'Fout bij verwerken melding '||rec.mld_melding_key||' (zonder opdrachten)';
                  mld.setmeldingstatus (rec.mld_melding_key, 6, NULL);
                  fac.writelog (p_applname, 'I',
                                rec.mld_melding_key,
                                'Verwerkt'
                               );
               END IF;
            END IF;

         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               fac.writelog (p_applname, 'E',
                             v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                             'Geen gegevens gevonden (' || SUBSTR (SQLERRM, 1, 9) || ')'
                            );
            WHEN OTHERS
            THEN
               fac.writelog (p_applname, 'E',
                             v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                             'Error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 100)
                            );
         END;
      END LOOP;

      COMMIT;
   EXCEPTION
      WHEN OTHERS
      THEN
         fac.writelog (p_applname, 'E',
                       v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                       'Error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 100)
                      );
         COMMIT;
   END;

   -- Specify p_doUpdate to set TV/AV statuses in Catering
   PROCEDURE exp_res (p_applname IN VARCHAR2, p_doUpdate IN BOOLEAN)
   IS
      -- Alle reserveringen met kosten
      CURSOR c_sapres
      IS
            SELECT r.*,
                   DECODE (r.alg_locatie_key,
                             2, '0801',    -- SSCA
                           161, '0801',    -- AHO
                             0, '0801',    -- AHO (rit)
                           121, '1435')    -- DEV
                      crediteurnr
              FROM (   SELECT * FROM akza_v_export_catering
                    UNION ALL
                       SELECT * FROM akza_v_export_resdeel
                    UNION ALL
                       SELECT * FROM akza_v_export_resruimten
                    UNION ALL
                       SELECT * FROM akza_v_export_resritten) r
             WHERE bedrag > 0;

      rec c_sapres%ROWTYPE;

      v_companycode VARCHAR2 (12);
      v_kostensoort VARCHAR2 (12);
      v_btw VARCHAR2 (2);

      v_errorhint   VARCHAR2(100);
      v_errormsg    VARCHAR2(100);
      v_aanduiding  VARCHAR2(100);

   BEGIN
      v_aanduiding := 'init';
      v_errormsg   := 'init';
      v_errorhint  := 'init';

      DELETE akza_exp_sap
       WHERE soort IN ('artikel', 'deel', 'ruimte', 'rit');

      DELETE imp_log
       WHERE imp_log_applicatie = p_applname
         AND imp_log_datum < SYSDATE - 185;

      FOR rec IN c_sapres
      LOOP
         BEGIN
            v_aanduiding := rec.res_reservering_key||'/'||rec.res_rsv_ruimte_volgnr||' - '||rec.ruimte_art_oms;

            v_errormsg  := 'Start';
            v_errorhint := 'Fout bij overnemen gegevens';
            v_companycode := rec.companycode;
            v_kostensoort := rec.kostensoort;

            v_errormsg := 'Insert record';
            v_errorhint := 'Invoegen record mislukt!';
            INSERT INTO akza_exp_sap
               (soort,
                crediteurnr,
                debiteurnr,
                companycode,
                costcentre,
                ordernr,
                postingkey,
                kostensoort,
                key,
                refnr,
                einddatum,
                bedrag_ex,
                bedrag_inc,
                btwcode,
                omschrijving,
                perslid)
            VALUES
               (rec.soort,
                rec.crediteurnr,
                rec.debiteurnr,
                rec.companycode,
                rec.kostenplaatscode,
                rec.res_rsv_ruimte_ordernr,
                rec.postkey,
                rec.kostensoort,
                COALESCE(rec.res_rsv_deel_key, rec.res_rsv_artikel_key, rec.res_rsv_ruimte_key),
                TO_CHAR(rec.res_reservering_key)||'/'||TO_CHAR(rec.res_rsv_ruimte_volgnr),
                COALESCE((SELECT MAX(fac_tracking_datum)
                            FROM fac_tracking
                           WHERE fac_tracking_refkey = rec.res_rsv_ruimte_key
                             AND fac_srtnotificatie_key = 32),
                         rec.einddatum),
                rec.bedrag,
                ROUND(rec.bedrag * (1 + fac.safe_to_number(rec.btw/100) ), 2),
                rec.btw,
                rec.datum||' '||rec.ruimte_art_oms,
                rec.melder);

            fac.writelog(p_applname, 'I',
                         v_aanduiding,
                         rec.bedrag);

            IF p_doUpdate
            THEN
               v_errormsg  := 'Update status';
               v_errorhint := 'Fout bij '||rec.soort;

               IF (rec.res_rsv_artikel_key IS NOT NULL)
               THEN
                  UPDATE   res_rsv_artikel
                     SET   res_status_bo_key = 6
                   WHERE   res_status_bo_key = 5 AND res_rsv_artikel_key = rec.res_rsv_artikel_key;
               END IF;

               IF (rec.res_rsv_deel_key IS NOT NULL)
               THEN
                  UPDATE   res_rsv_deel
                     SET   res_status_bo_key = 6
                   WHERE   res_status_bo_key = 5 AND res_rsv_deel_key = rec.res_rsv_deel_key;
               END IF;

               IF (rec.res_rsv_deel_key IS NULL) AND (rec.res_rsv_artikel_key IS NULL)
               THEN
                  UPDATE   res_rsv_ruimte
                     SET   res_status_bo_key = 6
                   WHERE   res_status_bo_key = 5 AND res_rsv_ruimte_key = rec.res_rsv_ruimte_key;
               END IF;

               fac.trackaction ('RESVER', rec.res_rsv_ruimte_key, NULL, NULL, NULL);
            END IF;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               fac.writelog (p_applname, 'E',
                             v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                             'Geen gegevens gevonden (' || SUBSTR (SQLERRM, 1, 9) || ')'
                            );
            WHEN OTHERS
            THEN
               fac.writelog (p_applname, 'E',
                             v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                             'Error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 100)
                            );                                                                                   -- tbv logging
         END;
      END LOOP;
   EXCEPTION
      WHEN OTHERS
      THEN
         fac.writelog (p_applname, 'E',
                       v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                       'Error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 100)
                      );
      COMMIT;
   END;

   PROCEDURE exp_logistiek (p_applname IN VARCHAR2, p_doUpdate IN BOOLEAN)
   IS
      v_aanduiding                  VARCHAR(100);
      v_errormsg                    VARCHAR(200);
      v_errorhint                   VARCHAR(200);
      v_count                       NUMBER;

      -- In een aantal afdelingskenmerken worden maandelijks terugkerende vaste kosten
      -- bijgehouden. Op basis hiervan maken we per (afdelings-)kostenplaats een melding
      -- aan, om zo historie op te bouwen.
      -- Deze cursor bevat een regel per melding, met gesommeerde kosten voor
      -- postrondes en/of dagbladen.
      CURSOR c_vast
      IS
         -- usrdata:
         --    Looprondes (p/maand)             2176
         --    Dagblad bezorgen (p/maand)       2177
         --    Opslag containers                2197
         -- Kenmerken:
         --    Postrondes:
         --       Ophaalplaats 1/2/3            1295 / 1296 / 1297
         --    Dagbladen:
         --       Bezorgplaats 1/2/3            1301 / 1305 / 1308
         --    Containers:
         --       Aantal containers             1321
         SELECT a.prs_kostenplaats_key,
                k.prs_kostenplaats_omschrijving,
                p.postrondes,
                d.dagbladen,
                c.containers
           FROM prs_kostenplaats k,
                prs_afdeling a
                LEFT OUTER JOIN (  SELECT prs_afdeling_key,
                                          SUM (fac_usrdata_prijs) postrondes
                                     FROM prs_afdeling, prs_kenmerklink, fac_usrdata
                                    WHERE     prs_link_key = prs_afdeling_key
                                          AND prs_kenmerk_key IN (1295, 1296, 1297)
                                          AND prs_kenmerklink_verwijder IS NULL
                                          AND fac_usrdata_key = 2176
                                 GROUP BY prs_afdeling_key) p
                   ON p.prs_afdeling_key = a.prs_afdeling_key
                LEFT OUTER JOIN (  SELECT prs_afdeling_key,
                                          SUM (fac_usrdata_prijs) dagbladen
                                     FROM prs_afdeling, prs_kenmerklink, fac_usrdata
                                    WHERE     prs_link_key = prs_afdeling_key
                                          AND prs_kenmerk_key IN (1301, 1305, 1308)
                                          AND prs_kenmerklink_verwijder IS NULL
                                          AND fac_usrdata_key = 2177
                                 GROUP BY prs_afdeling_key) d
                   ON d.prs_afdeling_key = a.prs_afdeling_key
                LEFT OUTER JOIN (  SELECT prs_afdeling_key,
                                          SUM (  fac.safe_to_number(prs_kenmerklink_waarde)
                                               * fac_usrdata_prijs) containers
                                     FROM prs_afdeling, prs_kenmerklink, fac_usrdata
                                    WHERE     prs_link_key = prs_afdeling_key
                                          AND prs_kenmerk_key = 1321
                                          AND prs_kenmerklink_verwijder IS NULL
                                          AND fac_usrdata_key = 2197
                                 GROUP BY prs_afdeling_key) c
                   ON c.prs_afdeling_key = a.prs_afdeling_key
          WHERE a.prs_afdeling_verwijder IS NULL
            AND k.prs_kostenplaats_key = a.prs_kostenplaats_key
            AND (   p.postrondes IS NOT NULL
                 OR d.dagbladen IS NOT NULL
                 OR c.containers IS NOT NULL);

      CURSOR c_insert
      IS
         SELECT xmlnode,
                '0801' crediteurnr,
                k.debiteurnr,
                ac.companycode,
                k.prs_kostenplaats_nr costcentre,
                ordernr,
                CASE
                   WHEN (totaal_kosten < 0) THEN 50
                   ELSE 40
                END postingkey,
                kostensoort,
                key,
                nummer refnr,
                einddatum,
                totaal_kosten bedrag_ex,
                ROUND(totaal_kosten * 1.21, 2) bedrag_inc,
                '21' btwcode,
                -- Als (Teijin-) PO-nummer gevuld, dan in omschrijving vermelden.
                DECODE(po_nr,
                       NULL, '',
                       po_nr||' ')
                  ||vakgroep||' / '||melding omschrijving,
                melder perslid
           FROM akza_v_logistiek_doorbel l,
                akza_v_kostenplaats k,
                (SELECT * FROM prs_kenmerklink
                  WHERE prs_kenmerk_key = 1380
                    AND prs_kenmerklink_verwijder IS NULL) kl,
                akza_v_afdelingcompany ac
           WHERE totaal_kosten != 0
            AND k.prs_kostenplaats_key = l.kostenplaats_key
            AND kl.prs_kenmerklink_waarde = k.debiteurnr
            AND ac.prs_afdeling_key = kl.prs_link_key
            AND (   (xmlnode = 'melding' AND status = 5)     -- afgemelde meldingen
                 OR (xmlnode = 'opdracht' AND status = 6)    -- afgemelde opdrachten
                 OR (    xmlnode = 'reservering'             -- afgeleverde cateringartikelen
                     AND datum BETWEEN (SELECT COALESCE(MAX(fac_tracking_datum),
                                                        TO_DATE('08-10-2012', 'DD-MM-YYYY') )
                                          FROM fac_tracking t,
                                               (SELECT key FROM akza_v_logistiek_doorbel
                                                 WHERE xmlnode = 'melding' AND status = 6) d
                                         WHERE t.fac_srtnotificatie_key = 24                  -- MLDVER
                                           AND d.key = t.fac_tracking_refkey)
                                   AND SYSDATE ) );


      -- stdmelding:
      --    Postale diensten/Vaste kosten          1101
      -- Kenmerken:
      --    Kostenplaats                           564
      --    Postrondes                             561
      --    Dagbladen                              563
      --    Opslag containers                      621
      c_stdmelding_key              NUMBER      := 1101;
      c_flex_kostenplaats           NUMBER      := 564;
      c_flex_postrondes             NUMBER      := 561;
      c_flex_dagbladen              NUMBER      := 563;
      c_flex_containers             NUMBER      := 621;
      v_melding_key                 NUMBER;

   BEGIN
      v_aanduiding := 'init';
      v_errormsg   := 'init';
      v_errorhint  := 'init';

      DELETE akza_exp_sap
       WHERE soort IN ('logistiek');

      DELETE imp_log
       WHERE imp_log_applicatie = p_applname
         AND imp_log_datum < SYSDATE - 185;

      -- Meldingen voor vaste kosten toevoegen (o.b.v. flexkenmerken bij afdelingen)
      IF (p_doUpdate)
      THEN
         FOR r IN c_vast
         LOOP
            BEGIN
               v_aanduiding := r.prs_kostenplaats_omschrijving;

               v_errormsg  := 'Meldingen vaste kosten toevoegen';
               v_errorhint := 'Fout bij toevoegen melding';
               -- Einddatum wordt expliciet gezet, omdat er geen tracking toegevoegd
               -- wordt en we eigenlijk de MLDAFM-datum willen gebruiken.
               INSERT INTO mld_melding
                  (mld_melding_module,
                   mld_meldbron_key,
                   mld_melding_datum,
                   mld_melding_einddatum,
                   mld_stdmelding_key,
                   prs_perslid_key,
                   mld_melding_status,
                   mld_melding_spoed,
                   prs_kostenplaats_key)
               VALUES
                  ('MLD',
                   45,                 -- System
                   SYSDATE,
                   SYSDATE,
                   c_stdmelding_key,
                   7520,               -- Facilitor
                   5,                  -- Afgemeld
                   3,
                   r.prs_kostenplaats_key)
               RETURNING mld_melding_key
               INTO v_melding_key;

               v_errorhint := 'Fout bij toevoegen kenmerk';
               mld.upsertmeldingkenmerk(c_flex_kostenplaats,
                                        v_melding_key,
                                        TO_CHAR(r.prs_kostenplaats_key) );
               mld.upsertmeldingkenmerk(c_flex_postrondes,
                                        v_melding_key,
                                        TO_CHAR(r.postrondes) );
               mld.upsertmeldingkenmerk(c_flex_dagbladen,
                                        v_melding_key,
                                        TO_CHAR(r.dagbladen) );
               mld.upsertmeldingkenmerk(c_flex_containers,
                                        v_melding_key,
                                        TO_CHAR(r.containers) );

               fac.writelog(p_applname, 'I',
                            'Melding '||v_melding_key||' toegevoegd',
                            'Kostenplaats '||v_aanduiding);

            EXCEPTION
               WHEN NO_DATA_FOUND
               THEN
                  fac.writelog (p_applname, 'E',
                                v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                                'Geen gegevens gevonden (' || SUBSTR (SQLERRM, 1, 9) || ')'
                               );
               WHEN OTHERS
               THEN
                  fac.writelog (p_applname, 'E',
                                v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                                'Error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 100)
                               );                                                                                   -- tbv logging
            END;
         END LOOP;

         COMMIT;
      END IF;

      v_errormsg := 'Insert record';
      v_errorhint := 'Invoegen record mislukt!';

      -- Logistieke acties voor externe klanten aan doorbelastingstabel toevoegen
      FOR r IN c_insert
      LOOP
         BEGIN
            v_aanduiding := r.refnr;

            INSERT INTO akza_exp_sap
               (soort,
                crediteurnr,
                debiteurnr,
                companycode,
                costcentre,
                ordernr,
                postingkey,
                kostensoort,
                key,
                refnr,
                einddatum,
                bedrag_ex,
                bedrag_inc,
                btwcode,
                omschrijving,
                perslid)
            VALUES
               ('logistiek',
                r.crediteurnr,
                r.debiteurnr,
                r.companycode,
                r.costcentre,
                r.ordernr,
                r.postingkey,
                r.kostensoort,
                r.key,
                r.refnr,
                COALESCE((SELECT MAX(fac_tracking_datum)
                            FROM fac_tracking
                           WHERE fac_tracking_refkey = r.key
                             AND fac_srtnotificatie_key = DECODE(r.xmlnode,
                                                                 'opdracht',  26,   -- ORDAFM
                                                                 'melding',   18,   -- MLDAFM
                                                                              32    -- RESAFM
                                                                ) ),
                         r.einddatum),
                r.bedrag_ex,
                r.bedrag_inc,
                r.btwcode,
                r.omschrijving,
                r.perslid);

               fac.writelog(p_applname, 'I',
                            v_aanduiding,
                            r.bedrag_ex);
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               fac.writelog (p_applname, 'E',
                             v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                             'Geen gegevens gevonden (' || SUBSTR (SQLERRM, 1, 9) || ')'
                            );
            WHEN OTHERS
            THEN
               fac.writelog (p_applname, 'E',
                             v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                             'Error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 100)
                            );                                                                                   -- tbv logging
         END;
      END LOOP;

      COMMIT;

   EXCEPTION
      WHEN OTHERS
      THEN
         fac.writelog (p_applname, 'E',
                       v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                       'Error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 100)
                      );
   END exp_logistiek;

END;
/

--- EXPORT DEELOPDRACHTEN ------------------------------------------------------

-- Export MLD_SAP bepaalt doorbelastingsgegevens voor deelopdrachten. Gegevens worden later gebruikt
-- gebruikt door de specificatie- en verkoopfactuur-exports (SAP_SPEC resp SAP_FACTUREN)
CREATE OR REPLACE PROCEDURE akza_select_mld_sap (p_applname IN VARCHAR2, p_applrun IN VARCHAR2)
AS
BEGIN
    akza_p_sap.exp_mld(p_applname, TRUE); -- p_doUpdate TODO
END;
/

CREATE OR REPLACE VIEW akza_v_export_mld_sap
(RESULT, RESULT_ORDER)
AS
   SELECT 'soort;crediteurnr;debiteurnr;companycode;costcentre;ordernr;postingkey;kostensoort;key;refnr;bedrag_ex;bedrag_inc;btwcode;omschrijving;perslid',
          0
     FROM DUAL
   UNION ALL
   SELECT soort||';'||
          crediteurnr||';'||
          debiteurnr||';'||
          companycode||';'||
          costcentre||';'||
          ordernr||';'||
          postingkey||';'||
          kostensoort||';'||
          key||';'||
          refnr||';'||
          bedrag_ex||';'||
          bedrag_inc||';'||
          btwcode||';'||
          omschrijving||';'||
          perslid,
          key
     FROM akza_exp_sap
    WHERE soort = 'opdracht';

CREATE OR REPLACE PROCEDURE akza_export_mld_sap (p_applname   IN VARCHAR2,
                                                 p_applrun    IN VARCHAR2,
                                                 p_filedir    IN VARCHAR2,
                                                 p_filename   IN VARCHAR2
                                                )
AS
BEGIN
   -- Het laatste tenslotte heeft weinig met de export te maken
   -- Maar moet hier wel gebeuren: Alle meldingen die TV zijn en geen
   -- opdrachten hebben, worden AV verklaard, zonder verdere extra acties.
   --lgn('Tenslotte nog AV verklaren van lege (zonder opdrachten) TV meldingen');
   -- AKZA#23427: Meldingen Logistieke dienst (srtdisc 121) vallen hierbuiten; die dus
   -- nooit aanpassen met deze export!
   -- AKZA#37464: ook KPI-meldingen vallen hierbuiten
   FOR rec IN (SELECT   mld_melding_key
                 FROM   mld_melding m,
                        mld_stdmelding s,
                        mld_discipline d
                WHERE   NOT EXISTS (SELECT   1
                                      FROM   mld_opdr o
                                     WHERE   o.mld_melding_key = m.mld_melding_key)
                        AND m.mld_melding_status = 5                                        -- TV
                        AND m.mld_stdmelding_key = s.mld_stdmelding_key
                        AND s.mld_ins_discipline_key = d.ins_discipline_key
                        AND d.ins_srtdiscipline_key NOT IN (121, 161) )                     -- Logistiek, KPI
   LOOP
            mld.setmeldingstatus (rec.mld_melding_key, 6, NULL);
            fac.writelog(p_applname,
                         'I',
                         'Melding '||rec.mld_melding_key||' verwerkt',
                         '');
   END LOOP;

END;
/

--- EXPORT RESERVERINGEN -------------------------------------------------------

CREATE OR REPLACE PROCEDURE akza_select_res_sap (p_applname IN VARCHAR2, p_applrun IN VARCHAR2)
AS
BEGIN
   akza_p_sap.exp_res (p_applname, TRUE); -- doUpdate
END;
/

CREATE OR REPLACE VIEW akza_v_export_res_sap
(RESULT, RESULT_ORDER)
AS
   SELECT 'soort;crediteurnr;debiteurnr;companycode;costcentre;ordernr;postingkey;kostensoort;key;refnr;bedrag_ex;bedrag_inc;btwcode;omschrijving;perslid',
          0
     FROM DUAL
   UNION ALL
   SELECT soort||';'||
          crediteurnr||';'||
          debiteurnr||';'||
          companycode||';'||
          costcentre||';'||
          ordernr||';'||
          postingkey||';'||
          kostensoort||';'||
          key||';'||
          refnr||';'||
          bedrag_ex||';'||
          bedrag_inc||';'||
          btwcode||';'||
          omschrijving||';'||
          perslid,
          key
     FROM akza_exp_sap
    WHERE soort IN ('artikel', 'deel', 'ruimte', 'rit');

--- EXPORT LOGISTIEK -----------------------------------------------------------

-- Voorbereiden export naar SAP; meldingen aanmaken voor vaste kosten vastgelegd in afdelingskenmerken
CREATE OR REPLACE PROCEDURE akza_select_logistiek (p_applname IN VARCHAR2, p_applrun IN VARCHAR2)
AS
BEGIN
   akza_p_sap.exp_logistiek(p_applname, TRUE);    --doUpdate
END akza_select_logistiek;
/

-- Exportview naar Foxpro (voor doorbelasting naar SAP)
CREATE OR REPLACE VIEW akza_v_export_logistiek
AS
   WITH tmp
   AS
     (SELECT *
        FROM akza_v_logistiek_doorbel l
       WHERE totaal_kosten != 0
         AND (   (xmlnode = 'melding' AND status = 5)     -- afgemelde meldingen
              OR (xmlnode = 'opdracht' AND status = 6)    -- afgemelde opdrachten
              OR (    xmlnode = 'reservering'             -- afgeleverde cateringartikelen
                  AND datum BETWEEN (SELECT COALESCE(MAX(fac_tracking_datum),
                                                     TO_DATE('08-10-2012', 'DD-MM-YYYY') )
                                       FROM fac_tracking t,
                                            (SELECT key FROM akza_v_logistiek_doorbel
                                              WHERE xmlnode = 'melding' AND status = 6) d
                                      WHERE t.fac_srtnotificatie_key = 24                  -- MLDVER
                                        AND d.key = t.fac_tracking_refkey)
                                AND SYSDATE ) ) )
   SELECT '<html><head><style>' result, 1 result_order FROM DUAL
   UNION ALL
   SELECT '.num0dec {mso-number-format:0;} .num2dec {mso-number-format:Fixed;} .tekst {mso-number-format:"\@";}' result, 2 result_order FROM DUAL
   UNION ALL
   SELECT '</style></head><body><table>' result, 3 result_order FROM DUAL
   UNION ALL
   SELECT '<tr><td>INT_FACT</td>'||
          '<td>CMPCODE</td>'||
          '<td>KPLCODE</td>'||
          '<td>PK</td>'||
          '<td>VAL</td>'||
          '<td>FAKT.DA</td>'||
          '<td>REFERENTIE</td>'||
          '<td>GRP</td>'||
          '<td>BEDRAG</td>'||
          '<td>AANTAL</td>'||
          '<td>ARTIKEL</td>'||
          '<td>DT</td>'||
          '<td>ARTIKELCODE</td>'||
          '<td>PRIJS</td>'||
          '<td>REFERENTIE 1</td>'||
          '<td>BTW</td></tr>' result, 4 result_order FROM DUAL
   UNION ALL
   SELECT '<tr><td>' ||
             nummer ||
          '</td><td>' ||
             SUBSTR(kostenplaats_nr,
                   INSTR(kostenplaats_nr, '(')+1,
                   INSTR(kostenplaats_nr, ')') - INSTR(kostenplaats_nr, '(')-1) ||
          '</td><td>' ||
             SUBSTR(kostenplaats_nr,
                    1,
                    INSTR(kostenplaats_nr, '(')-2) ||
          '</td><td>' ||
             CASE
                WHEN (totaal_kosten < 0) THEN 50
                ELSE 40
             END ||
          '</td><td>' ||
             'EUR'||
          '</td><td>' ||
             TO_CHAR (TRUNC(datum), 'dd-mm-yyyy') ||
          '</td><td>' ||
             melder ||
          '</td><td>' ||
             kostensoort ||
          '</td><td class="num2dec">' ||
             REPLACE(TO_CHAR(COALESCE(totaal_kosten, 0)),'.',',') ||
          '</td><td class="num0dec">' ||
             '1' ||
          '</td><td>' ||
             melding ||
          '</td><td>' ||
             DECODE (SUBSTR(kostenplaats_nr,
                     INSTR(kostenplaats_nr, '(')+1,
                     INSTR(kostenplaats_nr, ')') - INSTR(kostenplaats_nr, '(')-1),
                     '0801', 'NY',
                     'MY') ||
          '</td><td>' ||
             'FCLT' ||
          '</td><td class="num2dec">' ||
             REPLACE(TO_CHAR(COALESCE(totaal_kosten, 0)),'.',',') ||
          '</td><td>' ||
          '</td><td>' ||
             '2' ||
          '</td></tr>' result,
          5 result_order
     FROM tmp
   UNION ALL
   SELECT '<tr><td class="num2dec">' ||  REPLACE(TO_CHAR( SUM(totaal_kosten) ),'.',',') || '</td>' ||
          '<td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>' result,
          6 result_order
     FROM tmp
   UNION ALL
   SELECT '<tr><td class="num0dec">1</td>' ||
          '<td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>' result,
          7 result_order
     FROM DUAL
   UNION ALL
   SELECT '</table></body></html>' result, 8 result_order FROM DUAL;

CREATE OR REPLACE VIEW akza_v_export_logistiek
(RESULT, RESULT_ORDER)
AS
   SELECT 'soort;crediteurnr;debiteurnr;companycode;costcentre;ordernr;postingkey;kostensoort;key;refnr;bedrag_ex;bedrag_inc;btwcode;omschrijving;perslid',
          0
     FROM DUAL
   UNION ALL
   SELECT soort||';'||
          crediteurnr||';'||
          debiteurnr||';'||
          companycode||';'||
          costcentre||';'||
          ordernr||';'||
          postingkey||';'||
          kostensoort||';'||
          key||';'||
          refnr||';'||
          bedrag_ex||';'||
          bedrag_inc||';'||
          btwcode||';'||
          omschrijving||';'||
          perslid,
          key
     FROM akza_exp_sap
    WHERE soort = 'logistiek';

-- Afronden export naar SAP;
-- meldingen/opdrachten/reserveringen op status Verwerkt zetten
CREATE OR REPLACE PROCEDURE akza_export_logistiek (p_applname   IN VARCHAR2,
                                                   p_applrun    IN VARCHAR2,
                                                   p_filedir    IN VARCHAR2,
                                                   p_filename   IN VARCHAR2)
AS
   v_aanduiding                  VARCHAR(100);
   v_errormsg                    VARCHAR(200);
   v_errorhint                   VARCHAR(100);
   v_count                       NUMBER;

   -- Alle te-verwerken meldingen en opdrachten.
   -- Doorbelaste logistieke meldingen hebben geen opdrachten, m.u.v. Verzending expeditie.
   -- Bij doorbelaste opdrachten (Verzending expeditie) moet ook de melding op Verwerkt worden gezet
   -- (Reserveringen zijn al op Verwerkt gezet door de RES-exports)
   CURSOR c
   IS
      SELECT key,
             xmlnode,
             nummer,
             melding,
             datum,
             totaal_kosten
        FROM akza_v_logistiek_doorbel l
       WHERE (xmlnode = 'melding' AND status = 5)           -- afgemelde meldingen
          OR (xmlnode = 'opdracht' AND status = 6)          -- afgemelde opdrachten
      ORDER BY nummer;

   c_flex_mld_doorbelast         NUMBER   := 562;

   c_typeopdr_NL                 NUMBER   := 1052;
   c_typeopdr_EU                 NUMBER   := 1053;
   c_typeopdr_WW                 NUMBER   := 1054;
   c_flex_opdr_NL_doorbelast     NUMBER   := 566;
   c_flex_opdr_EU_doorbelast     NUMBER   := 565;
   c_flex_opdr_WW_doorbelast     NUMBER   := 567;

   v_melding_key                 NUMBER;
   v_flex_key                    NUMBER;

BEGIN
   v_aanduiding := 'init';
   v_errormsg   := 'init';
   v_errorhint  := 'init';

   -- Meldingen en opdrachten op Verwerkt zetten
   -- (Reserveringen zijn bij de RES-exports al op Verwerkt gezet)
   FOR r IN c
   LOOP
      BEGIN
         v_aanduiding := r.xmlnode||' '||r.nummer||' (#'||r.key||')';

         -- Melding zonder opdrachten
         IF (r.xmlnode = 'melding')
         THEN
            v_errormsg := 'Verwerken';

            -- Melding op Verwerkt zetten (zorgt ook voor tracking)
            v_errorhint := 'Fout bij verwerken melding';
            mld.setmeldingstatus(r.key, 6, NULL);
            fac.writelog(p_applname, 'I',
                         v_aanduiding||' verwerkt',
                         '');
            -- Voor historie: bewaar doorbelaste bedrag
            v_errorhint := 'Fout bij zetten meldingkenmerk';
            mld.upsertmeldingkenmerk(c_flex_mld_doorbelast,
                                     r.key,
                                     TO_CHAR(r.totaal_kosten) );

         ELSIF (r.xmlnode = 'opdracht')
         THEN
            -- Zet op Verwerkt (zorgt ook voor tracking)
            v_errorhint := 'Fout bij verwerken opdracht';
            mld.setopdrachtstatus (r.key, 7, NULL);
            fac.writelog(p_applname, 'I',
                         v_aanduiding||' verwerkt',
                         '');
            -- Voor historie: bewaar doorbelaste bedrag
            v_errorhint := 'Fout bij zetten opdrachtkenmerk';
            SELECT DECODE(mld_typeopdr_key,
                          c_typeopdr_NL, c_flex_opdr_NL_doorbelast,
                          c_typeopdr_EU, c_flex_opdr_EU_doorbelast,
                          c_typeopdr_WW, c_flex_opdr_WW_doorbelast)
              INTO v_flex_key
              FROM mld_opdr
             WHERE mld_opdr_key = r.key;

            mld.upsertopdrachtkenmerk(v_flex_key,
                                      r.key,
                                      TO_CHAR(r.totaal_kosten) );

            v_errormsg := 'Zoeken overige opdrachten';

            -- Achterhaal melding bij opdracht; zijn nu alle opdrachten bij deze
            -- melding verwerkt?
            v_errorhint := 'Fout bij bepalen melding';
            SELECT mld_melding_key
              INTO v_melding_key
              FROM mld_opdr
             WHERE mld_opdr_key = r.key;

            -- Zijn er andere te-Verwerken opdrachten bij deze melding?
            -- (te-Verwerken is dan: niet Verwerkt (7), niet Afgewezen (1), niet Niet akkoord (2)
            v_errorhint := 'Fout bij tellen opdrachten';
            SELECT COUNT(*)
              INTO v_count
              FROM mld_opdr
             WHERE mld_melding_key = v_melding_key
               AND mld_opdr_key != r.key
               AND mld_statusopdr_key NOT IN (1,2,7);

            IF (v_count > 0)
            THEN
               -- Er zijn nog opdrachten; melding kan niet Verwerkt worden
               fac.writelog(p_applname, 'I',
                            'Melding L'||v_melding_key||' bij '||v_aanduiding||' wordt (nog) niet verwerkt',
                            'Er zijn nog andere openstaande/te verwerken opdrachten');

            ELSE
               -- Geen andere opdrachten; melding op Verwerkt zetten (zorgt ook voor tracking)
               v_errorhint := 'Fout bij verwerken melding';
               mld.setmeldingstatus(v_melding_key, 6, NULL);
               fac.writelog(p_applname,
                            'I',
                            'Melding L'||v_melding_key||' bij '||v_aanduiding||' verwerkt',
                            '');
            END IF;
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            fac.writelog (p_applname, 'E',
                          v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                          'Error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 100)
                         );
      END;
   END LOOP;

   COMMIT;

EXCEPTION
   WHEN OTHERS
   THEN
      fac.writelog (p_applname, 'E',
                    v_aanduiding||': '||v_errorhint||' ('||v_errormsg||')',
                    'Error ' || SQLCODE || '/' || SUBSTR (SQLERRM, 1, 100)
                   );
END akza_export_logistiek;
/


--- SPECIFICATIEREGELS ---------------------------------------------------------

-- AKZA#27345: Export verkoopfacturen naar SAP.
-- Genereert exportbestand met specificatieregels; deze wordt later in een batch-script
-- gesplitst in bestanden per betalende company(code)
CREATE OR REPLACE VIEW akza_v_export_sap_spec
(RESULT, RESULT_ORDER)
AS
   SELECT 'Seq;CoCd;Doc. Type;Crcy;PK;G/L Acct;Cost Ctr;Network;Ordnr;Text;Pstng Date;Amount;Crcy' result,
          0 result_order
     FROM DUAL
    UNION ALL
   SELECT seq||';'||cocd||';'||doctype||';'||crcy||';'||pk||';'||glacct||';'||
          costctr||';'||network||';'||ordnr||';'||text||';'||pstngdate||';'||amount||';'||crcy1 result,
          ROWNUM result_order
     FROM (
      SELECT ROW_NUMBER() OVER (PARTITION BY companycode ORDER BY companycode, kostensoort, costcentre) AS seq,
             companycode cocd,
             'MY' doctype,
             'EUR' crcy,
             postingkey pk,
             kostensoort glacct,
             costcentre costctr,
             NULL network,
             TRIM(ordernr) ordnr,
             -- Melder in omschrijving vermelden, maar alleen als dat niet _FACILITOR is.
                refnr||' '
             || omschrijving
             || DECODE(perslid,
                       'Facilitor', '',
                       ' ('||perslid||')' ) text,
             TO_CHAR(einddatum, 'DD-MM-YYYY') pstngdate,
             bedrag_ex amount,
             NULL crcy1
        FROM akza_exp_sap );

--- VERKOOPFACTUREN ------------------------------------------------------------

-- AKZA#27345: Export verkoopfacturen naar SAP.
-- Facturen worden getotaliseerd per klantbedrijf (company), met daarbij een specificatieregel
-- per opdracht/melding/reservering en aparte BTW-regels voor hoog/laag
CREATE OR REPLACE PROCEDURE akza_select_sap_facturen (p_applname IN VARCHAR2, p_applrun IN VARCHAR2)
AS
   CURSOR c_facturen
   IS
      SELECT TO_CHAR(SYSDATE+2, 'DDMMYYYY') docdate,
             'DA' doctype,
             crediteurnr companycode,
             TO_CHAR(SYSDATE+2, 'DDMMYYYY') postingdate,
             'EUR' currency,
             NULL documentnr,
                 DECODE(soort,
                        'opdracht', 'Service Orders',
                        'artikel', 'Catering',
                        'ruimte', 'Bookable rooms',
                        'deel', 'Bookable equipment',
                        'logistiek', 'Logistic Services',
                        soort)
                ||TO_CHAR(ADD_MONTHS(SYSDATE,-1), ' YYYY.MM') description,
             companycode||TO_CHAR(ADD_MONTHS(SYSDATE,-1), '-YYYY.MM') referencenr,
             CASE
                WHEN SUM(bedrag_inc) >= 0 THEN '01'
                WHEN SUM(bedrag_inc) < 0 THEN '11'
             END
                 postingkey,
             debiteurnr account,
             TRIM( TO_CHAR( SUM(bedrag_inc),
                            '99999999D99',
                            'NLS_NUMERIC_CHARACTERS=,.') ) amount,
             '**' taxcode,
             NULL network,
             --TODO: Deventer verwacht hier wel een waarde in(?)
             '' assignment,
             '' costcenter,
                 DECODE(soort,
                        'opdracht', 'Service Orders',
                        'artikel', 'Catering',
                        'ruimte', 'Bookable rooms',
                        'deel', 'Bookable equipment',
                        'logistiek', 'Logistic Services',
                        soort)
                ||TO_CHAR(ADD_MONTHS(SYSDATE,-1), ' YYYY.MM ')
                ||COALESCE(aa.prs_afdeling_naam6, 'LEEG') lineitemtext,
             NULL tradingpartner,
             '' ordernr,
             NULL partnerbanktype,
             NULL xref1,
             NULL xref2,
             -- de verschillende company's hebben andere contactpersonen per dienst
             DECODE( crediteurnr1,
                     '1435', DECODE( soort,
                                     'opdracht',  'VONKT',
                                     'artikel',   'VONKT',
                                     'ruimte',    'VONKT',
                                     'deel',      'VONKT',
                                     'logistiek', 'VONKT',
                                     NULL),
                     DECODE( soort,
                             'opdracht',  'BONGERSH',
                             'artikel',   'ERMERSJ',
                             'ruimte',    'ERMERSJ',
                             'deel',      'ERMERSJ',
                             'logistiek', 'BOSW',
                             NULL) )
                xref3,
             NULL companycodecross,
             NULL profitcenter,
             soort
             -- Diverse HQ-company's hebben dezelfde administratie (0801, 0804, 0806, 0810),
             -- dus daar niet onderling factureren.
             -- Bij incomplete inrichting kan de companycode leeg zijn, daar expliciet op checken
        FROM (SELECT DECODE(companycode, '0804', '0801',
                                         '0806', '0801',
                                         '0810', '0801',
                                         NULL,   'apekool',
                                         companycode) companycode1,
                     DECODE(crediteurnr, '0804', '0801',
                                         '0806', '0801',
                                         '0810', '0801',
                                         NULL,   'quequeleque',
                                         crediteurnr) crediteurnr1,
                     es.*
                FROM akza_exp_sap es),
             prs_v_aanwezigafdeling aa
       WHERE companycode1 != crediteurnr1
         AND aa.prs_afdeling_naam(+) = companycode
      GROUP BY companycode, companycode1, debiteurnr, crediteurnr, crediteurnr1, soort, aa.prs_afdeling_naam6;

   -- AKZA#32881 factuurregels sommeren per GLaccount (kostensoort) en kostenplaats
   CURSOR c_regels (p_crediteurnr VARCHAR2,
                    p_debiteurnr  VARCHAR2,
                    p_soort       VARCHAR2)
   IS
      SELECT CASE
                WHEN SUM(bedrag_ex) >= 0 THEN '50'
                WHEN SUM(bedrag_ex) < 0 THEN '40'
             END
                postingkey,
             kostensoort account,
             TRIM( TO_CHAR( SUM(bedrag_ex),
                            '99999999D99',
                            'NLS_NUMERIC_CHARACTERS=,.') ) amount,
             'NC' taxcode,
             NULL network,
             NULL assignment,
             costcentre costcenter,
                DECODE(soort,
                       'opdracht', 'Service Orders',
                       'artikel', 'Catering',
                       'ruimte', 'Bookable rooms',
                       'deel', 'Bookable equipment',
                       'logistiek', 'Logistic Services',
                       soort)
             || TO_CHAR(ADD_MONTHS(SYSDATE,-1), ' YYYY.MM ') lineitemtext,
             NULL tradingpartner,
             '' ordernr
             -- Diverse HQ-company's hebben dezelfde administratie (0801, 0804, 0806, 0810),
             -- dus daar niet onderling factureren.
             -- Bij incomplete inrichting kan de companycode leeg zijn, daar expliciet op checken
        FROM (SELECT DECODE(companycode, '0804', '0801',
                                         '0806', '0801',
                                         '0810', '0801',
                                         NULL,   'apekool',
                                         companycode) companycode1,
                     DECODE(crediteurnr, '0804', '0801',
                                         '0806', '0801',
                                         '0810', '0801',
                                         NULL,   'quequeleque',
                                         crediteurnr) crediteurnr1,
                     es.*
                FROM akza_exp_sap es)
       WHERE companycode1 != crediteurnr1
         AND crediteurnr = p_crediteurnr
         AND debiteurnr = p_debiteurnr
         AND soort = p_soort
      GROUP BY kostensoort, costcentre, soort
      ORDER BY kostensoort, costcentre;

   CURSOR c_btw (p_crediteurnr VARCHAR2,
                 p_debiteurnr  VARCHAR2,
                 p_soort       VARCHAR2)
   IS
      SELECT CASE
                WHEN SUM(bedrag_inc) - SUM(bedrag_ex) >= 0 THEN '50'
                WHEN SUM(bedrag_inc) - SUM(bedrag_ex) < 0 THEN '40'
             END
                postingkey,
             '3571039' account,
             TRIM( TO_CHAR( SUM(bedrag_inc) - SUM(bedrag_ex),
                            '99999999D99',
                            'NLS_NUMERIC_CHARACTERS=,.') ) amount,
             DECODE(btwcode,
                    '21', 'N3',
                    '6',  'N1',
                    '0',  'N5',
                    'NC')
                taxcode,
             NULL network,
             NULL assignment,
             NULL costcenter,
             'BTW '
             || DECODE(btwcode,
                       '21', '21%',
                       '6', '6%',
                       'onbekend: '||btwcode)
                lineitemtext
             -- Diverse HQ-company's hebben dezelfde administratie (0801, 0804, 0806, 0810),
             -- dus daar niet onderling factureren.
             -- Bij incomplete inrichting kan de companycode leeg zijn, daar expliciet op checken
        FROM (SELECT DECODE(companycode, '0804', '0801',
                                         '0806', '0801',
                                         '0810', '0801',
                                         NULL,   'apekool',
                                         companycode) companycode1,
                     DECODE(crediteurnr, '0804', '0801',
                                         '0806', '0801',
                                         '0810', '0801',
                                         NULL,   'quequeleque',
                                         crediteurnr) crediteurnr1,
                     es.*
                FROM akza_exp_sap es)
       WHERE companycode1 != crediteurnr1
         AND crediteurnr = p_crediteurnr
         AND debiteurnr = p_debiteurnr
         AND soort = p_soort
      GROUP BY postingkey, btwcode;

   v_aanduiding         VARCHAR2(100);
   v_volgnr             NUMBER;
   v_errormsg           VARCHAR(255);
   v_errorhint          VARCHAR(255);
BEGIN
   v_aanduiding := 'init';
   v_errormsg := 'init';
   v_errorhint := 'init';
   v_volgnr := 1;

   DELETE fac_rapport
    WHERE fac_rapport_node = p_applname;

   DELETE imp_log
    WHERE imp_log_applicatie = p_applname
      AND imp_log_datum > SYSDATE - 185;

   v_errorhint := 'Headerregel';

   INSERT INTO fac_rapport
     (fac_rapport_node,
      fac_rapport_volgnr,
      fac_rapport_regel,
      fac_rapport_soort)
   SELECT p_applname,
          0,
          '<html><head><style>.num0dec {mso-number-format:0;} .num2dec {mso-number-format:Fixed;} .tekst {mso-number-format:"\@"; white-space:nowrap;}</style></head><body><table>',
          1
     FROM DUAL
   UNION ALL
   SELECT p_applname,
          1,
          '<tr><td>DOCDATE</td>'||
          '<td>DOCTYPE</td>'||
          '<td>COMPANYCODE</td>'||
          '<td>POSTINGDATE</td>'||
          '<td>CURRENCY</td>'||
          '<td>DOCUMENTNR</td>'||
          '<td>DESCRIPTION</td>'||
          '<td>REFERENCENR</td>'||
          '<td>POSTINGKEY</td>'||
          '<td>ACCOUNT</td>'||
          '<td>AMOUNT</td>'||
          '<td>TAXCODE</td>'||
          '<td>NETWORK</td>'||
          '<td>ASSIGNMENT</td>'||
          '<td>COSTCENTER</td>'||
          '<td>LINEITEMTEXT</td>'||
          '<td>TRADINGPARTNER</td>'||
          '<td>ORDERNR</td>'||
          '<td>PARTNERBANKTYPE</td>'||
          '<td>XREF1</td>'||
          '<td>XREF2</td>'||
          '<td>XREF3</td>'||
          '<td>COMPANYCODECROSS</td>'||
          '<td>PROFITCENTER</td></tr>',
          1
     FROM DUAL;

   v_errorhint := 'Sommatieregel';

   FOR rec_f IN c_facturen
   LOOP
      BEGIN
         v_aanduiding := rec_f.companycode||' --> '||rec_f.account||' ('||rec_f.soort||')';
         v_volgnr := v_volgnr + 1;

         v_errormsg := 'Sommatieregel aanmaken';

         INSERT INTO fac_rapport
           (fac_rapport_node,
            fac_rapport_volgnr,
            fac_rapport_regel,
            fac_rapport_soort)
         VALUES
           (p_applname,
            v_volgnr,
            '<tr>'||
            '<td class="tekst">'||rec_f.docdate||'</td>'||
            '<td class="tekst">'||rec_f.doctype||'</td>'||
            '<td class="tekst">'||rec_f.companycode||'</td>'||
            '<td class="tekst">'||rec_f.postingdate||'</td>'||
            '<td class="tekst">'||rec_f.currency||'</td>'||
            '<td class="tekst">'||rec_f.documentnr||'</td>'||
            '<td class="tekst">'||rec_f.description||'</td>'||
            '<td class="tekst">'||rec_f.referencenr||'</td>'||
            '<td class="tekst">'||rec_f.postingkey||'</td>'||
            '<td class="tekst">'||rec_f.account||'</td>'||
            '<td class="num2dec">'||rec_f.amount||'</td>'||
            '<td class="tekst">'||rec_f.taxcode||'</td>'||
            '<td class="tekst">'||rec_f.network||'</td>'||
            '<td class="tekst">'||rec_f.assignment||'</td>'||
            '<td class="tekst">'||rec_f.costcenter||'</td>'||
            '<td class="tekst">'||rec_f.lineitemtext||'</td>'||
            '<td class="tekst">'||rec_f.tradingpartner||'</td>'||
            '<td class="tekst">'||rec_f.ordernr||'</td>'||
            '<td class="tekst">'||rec_f.partnerbanktype||'</td>'||
            '<td class="tekst">'||rec_f.xref1||'</td>'||
            '<td class="tekst">'||rec_f.xref2||'</td>'||
            '<td class="tekst">'||rec_f.xref3||'</td>'||
            '<td class="tekst">'||rec_f.companycodecross||'</td>'||
            '<td class="tekst">'||rec_f.profitcenter||'</td></tr>',
            1);

         v_errorhint := 'Specificatieregels';

         FOR rec IN c_regels (rec_f.companycode,
                              rec_f.account,
                              rec_f.soort)
         LOOP
            BEGIN
               v_aanduiding :=   rec_f.companycode||' --> '||rec_f.account||' ('||rec_f.soort||')'
                               ||' - '||rec.lineitemtext;
               v_volgnr := v_volgnr + 1;

               v_errormsg := 'Specificatieregel aanmaken';

               INSERT INTO fac_rapport
                 (fac_rapport_node,
                  fac_rapport_volgnr,
                  fac_rapport_regel,
                  fac_rapport_soort)
               VALUES
                 (p_applname,
                  v_volgnr,
                  '<tr><td/><td/><td/><td/><td/><td/><td/><td/>'||
                  '<td class="tekst">'||rec.postingkey||'</td>'||
                  '<td class="tekst">'||rec.account||'</td>'||
                  '<td class="num2dec">'||rec.amount||'</td>'||
                  '<td class="tekst">'||rec.taxcode||'</td>'||
                  '<td class="tekst">'||rec.network||'</td>'||
                  '<td class="tekst">'||rec.assignment||'</td>'||
                  '<td class="tekst">'||rec.costcenter||'</td>'||
                  '<td class="tekst">'||rec.lineitemtext||'</td>'||
                  '<td class="tekst">'||rec.tradingpartner||'</td>'||
                  '<td class="tekst">'||rec.ordernr||'</td>'||
                  '<td/><td/><td/><td/><td/></tr>',
                  1);
            EXCEPTION
               WHEN OTHERS THEN fac.writelog(p_applname, 'E',
                                             v_errormsg||' ('||v_errorhint||')',
                                             v_aanduiding);
            END;
         END LOOP;

         v_errorhint := 'BTW-regels';

         FOR rec_btw IN c_btw (rec_f.companycode,
                               rec_f.account,
                               rec_f.soort)
         LOOP
            BEGIN
               v_aanduiding :=   rec_f.companycode||' --> '||rec_f.account||' ('||rec_f.soort||')'
                               ||' - '||rec_btw.lineitemtext;
               v_volgnr := v_volgnr + 1;

               v_errormsg := 'BTW-regel aanmaken';

               INSERT INTO fac_rapport
                 (fac_rapport_node,
                  fac_rapport_volgnr,
                  fac_rapport_regel,
                  fac_rapport_soort)
               VALUES
                 (p_applname,
                  v_volgnr,
                  '<tr><td/><td/><td/><td/><td/><td/><td/><td/>'||
                  '<td class="tekst">'||rec_btw.postingkey||'</td>'||
                  '<td class="tekst">'||rec_btw.account||'</td>'||
                  '<td class="num2dec">'||rec_btw.amount||'</td>'||
                  '<td class="tekst">'||rec_btw.taxcode||'</td>'||
                  '<td class="tekst">'||rec_btw.network||'</td>'||
                  '<td class="tekst">'||rec_btw.assignment||'</td>'||
                  '<td class="tekst">'||rec_btw.costcenter||'</td>'||
                  '<td class="tekst">'||rec_btw.lineitemtext||'</td>'||
                  '<td/><td/><td/><td/><td/><td/><td/></tr>',
                  1);
            EXCEPTION
               WHEN OTHERS THEN fac.writelog(p_applname, 'E',
                                             v_errormsg||' ('||v_errorhint||')',
                                             v_aanduiding);
            END;
         END LOOP;

         fac.writelog(p_applname, 'S',
                      'Verkoopfactuur '||rec_f.companycode||' --> '||rec_f.account||' ('||rec_f.soort||')'||' geëxporteerd',
                      '€ '||rec_f.amount);

      EXCEPTION
         WHEN OTHERS THEN fac.writelog(p_applname, 'E',
                                       v_errormsg||' ('||v_errorhint||')',
                                       v_aanduiding);
      END;
   END LOOP;

EXCEPTION
   WHEN OTHERS THEN fac.writelog(p_applname, 'E',
                                 v_errormsg||' ('||v_errorhint||')',
                                 v_aanduiding);
END akza_select_sap_facturen;
/

CREATE OR REPLACE VIEW akza_v_export_sap_facturen
(RESULT, RESULT_ORDER)
AS
   SELECT fac_rapport_regel, fac_rapport_volgnr
     FROM fac_rapport
    WHERE fac_rapport_node = 'SAP_FACTUREN';


--------------------------------------------------------------------------------------------------
------------------------------- RAPPORTAGES EN NOTIFICATIEJOBS -----------------------------------
--------------------------------------------------------------------------------------------------

--- LOGISTIEK ------------------------------------------------------------------

-- Toont o.a. soort en prijs van alle door-te-belasten en al doorbelaste handelingen in een bepaalde periode
-- mld_srtkenmerk    PO-nummer         362
-- mld_srtkenmerk    Pakketnummer      561
CREATE OR REPLACE VIEW akza_v_rap_logistiek_doorbel
AS
   SELECT TO_CHAR (datum, 'yyyymmdd')||REPLACE(nummer,'L','') hide_f_sort,
          DECODE (xmlnode,
          'melding', '<a class="details" onclick=''FcltMgr.openDetail("appl/mld/mld_melding.asp?urole=bo&'||'mld_key='
                     || key || '")''>'
                     || nummer
                     || '</a>',
          'opdracht', '<a class="details" onclick=''FcltMgr.openDetail("appl/mld/mld_opdr.asp?urole=bo&'||'opdr_key='
                      || key || '")''>'
                      || nummer
                      || '</a>',
          'reservering', '<a class="details" onclick=''FcltMgr.openDetail("appl/res/res_reservering.asp?urole=bo&'||'rsv_ruimte_key='
                         || key || '")''>'
                         || nummer
                         || '</a>',
          nummer)
                html_nummer,
          datum,
          melding fclt_f_melding,
          vakgroep fclt_f_vakgroep,
          kostenplaats_nr||' '||kostenplaats_oms fclt_x_kostenplaats,
          kostenplaats_oms||'<br/>'||kostenplaats_nr html_kostenplaats,
          ordernr,
          ponr.mld_kenmerkmelding_waarde po_nummer,
          pakket.mld_kenmerkmelding_waarde pakketnummer,
          melder aanvrager,
          COALESCE (doorbelast_bedrag, totaal_kosten) kosten
     FROM akza_v_logistiek_doorbel ld,
          (SELECT km.* FROM mld_kenmerkmelding km, mld_kenmerk k
            WHERE km.mld_kenmerk_key = k.mld_kenmerk_key
              AND km.mld_kenmerkmelding_verwijder IS NULL
              AND k.mld_srtkenmerk_key = 362) ponr,
          (SELECT km.* FROM mld_kenmerkmelding km, mld_kenmerk k
            WHERE km.mld_kenmerk_key = k.mld_kenmerk_key
              AND km.mld_kenmerkmelding_verwijder IS NULL
              AND k.mld_srtkenmerk_key = 561) pakket
    WHERE ponr.mld_melding_key(+) = ld.key
      AND pakket.mld_melding_key(+) = ld.key;

-- Doorbelaste handelingen per meldingsoort/opdrachttype
CREATE OR REPLACE PROCEDURE akza_rap_logistiek_samenv (
   user_key      IN       NUMBER,
   p_datum_van   IN       VARCHAR2, -- Let wel: formaat '16-01-2006'
   p_datum_tot   IN       VARCHAR2,
   p_cursor      OUT      SYS_REFCURSOR
)
AS
   v_datum_van   DATE;
   v_datum_tot   DATE;
BEGIN
  v_datum_van := fac.safe_to_date (p_datum_van, 'dd-mm-yyyy');
  v_datum_tot := fac.safe_to_date (p_datum_tot, 'dd-mm-yyyy');

  OPEN p_cursor FOR
        SELECT vakgroep,
               melding,
               COUNT (nummer) aantal_meldingen,
               SUM (totaal_kosten) totaal_kosten
          FROM akza_v_logistiek_doorbel
         WHERE datum BETWEEN TO_DATE ('1-10-2012', 'DD-MM-YYYY')
                         AND SYSDATE
           AND datum BETWEEN v_datum_van
                         AND v_datum_tot
      GROUP BY melding, vakgroep
      ORDER BY vakgroep, melding;
END akza_rap_logistiek_samenv;
/

-- Actueel overzicht van vaste kosten (flexkenmerken bij afdelingen)
-- usrdata:
--    Looprondes (p/maand)          2176
--    Dagblad bezorgen (p/maand)    2177
--    Opslag containers             2197
-- Kenmerken
--    Postrondes:
--       Ophaalplaats 1             1295
--       Ophaalplaats 2             1296
--       Ophaalplaats 3             1297
--    Dagbladen:
--       Bezorgplaats 1             1301
--       Dagblad 1                  1299
--       Abonnee 1                  1300
--       Bezorgplaats 2             1305
--       Dagblad 2                  1304
--       Abonnee 2                  1303
--       Bezorgplaats 3             1308
--       Dagblad 3                  1307
--       Abonnee 3                  1309
--    Containers:
--       Aantal containers          1321
CREATE OR REPLACE VIEW akza_v_rap_logistiek_vastkost
AS
   SELECT prs_afdeling_omschrijving||oms hide_f_sort,
          prs_afdeling_omschrijving fclt_x_afdeling,
          '<a class="details" onclick=''FcltMgr.openDetail("appl/prs/prs_afdeling.asp?afd_niveau=2&'||'key='
                      || prs_afdeling_key || '")''>'
                      || htf.escape_sc(prs_afdeling_omschrijving)
                      || '</a>' html_afdeling,
          ruimte "ruimte/persoon",
          oms,
          prs_kostenplaats_nr||' '||prs_kostenplaats_omschrijving fclt_x_kostenplaats,
          prs_kostenplaats_omschrijving||'<br/>'||prs_kostenplaats_nr html_kostenplaats,
          aantal * fac_usrdata_prijs bedrag,
          soort fclt_x_soort
     FROM (
      SELECT a.prs_afdeling_key,
             a.prs_afdeling_omschrijving prs_afdeling_omschrijving,
             a.prs_kostenplaats_key,
             'Looprondes' soort,
             'Postronde' oms,
             ra.alg_ruimte_aanduiding ruimte,
             1 aantal,
             2176 fac_usrdata_key
        FROM prs_afdeling a,
             prs_kenmerklink kl,
             alg_v_ruimte_gegevens ra
       WHERE kl.prs_kenmerk_key IN (1295, 1296, 1297)
         AND kl.prs_kenmerklink_verwijder IS NULL
         AND kl.prs_link_key = a.prs_afdeling_key
         AND ra.alg_ruimte_key = fac.safe_to_number(kl.prs_kenmerklink_waarde)
      UNION ALL
      SELECT a.prs_afdeling_key,
             a.prs_afdeling_omschrijving,
             a.prs_kostenplaats_key,
             'Dagbladen' soort,
             dbl.prs_kenmerklink_waarde oms,
             abo.prs_kenmerklink_waarde ruimte,
             1 aantal,
             2177 fac_usrdata_key
        FROM prs_afdeling a,
             prs_kenmerklink kl,
             alg_v_ruimte_gegevens ra,
             (SELECT * FROM prs_kenmerklink WHERE prs_kenmerk_key = 1299
                 AND prs_kenmerklink_verwijder IS NULL) dbl,
             (SELECT * FROM prs_kenmerklink WHERE prs_kenmerk_key = 1300
                 AND prs_kenmerklink_verwijder IS NULL) abo
       WHERE kl.prs_kenmerk_key = 1301
         AND kl.prs_kenmerklink_verwijder IS NULL
         AND kl.prs_link_key = a.prs_afdeling_key
         AND ra.alg_ruimte_key = fac.safe_to_number(kl.prs_kenmerklink_waarde)
         AND dbl.prs_link_key(+) = a.prs_afdeling_key
         AND abo.prs_link_key(+) = a.prs_afdeling_key
      UNION ALL
      SELECT a.prs_afdeling_key,
             a.prs_afdeling_omschrijving,
             a.prs_kostenplaats_key,
             'Dagbladen' soort,
             dbl.prs_kenmerklink_waarde oms,
             abo.prs_kenmerklink_waarde ruimte,
             1 aantal,
             2177 fac_usrdata_key
        FROM prs_afdeling a,
             prs_kenmerklink kl,
             alg_v_ruimte_gegevens ra,
             (SELECT * FROM prs_kenmerklink WHERE prs_kenmerk_key = 1304
                 AND prs_kenmerklink_verwijder IS NULL) dbl,
             (SELECT * FROM prs_kenmerklink WHERE prs_kenmerk_key = 1303
                 AND prs_kenmerklink_verwijder IS NULL) abo
       WHERE kl.prs_kenmerk_key = 1305
         AND kl.prs_kenmerklink_verwijder IS NULL
         AND kl.prs_link_key = a.prs_afdeling_key
         AND ra.alg_ruimte_key = fac.safe_to_number(kl.prs_kenmerklink_waarde)
         AND dbl.prs_link_key(+) = a.prs_afdeling_key
         AND abo.prs_link_key(+) = a.prs_afdeling_key
      UNION ALL
      SELECT a.prs_afdeling_key,
             a.prs_afdeling_omschrijving,
             a.prs_kostenplaats_key,
             'Dagbladen' soort,
             dbl.prs_kenmerklink_waarde oms,
             abo.prs_kenmerklink_waarde ruimte,
             1 aantal,
             2177 fac_usrdata_key
        FROM prs_afdeling a,
             prs_kenmerklink kl,
             alg_v_ruimte_gegevens ra,
             (SELECT * FROM prs_kenmerklink WHERE prs_kenmerk_key = 1307
                 AND prs_kenmerklink_verwijder IS NULL) dbl,
             (SELECT * FROM prs_kenmerklink WHERE prs_kenmerk_key = 1309
                 AND prs_kenmerklink_verwijder IS NULL) abo
       WHERE kl.prs_kenmerk_key = 1308
         AND kl.prs_kenmerklink_verwijder IS NULL
         AND kl.prs_link_key = a.prs_afdeling_key
         AND ra.alg_ruimte_key = fac.safe_to_number(kl.prs_kenmerklink_waarde)
         AND dbl.prs_link_key(+) = a.prs_afdeling_key
         AND abo.prs_link_key(+) = a.prs_afdeling_key
      UNION ALL
      SELECT a.prs_afdeling_key,
             a.prs_afdeling_omschrijving prs_afdeling_omschrijving,
             a.prs_kostenplaats_key,
             'Opslag containers' soort,
                'Container ('
             || fac.safe_to_number(kl.prs_kenmerklink_waarde)
             || 'x)'
                oms,
             NULL ruimte,
             fac.safe_to_number(kl.prs_kenmerklink_waarde) aantal,
             2197 fac_usrdata_key
        FROM prs_afdeling a,
             prs_kenmerklink kl
       WHERE kl.prs_kenmerk_key = 1321
         AND kl.prs_kenmerklink_verwijder IS NULL
         AND kl.prs_link_key = a.prs_afdeling_key) a,
      fac_usrdata ud,
      prs_kostenplaats k
 WHERE ud.fac_usrdata_key = a.fac_usrdata_key
   AND k.prs_kostenplaats_key = a.prs_kostenplaats_key;

--- RUIMTEGEGEVENS, PERSOONSGEGEVENS, INFORMATIEGIDS ---------------------------

-- AKZA12084: ruimtebeheerders inclusief afdeling als bron voor flexkenmerk bij ruimte (en van belang voor werkvergunning)
CREATE OR REPLACE VIEW akza_v_ruimtebeheerders
(prs_perslid_key, persoonafdeling)
AS
   SELECT   p.prs_perslid_key, p.prs_perslid_naam || ' / ' || a.prs_afdeling_naam
       FROM prs_perslid p, prs_afdeling a
      WHERE p.prs_perslid_verwijder IS NULL
        AND p.prs_afdeling_key = a.prs_afdeling_key
   ORDER BY p.prs_perslid_naam;

CREATE OR REPLACE VIEW akza_v_extraphone (fclt_f_groep,
                                                fclt_f_omschrijving,
                                                fclt_f_plaats,
                                                fclt_f_bereiken,
                                                nummer_email,
                                                fclt_3d_locatie_key,
                                                fclt_3d_gebouw_key
                                                    )
AS
   SELECT   ins_srtdeel_omschrijving, idd.ins_deel_omschrijving,
            alg_plaatsaanduiding, ins_srtkenmerk_omschrijving,
            ins_kenmerkdeel_waarde, alg_locatie_key, alg_gebouw_key
       FROM INS_DEEL idd,
            INS_KENMERKDEEL ikd,
            INS_KENMERK ik,
            INS_SRTKENMERK isk,
            INS_SRTDEEL isd,
            ins_v_alg_overzicht o
      WHERE idd.ins_deel_verwijder IS NULL
        AND idd.ins_srtdeel_key = isd.ins_srtdeel_key
        AND idd.ins_deel_key = ikd.ins_deel_key
        AND ikd.ins_kenmerk_key = ik.ins_kenmerk_key
        AND isk.ins_srtkenmerk_key = ik.ins_srtkenmerk_key
        AND ins_kenmerkdeel_verwijder IS NULL
        AND isk.ins_srtkenmerk_kenmerktype NOT IN ('L', 'Q', 'M', 'F')
        AND idd.ins_discipline_key = 825           -- Additieve Bereikbaarheid
        AND isk.ins_srtkenmerk_key IN (3082, 3083, 3084)      -- Tel/Fax/Email
        AND o.alg_ruimte_key = idd.ins_alg_ruimte_key
        AND o.alg_onroerendgoed_type = idd.ins_alg_ruimte_type
   ORDER BY idd.ins_deel_omschrijving, ins_kenmerk_volgnummer;

-- Ongeacht of een BHV-kenmerk is ingevuld
CREATE OR REPLACE VIEW akza_v_rap_bhv_all
AS
  SELECT pf.prs_perslid_key hide_f_key,
         pf.prs_perslid_naam_full fclt_f_naam,
         p.prs_perslid_telefoonnr telefoon,
         d.prs_afdeling_naam fclt_f_afdeling,
         w.alg_gebouw_code fclt_f_gebouw,
         w.alg_verdieping_code verdieping,
         w.alg_ruimte_nr ruimte,
         NVL((SELECT kl.prs_kenmerklink_waarde
                FROM prs_kenmerklink kl
               WHERE kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1166),
             'Nooit') fclt_f_laatste_instructie_kb,
         NVL((SELECT kl.prs_kenmerklink_waarde
                FROM prs_kenmerklink kl
               WHERE kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1165),
             'Nooit') fclt_f_laatste_instructie_ehbo,
         NVL((SELECT kl.prs_kenmerklink_waarde
                FROM prs_kenmerklink kl
               WHERE kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1168),
             'Nooit') fclt_f_ehbo_tot,
         NVL((SELECT fac_usrdata_omschr
                FROM prs_kenmerklink kl, fac_usrdata
               WHERE     kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1161
                     AND prs_kenmerklink_waarde = fac_usrdata_key),
             'Onbekend') fclt_f_actief_ehbo,
         NVL((SELECT kl.prs_kenmerklink_waarde
                FROM prs_kenmerklink kl
               WHERE kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1164),
             'Nooit') fclt_f_laatste_instructie_aed,
         NVL((SELECT kl.prs_kenmerklink_waarde
                FROM prs_kenmerklink kl
               WHERE kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1200),
             'Nooit') fclt_f_aed_tot,
         NVL((SELECT kl.prs_kenmerklink_waarde
                FROM prs_kenmerklink kl
               WHERE kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1180),
             'Nooit') fclt_f_nibhv_aed_per,
         NVL((SELECT kl.prs_kenmerklink_waarde
                FROM prs_kenmerklink kl
               WHERE kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1201),
             'Nooit') fclt_f_nibhv_aed_tot,
         NVL((SELECT kl.prs_kenmerklink_waarde
                FROM prs_kenmerklink kl
               WHERE kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1167),
             'Nooit') fclt_f_laatste_instructie_ocp,
         NVL((SELECT kl.prs_kenmerklink_waarde
                FROM prs_kenmerklink kl
               WHERE kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1202),
             'Nooit') fclt_f_ocp_tot,
         NVL((SELECT kl.prs_kenmerklink_waarde
                FROM prs_kenmerklink kl
               WHERE kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1203),
             'Nooit') fclt_f_nibhv_ocp_per,
         NVL((SELECT kl.prs_kenmerklink_waarde
                FROM prs_kenmerklink kl
               WHERE kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1204),
             'Nooit') fclt_f_nibhv_ocp_tot,
         NVL((SELECT kl.prs_kenmerklink_waarde
                FROM prs_kenmerklink kl
               WHERE kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1204),
             'Nooit') fclt_f_laatste_instructie_evac,
         NVL((SELECT fac_usrdata_omschr
                FROM prs_kenmerklink kl, fac_usrdata
               WHERE     kl.prs_link_key = p.prs_perslid_key
                     AND kl.prs_kenmerk_key = 1160
                     AND prs_kenmerklink_waarde = fac_usrdata_key),
            'Onbekend') fclt_f_actief_bhv
    FROM prs_perslid p,
         prs_v_perslid_fullnames pf,
         prs_v_werkplek_gegevens w,
         prs_perslidwerkplek pw,
         prs_afdeling d
   WHERE     p.prs_afdeling_key = d.prs_afdeling_key
         AND p.prs_perslid_key = pf.prs_perslid_key
         AND w.prs_werkplek_key = pw.prs_werkplek_key
         AND p.prs_perslid_key = pw.prs_perslid_key
         AND prs_perslid_upper NOT LIKE '[%'
         AND prs_perslid_upper NOT LIKE 'LEEG [%'
   ORDER BY 1;

CREATE OR REPLACE VIEW akza_v_rap_bhv
AS
   SELECT   *
     FROM akza_v_rap_bhv_all
    WHERE EXISTS (
            SELECT *
              FROM prs_kenmerklink kl
             WHERE kl.prs_link_key = hide_f_key
               AND kl.prs_kenmerk_key IN
                      -- Zie AKZA_V_RAP_BHV_ALL voor betekenis
                      (1166,
                       1165,
                       1168,
                       1161,
                       1164,
                       1200,
                       1180,
                       1201,
                       1167,
                       1202,
                       1203,
                       1204,
                       1205,
                       1160
                      ))
   ORDER BY 1;

-- Kentekenoverzicht (nu met flexvelden ipv persoonsgebonden objecten)
-- AKZA#30421: nu met fullnames en aanklikbare namen
CREATE OR REPLACE VIEW akza_v_rap_kentekens
AS
   SELECT * FROM
     (SELECT prs_perslid_naam_full||'1' hide_f_sort
            ,prs_perslid_naam_full fclt_x_naam
            ,      '<a class="details" onclick=''FcltMgr.openDetail("'
                || 'appl/prs/prs_perslid.asp?key='||pf.prs_perslid_key
                || '")''>'
                || htf.escape_sc(prs_perslid_naam_full)
                || '</a>'
             html_naam
            ,knt.prs_kenmerklink_waarde fclt_f_kenteken
            ,ud.fac_usrdata_omschr soort
            ,mrk.prs_kenmerklink_waarde merk
            ,typ.prs_kenmerklink_waarde type
            ,klr.prs_kenmerklink_waarde kleur
        FROM prs_v_perslid_fullnames pf
            ,prs_v_aanwezigkenmerklink knt
            ,prs_v_aanwezigkenmerklink srt
            ,fac_usrdata ud
            ,prs_v_aanwezigkenmerklink mrk
            ,prs_v_aanwezigkenmerklink typ
            ,prs_v_aanwezigkenmerklink klr
       WHERE     knt.prs_link_key    = pf.prs_perslid_key
             AND knt.prs_kenmerk_key = 1260
             AND srt.prs_link_key(+) = pf.prs_perslid_key
             AND srt.prs_kenmerk_key(+) = 1280
             AND srt.prs_kenmerklink_waarde = ud.fac_usrdata_key(+)
             AND mrk.prs_link_key(+) = pf.prs_perslid_key
             AND mrk.prs_kenmerk_key(+) = 1281
             AND typ.prs_link_key(+) = pf.prs_perslid_key
             AND typ.prs_kenmerk_key(+) = 1282
             AND klr.prs_link_key(+) = pf.prs_perslid_key
             AND klr.prs_kenmerk_key(+) = 1283)
   UNION
     (SELECT prs_perslid_naam_full||'2' hide_f_sort
            ,prs_perslid_naam_full fclt_x_naam
            ,      '<a class="details" onclick=''FcltMgr.openDetail("'
                || 'appl/prs/prs_perslid.asp?key='||pf.prs_perslid_key
                || '")''>'
                || htf.escape_sc(prs_perslid_naam_full)
                || '</a>'
             html_naam
            ,knt.prs_kenmerklink_waarde fclt_f_kenteken
            ,ud.fac_usrdata_omschr soort
            ,mrk.prs_kenmerklink_waarde merk
            ,typ.prs_kenmerklink_waarde type
            ,klr.prs_kenmerklink_waarde kleur
        FROM prs_v_perslid_fullnames pf
            ,prs_v_aanwezigkenmerklink knt
            ,prs_v_aanwezigkenmerklink srt
            ,fac_usrdata ud
            ,prs_v_aanwezigkenmerklink mrk
            ,prs_v_aanwezigkenmerklink typ
            ,prs_v_aanwezigkenmerklink klr
       WHERE     knt.prs_link_key = pf.prs_perslid_key
             AND knt.prs_kenmerk_key = 1284
             AND srt.prs_link_key(+) = pf.prs_perslid_key
             AND srt.prs_kenmerk_key(+) = 1285
             AND srt.prs_kenmerklink_waarde = ud.fac_usrdata_key(+)
             AND mrk.prs_link_key(+) = pf.prs_perslid_key
             AND mrk.prs_kenmerk_key(+) = 1286
             AND typ.prs_link_key(+) = pf.prs_perslid_key
             AND typ.prs_kenmerk_key(+) = 1287
             AND klr.prs_link_key(+) = pf.prs_perslid_key
             AND klr.prs_kenmerk_key(+) = 1288)
   UNION
     (SELECT prs_perslid_naam_full||'3' hide_f_sort
            ,prs_perslid_naam_full fclt_x_naam
            ,      '<a class="details" onclick=''FcltMgr.openDetail("'
                || 'appl/prs/prs_perslid.asp?key='||pf.prs_perslid_key
                || '")''>'
                || htf.escape_sc(prs_perslid_naam_full)
                || '</a>'
             html_naam
            ,knt.prs_kenmerklink_waarde fclt_f_kenteken
            ,ud.fac_usrdata_omschr soort
            ,mrk.prs_kenmerklink_waarde merk
            ,typ.prs_kenmerklink_waarde type
            ,klr.prs_kenmerklink_waarde kleur
        FROM prs_v_perslid_fullnames pf
            ,prs_v_aanwezigkenmerklink knt
            ,prs_v_aanwezigkenmerklink srt
            ,fac_usrdata ud
            ,prs_v_aanwezigkenmerklink mrk
            ,prs_v_aanwezigkenmerklink typ
            ,prs_v_aanwezigkenmerklink klr
       WHERE     knt.prs_link_key = pf.prs_perslid_key
             AND knt.prs_kenmerk_key = 1289
             AND srt.prs_link_key(+) = pf.prs_perslid_key
             AND srt.prs_kenmerk_key(+) = 1290
             AND srt.prs_kenmerklink_waarde = ud.fac_usrdata_key(+)
             AND mrk.prs_link_key(+) = pf.prs_perslid_key
             AND mrk.prs_kenmerk_key(+) = 1291
             AND typ.prs_link_key(+) = pf.prs_perslid_key
             AND typ.prs_kenmerk_key(+) = 1292
             AND klr.prs_link_key(+) = pf.prs_perslid_key
             AND klr.prs_kenmerk_key(+) = 1293)
   ORDER BY hide_f_sort;

-- AKZA#30584: Rapportage ruimte- en gebouwbeheerders (delegates) voor eindgebruikers
-- alg_kenmerk    1160     Areadelegate
-- alg_kenmerk    1180     Reserve Area delegate
-- alg_kenmerk    1181     Reserve Building delegate
-- alg_kenmerk    1182     Supervisor
-- alg_kenmerk    1183     Building delegate
-- alg_kenmerk    1184     Evacuation
-- alg_kenmerk    1185     Reserve Area delegate (res)
-- alg_kenmerk    1200     Reserve Ontruimingsfuctionaris
CREATE OR REPLACE VIEW akza_v_rap_areadelegates
AS
   SELECT al.alg_locatie_code||'-'||og.alg_gebouw_code||'-'||og.alg_verdieping_code||'-'||og.alg_ruimte_nr hide_f_sort,
          al.alg_locatie_code fclt_f_locatie,
          og.alg_gebouw_code fclt_f_gebouw,
          og.alg_verdieping_code fclt_f_verdieping,
          og.alg_ruimte_nr||' ('||og.alg_ruimte_omschrijving||')' fclt_f_ruimte,
          areadel.prs_perslid_naam_full areagedelegeerde,
          areares.prs_perslid_naam_full reserve_areagedelegeerde,
          arearesres.prs_perslid_naam_full res_reserve_areagedelegeerde,
          builddel.prs_perslid_naam_full gebouwgedelegeerde,
          buildres.prs_perslid_naam_full reserve_gebouwgedelegeerde,
          superv.prs_perslid_naam_full supervisor,
          evac.prs_perslid_naam_full ontruimingsfunctionaris,
          evacres.prs_perslid_naam_full res_ontruimingsfunctionaris
     FROM alg_v_aanweziglocatie al,
          alg_v_onroerendgoed_gegevens og,
          (SELECT ok.alg_onrgoed_key alg_ruimte_key,
                  pf.prs_perslid_key,
                  pf.prs_perslid_naam_full
             FROM alg_onrgoedkenmerk ok, prs_v_perslid_fullnames pf
            WHERE ok.alg_onrgoed_niveau = 'R' AND ok.alg_kenmerk_key = 1160
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL
              AND fac.safe_to_number(ok.alg_onrgoedkenmerk_waarde) = pf.prs_perslid_key) areadel,
          (SELECT ok.alg_onrgoed_key alg_ruimte_key,
                  pf.prs_perslid_key,
                  pf.prs_perslid_naam_full
             FROM alg_onrgoedkenmerk ok, prs_v_perslid_fullnames pf
            WHERE ok.alg_onrgoed_niveau = 'R' AND ok.alg_kenmerk_key = 1180
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL
              AND fac.safe_to_number(ok.alg_onrgoedkenmerk_waarde) = pf.prs_perslid_key) areares,
          (SELECT ok.alg_onrgoed_key alg_ruimte_key,
                  pf.prs_perslid_key,
                  pf.prs_perslid_naam_full
             FROM alg_onrgoedkenmerk ok, prs_v_perslid_fullnames pf
            WHERE ok.alg_onrgoed_niveau = 'R' AND ok.alg_kenmerk_key = 1185
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL
              AND fac.safe_to_number(ok.alg_onrgoedkenmerk_waarde) = pf.prs_perslid_key) arearesres,
          (SELECT ok.alg_onrgoed_key alg_ruimte_key,
                  pf.prs_perslid_key,
                  pf.prs_perslid_naam_full
             FROM alg_onrgoedkenmerk ok, prs_v_perslid_fullnames pf
            WHERE ok.alg_onrgoed_niveau = 'R' AND ok.alg_kenmerk_key = 1183
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL
              AND fac.safe_to_number(ok.alg_onrgoedkenmerk_waarde) = pf.prs_perslid_key) builddel,
          (SELECT ok.alg_onrgoed_key alg_ruimte_key,
                  pf.prs_perslid_key,
                  pf.prs_perslid_naam_full
             FROM alg_onrgoedkenmerk ok, prs_v_perslid_fullnames pf
            WHERE ok.alg_onrgoed_niveau = 'R' AND ok.alg_kenmerk_key = 1181
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL
              AND fac.safe_to_number(ok.alg_onrgoedkenmerk_waarde) = pf.prs_perslid_key) buildres,
          (SELECT ok.alg_onrgoed_key alg_ruimte_key,
                  pf.prs_perslid_key,
                  pf.prs_perslid_naam_full
             FROM alg_onrgoedkenmerk ok, prs_v_perslid_fullnames pf
            WHERE ok.alg_onrgoed_niveau = 'R' AND ok.alg_kenmerk_key = 1182
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL
              AND fac.safe_to_number(ok.alg_onrgoedkenmerk_waarde) = pf.prs_perslid_key) superv,
          (SELECT ok.alg_onrgoed_key alg_ruimte_key,
                  pf.prs_perslid_key,
                  pf.prs_perslid_naam_full
             FROM alg_onrgoedkenmerk ok, prs_v_perslid_fullnames pf
            WHERE ok.alg_onrgoed_niveau = 'R' AND ok.alg_kenmerk_key = 1184
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL
              AND fac.safe_to_number(ok.alg_onrgoedkenmerk_waarde) = pf.prs_perslid_key) evac,
          (SELECT ok.alg_onrgoed_key alg_ruimte_key,
                  pf.prs_perslid_key,
                  pf.prs_perslid_naam_full
             FROM alg_onrgoedkenmerk ok, prs_v_perslid_fullnames pf
            WHERE ok.alg_onrgoed_niveau = 'R' AND ok.alg_kenmerk_key = 1200
              AND ok.alg_onrgoedkenmerk_verwijder IS NULL
              AND fac.safe_to_number(ok.alg_onrgoedkenmerk_waarde) = pf.prs_perslid_key) evacres
    WHERE og.alg_locatie_key = al.alg_locatie_key
      AND og.alg_ruimte_key IS NOT NULL
      AND areadel.alg_ruimte_key(+) = og.alg_ruimte_key
      AND areares.alg_ruimte_key(+) = og.alg_ruimte_key
      AND arearesres.alg_ruimte_key(+) = og.alg_ruimte_key
      AND builddel.alg_ruimte_key(+) = og.alg_ruimte_key
      AND buildres.alg_ruimte_key(+) = og.alg_ruimte_key
      AND superv.alg_ruimte_key(+) = og.alg_ruimte_key
      AND evac.alg_ruimte_key(+) = og.alg_ruimte_key
      AND evacres.alg_ruimte_key(+) = og.alg_ruimte_key
      AND (   areadel.alg_ruimte_key IS NOT NULL
           OR areares.alg_ruimte_key IS NOT NULL
           OR arearesres.alg_ruimte_key IS NOT NULL
           OR builddel.alg_ruimte_key IS NOT NULL
           OR buildres.alg_ruimte_key IS NOT NULL
           OR superv.alg_ruimte_key IS NOT NULL
           OR evac.alg_ruimte_key IS NOT NULL
           OR evacres.alg_ruimte_key IS NOT NULL);

--- OBJECTBEHEER ---------------------------------------------------------------

-- AKZA#29494: Labels met QR-code voor objecten
CREATE OR REPLACE VIEW akza_v_ins_qrc
AS
   SELECT i.ins_deel_omschrijving hide_f_sort,
          b.fac_bookmark_naam fclt_f_bookmark,
          i.ins_discipline_key fclt_3d_discipline_key,
          l.alg_locatie_key fclt_3d_locatie_key,
          l.alg_locatie_omschrijving fclt_f_locatie,
          o.alg_gebouw_omschrijving fclt_f_gebouw,
          o.alg_plaatsaanduiding plaats,
          s.ins_srtdeel_omschrijving fclt_f_objectsoort,
          i.ins_deel_omschrijving fclt_f_identificatie,
          i.ins_deel_key,
          (SELECT r.alg_ruimte_omschrijving
             FROM alg_ruimte r
            WHERE r.alg_ruimte_key = i.ins_alg_ruimte_key)
             soortruimte,
          s.ins_srtdeel_code,
          s.ins_srtdeel_key,
          i.ins_alg_ruimte_type,
          o.alg_gebouw_code,
          o.alg_verdieping_code,
          l.alg_district_key,
          i.ins_alg_ruimte_key,
          b.fac_bookmark_id hide_f_bookmark_id
     FROM ins_deel i,
          ins_v_alg_overzicht o,
          ins_srtdeel s,
          alg_locatie l,
          alg_district di,
          fac_bookmark b
    WHERE     b.fac_bookmark_path IN ('appl/pda/ins_deel.asp',
                                      'appl/ins/ins_deel.asp')
          AND ins_deel_verwijder IS NULL
          AND COALESCE(i.ins_deel_vervaldatum, SYSDATE+1) > SYSDATE
          AND i.ins_deel_module = 'INS'
          AND i.ins_deel_parent_key IS NULL
          AND o.alg_onroerendgoed_keys = i.ins_alg_ruimte_key
          AND o.alg_onroerendgoed_type = i.ins_alg_ruimte_type
          AND i.ins_alg_ruimte_type IN ('T', 'R', 'W')
          AND o.alg_locatie_key = i.ins_alg_locatie_key
          AND i.ins_alg_locatie_key = l.alg_locatie_key
          AND l.alg_district_key = di.alg_district_key
          AND s.ins_srtdeel_key = i.ins_srtdeel_key
   UNION ALL
   SELECT i.ins_deel_omschrijving hide_f_sort,
          b.fac_bookmark_naam fclt_f_bookmark,
          i.ins_discipline_key fclt_3d_discipline_key,
          l.alg_locatie_key fclt_3d_locatie_key,
          l.alg_locatie_omschrijving fclt_f_locatie,
          o.alg_gebouw_omschrijving fclt_f_gebouw,
          o.alg_plaatsaanduiding plaats,
          s.ins_srtdeel_omschrijving fclt_f_objectsoort,
          i.ins_deel_omschrijving fclt_f_identificatie,
          i.ins_deel_key,
          (SELECT r.alg_ruimte_omschrijving
             FROM alg_ruimte r
            WHERE r.alg_ruimte_key = i.ins_alg_ruimte_key)
             soortruimte,
          s.ins_srtdeel_code,
          s.ins_srtdeel_key,
          i.ins_alg_ruimte_type,
          o.alg_gebouw_code,
          o.alg_verdieping_code,
          l.alg_district_key,
          i.ins_alg_ruimte_key,
          b.fac_bookmark_id hide_f_bookmark_id
     FROM ins_deel i,
          ins_v_alg_overzicht o,
          ins_srtdeel s,
          ins_srtgroep g,
          alg_locatie l,
          alg_district di,
          fac_bookmark b,
          mld_stdmelding sm,
          mld_stdmelding_srtinst si
    WHERE     b.fac_bookmark_path IN ('appl/pda/melding.asp',
                                      'appl/mld/melding.asp')
--          AND b.fac_bookmark_query LIKE '%stdm_key='||sm.mld_stdmelding_key||'%'
          AND (b.fac_bookmark_expire IS NULL OR b.fac_bookmark_expire > SYSDATE)
          AND ins_deel_verwijder IS NULL
          AND i.ins_deel_module = 'INS'
          AND i.ins_deel_parent_key IS NULL
          AND s.ins_srtdeel_key = i.ins_srtdeel_key
          AND g.ins_srtgroep_key = s.ins_srtgroep_key
          AND o.alg_onroerendgoed_keys = i.ins_alg_ruimte_key
          AND o.alg_onroerendgoed_type = i.ins_alg_ruimte_type
          AND i.ins_alg_ruimte_type IN ('T', 'R', 'W')
          AND o.alg_locatie_key = i.ins_alg_locatie_key
          AND i.ins_alg_locatie_key = l.alg_locatie_key
          AND l.alg_district_key = di.alg_district_key
          AND sm.mld_stdmelding_key = si.mld_stdmelding_key
          AND si.ins_srtinstallatie_key = DECODE(si.ins_srtinstallatie_niveau,
                                          'S', i.ins_srtdeel_key,
                                          'G', s.ins_srtgroep_key,
                                          'D', g.ins_discipline_key);

CREATE OR REPLACE VIEW akza_v_ins_qrc_single
AS
   SELECT *
     FROM akza_v_ins_qrc;

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

CREATE OR REPLACE VIEW AKZA_V_NOTI_OBJBEH
(
   METHODE,
   TO_KEY,
   TO_OMSCHR,
   REF_KEY,
   REF_OMSCHR,
   KPN_KEY,
   AANTAL,
   BETREFT
)
AS
   WITH taken
           AS (/* Formatted on 24-5-2018 14:37:40 (QP5 v5.136.908.31019) */
SELECT fac.nextcyclusdatedeel (d.ins_deel_key, d.ins_srtcontrole_key, 1)
          volgende_cyclus,
       p.ins_deelsrtcontrole_plandatum datum_gepland,
       COALESCE (
          p.ins_deelsrtcontrole_plandatum,
          fac.nextcyclusdatedeel (d.ins_deel_key, d.ins_srtcontrole_key, 1))
          volgende_ctr,
       d.*,
       xcp.ins_srtcontroledl_xcp_periode
  FROM (SELECT sc.ins_srtcontrole_key,
               d.ins_deel_key,
               d.ins_deel_omschrijving,
               sc.ins_srtcontrole_periode,
               sd.ins_srtdeel_omschrijving,
               a.prs_kostenplaats_key,
               pfa.prs_perslid_key,
               pfa.prs_perslid_naam_full,
               ud.fac_usrdata_key,
               ud.fac_usrdata_omschr
          FROM ins_srtcontrole sc,
               ins_discipline di,
               ins_v_aanwezigsrtgroep sg,
               ins_v_aanwezigsrtdeel sd,
               ins_v_aanwezigdeel d,
               prs_perslid p,
               prs_afdeling a,
               prs_v_perslid_fullnames_all pfa,
               (SELECT *
                  FROM ins_kenmerkdeel kd, ins_kenmerk k
                 WHERE     kd.ins_kenmerkdeel_verwijder IS NULL
                       AND kd.ins_kenmerk_key = k.ins_kenmerk_key
                       AND k.ins_srtkenmerk_key = 3742) kd, -- Uitvoerder regime
               fac_usrdata ud
         WHERE     sd.ins_srtdeel_key = d.ins_srtdeel_key
               AND sg.ins_srtgroep_key = sd.ins_srtgroep_key
               AND di.ins_discipline_key = sg.ins_discipline_key
               AND COALESCE (d.ins_deel_vervaldatum, SYSDATE + 1) > SYSDATE
               AND p.prs_perslid_key = d.prs_perslid_key_beh
               AND a.prs_afdeling_key(+) = p.prs_afdeling_key
               AND pfa.prs_perslid_key = d.prs_perslid_key_beh
               AND kd.ins_deel_key = d.ins_deel_key
               AND kd.ins_kenmerkdeel_waarde != '4321'             -- 'N.v.t.'
               AND ud.fac_usrdata_key =
                     fac.safe_to_number (kd.ins_kenmerkdeel_waarde)
               AND sc.ins_srtinstallatie_key =
                     DECODE (ins_srtcontrole_niveau,
                             'D', di.ins_discipline_key,
                             'G', sg.ins_srtgroep_key,
                             'S', sd.ins_srtdeel_key)) d,
       ins_srtcontroledl_xcp xcp,
       (SELECT *
          FROM ins_v_udr_deelinspect ins
         WHERE deelsrtcontrole_status = 'Gepland'
               AND ins_deelsrtcontrole_plandatum IS NOT NULL) p
 WHERE     xcp.ins_deel_key = d.ins_deel_key
       AND xcp.ins_srtcontrole_key = d.ins_srtcontrole_key
       AND p.deel_key(+) = d.ins_deel_key
       AND p.ins_srtcontrole_key(+) = d.ins_srtcontrole_key
       AND COALESCE (xcp.ins_srtcontroledl_xcp_periode,
                     d.ins_srtcontrole_periode) > 0
       -- De eerste paar dagen van volgende maand ook vast meepakken, dat scheelt verrassingen
       AND COALESCE (
             p.ins_deelsrtcontrole_plandatum,
             fac.nextcyclusdatedeel (d.ins_deel_key,
                                     d.ins_srtcontrole_key,
                                     1)) < ADD_MONTHS (SYSDATE, 1) + 3)
     SELECT 'mail' methode,
            prs_perslid_key to_key,
            prs_perslid_naam_full to_omschr,
            NULL ref_key,
            NULL ref_omschr,
            NULL kpn_key,
            COUNT ( * ) aantal,
            LISTAGG (ins_deel_omschrijving, ', ')
               WITHIN GROUP (ORDER BY ins_deel_omschrijving)
               AS betreft
       FROM taken
      WHERE fac_usrdata_key = 4318                          -- Objectbeheerder
   GROUP BY prs_perslid_key, prs_perslid_naam_full
   UNION ALL
     SELECT 'melding' methode,
            fac_usrdata_key to_key,
            fac_usrdata_omschr to_omschr,
            prs_perslid_key ref_key,
            prs_perslid_naam_full ref_omschr,
            prs_kostenplaats_key kpn_key,
            COUNT ( * ) aantal,
            LISTAGG (ins_deel_omschrijving, ', ')
               WITHIN GROUP (ORDER BY ins_deel_omschrijving)
               AS betreft
       FROM taken
      WHERE fac_usrdata_key IN (4319, 4320, 4347)     -- TS-EIA / TS-WTB / LDW
   GROUP BY fac_usrdata_key,
            fac_usrdata_omschr,
            prs_kostenplaats_key,
            prs_perslid_key,
            prs_perslid_naam_full
   ORDER BY methode, to_omschr, ref_omschr;

CREATE OR REPLACE FORCE VIEW AKZA_V_TAKEN_STOPLICHT
(
   ALG_LOCATIE_CODE,
   ALG_GEBOUW_CODE,
   ALG_GEBOUW_KEY,
   ALG_VERDIEPING_CODE,
   ALG_VERDIEPING_KEY,
   ALG_RUIMTE_NR,
   ALG_RUIMTE_KEY,
   STATUS
)
AS
   WITH taken
           AS (SELECT d.*,
                      fac.nextcyclusdatedeel (d.ins_deel_key,
                                              d.ins_srtcontrole_key,
                                              1)
                         datum,
                      ins_deelsrtcontrole_plandatum,
                      CASE
                         WHEN ins_deelsrtcontrole_plandatum IS NOT NULL
                         THEN
                            ins_deelsrtcontrole_plandatum
                         ELSE
                            fac.nextcyclusdatedeel (d.ins_deel_key,
                                                    d.ins_srtcontrole_key,
                                                    1)
                      END
                         AS next_date
                 FROM (SELECT d.ins_alg_ruimte_key,
                              d.ins_deel_key,
                              d.ins_deel_omschrijving,
                              sd.ins_srtdeel_omschrijving,
                              sc.ins_srtcontrole_key,
                              sc.ins_srtcontrole_periode
                         FROM ins_srtcontrole sc,
                              ins_discipline di,
                              ins_v_aanwezigsrtgroep sg,
                              ins_v_aanwezigsrtdeel sd,
                              ins_v_aanwezigdeel d,
                              prs_perslid p
                        WHERE sd.ins_srtdeel_key = d.ins_srtdeel_key
                              AND sg.ins_srtgroep_key = sd.ins_srtgroep_key
                              AND di.ins_discipline_key =
                                    sg.ins_discipline_key
                              AND COALESCE (d.ins_deel_vervaldatum,
                                            SYSDATE + 1) > SYSDATE
                              AND p.prs_perslid_key = d.prs_perslid_key_beh
                              AND d.ins_alg_ruimte_type = 'R'
                              AND sc.ins_srtinstallatie_key =
                                    DECODE (ins_srtcontrole_niveau,
                                            'D', di.ins_discipline_key,
                                            'G', sg.ins_srtgroep_key,
                                            'S', sd.ins_srtdeel_key)) d
                      LEFT OUTER JOIN ins_srtcontroledl_xcp xcp
                         ON xcp.ins_deel_key = d.ins_deel_key
                            AND xcp.ins_srtcontrole_key =
                                  d.ins_srtcontrole_key
                      LEFT OUTER JOIN (SELECT d.ins_alg_ruimte_key,
                                              d.ins_deel_key,
                                              d.ins_deel_omschrijving,
                                              sd.ins_srtdeel_omschrijving,
                                              c.ins_srtcontrole_key,
                                              sc.ins_srtcontrole_periode,
                                              c.ins_deelsrtcontrole_plandatum
                                         FROM ins_deelsrtcontrole c,
                                              ins_v_aanwezigdeel d,
                                              ins_srtdeel sd,
                                              ins_srtcontrole sc
                                        WHERE c.ins_deelsrtcontrole_plandatum IS NOT NULL
                                              AND c.ins_deelsrtcontrole_datum IS NULL
                                              AND d.ins_deel_key =
                                                    c.ins_deel_key
                                              AND sd.ins_srtdeel_key =
                                                    d.ins_srtdeel_key
                                              AND sc.ins_srtcontrole_key =
                                                    c.ins_srtcontrole_key)
                                      respijt
                         ON respijt.ins_deel_key = d.ins_deel_key
                            AND respijt.ins_srtcontrole_key =
                                  d.ins_srtcontrole_key
                WHERE COALESCE (xcp.ins_srtcontroledl_xcp_periode,
                                d.ins_srtcontrole_periode) > 0)
   SELECT r."ALG_LOCATIE_CODE",
          r."ALG_GEBOUW_CODE",
          r."ALG_GEBOUW_KEY",
          r."ALG_VERDIEPING_CODE",
          r."ALG_VERDIEPING_KEY",
          r."ALG_RUIMTE_NR",
          r."ALG_RUIMTE_KEY",
          t.status
     FROM    (SELECT l.alg_locatie_code,
                     g.alg_gebouw_code,
                     g.alg_gebouw_key,
                     v.alg_verdieping_code,
                     v.alg_verdieping_key,
                     r.alg_ruimte_nr,
                     r.alg_ruimte_key
                FROM alg_v_aanwezigruimte r,
                     alg_v_aanwezigverdieping v,
                     alg_v_aanweziggebouw g,
                     alg_v_aanweziglocatie l
               WHERE     v.alg_verdieping_key = r.alg_verdieping_key
                     AND g.alg_gebouw_key = v.alg_gebouw_key
                     AND l.alg_locatie_key = g.alg_locatie_key) r
          LEFT OUTER JOIN
             (  SELECT ins_alg_ruimte_key alg_ruimte_key,
                       CASE
                          WHEN MIN(next_date) < SYSDATE THEN 1       -- 'rood'
                          WHEN MIN (next_date) < ADD_MONTHS (SYSDATE, 1) THEN 2 -- 'geel'
                          ELSE 3                                    -- 'groen'
                       END
                          status
                  FROM taken
              GROUP BY ins_alg_ruimte_key) t
          ON r.alg_ruimte_key = t.alg_ruimte_key;

CREATE OR REPLACE VIEW akza_v_cad_taken_stoplicht
AS
   SELECT alg_ruimte_key,
          DECODE(status,
                 1, 'rood',
                 2, 'geel',
                 3, 'groen') waarde
     FROM akza_v_taken_stoplicht;

--- SLEUTELBEHEER --------------------------------------------------------------

CREATE OR REPLACE VIEW akza_v_rap_sleutelplan
(
   EXTRA_KEY,
   FCLT_F_BEZITTER,
   PERSONEELSNR,
   AFDELING,
   TELEFOONNR,
   FCLT_F_SLUITPLAN,
   SOORT,
   SLEUTELNR,
   DATUM,
   OPMERKING
)
AS
     SELECT   p1.prs_perslid_key,
              p.prs_perslid_naam_full,
              p1.prs_perslid_nr,
              a.prs_afdeling_naam1,
              p1.prs_perslid_telefoonnr,
              ins_srtdeel_code Sluitplan,
              s.ins_srtdeel_omschrijving Soort,
              dl.ins_deel_omschrijving Sleutelnr,
              TO_CHAR (
                 (SELECT   MAX (tr.fac_tracking_datum)
                    FROM   fac_tracking tr, fac_srtnotificatie str
                   WHERE   tr.fac_srtnotificatie_key =
                              str.fac_srtnotificatie_key
                           AND (str.fac_srtnotificatie_xmlnode IN ('deel'))
                           AND FAC_SRTNOTIFICATIE_CODE = 'INSOUT'
                           AND dl.ins_deel_key = tr.fac_tracking_refkey),
                 'DD-MM-YYYY'
              )
                 Datum,
                 pa.alg_plaatsaanduiding
              || ' ('
              || r.alg_ruimte_omschrijving
              || ')'
                 Opmerking
       FROM   ins_v_aanwezigdeel dl,
              ins_v_aanwezigsrtdeel s,
              prs_v_perslid_fullnames_all p,
              prs_v_aanwezigperslid p1,
              alg_ruimte r,
              ins_v_alg_overzicht pa,
              prs_v_afdeling a
      WHERE       s.ins_srtdeel_key = dl.ins_srtdeel_key
              AND s.ins_srtgroep_key = 925
              AND dl.ins_alg_ruimte_type_org = 'R'
              AND dl.ins_alg_ruimte_key = p.prs_perslid_key
              AND p.prs_perslid_key = p1.prs_perslid_key
              AND dl.ins_alg_ruimte_key_org IS NOT NULL
              AND dl.ins_alg_ruimte_key_org = r.alg_ruimte_key
              AND r.alg_ruimte_key = pa.alg_onroerendgoed_keys
              AND a.prs_afdeling_key = p1.prs_afdeling_key
   ORDER BY   prs_perslid_naam_full, sluitplan;

CREATE OR REPLACE VIEW akza_v_noti_sleutelplan
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   XKEY
)
AS
   SELECT 'CUST01',
          NULL,
          fac.safe_to_number (prs_perslid_key_voor),
          'Overzicht sleutels',
          (SELECT fac_usrrap_key
             FROM fac_usrrap
            WHERE fac_usrrap_omschrijving = 'AKZA_V_RAP_SLEUTELPLAN'),
          fac.safe_to_number (prs_perslid_key_voor)
     FROM mld_melding,
          fac_tracking tr,
          fac_srtnotificatie str
    WHERE mld_stdmelding_key = 1061
      AND mld_melding_status IN (5, 6)
      AND tr.fac_srtnotificatie_key = str.fac_srtnotificatie_key
      AND ( (tr.fac_tracking_refkey = mld_melding_key
             AND str.fac_srtnotificatie_xmlnode IN ('melding')))
      AND fac_srtnotificatie_code = 'MLDAFM'
      AND tr.fac_tracking_datum >
            (SELECT fac_notificatie_job_nextrun
                    - fac_notificatie_job_interval / 24
               FROM fac_notificatie_job
              WHERE fac_notificatie_job_view = 'AKZA_V_NOTI_SLEUTELPLAN');

-- AKZA#30566 notificatie tbv einde tijdelijke badge
CREATE OR REPLACE VIEW AKZA_V_NOTI_MLD_EINDTMPBADGE
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   XKEY
)
AS
    SELECT 'CUST03',
           NULL,
           m.prs_perslid_key,
           'Tijdelijke badge verloopt: ' || einddat_badge.datum || ' (oorsponkelijke aanvraag: ' || m.mld_melding_key || ')',
           m.mld_melding_key,
           NULL
      FROM mld_melding  m,
           (SELECT mld_melding_key, mld_kenmerkmelding_waarde datum
              FROM mld_kenmerkmelding km
             WHERE     km.mld_kenmerk_key IN (305, 1574, 1561) -- 305 uit de oude aanvragen, 1574 als vervolgmelding (wordt of gevuld vanuit voorgaande of in deze mld, 1561 vanuit verlenging)
                   AND mld_kenmerkmelding_waarde IS NOT NULL
                   AND mld_kenmerkmelding_verwijder IS NULL) einddat_badge
     WHERE     m.mld_melding_key = einddat_badge.mld_melding_key
           AND fac.safe_to_date (einddat_badge.datum, 'DD-MM-YYYY') =
               TRUNC (SYSDATE + 7);

--- EXPORTS --------------------------------------------------------------------

-- FACILITOR beoordeelt maandelijks welke taken in de komende periode moeten worden uitgevoerd,
-- of al uitgevoerd hadden moeten zijn. De beheerders van de objecten van deze taken worden
-- hiervan op de hoogte gesteld.
-- * Is de beheerder tevens de eigenaar (owner), dan krijgt deze hierover een e-mail, met een
--   link naar een overzicht van taken op zijn objecten
-- * Ligt het beheer bij TS (EIA of WTB), dan wordt per objectbeheerder een melding aangemaakt,
-- die vanzelf in de actielijst van de juiste backoffice terecht komen. Melder = objectbeheerder
-- (plus kostenplaats).
-- NB: een owner ontvangt maximaal één e-mail per maand; men ontvangt niet over ieder object
-- een e-mail en er wordt alleen een e-mail verzonden als er in de komende periode taken op
-- objecten van de owner uitgevoerd moeten worden (of taken te laat zijn).

CREATE OR REPLACE PROCEDURE AKZA_INSERT_OBJECTEN (
    p_to_key            IN NUMBER,
    p_ref_key           IN NUMBER,
    p_mld_melding_key   IN VARCHAR2)
IS
    CURSOR c_objecten IS
        SELECT splt.methode,
               splt.to_key,
               splt.ref_key,
               obj.ins_deel_key
          FROM (SELECT DISTINCT methode,
                                to_key,
                                ref_key,
                                REGEXP_SUBSTR (betreft,
                                               '[^,]+',
                                               1,
                                               COLUMN_VALUE)    item
                  FROM akza_v_noti_objbeh  spl,
                       TABLE (
                           CAST (
                               MULTISET (
                                       SELECT LEVEL
                                         FROM DUAL
                                   CONNECT BY LEVEL <=
                                                LENGTH (
                                                    REGEXP_REPLACE (betreft,
                                                                    '[^,]'))
                                              + 1) AS SYS.OdciNumberList)))
               splt,
               ins_deel  obj
         WHERE     splt.methode = 'melding'
               AND TRIM (splt.item) = obj.ins_deel_omschrijving
               AND splt.to_key = p_to_key
               AND splt.ref_key = p_ref_key;
BEGIN
    FOR rec IN c_objecten
    LOOP
        BEGIN
            INSERT INTO mld_melding_object (mld_melding_key, ins_deel_key)
                 VALUES (p_mld_melding_key, rec.ins_deel_key);
        EXCEPTION
            WHEN OTHERS
            THEN
                fac.imp_writelog (
                    'Monthly Task',
                    'W',
                       'Aanvullen object: '
                    || rec.ins_deel_key
                    || ' is niet uitgevoerd',
                    'Melding: ' || p_mld_melding_key);
                    
                COMMIT;
        END;
    END LOOP;
END AKZA_INSERT_OBJECTEN;
/

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

   v_aanduiding         VARCHAR2(100);
   v_melding_key        NUMBER(10);

   CURSOR c
   IS
      SELECT * FROM akza_v_noti_objbeh;

     

BEGIN
   v_errorhint := 'init';

   DELETE imp_log WHERE imp_log_applicatie = p_applname;


   FOR rec IN c
   LOOP
      BEGIN
         IF (rec.methode = 'mail')
         THEN
            v_aanduiding := rec.ref_omschr || ' ('||rec.methode||') ';
         ELSE
            v_aanduiding := rec.to_omschr||'/'||rec.ref_omschr || ' ('||rec.methode||') ';
         END IF;

         IF (rec.methode = 'mail')
         THEN
            v_errorhint := 'Add mail';

            INSERT INTO fac_notificatie (
               fac_srtnotificatie_key,
               fac_notificatie_status,
               prs_perslid_key_receiver,
               fac_notificatie_receiver_email,
               fac_notificatie_oms,
               fac_notificatie_refkey,
               prs_perslid_key_sender,
               fac_notificatie_prioriteit,
               fac_notificatie_lang)
            SELECT fac_srtnotificatie_key,
                   2,
                   rec.to_key,
                   prs_perslid_email,
                   rec.aantal||' uit te voeren taken deze maand',
                   rec.to_key,
                   7520,
                   2,
                   'NL'
              FROM fac_srtnotificatie,
                   prs_perslid
             WHERE fac_srtnotificatie_code = 'CUST05'
               AND prs_perslid_key = rec.to_key;

            fac.writelog (p_applname, 'I',
                          'Mail naar '||rec.to_omschr,
                          rec.aantal||' objecten');
         ELSE
            v_errorhint := 'Add melding';

            INSERT INTO mld_melding (
               mld_melding_onderwerp,
               mld_melding_omschrijving,
               mld_kosten_klant,
               prs_perslid_key,
               prs_perslid_key_voor,
               prs_kostenplaats_key,
               mld_stdmelding_key,
               mld_alg_locatie_key,
               mld_melding_datum,
               mld_meldbron_key,
               mld_melding_status,
               mld_melding_module,
               mld_melding_spoed)
            VALUES (
                 'Taken voor '||rec.ref_omschr,
                   rec.aantal||' uit te voeren taken deze maand voor objectbeheerder '||rec.ref_omschr
                 ||CHR(13)||CHR(10)||'Betreft object(en): '||rec.betreft,
                 1,
                 rec.ref_key,
                 rec.ref_key,
                 rec.kpn_key,
                 DECODE(rec.to_key,
                        4320, 1481,    -- EIA / Uitvoering regime
                        4319, 1482,   -- WTB / Uitvoering regime
                        4347, 1581),  -- LDW/ Uitvoering regime
                 121,                  -- DEV
                 SYSDATE,
                 45,                   -- System
                 NULL,                 -- Nieuw
                 'MLD',
                 3)
            RETURNING mld_melding_key
            INTO v_melding_key;

            v_errorhint := 'Set status';
            mld.setmeldingstatus (v_melding_key, 2, 7520);

            fac.writelog (p_applname, 'I',
                          'Melding voor '||rec.to_omschr||', namens '||rec.ref_omschr,
                          rec.aantal||' objecten');
                          
            AKZA_INSERT_OBJECTEN (rec.to_key, rec.ref_key, v_melding_key);
            
         END IF;

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

EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      fac.writelog (p_applname, 'E',
                    'Error ' || oracle_err_num || '/' || oracle_err_mes,
                    v_errorhint);
END akza_export_task_monthly;
/

-- Rapport om te check of alle kostenplaats- en companygegevens volledig zijn ingevuld.
CREATE OR REPLACE VIEW akza_v_rap_kpn_check
AS
   SELECT DISTINCT k.prs_kostenplaats_nr||'-'||k.debiteurnr hide_f_sort,
          k.fclt_kostenplaats_nr fclt_f_kostenplaats_nr,
          k.prs_kostenplaats_omschrijving fclt_x_kostenplaats_naam,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/prs/kpn_kpn.asp?mode=viewUpdate&'||'key='||k.prs_kostenplaats_key
          || '")''>'
          || htf.escape_sc(k.prs_kostenplaats_omschrijving)
          || '</a>'
             html_kostenplaats_naam,
          k.debiteurnr fclt_f_debiteurnr,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/prs/kpn_kpngroep.asp?mode=viewUpdate&'||'key='||k.prs_kostenplaatsgrp_key
          || '")''>'
          || htf.escape_sc(k.prs_kostenplaatsgrp_oms)
          || '</a>'
             html_kostenplaatsgroep,
          ac.companycode fclt_f_companycode,
              '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/prs/prs_show_afdeling.asp?afd_niveau=1&'||'afd_key='||ac.company_key
          || '")''>'
          || htf.escape_sc(ac.company_oms)
          || '</a>'
             html_company_omschrijving,
          DECODE( ac.companycode,
                  NULL, 'Nee',
                  'Ja') fclt_f_ok
     FROM akza_v_kostenplaats k,
          (SELECT * FROM prs_kenmerklink
            WHERE prs_kenmerk_key = 1380
              AND prs_kenmerklink_verwijder IS NULL) kl,
          akza_v_afdelingcompany ac
    WHERE k.prs_kostenplaats_verwijder IS NULL
      AND kl.prs_kenmerklink_waarde(+) = k.debiteurnr
      AND ac.prs_afdeling_key(+) = kl.prs_link_key;

-- AKZA#37566 Rapport met ruimte gegevens.
create or replace view akza_v_rap_ruimte_gegevens
(
   alg_locatie_omschrijving,
   alg_locatie_code,
   alg_gebouw_omschrijving,
   alg_verdieping_omschrijving,
   alg_verdieping_volgnr,
   alg_verdieping_code,
   alg_ruimte_nr,
   alg_ruimte_omschrijving,
   alg_srtruimte_omschrijving,
   alg_ruimte_vloer_omschrijving,
   alg_ruimte_bruto_vloeropp,
   alg_ruimte_opp_gevelglas,
   alg_ruimte_opp_separatieglas,
   alg_ruimte_opp_gevelbekleding,
   alg_ruimte_aanduiding,
   alg_ruimte_omtrek,
   alg_ruimte_inhoud,
   alg_ruimte_getekend,
   alg_ruimte_opmerking,
   alg_ruimte_opp_alt1,
   alg_ruimte_opp_alt2
)
as
   select alg_locatie_omschrijving,
          alg_locatie_code,
          alg_gebouw_omschrijving,
          alg_verdieping_omschrijving,
          alg_verdieping_volgnr,
          alg_verdieping_code,
          alg_ruimte_nr,
          alg_ruimte_omschrijving,
          alg_srtruimte_omschrijving,
          alg_ruimte_vloer_omschrijving,
          alg_ruimte_bruto_vloeropp,
          alg_ruimte_opp_gevelglas,
          alg_ruimte_opp_separatieglas,
          alg_ruimte_opp_gevelbekleding,
          alg_ruimte_aanduiding,
          alg_ruimte_omtrek,
          alg_ruimte_inhoud,
          alg_ruimte_getekend,
          alg_ruimte_opmerking,
          alg_ruimte_opp_alt1,
          alg_ruimte_opp_alt2
     from alg_v_ruimte_gegevens;

--------------------------------------------------------------------------------------------------
------------------------------- IMPORTS ----------------------------------------------------------
--------------------------------------------------------------------------------------------------

--- RUYS -----------------------------------------------------------------------

-- Maandelijkse import voor kosten van postale diensten, geadministreerd in Ruys.
-- Data mag alleen verwerkt worden, als het importbestand volledig correct is (qua structuur in ieder geval)
-- Daarom:
--   * Als een foutieve regel wordt gevonden, worden opvolgende regels niet meer ingelezen
--   * Als een of meer foutieve regels gevonden zijn, wordt de importtabel weer geleegd, zodat de
--     update-routine effectief niets doet.
CREATE OR REPLACE PROCEDURE akza_import_ruys (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   c_max_errors                    NUMBER := 100;
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_error                   NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;
   -- De importvelden:

   v_kpn                           VARCHAR2 (256);
   v_kpn_grp                       VARCHAR2 (256);
   v_bedrag                        VARCHAR2 (256);

   CURSOR c
   IS
      SELECT   *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   fac.imp_writelog (p_import_key, 'S',
                     'Start inlezen importbestand in importtabel',
                     TO_CHAR(SYSDATE, 'DD-MM-YYYY HH24:MI') );

   DELETE FROM akza_imp_ruys;

   -- We gaan uit van een geldig bestand, mogelijk verandert dat onderweg
   header_is_valid := 0;
   v_ongeldig := 0;
   v_count_tot := 0;
   v_count_error := 0;
   v_count_import := 0;

   FOR rec IN c
   LOOP
      BEGIN
         v_newline := rec.fac_imp_file_line;
         v_aanduiding := '';
         v_errorhint := 'Fout bij opvragen te importeren rij';

         -- Lees alle veldwaarden
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_kpn);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_kpn_grp);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 3, v_bedrag);

         v_aanduiding := '[' || v_kpn ||  '(' || v_kpn_grp || '): ' || v_bedrag || '] ';

         -- 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.
         -- NB: doordat deze import een stylesheet gebruikt, zullen deze kolommen altijd kloppen,
         --     ook al wordt een verkeerd bestand ingelezen (mits de stylesheet klopt)
         IF (header_is_valid = 0)
         THEN
            IF     UPPER(v_kpn)     = 'KP_ZOEKNUMMER'
               AND UPPER(v_kpn_grp) = 'DEB_NUMMER'
               AND UPPER(v_bedrag)  = 'TOTALE_PRIJS'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;

            -- Controleer alle veldwaarden
            v_errorhint := 'Ongeldige kostenplaatscode';
            v_kpn := TRIM(v_kpn);

            IF (v_kpn IS NOT NULL)
            THEN
                IF LENGTH (v_kpn) > 10
                THEN
                    v_ongeldig := 1;
                    v_count_error := v_count_error + 1;
                    fac.imp_writelog (p_import_key, 'W',
                                      v_aanduiding || 'Kostenplaatscode te lang',
                                      'Er worden geen regels meer in de importtabel geplaatst.' );
                END IF;
            ELSE
                v_ongeldig := 1;
                v_count_error := v_count_error + 1;
                fac.imp_writelog (p_import_key, 'W',
                                  v_aanduiding || 'Kostenplaatscode ontbreekt',
                                  'Er worden geen regels meer in de importtabel geplaatst.' );
            END IF;
            v_errorhint := 'Ongeldige kostenplaatsgroep';
            v_kpn_grp := TRIM(v_kpn_grp);

            IF (v_kpn_grp IS NOT NULL)
            THEN
                IF LENGTH (v_kpn_grp) > 10
                THEN
                    v_ongeldig := 1;
                    v_count_error := v_count_error + 1;
                    fac.imp_writelog (p_import_key, 'W',
                                      v_aanduiding || 'Kostenplaatsgroep te lang',
                                      'Er worden geen regels meer in de importtabel geplaatst.' );
                END IF;
            ELSE
                v_ongeldig := 1;
                v_count_error := v_count_error + 1;
                fac.imp_writelog (p_import_key, 'W',
                                  v_aanduiding || 'Kostenplaatsgroep ontbreekt',
                                  'Er worden geen regels meer in de importtabel geplaatst.' );
            END IF;

            v_errorhint := 'Ongeldig bedrag';
            v_bedrag := TRIM (v_bedrag);

            IF (v_bedrag IS NOT NULL)
            THEN
                IF LENGTH (v_bedrag) > 10
                THEN
                    v_ongeldig := 1;
                    v_count_error := v_count_error + 1;
                    fac.imp_writelog (p_import_key, 'W',
                                      v_aanduiding || 'Bedrag te lang',
                                      'Er worden geen regels meer in de importtabel geplaatst.' );
                END IF;
            ELSE
                v_ongeldig := 1;
                v_count_error := v_count_error + 1;
                fac.imp_writelog (p_import_key, 'W',
                                  v_aanduiding || 'Bedrag ontbreekt',
                                  'Er worden geen regels meer in de importtabel geplaatst.' );
            END IF;

            -- Insert geformatteerde import record, mits we alleen nog maar correcte regels zijn tegengekomen.
            IF v_ongeldig = 0
            THEN
               BEGIN
                  v_errorhint :=
                      'Fout bij toevoegen regel aan importtabel';

                  INSERT INTO akza_imp_ruys
                     (kpn, kpn_grp, bedrag)
                  VALUES
                     (v_kpn, v_kpn_grp, v_bedrag);

                  v_count_import := v_count_import + 1;

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

            -- Als er teveel foutieve regels zijn, dan zijn we waarschijnlijk een corrupt of verkeerd
            -- bestand aan het inlezen. Dan houden we ermee op.
            IF (v_count_error > c_max_errors)
            THEN
               fac.imp_writelog
                       (p_import_key,
                        'E',
                        'Meer dan '||TO_CHAR(c_max_errors)||' fouten gevonden. Import wordt afgebroken.',
                        'Controleer het importbestand; waarschijnlijk klopt het formaat niet.'
                       );
               EXIT;
            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.',
                        'Heeft u wel het juiste bestand ingelezen?'
                       );
   ELSIF (v_ongeldig = 1)
   THEN
      -- Importtabel leeggooien, zodat klikken op "Verwerken" niets doet. We willen een volledig correct bestand.
      DELETE FROM akza_imp_ruys;
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand! Bestand bevat een of meer ongeldige regels.',
                        'Importtabel geleegd. Corrigeer de fouten en lees het bestand daarna opnieuw in.'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'Importbestand succesvol ingelezen: '
                        || TO_CHAR (v_count_tot) || ' regels.',
                        '(Dit nummer moet gelijk zijn aan "Ingelezen regels" - 1)'
                       );
   END IF;

   COMMIT;

EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
      v_errormsg :=
           'OTHERS (error ' || oracle_err_num || '/' || oracle_err_mes || ')';

      -- Importtabel leeggooien, zodat klikken op "Verwerken" niets doet. We willen een volledig correct bestand.
      DELETE FROM akza_imp_ruys;
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || v_errormsg,
                        v_errorhint
                       );
      COMMIT;
END akza_import_ruys;
/

-- Import voor maandelijkse doorbelasting van postale diensten uit Ruys. Maakt meldingen aan die door
-- de export naar SAP/Foxpro worden doorbelast.
-- Gegevens alleen verwerken als:
--  - geen fouten gevonden bij inlezen (i.e. importtabel niet leeg)
--  - alle in importbestand aanwezige kostenplaatsen ook aanwezig in Facilitor
--    (eerst kostenplaatsen checken en pas als allemaal gevonden de meldingen aanmaken)
CREATE OR REPLACE PROCEDURE akza_update_ruys (
   p_import_key IN NUMBER
)
IS
   v_aanduiding               VARCHAR2 (200);
   v_errorhint                VARCHAR2 (1000);
   v_errormsg                 VARCHAR2 (1000);
   oracle_err_num             NUMBER;
   oracle_err_mes             VARCHAR2 (200);
   v_count_tot                NUMBER (10);
   v_count_error              NUMBER (10);
   v_count                    NUMBER (10);
   v_sum_bedrag               NUMBER (10,2);
   v_ongeldig                 NUMBER (1);
   v_test                     NUMBER (10);

   -- Alle kostenplaatsen in het importbestand
   CURSOR c
   IS
        SELECT DISTINCT kpn, kpn_grp
          FROM akza_imp_ruys
      ORDER BY fac.safe_to_number(kpn);

   c_stdmelding_key           NUMBER            := 1046;       -- Melding 'maandrapportage'
   c_flex_kpn_key             NUMBER            := 420;        -- Flexkenmerk Kostenplaats
   c_flex_bedrag_key          NUMBER            := 411;        -- Flexkenmerk Bedrag
   v_kpn_nr                   VARCHAR2(10);
   v_kostenplaats_key         NUMBER;
   v_totaalbedrag             NUMBER;
   v_melding_key              NUMBER;

   -- Subproc
   PROCEDURE getKostenplaats(p_kpn IN VARCHAR2,
                             p_kpn_grp IN VARCHAR2,
                             p_kpn_key OUT NUMBER)
   IS
      v_kostenplaatsgrp_key      NUMBER;
   BEGIN
      p_kpn_key := NULL;

      -- Eerst kostenplaatsgroep bepalen, daarna binnen die groep de kostenplaats zoeken
      v_errorhint := 'Fout bij bepalen kostenplaatsgroep';
      SELECT COUNT(*)
        INTO v_count
        FROM prs_kostenplaatsgrp kg
       WHERE kg.prs_kostenplaatsgrp_oms LIKE UPPER(p_kpn_grp)||'%';

      -- Geen kostenplaatsgroep gevonden --> error
      IF (v_count = 0)
      THEN
         v_count_error := v_count_error + 1;
         fac.imp_writelog (p_import_key,
                           'W',
                           v_aanduiding,
                           'Geen kostenplaatsgroep gevonden.'
                          );
      -- Als kostenplaatsgroep gevonden, dan kostenplaats zoeken
      ELSE
         v_errorhint := 'Fout bij ophalen kostenplaatsgroep';
         SELECT kg.prs_kostenplaatsgrp_key
           INTO v_kostenplaatsgrp_key
           FROM prs_kostenplaatsgrp kg
          WHERE kg.prs_kostenplaatsgrp_oms LIKE UPPER(p_kpn_grp)||'%';

         v_errorhint := 'Fout bij bepalen kostenplaats';
         v_kpn_nr := LPAD(p_kpn, 10, '0');
         SELECT COUNT(*)
           INTO v_count
           FROM akza_v_kostenplaats
          WHERE prs_kostenplaats_verwijder IS NULL
            AND LPAD(prs_kostenplaats_upper, 10, '0') = v_kpn_nr
            AND prs_kostenplaatsgrp_key = v_kostenplaatsgrp_key;

         -- Geen kostenplaats gevonden --> error
         IF (v_count = 0)
         THEN
            v_count_error := v_count_error + 1;
            fac.imp_writelog (p_import_key,
                              'W',
                              v_aanduiding,
                              'Geen kostenplaats gevonden (binnen kostenplaatsgroep).'
                             );
         -- Kostenplaats gevonden --> key ophalen
         ELSE
            v_errorhint := 'Fout bij ophalen kostenplaats';
            SELECT prs_kostenplaats_key
              INTO p_kpn_key
              FROM akza_v_kostenplaats
             WHERE prs_kostenplaats_verwijder IS NULL
               AND LPAD(prs_kostenplaats_upper, 10, '0') = v_kpn_nr
               AND prs_kostenplaatsgrp_key = v_kostenplaatsgrp_key;
         END IF;  -- kpn
      END IF; -- kpn_grp

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

BEGIN
   fac.imp_writelog (p_import_key, 'S',
                     'Start verwerken geïmporteerde gegevens',
                     TO_CHAR(SYSDATE, 'DD-MM-YYYY HH24:MI') );

   v_count_tot := 0;
   v_count_error := 0;
   v_sum_bedrag := 0;
   v_aanduiding := '';
   v_ongeldig := 0;

   -- Staat er eigenlijk wel wat in de importtabel?
   SELECT COUNT(*)
     INTO v_count
     FROM akza_imp_ruys;
   IF (v_count = 0)
   THEN
      fac.imp_writelog (p_import_key, 'S',
                        'Importtabel is leeg!',
                        'Niets te verwerken.' );
   ELSE
      -- Eerst kijken of ik alle kostenplaatsen wel kan vinden. Dan pas meldingen aanmaken.
      FOR chck IN c
      LOOP
         v_aanduiding := 'Kostenplaats ' || chck.kpn || ' (' || chck.kpn_grp || ')';
         v_test := NULL;

         getKostenplaats(chck.kpn, chck.kpn_grp, v_test);
         IF (v_test IS NULL )
         THEN
            v_ongeldig := 1;
         END IF;
      END LOOP;

      -- Fout(en) gevonden --> afbreken
      IF (v_ongeldig = 1)
      THEN
         fac.imp_writelog (p_import_key,
                           'E',
                           'Eén of meer kostenplaats(groep)en niet gevonden. Import wordt niet verwerkt.',
                           'Corrigeer de fouten in het importbestand.');
      -- Alle kostenplaatsen gevonden --> verwerk importbestand
      ELSE
         FOR rec IN c
         LOOP
            BEGIN
               v_count_tot := v_count_tot + 1;
               v_aanduiding := 'Kostenplaats ' || rec.kpn || ' (' || rec.kpn_grp || ')';

               -- Kostenplaats-key ophalen
               v_errorhint := 'Fout bij ophalen kostenplaats';
               getKostenplaats(rec.kpn, rec.kpn_grp, v_kostenplaats_key);
               IF (v_kostenplaats_key IS NOT NULL)
               THEN
                  -- Als kostenplaats gevonden, dan melding met totaalbedrag maken
                  v_errorhint := 'Fout bij bepalen totaalbedrag';
                  SELECT ROUND( SUM( fac.safe_to_number( REPLACE(bedrag, ',', '.') ) ), 2)
                    INTO v_totaalbedrag
                    FROM akza_imp_ruys
                   WHERE kpn = rec.kpn
                     AND kpn_grp = rec.kpn_grp;

                  v_aanduiding := v_aanduiding || ', €' ||v_totaalbedrag;

                  v_errorhint := 'Fout bij toevoegen melding';
                  INSERT INTO mld_melding
                     (mld_melding_module,
                      mld_meldbron_key,
                      mld_melding_datum,
                      mld_stdmelding_key,
                      prs_perslid_key,
                      mld_melding_status,
                      mld_melding_spoed,
                      prs_kostenplaats_key)
                  VALUES
                     ('MLD',
                      45,                 -- System
                      SYSDATE,
                      c_stdmelding_key,
                      7520,               -- Facilitor
                      5,                  -- Afgemeld
                      3,
                      v_kostenplaats_key)
                  RETURNING mld_melding_key
                  INTO v_melding_key;

                  v_errorhint := 'Fout bij toevoegen kenmerk kostenplaats';
                  INSERT INTO mld_kenmerkmelding
                     (mld_melding_key,
                      mld_kenmerk_key,
                      mld_kenmerkmelding_waarde)
                  VALUES
                     (v_melding_key,
                      c_flex_kpn_key,
                      v_kostenplaats_key);

                  v_errorhint := 'Fout bij toevoegen kenmerk bedrag';
                  INSERT INTO mld_kenmerkmelding
                     (mld_melding_key,
                      mld_kenmerk_key,
                      mld_kenmerkmelding_waarde)
                  VALUES
                     (v_melding_key,
                      c_flex_bedrag_key,
                      v_totaalbedrag);

                  v_sum_bedrag := v_sum_bedrag + v_totaalbedrag;

                  fac.imp_writelog (p_import_key,
                                    'I',
                                    v_aanduiding||' (key '||v_kostenplaats_key||'): €'||v_totaalbedrag,
                                    'Melding L'||v_melding_key);
               ELSE
                  -- Bij de check is de kostenplaats wel gevonden, maar daarna niet?!
                  fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || 'niet gevonden?!',
                                 v_errorhint
                                );
               END IF; -- kpn

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

         fac.imp_writelog(p_import_key,
                          'S',
                             'Verwerkte kostenplaatsen zonder foutmelding: '
                          || TO_CHAR (v_count_tot - v_count_error),
                          'Totaalbedrag: '||TO_CHAR(v_sum_bedrag)
                         );

         SELECT DECODE(v_count_error,
                       0, '',
                       'Controleer de logging op fouten en exporteer regels voor deze kostenplaats opnieuw uit Ruys.')
           INTO v_errorhint
           FROM DUAL;
         fac.imp_writelog(p_import_key,
                          'S',
                             'Verwerkte kostenplaatsen met foutmelding: '
                          || TO_CHAR (v_count_error),
                          v_errorhint);
      END IF; -- v_ongeldig
   END IF; -- leeg importbestand?

   COMMIT;

END akza_update_ruys;
/

--- OPDRACHTKOSTEN -------------------------------------------------------------

-- AKZA#27387: Import opdrachtkosten (MB)
CREATE OR REPLACE PROCEDURE akza_import_opdrkosten (
   p_import_key IN NUMBER
)
IS
   c_fielddelimitor                VARCHAR2 (1)    := ';';
   v_newline                       VARCHAR2 (1000);             -- Input line
   v_aanduiding                    VARCHAR2 (200);
   v_errorhint                     VARCHAR2 (1000);
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER := 0;
   v_ongeldig                      NUMBER (1);
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_count                         NUMBER;
   -- De importvelden:

   v_mld_opdr_nr                   VARCHAR2 (256);
   v_mld_opdr_uren                 VARCHAR2 (256);
   v_mld_opdr_uurloon              VARCHAR2 (256);
   v_mld_opdr_materiaal            VARCHAR2 (256);
   -- !!Let op: dit is geen veld in de database, maar wordt via opdrachtkosten teruggerekend!!
   v_correctie_bedrag              VARCHAR2 (256);
   v_mld_opdr_opmerking            VARCHAR2 (4000);

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

   v_count_tot := 0;
   v_count_import := 0;

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

         -- Lees alle veldwaarden
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 1, v_mld_opdr_nr);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 2, v_mld_opdr_uren);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 3, v_mld_opdr_uurloon);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 4, v_mld_opdr_materiaal);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 5, v_correctie_bedrag);
         fac.imp_getfield_nr (v_newline, c_fielddelimitor, 6, v_mld_opdr_opmerking);

         v_aanduiding := '[' || v_mld_opdr_nr ||  '(' || v_mld_opdr_uren || ',' || v_mld_opdr_uurloon || ',' || v_mld_opdr_materiaal || ',' || v_correctie_bedrag || '): ' || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER(v_mld_opdr_nr)         = 'OPDRACHTNUMMER'
               AND UPPER(v_mld_opdr_uren)       = 'UREN'
               AND UPPER(v_mld_opdr_uurloon)    = 'UURTARIEF'
               AND UPPER(v_mld_opdr_materiaal)  = 'MATERIAALKOSTEN'
               AND UPPER(v_correctie_bedrag)    = 'CORRECTIEBEDRAG'
               AND UPPER(v_mld_opdr_opmerking)    = 'OPMERKINGEN'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;

            -- Controleer alle veldwaarden
            v_errorhint := 'Ongeldig/onbekend opdrachtnummer';
            v_mld_opdr_nr := TRIM(v_mld_opdr_nr);

            -- opdrachtnummer is maximaal <prefix> + <meldingkey> + '/' + <volgnr> = 3 + 10 + 1 + 10 = 24 karakters
            IF (v_mld_opdr_nr IS NOT NULL)
            THEN
                IF LENGTH (v_mld_opdr_nr) > 24
                THEN
                    v_mld_opdr_nr := SUBSTR (v_mld_opdr_nr, 1, 24);
                    fac.imp_writelog (p_import_key, 'W',
                                      v_aanduiding || 'Opdrachtnummer te lang',
                                      'Wordt afgebroken tot [' || v_mld_opdr_nr || ']' );
                END IF;
            ELSE
                v_ongeldig := 1;
                EXIT;
            END IF;


            -- opdracht uren is N(7,2), dus maximaal 8 karakters (b.v. 12345.67)
            IF (v_mld_opdr_uren IS NOT NULL)
            THEN
                IF LENGTH (v_mld_opdr_uren) > 8
                THEN
                    v_mld_opdr_uren := SUBSTR (v_mld_opdr_uren, 1, 8);
                    fac.imp_writelog (p_import_key, 'W',
                                      v_aanduiding || 'Uren te lang',
                                      'Wordt afgebroken tot [' || v_mld_opdr_uren || ']' );
                END IF;
            END IF;


            -- uurtarief is N(6,2), dus maximaal 7 karakters (b.v. 1234.56)
            IF (v_mld_opdr_uurloon IS NOT NULL)
            THEN
                IF LENGTH (v_mld_opdr_uurloon) > 8
                THEN
                    v_mld_opdr_uurloon := SUBSTR (v_mld_opdr_uurloon, 1, 7);
                    fac.imp_writelog (p_import_key, 'W',
                                      v_aanduiding || 'Uurtarief te lang',
                                      'Wordt afgebroken tot [' || v_mld_opdr_uurloon || ']' );
                END IF;
            END IF;

            -- materiaalkosten is N(8,2), dus maximaal 9 karakters (b.v. 123456.78)
            IF (v_mld_opdr_materiaal IS NOT NULL)
            THEN
                IF LENGTH (v_mld_opdr_materiaal) > 9
                THEN
                    v_mld_opdr_materiaal := SUBSTR (v_mld_opdr_materiaal, 1, 7);
                    fac.imp_writelog (p_import_key, 'W',
                                      v_aanduiding || 'Materiaalkosten te lang',
                                      'Wordt afgebroken tot [' || v_mld_opdr_materiaal || ']' );
                END IF;
            END IF;

            -- correctiebedrag is geen DB-veld, maar wordt logischerwijs gelijkgetrokken aan materiaalkosten.
            IF (v_correctie_bedrag IS NOT NULL)
            THEN
                IF LENGTH (v_correctie_bedrag) > 9
                THEN
                    v_correctie_bedrag := SUBSTR (v_correctie_bedrag, 1, 7);
                    fac.imp_writelog (p_import_key, 'W',
                                      v_aanduiding || 'Correctiebedrag te lang',
                                      'Wordt afgebroken tot [' || v_correctie_bedrag || ']' );
                END IF;
            END IF;

            -- opmerking is maximaal 4000 karakters
            IF (v_mld_opdr_opmerking IS NOT NULL)
            THEN
                IF LENGTH (v_mld_opdr_opmerking) > 4000
                THEN
                    v_mld_opdr_opmerking := SUBSTR (v_mld_opdr_opmerking, 1, 4000);
                    fac.imp_writelog (p_import_key, 'W',
                                      v_aanduiding || 'Opmerking te lang',
                                      'Wordt afgebroken tot [' || v_mld_opdr_opmerking || ']' );
                END IF;
            END IF;


            IF  (   v_mld_opdr_uren IS NULL
                AND v_mld_opdr_uurloon IS NULL
                AND v_mld_opdr_materiaal IS NULL
                AND v_correctie_bedrag IS NULL
                AND v_mld_opdr_opmerking IS NULL
                )
            THEN
                fac.imp_writelog (p_import_key, 'W',
                                  v_aanduiding || 'Alle velden zijn leeg, regel wordt niet verwerkt.',
                                  'Ingelezen regel kan niet worden weggeschreven!' );
                v_ongeldig := 1;
                EXIT;
            END IF;


            IF  (   (v_mld_opdr_uren IS NOT NULL AND v_mld_opdr_uurloon IS NULL) OR
                    (v_mld_opdr_uren IS NULL AND v_mld_opdr_uurloon IS NOT NULL)
                )
            THEN
                fac.imp_writelog (p_import_key, 'W',
                                  v_aanduiding || 'Resultaat van uren x uurtarief is 0 omdat niet beide velden gevuld zijn.',
                                  'Wordt derhlave genegeerd' );
            END IF;


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

                  INSERT INTO akza_imp_opdrkosten( mld_opdr_nr, mld_opdr_uren, mld_opdr_uurloon, mld_opdr_materiaal, correctie_bedrag, mld_opdr_opmerking)
                  VALUES (v_mld_opdr_nr, v_mld_opdr_uren, v_mld_opdr_uurloon, v_mld_opdr_materiaal, v_correctie_bedrag, v_mld_opdr_opmerking);

                  v_count_import := v_count_import + 1;

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

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldig importbestand',
                        'Geen header of header niet volgens specificatie!'
                       );
   ELSIF (v_ongeldig = 1)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        'Ongeldige regel(s)',
                        'Regel '||v_aanduiding||' is ongeldig! (Mogelijk zijn er nog meer ongeldige regels.)'
                       );
   ELSE
      fac.imp_writelog (p_import_key,
                        'S',
                           'OPDRACHT KOSTEN: aantal ingelezen regels: '
                        || TO_CHAR (v_count_tot),
                        ''
                       );
   END IF;

   COMMIT;

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

CREATE OR REPLACE PROCEDURE akza_update_opdrkosten (
   p_import_key IN NUMBER
)
IS
   v_aanduiding               VARCHAR2 (200);
   v_errorhint                VARCHAR2 (1000);
   v_errormsg                 VARCHAR2 (1000);
   oracle_err_num             NUMBER;
   oracle_err_mes             VARCHAR2 (200);
   v_count_tot                NUMBER (10);
   v_count_error              NUMBER (10);
   v_count                    NUMBER (10);

   -- Alle kostenplaatsen in het importbestand
   CURSOR c
   IS
        SELECT  mld_opdr_nr,
                ROUND(COALESCE(fac.safe_to_number(REPLACE(mld_opdr_uren,     ',','.')),0),2) mld_opdr_uren,
                ROUND(COALESCE(fac.safe_to_number(REPLACE(mld_opdr_uurloon,  ',','.')),0),2) mld_opdr_uurloon,
                ROUND(COALESCE(fac.safe_to_number(REPLACE(mld_opdr_materiaal,',','.')),0),2) mld_opdr_materiaal,
                ROUND(COALESCE(fac.safe_to_number(REPLACE(correctie_bedrag,  ',','.')),0),2) correctie_bedrag,
                mld_opdr_opmerking
        FROM akza_imp_opdrkosten
        ORDER BY mld_opdr_nr;


   v_mld_opdr_key             NUMBER (10);
   l_mld_opdr_uurloon         MLD_OPDR.mld_opdr_uurloon%TYPE;



   FUNCTION try_getopdracht_id (p_broc_nr IN VARCHAR2, p_leverancier_nr IN VARCHAR2)
       RETURN NUMBER
       AS
            c_prefix1       VARCHAR2 (1);
            -- Ter bepaling van de positie van de slash in bron-nr
            c_index          NUMBER;
            c_slash_index    NUMBER;
            -- Opdrachtnr voor de slash
            c_broc_s1       VARCHAR2 (20);
            -- Opdrachtnr na de slash
            c_broc_s2       VARCHAR2 (20);
            p_broc_key      NUMBER(10);
       BEGIN
            p_broc_key := NULL;
            c_index := 1;
            c_prefix1 := SUBSTR (p_broc_nr, c_index, 1);

            IF ( ( (ASCII (c_prefix1) >= 65 AND ASCII (c_prefix1) <= 90)
                   OR (ASCII (c_prefix1) >= 97 AND ASCII(c_prefix1) <= 122))
                 AND ASCII (c_prefix1) != 67
                 AND ASCII (c_prefix1) != 99)
            THEN
                -- Eerste karakter is een letter
                -- Heeft opdrachtnr nog meer aan prefix?
                c_index := 2;
                c_prefix1 := SUBSTR (p_broc_nr, c_index, 1);

                IF  ( (ASCII (c_prefix1) >= 65 AND ASCII (c_prefix1) <= 90)
                   OR (ASCII (c_prefix1) >= 97 AND ASCII(c_prefix1) <= 122))
                THEN
                    -- Eerste 2 karakter zijn letters
                    -- Heeft opdrachtnr nog meer aan prefix?
                    c_index := 3;
                    c_prefix1 := SUBSTR (p_broc_nr, c_index, 1);
                    IF  ( (ASCII (c_prefix1) >= 65 AND ASCII (c_prefix1) <= 90)
                       OR (ASCII (c_prefix1) >= 97 AND ASCII(c_prefix1) <= 122))
                    THEN
                        -- Opdracht heeft prefix van 3 letters.
                        c_index := 4;
                    END IF;
                END IF;
            END IF;
            c_slash_index := INSTR (p_broc_nr, '/');
            IF c_slash_index = 0
            THEN
                c_broc_s1 := SUBSTR (p_broc_nr, c_index);
                c_broc_s2 := '';
            ELSE
                c_broc_s1 := SUBSTR (p_broc_nr, c_index, c_slash_index - c_index);
                c_broc_s2 := SUBSTR (p_broc_nr, c_slash_index + 1);
            END IF;
            BEGIN
                SELECT  o.mld_opdr_key
                INTO    p_broc_key
                FROM    mld_opdr o
                WHERE   o.mld_melding_key = fac.safe_to_number (c_broc_s1)
                AND     mld_opdr_bedrijfopdr_volgnr = fac.safe_to_number (c_broc_s2);
            EXCEPTION
               WHEN OTHERS
               THEN
                    p_broc_key := NULL;
            END;
            RETURN p_broc_key;
    END;


BEGIN
    v_count_tot := 0;
    v_count_error := 0;
    v_aanduiding := '';

    FOR rec IN c
    LOOP
        BEGIN
            v_count_tot := v_count_tot + 1;
                        v_aanduiding := 'Opdrachtnr ' || rec.mld_opdr_nr ||  '(' || rec.mld_opdr_uren || ',' || rec.mld_opdr_uurloon || ',' || rec.mld_opdr_materiaal || ',' || rec.correctie_bedrag || '): ';

            v_mld_opdr_key := try_getopdracht_id(rec.mld_opdr_nr, NULL);
            IF (v_mld_opdr_key IS NULL)
            THEN
                v_count_error := v_count_error + 1;
                v_errormsg := 'Opdrachtnummer onbekend / is niet gevonden';
                v_errorhint := 'Fout bij bepalen opdrachtnummer';
                fac.imp_writelog (p_import_key,
                                 'E',
                                 v_aanduiding || v_errormsg,
                                 v_errorhint
                                );
               COMMIT;
            ELSE

                -- Opdrachtnummer is gevonden, mld_opdr record is gevonden.

                -- Stap 1) Uren x tarief

                -- Als uurtarief bij opdracht niet is ingevuld, of als die wel is ingevuld en gelijk is aan uurtarief uit import regel, dan de uren aanvullen/optellen (en uurtarief invullen)
                IF (rec.mld_opdr_uurloon != 0 AND rec.mld_opdr_uurloon !=0)
                THEN
                    v_errorhint := 'Fout bij bepalen/zetten uurloon';
                    -- We gaan eerst ff het uurtarief ophalen, misschien is ie wel gelijk aan het importrecord?
                    SELECT mld_opdr_uurloon
                    INTO l_mld_opdr_uurloon
                    FROM mld_opdr
                    WHERE mld_opdr_key = v_mld_opdr_key;

                    IF (l_mld_opdr_uurloon IS NULL OR l_mld_opdr_uurloon = rec.mld_opdr_uurloon)
                    THEN
                        -- Inderdaad is tarief gelijk aan import-record, of er was nog geen tarief ingevuld, dan ook goed...
                        UPDATE mld_opdr
                        SET mld_opdr_uren = COALESCE(mld_opdr_uren, 0) + rec.mld_opdr_uren,
                            mld_opdr_uurloon = rec.mld_opdr_uurloon,
                            mld_opdr_kosten = mld_opdr_kosten + ROUND(rec.mld_opdr_uurloon * rec.mld_opdr_uren, 2)
                        WHERE mld_opdr_key = v_mld_opdr_key;
                    ELSE
                        UPDATE mld_opdr
                        SET mld_opdr_kosten = mld_opdr_kosten + ROUND(rec.mld_opdr_uurloon * rec.mld_opdr_uren, 2)
                        WHERE mld_opdr_key = v_mld_opdr_key;
                    END IF;
                END IF;

                -- Stap 2) Materiaal kosten

                IF (rec.mld_opdr_materiaal != 0)
                THEN
                    v_errorhint := 'Fout bij zetten materiaalkosten';
                    UPDATE mld_opdr
                    SET mld_opdr_materiaal = COALESCE(mld_opdr_materiaal,0) + rec.mld_opdr_materiaal,
                        mld_opdr_kosten = mld_opdr_kosten + rec.mld_opdr_materiaal
                    WHERE mld_opdr_key = v_mld_opdr_key;
                END IF;

                -- Stap 3) Correctie bedrag

                IF (rec.correctie_bedrag != 0)
                THEN
                    v_errorhint := 'Fout bij zetten correctiebedrag';
                    UPDATE mld_opdr
                    SET mld_opdr_kosten = mld_opdr_kosten + rec.correctie_bedrag
                    WHERE mld_opdr_key = v_mld_opdr_key;
                END IF;

                -- Stap 4) Aanvullen van opmerking

                IF (rec.mld_opdr_opmerking IS NOT NULL)
                THEN
                    v_errorhint := 'Fout bij zetten opmerking';
                    UPDATE mld_opdr
                    SET mld_opdr_opmerking = SUBSTR(mld_opdr_opmerking || CHR(10) || rec.mld_opdr_opmerking,1,4000)
                    WHERE mld_opdr_key = v_mld_opdr_key;
                END IF;

                -- Informatieve logging
                SELECT TO_CHAR(mld_opdr_kosten, '99G9999D99MI')
                  INTO v_errorhint
                  FROM mld_opdr
                 WHERE mld_opdr_key = v_mld_opdr_key;
                fac.imp_writelog (p_import_key,
                                  'I',
                                  'Bijgewerkt: '||v_aanduiding,
                                  'Totaalbedrag: '||v_errorhint
                                 );

            END IF;

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

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

    COMMIT;

END akza_update_opdrkosten;
/

--- INSPECTIERESULTATEN -------------------------------------------------------------

-- AKZA#31258: Import inspectieresultaten
CREATE OR REPLACE PROCEDURE akza_import_inspectieobj (
   p_import_key IN NUMBER
)
IS
   c_delim                         VARCHAR2 (1) := ';';
   v_newline                       VARCHAR2 (1000);              -- Input line
   v_errormsg                      VARCHAR2 (1000);
   oracle_err_num                  NUMBER;
   oracle_err_mes                  VARCHAR2 (200);
   header_is_valid                 NUMBER;
   v_count_tot                     NUMBER (10);
   v_count_import                  NUMBER (10);
   v_ongeldig                      NUMBER (1);
   v_aanduiding                    VARCHAR (200);
   -- De importvelden:
   v_alg_locatie_code              VARCHAR2 (255);                      -- C10
   v_ins_deel_omschrijving         VARCHAR2 (255);                      -- C60
   v_ins_srtcontrole_omschrijving  VARCHAR2 (255);                      -- C60
   v_ins_controle_datum            VARCHAR2 (255);                      -- DATE
   v_ins_controle_opm              VARCHAR2 (1024);                     -- C500
   v_afgekeurd                     VARCHAR2 (255);                      -- C60
   v_bestand                       VARCHAR2 (255);                      -- C200
   -- Overig:
   v_ins_controle_datum_d          DATE;                                -- DATE

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

   COMMIT;

   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout bij opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_alg_locatie_code);
         fac.imp_getfield (v_newline, c_delim, v_ins_deel_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_ins_srtcontrole_omschrijving);
         fac.imp_getfield (v_newline, c_delim, v_ins_controle_datum);
         fac.imp_getfield (v_newline, c_delim, v_ins_controle_opm);
         fac.imp_getfield (v_newline, c_delim, v_afgekeurd);
         fac.imp_getfield (v_newline, c_delim, v_bestand);

         v_aanduiding := '[' || v_ins_deel_omschrijving || ' (' || v_alg_locatie_code || ')] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (v_alg_locatie_code) = 'LOCATIECODE'
               AND UPPER (v_ins_deel_omschrijving) = 'OBJECT_ID'
               AND UPPER (v_ins_srtcontrole_omschrijving) = 'SOORTCONTROLE'
               AND UPPER (v_ins_controle_datum) = 'CONTROLEDATUM'
               AND UPPER (v_ins_controle_opm) = 'CONTROLEOPMERKING'
               AND UPPER (v_afgekeurd) = 'AFGEKEURD'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Locatiecode ongeldig';
            v_alg_locatie_code := TRIM (v_alg_locatie_code);

            IF LENGTH (v_alg_locatie_code) > 10
            THEN
               v_alg_locatie_code := SUBSTR (v_alg_locatie_code, 1, 10);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Locatiecode wordt afgebroken tot ['
                  || v_alg_locatie_code
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Objectomschrijving ongeldig';
            v_ins_deel_omschrijving := TRIM (v_ins_deel_omschrijving);

            IF LENGTH (v_ins_deel_omschrijving) > 60
            THEN
               v_ins_deel_omschrijving :=
                  SUBSTR (TRIM (v_ins_deel_omschrijving), 1, 60);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                     'Objectomschrijving wordt afgebroken tot ['
                  || v_ins_deel_omschrijving
                  || ']'
               );
            END IF;

            --
            v_errormsg := 'Soortcontrole ongeldig';
            v_ins_srtcontrole_omschrijving := TRIM (v_ins_srtcontrole_omschrijving);

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

            --
            v_errormsg := 'Controledatum ongeldig';
            v_ins_controle_datum := TRIM (v_ins_controle_datum);
            v_ins_controle_datum_d := NULL;

            IF (v_ins_controle_datum IS NOT NULL)
            THEN
               IF (fac.safe_to_date (v_ins_controle_datum, 'dd-mm-yyyy') IS NULL)
               THEN
                  fac.imp_writelog (p_import_key,
                                    'W',
                                    v_aanduiding || v_errormsg,
                                    'Controledatum wordt genegeerd');
               ELSE
                  v_ins_controle_datum_d :=
                     fac.safe_to_date (v_ins_controle_datum, 'dd-mm-yyyy');
               END IF;
            END IF;

            --
            v_errormsg := 'Controleopmerking ongeldig';
            v_ins_controle_opm := TRIM (v_ins_controle_opm);

            IF LENGTH (v_ins_controle_opm) > 500
            THEN
               v_ins_controle_opm := SUBSTR (v_ins_controle_opm, 1, 500);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Controleopmerking wordt afgekapt op 500 posities'
               );
            END IF;

            --
            v_errormsg := 'Afgekeurd ongeldig';
            v_afgekeurd := TRIM (v_afgekeurd);

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

            --
            v_errormsg := 'Bestandsnaam ongeldig';
            v_bestand := TRIM (v_bestand);

            IF (v_bestand IS NOT NULL AND LENGTH (v_bestand) > 200 )
            THEN
               v_bestand := SUBSTR (v_bestand, 1, 200);
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || v_errormsg,
                  'Bestandsnaam wordt afgekapt op 200 posities'
               );
            END IF;

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

                  INSERT INTO akza_imp_inspectieobj (
                                                        alg_locatie_code,
                                                        ins_deel_omschrijving,
                                                        ins_srtcontrole_omschrijving,
                                                        ins_deelsrtcontrole_datum,
                                                        ins_deelsrtcontrole_opmerking,
                                                        afgekeurd,
                                                        bestand
                             )
                    VALUES   (v_alg_locatie_code,
                              v_ins_deel_omschrijving,
                              v_ins_srtcontrole_omschrijving,
                              v_ins_controle_datum_d,
                              v_ins_controle_opm,
                              v_afgekeurd,
                              v_bestand);

                  COMMIT;
                  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,
                                       'W',
                                       v_aanduiding || v_errormsg,
                                       '');

                     COMMIT;
               END;
            END IF;
         END IF;
      END;
   END LOOP;

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

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

-- Leest voor objecten (locatie+object-id) het resultaat van specifieke taken in,
-- uitgevoerd op bepaalde datums. Met ruimte voor een opmerking en een link naar een
-- bestandsnaam. Voor de bestandsnaam wordt het bestandsnaam-kenmerk met de laagste key
-- bij de betreffende taak (controle) gezocht en gebruikt.
CREATE OR REPLACE PROCEDURE akza_update_inspectieobj (
   p_import_key IN NUMBER
)
AS
   v_errormsg                 VARCHAR2 (1000);
   oracle_err_num             NUMBER;
   oracle_err_mes             VARCHAR2 (200);
   v_count                    NUMBER (10);
   v_count_tot                NUMBER (10);
   v_count_cupdate            NUMBER (10);
   v_aanduiding               VARCHAR (200);

   CURSOR c1
   IS
      SELECT i.alg_locatie_code,
             i.ins_deel_omschrijving,
             sc.ins_srtcontrole_key,
             sc.ins_srtcontrole_omschrijving,
             i.ins_deelsrtcontrole_datum,
             i.ins_deelsrtcontrole_opmerking,
             i.bestand bestandsnaam,
             i.afgekeurd,
             ad.ins_deel_key,
             ad.ins_srtdeel_key,
             g.ins_srtgroep_key,
             ad.ins_discipline_key,
             al.alg_locatie_key
        FROM akza_imp_inspectieobj i,
             ins_srtcontrole sc,
             ins_v_aanwezigdeel ad,
             ins_srtdeel sd,
             ins_srtgroep g,
             alg_v_aanweziglocatie al
       WHERE ad.ins_deel_omschrijving(+) = i.ins_deel_omschrijving
         AND UPPER(sc.ins_srtcontrole_omschrijving(+)) = UPPER(i.ins_srtcontrole_omschrijving)
         AND sd.ins_srtdeel_key(+) = ad.ins_srtdeel_key
         AND g.ins_srtgroep_key(+) = sd.ins_srtgroep_key
         AND al.alg_locatie_key(+) = ad.ins_alg_locatie_key;

   v_deel_key                 NUMBER (10);
   v_kenmerk_key              NUMBER (10);
   v_kenmerkdeel_key          NUMBER (10);
   v_srtcontrole_id           VARCHAR2 (20);
   v_controlemode_succes_key  NUMBER (10);
   v_controlemode_afkeur_key  NUMBER (10);
   v_deelsrtcontrole_key      NUMBER(10);
BEGIN
   v_count := 0;
   v_count_tot := 0;
   v_count_cupdate := 0;
   v_aanduiding := '';

   FOR rec IN c1
   LOOP
      BEGIN
         v_count_tot := v_count_tot + 1;
         v_aanduiding := '['||rec.ins_deel_omschrijving
                       ||'|'||rec.alg_locatie_code
                       ||'|'||rec.ins_srtcontrole_omschrijving
                       ||'|'||rec.ins_deelsrtcontrole_datum
                       || '] ';

         -- We kunnen alleen iets met objecten die we kennen!
         IF (rec.ins_deel_key IS NULL OR rec.alg_locatie_key IS NULL)
         THEN
            fac.imp_writelog(p_import_key, 'E',
                             'Objectcode onbekend (binnen locatie); regel wordt overgeslagen',
                             v_aanduiding);
            CONTINUE;
         END IF;

         -- Zonder datum doen we niks
         IF (rec.ins_deelsrtcontrole_datum IS NULL)
         THEN
            fac.imp_writelog(p_import_key, 'E',
                             'Geen datum ingevuld; regel wordt overgeslagen',
                             v_aanduiding);
            CONTINUE;
         END IF;

         -- Kennen we de srtcontrole uberhaupt?
         IF (rec.ins_srtcontrole_key IS NULL)
         THEN
            fac.imp_writelog(p_import_key, 'E',
                             'Soort taak onbekend; regel wordt overgeslagen',
                             v_aanduiding);
            CONTINUE;
         END IF;

         -- En hoort die srtcontrole ook bij deze objectsoort/-groep/discipline?
         v_errormsg := 'srtcontrole bij objectsoort';
         SELECT COUNT(*)
           INTO v_count
           FROM ins_srtcontrole sc
          WHERE sc.ins_srtcontrole_key = rec.ins_srtcontrole_key
            AND sc.ins_srtinstallatie_key =
                  DECODE(  sc.ins_srtcontrole_niveau,
                           'S', rec.ins_srtdeel_key,
                           'G', rec.ins_srtgroep_key,
                           'D', rec.ins_discipline_key);

         -- Nee --> overslaan
         IF (v_count = 0)
         THEN
            fac.imp_writelog(p_import_key, 'E',
                             'Soort taak hoort niet bij object; regel wordt overgeslagen',
                             v_aanduiding);
            CONTINUE;
         END IF;
         -- TODO: kan een srtcontrole meerdere malen aan een object gekoppeld zijn? Dan dat nog specifieker bepalen?

         IF (rec.ins_deelsrtcontrole_datum IS NULL)
         THEN
            fac.imp_writelog(p_import_key, 'E',
                             'Geen datum opgegeven; regel wordt overgeslagen',
                             v_aanduiding);
            CONTINUE;
         END IF;

         v_errormsg := 'Fout bij bepalen controlemethode succes';
         SELECT MIN(ins_controlemode_key)
           INTO v_controlemode_succes_key
           FROM ins_controlemode cm,
                ctr_disc_params dp,
                ins_srtcontrole sc
          WHERE cm.ins_controlemode_success = 1
            AND cm.ins_srtcontrole_type = dp.ctr_disc_params_controle_type
            AND dp.ctr_ins_discipline_key = sc.ctr_discipline_key
            AND sc.ins_srtcontrole_key = rec.ins_srtcontrole_key;

         v_errormsg := 'Fout bij bepalen controlemethode afgekeurd';
         SELECT MIN(ins_controlemode_key)
           INTO v_controlemode_afkeur_key
           FROM ins_controlemode cm,
                ctr_disc_params dp,
                ins_srtcontrole sc
          WHERE cm.ins_controlemode_success IS NULL
            AND cm.ins_srtcontrole_type = dp.ctr_disc_params_controle_type
            AND dp.ctr_ins_discipline_key = sc.ctr_discipline_key
            AND sc.ins_srtcontrole_key = rec.ins_srtcontrole_key;

         -- TODO: ins_deelsrtcontrole_datum_org is de datum waarop de taak eigenlijk gedaan had
         -- moeten worden. Die staat bij taken met standaardperiode 0 in ins_srtcontroledl_xcp en
         -- zal doorgaans afwijken van de datum in het importbestand.
         v_errormsg := 'Fout bij toevoegen controle';
         INSERT INTO ins_deelsrtcontrole (
            ins_deel_key,
            ins_srtcontrole_key,
            ins_deelsrtcontrole_datum,
            ins_deelsrtcontrole_datum_org,
            ins_controlemode_key,
            ins_deelsrtcontrole_opmerking)
         VALUES (
            rec.ins_deel_key,
            rec.ins_srtcontrole_key,
            rec.ins_deelsrtcontrole_datum,
            rec.ins_deelsrtcontrole_datum,
            DECODE(rec.afgekeurd,
                   NULL, v_controlemode_succes_key,
                   v_controlemode_afkeur_key),
            rec.ins_deelsrtcontrole_opmerking)
         RETURNING ins_deelsrtcontrole_key INTO v_deelsrtcontrole_key;

         IF (rec.bestandsnaam IS NOT NULL)
         THEN
            v_errormsg := 'Fout bij bepalen bestandskenmerk';
            SELECT MIN(ins_kenmerk_key)
              INTO v_kenmerk_key
              FROM ins_kenmerk k,
                   ins_srtkenmerk sk,
                   ins_srtcontrole rec
             WHERE k.ins_kenmerk_niveau = 'C'
               AND k.ins_srtinstallatie_key = rec.ins_srtcontrole_key
               AND k.ins_kenmerk_verwijder IS NULL
               AND sk.ins_srtkenmerk_key = k.ins_srtkenmerk_key
               AND sk.ins_srtkenmerk_kenmerktype = 'X';

            v_errormsg := 'Bestandsnaam vastleggen';
            INSERT INTO ins_kmdeelsrtcontr (
               ins_deelsrtcontrole_key,
               ins_kenmerk_key,
               ins_kmdeelsrtcontr_waarde)
            VALUES (
               v_deelsrtcontrole_key,
               v_kenmerk_key,
               REPLACE(
                  CASE
                  WHEN UPPER(rec.bestandsnaam) LIKE 'R:\TD-EXTERN\ITA-3\REPORTS\RTC%'
                     THEN '/RTC'||SUBSTR(rec.bestandsnaam, 31)
                  WHEN UPPER(rec.bestandsnaam) LIKE 'R:/TD-EXTERN/ITA-3/REPORTS/RTC%'
                     THEN '/RTC'||SUBSTR(rec.bestandsnaam, 31)
                  ELSE
                     rec.bestandsnaam
                  END,
                  '\',
                  '/')
            );
         END IF;

         v_count_cupdate := v_count_cupdate + 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_errormsg,
                              v_aanduiding);
      END;
   END LOOP;

   fac.imp_writelog (p_import_key, 'S',
                     'Aantal ingelezen taken: ' || TO_CHAR (v_count_tot),
                     '');
   fac.imp_writelog (p_import_key, 'S',
                     'Aantal verwerkte taken: ' || TO_CHAR (v_count_cupdate),
                     '');
   COMMIT;

END akza_update_inspectieobj;
/

--- view om de locatie van nieuwe apparatuur aan te kunnen geven
CREATE OR REPLACE VIEW AKZA_V_RUIMTES_DEVENTER
(
   RUIMTE_KEY,
   RUIMTE,
   VERVALDATUM
)
AS
   SELECT ALG_RUIMTE_KEY,
             ALG_GEBOUW_UPPER
          || '/'
          || ALG_VERDIEPING_CODE
          || '/'
          || ALG_RUIMTE_UPPER_NR
          || '-'
          || ALG_RUIMTE_OMSCHRIJVING
             AS RUIMTE,
          ALG_RUIMTE_VERWIJDER
     FROM ALG_V_RUIMTE_GEGEVENS_ALL R
    WHERE ALG_LOCATIE_KEY = 121;

--- Overzicht met alle werkvergunningen
CREATE OR REPLACE VIEW AKZA_V_WERKVERGUNNINGEN
(
   HIDE_F_MELDING_KEY,
   HTML_AANVRAAG_NR,
   MELDING,
   ONDERWERP,
   STATUS,
   DATUM,
   AANVRAGER,
   AFDELING,
   AFDELING_OMSCHR,
   HTML_BESTAND,
   AANVRAAG_AFGEROND,
   FCLT_3D_LOCATIE_KEY
)
AS
   SELECT (1 - s.mld_melding_key) AS sort_desc,
             '<a class="details" onclick=''FcltMgr.openDetail("'
          || 'appl/mld/mld_melding.asp?urole=fe&'
          || 'mld_key='
          || s.mld_melding_key
          || '")''>'
          || HTF.escape_sc (s.mld_melding_key)
          || '</a>',
          t.mld_stdmelding_omschrijving,
          s.mld_melding_onderwerp,
          --- s.mld_melding_status,
          u.mld_statuses_omschrijving,
          s.mld_melding_datum,
          p.prs_perslid_naam_full,
          a.prs_afdeling_naam,
          a.prs_afdeling_omschrijving,
          (   '<a target ="_blank" href="'
           || bestand.mld_kenmerkmelding_waarde
           || '">'
           || HTF.escape_sc ('PTW-' || s.mld_melding_key)
           || '</a>'),
          ---     bestand.mld_kenmerkmelding_waarde,
          CASE
             WHEN ptw_volledig.mld_kenmerkmelding_waarde IS NOT NULL
             THEN
                'Ja'
             WHEN ptw_volledig.mld_kenmerkmelding_waarde IS NULL
             THEN
                'Nee'
          END
             AS Ptw_Volledig,
              s.mld_alg_locatie_key
     FROM mld_melding s,
          mld_stdmelding t,
          prs_v_perslid_fullnames_all p,
          prs_perslid pl,
          prs_afdeling a,
          mld_statuses u,
          (SELECT k.mld_melding_key, k.mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding k, mld_kenmerk n
            WHERE n.mld_kenmerk_key = k.mld_kenmerk_key
                  AND n.mld_srtkenmerk_key = 961) bestand,
          (SELECT k.mld_melding_key, k.mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding k, mld_kenmerk n
            WHERE n.mld_kenmerk_key = k.mld_kenmerk_key
                  AND n.mld_srtkenmerk_key = 962) ptw_volledig
    WHERE     p.prs_perslid_key = s.prs_perslid_key_voor
          AND s.mld_stdmelding_key = t.mld_stdmelding_key
          AND s.mld_melding_key = bestand.mld_melding_key
          AND s.mld_melding_key = ptw_volledig.mld_melding_key(+)
          AND s.mld_melding_status = u.mld_statuses_key
          AND p.prs_perslid_key=pl.prs_perslid_key
          AND pl.prs_afdeling_key=a.prs_afdeling_key
          AND s.mld_melding_status NOT IN (1, 5, 6, 99);

--- Rapportage tbv ombouwwerkzaamheden Eurest
CREATE OR REPLACE VIEW AKZA_V_WERKZAAMH_EUREST
(
   LOCATIECODE,
   LOCATIE,
   RUIMTE,
   DATUM,
   VAN,
   TOT,
   VERW_DAT,
   RESNR,
   AANT_PERS,
   AANT_WERK,
   NO_SHOW,
   WIJZIGINGEN,
   AANT_VOORZ,
   LEV_VOORZ,
   VOORZIENING,
   GASTHEER,
   AANVRAGER,
   TEL_AANVRAGER,
   KOSTENPLAATS,
   ORDERNNR,
   OMSCHRIJVING,
   OPMERKING,
   G_VORPAS,
   VOORZ_AANMAAK,
   VOORZ_VERW,
   VOORZ_MUT,
   WIJZ_LAST_MINUTE,
   DEL_LAST_MINUTE
)
AS
   SELECT rg.alg_locatie_code,
          rg.alg_locatie_omschrijving,
          r.res_ruimte_nr,
          TRUNC (
             COALESCE (rr.res_rsv_ruimte_van, ra.res_rsv_artikel_levering))
             datum,
          TO_CHAR (rr.res_rsv_ruimte_van, 'HH24:MI') van,
          TO_CHAR (rr.res_rsv_ruimte_tot, 'HH24:MI') tot,
          TRUNC (rr.res_rsv_ruimte_verwijder),
          res.res_reservering_key || '/' || rr.res_rsv_ruimte_volgnr resnr,
          rr.res_rsv_ruimte_bezoekers aant_pers,
          '' aant_werk,
          '' no_show,
          '' wijzigingen,
          ra.res_rsv_artikel_aantal,
          TO_CHAR (ra.res_rsv_artikel_levering, 'HH24:MI') levering,
          a.res_artikel_omschrijving,
          h.prs_perslid_naam_full HOST,
          g.prs_perslid_naam_full aanvr,
          gt.prs_perslid_telefoonnr telnr_aanvr,
          k.prs_kostenplaats_nr,
          rr.res_rsv_ruimte_ordernr,
          rr.res_rsv_ruimte_omschrijving,
          rr.res_rsv_ruimte_opmerking,
          g_vorpas.res_kenmerkreservering_waarde g_vorpas,
          ra.res_rsv_artikel_aanmaak,
          ra.res_rsv_artikel_verwijder,
          ra.res_rsv_artikel_mutatie,
          CASE
             WHEN ( (TRUNC (SYSDATE) = TRUNC (ra.res_rsv_artikel_aanmaak))
                   OR (TRUNC (SYSDATE) = TRUNC (ra.res_rsv_artikel_mutatie)))
             THEN
                'Ja'
             ELSE
                'Nee'
          END
             LM_MUT,
          CASE
             WHEN TRUNC (SYSDATE) = TRUNC (ra.res_rsv_artikel_verwijder)
             THEN
                'Ja'
             ELSE
                'Nee'
          END
             LM_DEL
     FROM res_rsv_ruimte rr,
          res_reservering res,
          res_rsv_artikel ra,
          res_artikel a,
          res_ruimte_opstelling ro,
          res_ruimte r,
          res_alg_ruimte ar,
          alg_v_ruimte_gegevens_all rg,
          prs_v_perslid_fullnames_all h,
          prs_v_perslid_fullnames_all g,
          prs_perslid gt,
          prs_kostenplaats k,
          (SELECT kw.res_kenmerkreservering_waarde, kw.res_rsv_ruimte_key
             FROM res_kenmerk k, res_kenmerkwaarde kw
            WHERE kw.res_kenmerk_key = k.res_kenmerk_key
                  AND k.res_srtkenmerk_key = 181) g_vorpas
    WHERE     ra.res_rsv_ruimte_key = rr.res_rsv_ruimte_key
          AND rr.res_reservering_key = res.res_reservering_key
          AND r.res_ruimte_key=ar.res_ruimte_key
          AND ar.alg_ruimte_key=rg.alg_ruimte_key
          AND a.res_artikel_key = ra.res_artikel_key
          AND rr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key
          AND ro.res_ruimte_key = r.res_ruimte_key
          AND rr.res_rsv_ruimte_host_key = h.prs_perslid_key
          AND rr.res_rsv_ruimte_contact_key = g.prs_perslid_key
          AND g.prs_perslid_key = gt.prs_perslid_key
          AND rr.prs_kostenplaats_key = k.prs_kostenplaats_key
          AND rr.res_rsv_ruimte_key = g_vorpas.res_rsv_ruimte_key(+)
          AND (rr.res_rsv_ruimte_verwijder IS NULL
               OR TRUNC (SYSDATE) = TRUNC (rr.res_rsv_ruimte_verwijder));

-- Notificatie naar areagedelegeerde AKZA#41201
-- Voor alle nieuwe meldingen waarbij het vinkje werkvergunning aanstaat (km441) en een waarbij een werkvergunning is aangemaakt (km961)
-- En waarbij aangegeven is dat de areagedelegeerde geinformeerd moet worden (km1021), AKZA#57881 direct of op een later moment 
-- hierbij de areagedelegeerde ophalen die bij de ruimte is vastgelegd (km 1160)
CREATE OR REPLACE VIEW AKZA_V_NOTI_PTW_AREAGD
(
    SENDER,
    RECEIVER,
    TEXT,
    CODE,
    FAC_SRTNOTIFICATIE_KEY,
    KEY,
    XKEY,
    XEMAIL,
    XMOBILE,
    XSENDER
)
AS
    SELECT DISTINCT
           NULL,
           p.prs_perslid_key,
           REPLACE (n.fac_srtnotificatie_oms, '##mldnr##', m.mld_melding_key),
           fac_srtnotificatie_code,
           n.fac_srtnotificatie_key,
           m.mld_melding_key,
           NULL
               xkey,
           p.prs_perslid_email
               xemail,
           NULL
               xmobile,
           'no_reply@akza.facilitor.nl'
      FROM fac_tracking               t,
           fac_srtnotificatie         n,
           mld_melding                m,
           alg_v_allonrgoed_gegevens  r,
           alg_onrgoedkenmerk         ad,
           prs_perslid                p,
           (SELECT km.mld_melding_key
              FROM mld_kenmerkmelding km, mld_kenmerk k
             WHERE     k.mld_kenmerk_key = km.mld_kenmerk_key
                   AND k.mld_srtkenmerk_key = 441) ptw_nodig,
           (SELECT km.mld_melding_key, km.mld_kenmerkmelding_waarde
              FROM mld_kenmerkmelding km, mld_kenmerk k
             WHERE     k.mld_kenmerk_key = km.mld_kenmerk_key
                   AND k.mld_srtkenmerk_key = 961) ptw,
           (SELECT km.mld_melding_key, km.mld_kenmerkmelding_waarde
              FROM mld_kenmerkmelding km, mld_kenmerk k
             WHERE     k.mld_kenmerk_key = km.mld_kenmerk_key
                   AND k.mld_srtkenmerk_key = 1021) areaged
     WHERE     T.FAC_TRACKING_REFKEY = M.MLD_MELDING_KEY
           AND T.FAC_SRTNOTIFICATIE_KEY = 21                --- nieuwe melding
           AND N.FAC_SRTNOTIFICATIE_CODE = 'CUST06'
           AND m.mld_melding_key = ptw_nodig.mld_melding_key
           AND m.mld_melding_key = ptw.mld_melding_key
           AND m.mld_melding_key = areaged.mld_melding_key
           AND m.mld_alg_onroerendgoed_keys = r.alg_onroerendgoed_keys
           AND r.alg_ruimte_key = ad.alg_onrgoed_key
           AND ad.alg_kenmerk_key = 1160
           AND ad.alg_onrgoedkenmerk_waarde = p.prs_perslid_key
           AND t.fac_tracking_datum >
               (SELECT   fac_notificatie_job_nextrun
                       - fac_notificatie_job_interval / 24
                  FROM fac_notificatie_job
                 WHERE UPPER (fac_notificatie_job_view) =
                       'AKZA_V_NOTI_PTW_AREAGD')
           AND t.fac_tracking_datum <
               (SELECT fac_notificatie_job_nextrun
                  FROM fac_notificatie_job
                 WHERE UPPER (fac_notificatie_job_view) =
                       'AKZA_V_NOTI_PTW_AREAGD')
    UNION ALL
    SELECT DISTINCT
           NULL,
           p.prs_perslid_key,
           REPLACE (n.fac_srtnotificatie_oms, '##mldnr##', m.mld_melding_key),
           fac_srtnotificatie_code,
           n.fac_srtnotificatie_key,
           m.mld_melding_key,
           NULL
               xkey,
           p.prs_perslid_email
               xemail,
           NULL
               xmobile,
           'no_reply@akza.facilitor.nl'
      FROM fac_tracking               t,
           fac_srtnotificatie         n,
           mld_melding                m,
           alg_v_allonrgoed_gegevens  r,
           alg_onrgoedkenmerk         ad,
           prs_perslid                p,
           (SELECT km.mld_melding_key
              FROM mld_kenmerkmelding km, mld_kenmerk k
             WHERE     k.mld_kenmerk_key = km.mld_kenmerk_key
                   AND k.mld_srtkenmerk_key = 441) ptw_nodig,
           (SELECT km.mld_melding_key, km.mld_kenmerkmelding_waarde
              FROM mld_kenmerkmelding km, mld_kenmerk k
             WHERE     k.mld_kenmerk_key = km.mld_kenmerk_key
                   AND k.mld_srtkenmerk_key = 961) ptw,
           (SELECT km.mld_melding_key, km.mld_kenmerkmelding_waarde
              FROM mld_kenmerkmelding km, mld_kenmerk k
             WHERE     k.mld_kenmerk_key = km.mld_kenmerk_key
                   AND k.mld_srtkenmerk_key = 1021) areaged
     WHERE     t.fac_tracking_refkey = m.mld_melding_key
           AND t.fac_tracking_oms LIKE
                   '%Areagedelegeerde informeren?: (leeg) --> 1%' --- of als in een later stadium nog het kenmerk gevuld wordt
           AND n.fac_srtnotificatie_code = 'CUST06'
           AND m.mld_melding_key = ptw_nodig.mld_melding_key
           AND m.mld_melding_key = ptw.mld_melding_key
           AND m.mld_melding_key = areaged.mld_melding_key
           AND m.mld_alg_onroerendgoed_keys = r.alg_onroerendgoed_keys
           AND r.alg_ruimte_key = ad.alg_onrgoed_key
           AND ad.alg_kenmerk_key = 1160
           AND ad.alg_onrgoedkenmerk_waarde = p.prs_perslid_key
           AND t.fac_tracking_datum >
               (SELECT   fac_notificatie_job_nextrun
                       - fac_notificatie_job_interval / 24
                  FROM fac_notificatie_job
                 WHERE UPPER (fac_notificatie_job_view) =
                       'AKZA_V_NOTI_PTW_AREAGD')
           AND t.fac_tracking_datum <
               (SELECT fac_notificatie_job_nextrun
                  FROM fac_notificatie_job
                 WHERE UPPER (fac_notificatie_job_view) =
                       'AKZA_V_NOTI_PTW_AREAGD');

CREATE OR REPLACE VIEW AKZ_HUUR_VERHUURB_RUIMTE_PERSL
(
   FCLT_F_COMPANYCODE,
   HIDE_F_COMPANYNAAM,
   FCLT_F_KOSTENPLAATS,
   AFDELING,
   PERSLID_NAAM,
   PERSLID_KOSTENPLAATS,
   FCLT_X_LOCATIE,
   FCLT_F_GEBOUW,
   VERDIEPING,
   RUIMTENR,
   RUIMTESOORT,
   FCLT_3D_GEBOUW_KEY,
   FCLT_3D_AFDELING_KEY,
   BVO
)
AS
     SELECT e.prs_afdeling_naam companycode,
            e.prs_afdeling_omschrijving companynaam,
            kp.prs_kostenplaats_nr,
            a.prs_afdeling_omschrijving,
            perslid_wp.prs_perslid_naam_full,
            perslid_wp.prs_kostenplaats_nr,
            rg.alg_locatie_omschrijving || ' (' || rg.alg_locatie_code || ')',
            rg.alg_gebouw_omschrijving,
            rg.alg_verdieping_code,
            rg.alg_ruimte_nr,
            sr.alg_srtruimte_omschrijving,
            rg.alg_gebouw_key,
            a.prs_afdeling_key,
            ROUND (
               SUM(COALESCE (
                        rg.alg_ruimte_bruto_vloeropp
                      * ra.prs_ruimteafdeling_bezetting
                      / 100,
                      0)),
               1)
               bvo
       FROM prs_v_aanwezigafdeling a,
            prs_v_aanwezigafdeling e,
            prs_v_aanwezigruimteafdeling ra,
            alg_v_ruimte_gegevens rg,
            alg_srtruimte sr,
            akza_v_kostenplaats kp,
 (SELECT wp.prs_alg_ruimte_key,
        wp.prs_werkplek_key,
        pwp.prs_perslidwerkplek_bezetting,
        pl.prs_perslid_naam_full,
        a.prs_afdeling_omschrijving,
        kpl.prs_kostenplaats_nr
   FROM prs_werkplek wp,
        prs_perslidwerkplek pwp,
        prs_v_perslid_fullnames_all pl,
        prs_perslid p,
        prs_v_aanwezigafdeling a,
        prs_v_aanwezigafdeling e,
        prs_kostenplaats kpl
  WHERE     pwp.prs_werkplek_key = wp.prs_werkplek_key
        AND pl.prs_perslid_key = pwp.prs_perslid_key
        AND a.prs_afdeling_parentkey = e.prs_afdeling_key(+)
        AND e.prs_afdeling_parentkey IS NULL
        AND pl.prs_perslid_key = p.prs_perslid_key
        AND a.prs_afdeling_key = p.prs_afdeling_key
        AND kpl.prs_kostenplaats_key = a.prs_kostenplaats_key)
            perslid_wp
      WHERE     a.prs_afdeling_parentkey = e.prs_afdeling_key(+)
            AND e.prs_afdeling_parentkey IS NULL
            AND kp.prs_kostenplaats_key(+) = a.prs_kostenplaats_key
            AND ra.prs_afdeling_key = a.prs_afdeling_key(+)
            AND rg.alg_ruimte_key = ra.alg_ruimte_key(+)
            AND sr.alg_srtruimte_key = rg.alg_srtruimte_key
            AND perslid_wp.prs_alg_ruimte_key(+) = rg.alg_ruimte_key
   GROUP BY e.prs_afdeling_naam,
            e.prs_afdeling_omschrijving,
            kp.prs_kostenplaats_nr,
            a.prs_afdeling_omschrijving,
            rg.alg_locatie_code,
            rg.alg_locatie_omschrijving,
            rg.alg_gebouw_omschrijving,
            rg.alg_gebouw_key,
            rg.alg_verdieping_volgnr,
            rg.alg_verdieping_code,
            rg.alg_ruimte_nr,
            sr.alg_srtruimte_omschrijving,
            a.prs_afdeling_key,
            perslid_wp.prs_perslid_naam_full,
            perslid_wp.prs_afdeling_omschrijving,
            perslid_wp.prs_kostenplaats_nr;

CREATE OR REPLACE VIEW AKZA_V_RAP_CTR_LOD
AS
(SELECT lod.ins_deel_key,
        og.alg_plaatsaanduiding,
        ins_deel_omschrijving,
        ins_deel_opmerking,
        fac_usrdata_omschr,
        dc.ins_deelsrtcontrole_datum,
        (SELECT icm.ins_controlemode_oms
           FROM ins_controlemode icm
          WHERE icm.ins_controlemode_key = dc.ins_controlemode_key)
           controlemode_omschrijving,
        (SELECT prs_perslid_naam_full
           FROM prs_v_perslid_fullnames_all pf
          WHERE pf.prs_perslid_key = dc.prs_perslid_key)
           perslid,
        (SELECT lcl.x ('fc2l.fac_code2label_label',
                       fc2l.fac_code2label_key,
                       fc2l.fac_code2label_label)
           FROM fac_code2label fc2l
          WHERE fc2l.fac_code2label_domein = 'controle'
                AND fc2l.fac_code2label_code = dc.ins_deelsrtcontrole_status)
           deelsrtcontrole_status
   FROM ins_deel lod,
        ins_deelsrtcontrole dc,
        alg_v_allonrgoed_gegevens og,
        (SELECT fac_usrdata_code, fac_usrdata_omschr, km.ins_deel_key
           FROM ins_kenmerkdeel km, fac_usrdata ud
          WHERE     km.ins_kenmerk_key = 7025
                AND km.ins_kenmerkdeel_waarde = ud.fac_usrdata_key
                AND fac_usrtab_key = 526) criticaliteit
  WHERE     ins_srtdeel_key IN (7765, 7685)
        AND ins_deel_verwijder IS NULL
        AND criticaliteit.ins_deel_key = dc.ins_deel_key
        AND ins_deel_actief = 1
        AND dc.ins_deel_key = lod.ins_deel_key
        AND fac_usrdata_code IN ('A', 'B')
        AND lod.ins_alg_ruimte_key = og.alg_ruimte_key
        AND dc.ins_deelsrtcontrole_status = 6          -- alle voltooide taken
        AND ins_deelsrtcontrole_datum >= ADD_MONTHS (SYSDATE, -1)
        AND ins_deelsrtcontrole_datum <= SYSDATE
        -- 9457 P2, 9458 P3A, 14260 B, 9459 P4, 9460 P5A, 14269 P5C, 9456 P12
        AND ( (og.alg_gebouw_key IN (9457, 9458, 14260, 9459, 9460)
               AND og.alg_verdieping_code IN ('0', '1'))
             OR (og.alg_gebouw_key = 14269 AND og.alg_ruimte_key = 14277)
             OR (og.alg_gebouw_key = 9456 AND og.alg_ruimte_key = 13895))
 UNION ALL
 SELECT d.ins_deel_key,
        d.alg_plaatsaanduiding,
        d.ins_deel_omschrijving,
        d.ins_deel_opmerking,
        fac_usrdata_omschr,
        fac.nextcyclusdatedeel (d.ins_deel_key, d.ins_srtcontrole_key, 1),
        '' AS ctrmode,
        prs_perslid_naam_full,
        '' AS status
   FROM    (SELECT sc.ins_srtcontrole_key,
                   d.ins_deel_key,
                   d.ins_deel_omschrijving,
                   d.ins_deel_opmerking,
                   sc.ins_srtcontrole_periode,
                   sd.ins_srtdeel_omschrijving,
                   pfa.prs_perslid_key,
                   pfa.prs_perslid_naam_full,
                   criticaliteit.fac_usrdata_omschr,
                   og.alg_plaatsaanduiding
              FROM ins_srtcontrole sc,
                   ins_discipline di,
                   ins_v_aanwezigsrtgroep sg,
                   ins_v_aanwezigsrtdeel sd,
                   ins_v_aanwezigdeel d,
                   alg_v_allonrgoed_gegevens og,
                   prs_perslid p,
                   prs_v_perslid_fullnames_all pfa,
                   (SELECT fac_usrdata_code,
                           fac_usrdata_omschr,
                           km.ins_deel_key
                      FROM ins_kenmerkdeel km, fac_usrdata ud
                     WHERE     km.ins_kenmerk_key = 7025
                           AND km.ins_kenmerkdeel_waarde = ud.fac_usrdata_key
                           AND fac_usrtab_key = 526) criticaliteit
             WHERE     sd.ins_srtdeel_key = d.ins_srtdeel_key
                   AND sg.ins_srtgroep_key = sd.ins_srtgroep_key
                   AND di.ins_discipline_key = sg.ins_discipline_key
                   AND COALESCE (d.ins_deel_vervaldatum, SYSDATE + 1) >=
                         SYSDATE
                   AND p.prs_perslid_key = d.prs_perslid_key_beh
                   AND d.ins_alg_ruimte_key = og.alg_ruimte_key
                   AND ( (og.alg_gebouw_key IN
                                (9457, 9458, 14260, 9459, 9460)
                          AND og.alg_verdieping_code IN ('0', '1'))
                        OR (og.alg_gebouw_key = 14269
                            AND og.alg_ruimte_key = 14277)
                        OR (og.alg_gebouw_key = 9456
                            AND og.alg_ruimte_key = 13895))
                   AND pfa.prs_perslid_key = d.prs_perslid_key_beh
                   AND criticaliteit.ins_deel_key = d.ins_deel_key
                   AND criticaliteit.fac_usrdata_code IN ('A', 'B') ---lod's met criticaliteit A of B
                   AND d.ins_srtdeel_key IN (7765, 7685)) d
        LEFT OUTER JOIN
           ins_srtcontroledl_xcp xcp
        ON xcp.ins_deel_key = d.ins_deel_key
           AND xcp.ins_srtcontrole_key = d.ins_srtcontrole_key
  WHERE COALESCE (xcp.ins_srtcontroledl_xcp_periode,
                  d.ins_srtcontrole_periode) > 0
        AND fac.nextcyclusdatedeel (d.ins_deel_key, d.ins_srtcontrole_key, 1) <=
              ADD_MONTHS (SYSDATE, 1)
        AND fac.nextcyclusdatedeel (d.ins_deel_key, d.ins_srtcontrole_key, 1) >=
              SYSDATE
        AND d.ins_deel_key NOT IN --- als een inspectie al is ingepland weegt dat zwaarder dan de oorspronkelijke datum, object komt op de lijst als plandatum komende maand is
                 (SELECT ins_deel_key
                    FROM ins_v_udr_deelinspect ins, ins_deel lod
                   WHERE     ins_deelsrtcontrole_plandatum IS NOT NULL
                         AND ins_deelsrtcontrole_datum IS NULL
                         AND lod.ins_deel_key = ins.deel_key
                         AND lod.ins_srtdeel_key IN (7765, 7685)
                         AND lod.ins_deel_verwijder IS NULL)
 UNION ALL
 SELECT lod.ins_deel_key,
        og.alg_plaatsaanduiding,
        lod.ins_deel_omschrijving,
        lod.ins_deel_opmerking,
        fac_usrdata_omschr,
        ins_deelsrtcontrole_plandatum,
        '' ctrmode,
        perslid,
        deelsrtcontrole_status
   FROM ins_v_udr_deelinspect ins,
        ins_deel lod,
        alg_v_allonrgoed_gegevens og,
        (SELECT fac_usrdata_code, fac_usrdata_omschr, km.ins_deel_key
           FROM ins_kenmerkdeel km, fac_usrdata ud
          WHERE     km.ins_kenmerk_key = 7025
                AND km.ins_kenmerkdeel_waarde = ud.fac_usrdata_key
                AND fac_usrtab_key = 526) criticaliteit
  WHERE     ins_deelsrtcontrole_plandatum IS NOT NULL
        AND ins_deelsrtcontrole_datum IS NULL
        AND lod.ins_alg_ruimte_key = og.alg_ruimte_key
        AND criticaliteit.ins_deel_key = lod.ins_deel_key
        AND fac_usrdata_code IN ('A', 'B')
        AND lod.ins_deel_key = ins.deel_key
        AND lod.ins_srtdeel_key IN (7765, 7685)                      --- LOD's
        AND lod.ins_deel_verwijder IS NULL
        AND actief = 'ja'
        AND ( (og.alg_gebouw_key IN (9457, 9458, 14260, 9459, 9460)
               AND og.alg_verdieping_code IN ('0', '1'))
             OR (og.alg_gebouw_key = 14269 AND og.alg_ruimte_key = 14277)
             OR (og.alg_gebouw_key = 9456 AND og.alg_ruimte_key = 13895))
        AND ins_deelsrtcontrole_plandatum <= ADD_MONTHS (SYSDATE, 1)
        AND ins_deelsrtcontrole_plandatum >= SYSDATE);
       
CREATE OR REPLACE VIEW AKZA_V_RUIMTES
(
   ruimte_key,
   ruimte_omschrijving,
   ruimte_verwijder
)
AS
   SELECT alg_ruimte_key,
          alg_ruimte_aanduiding || ' - ' || alg_ruimte_omschrijving,
          alg_ruimte_verwijder
     FROM alg_v_ruimte_gegevens_all
    WHERE alg_locatie_code IN ('SSCA', 'AMB')
          AND (alg_srtruimte_key IN (1021, 962, 963, 1029, 464, 1041, 1028)
               OR alg_srtruimte_key IS NULL);

CREATE OR REPLACE VIEW AKZA_V_RAP_TRAINING
(
   TRAINING,
   MEDEWERKER,
   AFDELING,
   VERANTW_COORDINATOR,
   OMSCHR_TRAINING,
   REULTAAT,
   TOELICHTING_RESULTAAT,
   DATUM_CERTIFICERING,
   GEPL_DATUM_CERTIFICERING,
   STATUS_CERTIFICERING
)
AS
   (SELECT ins_srtdeel_upper training,
           alg_plaatsaanduiding medewerker,
           prs_afdeling_omschrijving afdeling,
           beheerder verantw_coordinator,
           srtcontrole_omschrijving omschr_training,
           controlemode_omschrijving reultaat,
           ins_deelsrtcontrole_opmerking toelichting_resultaat,
           ins_deelsrtcontrole_datum datum_certificering,
           ins_deelsrtcontrole_plandatum gepl_datum_certificering,
           deelsrtcontrole_status status_certificering
      FROM ins_v_deel_gegevens o, ins_v_udr_deelinspect c
     WHERE ins_srtgroep_upper = 'TRAINING EN OPLEIDING'
           AND o.ins_deel_key = c.deel_key(+));               
 
-- Tbv van de aanvraag van (tijdelijke) badges is het nodig om een onderscheid te kunnen maken tussen medewerkers intern (incl. Teijin) en contractors
CREATE OR REPLACE VIEW AKZA_V_CONTRACTORS
(
   PRS_PERSLID_KEY,
   NAAM,
   PRS_PERSLID_VERWIJDER
)
AS
   SELECT p.prs_perslid_key,
          p.prs_perslid_string || ' / ' || fac_usrdata_code,
          p.prs_perslid_verwijder
     FROM AKZA_V_PERSLID p, PRS_KENMERKLINK kl, FAC_USRDATA ud
    WHERE     prs_link_key = prs_perslid_key
          AND prs_kenmerk_key = 1544
          AND fac_usrtab_key = 529
          AND prs_kenmerklink_waarde = fac_usrdata_key
          AND ud.fac_usrdata_verwijder is null
          AND (fac_usrdata_vervaldatum > sysdate or fac_usrdata_vervaldatum  is null);

CREATE OR REPLACE VIEW AKZA_V_PERSLID_INTERN
(
   prs_perslid_key,
   naam,
   prs_perslid_verwijder
)
AS
   SELECT p.prs_perslid_key,
           p.prs_perslid_string || ' / ' || fac_usrdata_code,
          p.prs_perslid_verwijder
     FROM AKZA_V_PERSLID p, PRS_KENMERKLINK kl, FAC_USRDATA ud
    WHERE     prs_link_key = prs_perslid_key
          AND prs_kenmerk_key = 1520
          AND fac_usrtab_key = 527
          AND prs_kenmerklink_waarde = fac_usrdata_key
          AND ud.fac_usrdata_verwijder is null
          AND (fac_usrdata_vervaldatum > sysdate or fac_usrdata_vervaldatum  is null);
         
CREATE OR REPLACE VIEW AKZA_V_AANVR_TBADGE
(
   PRS_PERSLID_KEY,
   NAAM,
   PRS_PERSLID_VERWIJDER
)
AS
   (SELECT "PRS_PERSLID_KEY", "NAAM", "PRS_PERSLID_VERWIJDER"
      FROM AKZA_V_PERSLID_INTERN
    UNION ALL
    SELECT "PRS_PERSLID_KEY", "NAAM", "PRS_PERSLID_VERWIJDER"
      FROM AKZA_V_CONTRACTORS);      
                  
CREATE OR REPLACE VIEW AKZA_V_RAP_TBADGES
(
    LOCATIE,
    BADGEHOUDER_KEY,
    BADGEHOUDER,
    INT_EXT,
    COMPANY,
    PROJECT,
    WERKZAAM_VOOR,
    BADGE_NR,
    SOORT_BADGE,
    BLOKKADE_DATUM,
    AANVRAGER,
    MELDING_KEY,
    HTML_MELDINGNR,
    MELDING,
    STATUS_MELDING,
    AANVRAAGDATUM,
    AANVRAAG_GEREED,
    GEVRAAGDE_EINDDAT
)
AS    
  SELECT DISTINCT
         DECODE (SUBSTR (mdw.badge_nr, 1, 2),
                 '30', 'Amsterdam',
                 '13', 'Arnhem', 'Locatie onbekend')
             locatie,
         mdw.badgehouder_prskey,
         mdw.badgehouder,
         mdw.int_ext,
         mdw.comp,
         mdw.project,
         mdw.werkzaam_voor,
         mdw.badge_nr,
         soort_badge,
         mdw.blokkade_datum,
         badges.aanvrager,
         badges.mld_melding_key,
            '<a class="details" onclick=''FcltMgr.openDetail("'
         || 'appl/mld/mld_melding.asp?mld_key='
         || badges.mld_melding_key
         || '")''>'
         || HTF.escape_sc (badges.mld_melding_key)
         || '</a>',
         badges.mld_stdmelding_omschrijving,
         badges.mld_statuses_omschrijving,
         badges.mld_melding_datum,
         badges.mld_melding_einddatum,
         badges.nieuwe_einddatum
    FROM (SELECT prs.prs_perslid_key
                     badgehouder_prskey,
                 prs.prs_perslid_naam_full
                     badgehouder,
                 int_ext.int_ext,
                 COALESCE (company_contr.company, company_intern.company)
                     comp,
                 COALESCE (proj.project, proj_cntr.project)
                     project,
                 werkz.werkzaam_voor,
                 badge.soort_badge,
                 badge_nr.badge_nr,
                 FAC.SAFE_TO_DATE (blokkade_datum.blokkade_datum, 'dd-mm-yyyy')
                     blokkade_datum
            FROM prs_v_perslid_fullnames_all prs,
                 (SELECT prs_link_key, ud.fac_usrdata_omschr int_ext
                    FROM prs_kenmerklink kl, fac_usrdata ud, fac_usrtab ut
                   WHERE     kl.prs_kenmerklink_niveau = 'P'
                         AND kl.prs_kenmerklink_waarde = ud.fac_usrdata_key
                         AND ud.fac_usrtab_key = ut.fac_usrtab_key
                         AND ut.fac_usrtab_key = 471
                         AND kl.prs_kenmerk_key = 1560) int_ext,
                 (SELECT prs_link_key, ud.fac_usrdata_omschr soort_badge
                    FROM prs_kenmerklink kl, fac_usrdata ud, fac_usrtab ut
                   WHERE     kl.prs_kenmerklink_niveau = 'P'
                         AND kl.prs_kenmerklink_waarde = ud.fac_usrdata_key
                         AND ud.fac_usrtab_key = ut.fac_usrtab_key
                         AND ut.fac_usrtab_key = 61
                         AND kl.prs_kenmerk_key = 1001) badge,
                 (SELECT prs_link_key, prs_kenmerklink_waarde badge_nr
                    FROM prs_kenmerklink kl
                   WHERE     kl.prs_kenmerklink_niveau = 'P'
                         AND kl.prs_kenmerk_key = 1000) badge_nr,
                 (SELECT prs_link_key, prs_kenmerklink_waarde blokkade_datum
                    FROM prs_kenmerklink kl
                   WHERE     kl.prs_kenmerklink_niveau = 'P'
                         AND kl.prs_kenmerk_key = 1360) blokkade_datum,
                 (SELECT prs_link_key, prs_kenmerklink_waarde company
                    FROM prs_kenmerklink kl
                   WHERE     kl.prs_kenmerklink_niveau = 'P'
                         AND kl.prs_kenmerk_key = 1543) company_contr,
                 (SELECT prs_link_key, ud.fac_usrdata_code company
                    FROM prs_kenmerklink kl, fac_usrdata ud
                   WHERE     kl.prs_kenmerklink_niveau = 'P'
                         AND kl.prs_kenmerk_key = 1520
                         AND ud.fac_usrtab_key = 527
                         AND ud.fac_usrdata_key = prs_kenmerklink_waarde)
                 company_intern,
                 (SELECT prs_link_key, prs_kenmerklink_waarde project
                    FROM prs_kenmerklink kl
                   WHERE     kl.prs_kenmerklink_niveau = 'P'
                         AND kl.prs_kenmerk_key = 1562) proj,
                 (SELECT prs_link_key, prs_kenmerklink_waarde project
                    FROM prs_kenmerklink kl
                   WHERE     kl.prs_kenmerklink_niveau = 'P'
                         AND kl.prs_kenmerk_key = 1580) proj_cntr,
                 (SELECT prs_link_key, ud.fac_usrdata_code werkzaam_voor
                    FROM prs_kenmerklink kl, fac_usrdata ud
                   WHERE     kl.prs_kenmerklink_niveau = 'P'
                         AND kl.prs_kenmerk_key = 1544
                         AND ud.fac_usrtab_key = 529
                         AND ud.fac_usrdata_key = prs_kenmerklink_waarde) werkz
           WHERE     prs.prs_perslid_key = company_intern.prs_link_key(+)
                 AND prs.prs_perslid_key = company_contr.prs_link_key(+)
                 AND prs.prs_perslid_key = blokkade_datum.prs_link_key(+)
                 AND prs.prs_perslid_key = badge.prs_link_key(+)
                 AND prs.prs_perslid_key = werkz.prs_link_key(+)
                 AND prs.prs_perslid_key = int_ext.prs_link_key(+)
                 AND prs.prs_perslid_key = badge_nr.prs_link_key(+)
                 AND prs.prs_perslid_key = proj.prs_link_key(+)
                 AND prs.prs_perslid_key = proj_cntr.prs_link_key(+)
                 AND prs.PRS_PERSLID_VERWIJDER IS NULL) mdw,
         (  SELECT DISTINCT melding_voor,
                            mld_melding_key,
                            mld_stdmelding_omschrijving,
                            mld_statuses_omschrijving,
                            mld_melding_datum,
                            mld_melding_einddatum,
                            aanvrager,
                            nieuwe_einddatum
              FROM (  SELECT melding_voor,
                             MAX (mld_melding_key)     max_mld_melding_key
                        FROM ((SELECT m.mld_melding_key,
                                      COALESCE (contractor.contractor_perslid_key,
                                                mdw_intern.int_mdw_perslid_key)    melding_voor
                                 FROM mld_melding m,
                                      (SELECT mld_melding_key
                                                  contractor_melding_key,
                                              mld_kenmerkmelding_waarde
                                                  contractor_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 1566 -- contractor
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) contractor,
                                      (SELECT mld_melding_key
                                                  int_mdw_melding_key,
                                              mld_kenmerkmelding_waarde
                                                  int_mdw_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 1564 -- interne medewerker
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) mdw_intern
                                WHERE     m.mld_stdmelding_key = 1761 -- badges >> aanvraag badge
                                      AND m.mld_melding_key =
                                          contractor_melding_key(+)
                                      AND m.mld_melding_key =
                                          int_mdw_melding_key(+))
                              UNION ALL
                              (SELECT m.mld_melding_key,
                                      medewerker.mdw_perslid_key     melding_voor
                                 FROM mld_melding m,
                                      (SELECT mld_melding_key              mdw_melding_key,
                                              mld_kenmerkmelding_waarde    mdw_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 1581 -- medewerker
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) medewerker
                                WHERE     m.mld_stdmelding_key = 1765 -- badges >> verlengen badge
                                      AND m.mld_melding_key = mdw_melding_key(+))
                              UNION ALL
                              (SELECT m.mld_melding_key,
                                      COALESCE (medewerker.mdw_perslid_key,
                                                contractor.contr_perslid_key)    melding_voor
                                 FROM mld_melding m,
                                      (SELECT mld_melding_key              mdw_melding_key,
                                              mld_kenmerkmelding_waarde    mdw_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 1521 -- medewerker
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) medewerker,
                                      (SELECT mld_melding_key              contr_melding_key,
                                              mld_kenmerkmelding_waarde    contr_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 1481 -- contractor
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) contractor
                                WHERE     m.mld_stdmelding_key = 1003 -- indienst met tijdelijke badge
                                      AND m.mld_melding_key = mdw_melding_key(+)
                                      AND m.mld_melding_key = contr_melding_key(+))
                              UNION ALL
                              (SELECT m.mld_melding_key,
                                      COALESCE (contractor.contr_perslid_key,
                                                medewerker.mdw_perslid_key)    melding_voor
                                 FROM mld_melding m,
                                      (SELECT mld_melding_key              mdw_melding_key,
                                              mld_kenmerkmelding_waarde    mdw_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 313 -- medewerker
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) medewerker,
                                      (SELECT mld_melding_key              contr_melding_key,
                                              mld_kenmerkmelding_waarde    contr_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 1441 -- contractor
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) contractor
                                WHERE     m.mld_stdmelding_key = 981 -- tijdelijke badge - aanvraag tijdelijke badge
                                      AND m.mld_melding_key = mdw_melding_key(+)
                                      AND m.mld_melding_key = contr_melding_key(+))
                              UNION ALL
                              (SELECT m.mld_melding_key,
                                      COALESCE (contractor.contr_perslid_key,
                                                medewerker.mdw_perslid_key)    melding_voor
                                 FROM mld_melding m,
                                      (SELECT mld_melding_key              mdw_melding_key,
                                              mld_kenmerkmelding_waarde    mdw_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 313 -- medewerker
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) medewerker,
                                      (SELECT mld_melding_key              contr_melding_key,
                                              mld_kenmerkmelding_waarde    contr_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 1441 -- contractor
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) contractor
                                WHERE     m.mld_stdmelding_key = 981 -- tijdelijke badge - aanvraag tijdelijke badge
                                      AND m.mld_melding_key = mdw_melding_key(+)
                                      AND m.mld_melding_key = contr_melding_key(+))
                              UNION ALL
                              (SELECT m.mld_melding_key,
                                      COALESCE (contractor.contr_perslid_key,
                                                medewerker.mdw_perslid_key)    melding_voor
                                 FROM mld_melding m,
                                      (SELECT mld_melding_key              mdw_melding_key,
                                              mld_kenmerkmelding_waarde    mdw_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 313 -- medewerker
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) medewerker,
                                      (SELECT mld_melding_key              contr_melding_key,
                                              mld_kenmerkmelding_waarde    contr_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 1441 -- contractor
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) contractor
                                WHERE     m.mld_stdmelding_key = 984 -- tijdelijke badge - verlengen tijdelijke badge
                                      AND m.mld_melding_key = mdw_melding_key(+)
                                      AND m.mld_melding_key = contr_melding_key(+))
                              UNION ALL
                              (SELECT m.mld_melding_key,
                                      medewerker.mdw_perslid_key     melding_voor
                                 FROM mld_melding m,
                                      (SELECT mld_melding_key              mdw_melding_key,
                                              mld_kenmerkmelding_waarde    mdw_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 341 -- medewerker
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) medewerker
                                WHERE     m.mld_stdmelding_key = 1006 -- uit dienst met tijdelijke badge
                                      AND m.mld_melding_key = mdw_melding_key(+))
                              UNION ALL
                              (SELECT m.mld_melding_key,
                                      medewerker.mdw_perslid_key     melding_voor
                                 FROM mld_melding m,
                                      (SELECT mld_melding_key              mdw_melding_key,
                                              mld_kenmerkmelding_waarde    mdw_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 1621 -- medewerker
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) medewerker
                                WHERE     m.mld_stdmelding_key = 1764 -- uit dienst met tijdelijke badge
                                      AND m.mld_melding_key = mdw_melding_key(+))
                              UNION ALL
                              (SELECT m.mld_melding_key,
                                      COALESCE (contractor.contr_perslid_key,
                                                medewerker.mdw_perslid_key)    melding_voor
                                 FROM mld_melding m,
                                      (SELECT mld_melding_key              mdw_melding_key,
                                              mld_kenmerkmelding_waarde    mdw_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 313 -- medewerker
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) medewerker,
                                      (SELECT mld_melding_key              contr_melding_key,
                                              mld_kenmerkmelding_waarde    contr_perslid_key
                                         FROM mld_kenmerkmelding km
                                        WHERE     km.mld_kenmerk_key = 1441 -- contractor
                                              AND km.mld_kenmerkmelding_verwijder
                                                      IS NULL) contractor
                                WHERE     m.mld_stdmelding_key = 1021 -- tijdelijke badge - innemen tijdelijke badge
                                      AND m.mld_melding_key = mdw_melding_key(+)
                                      AND m.mld_melding_key = contr_melding_key(+)))
                             laatste_aanvraag
                    GROUP BY melding_voor
                    ORDER BY melding_voor) max_aanvraag,
                   (SELECT sm.MLD_STDMELDING_OMSCHRIJVING,
                           m.mld_melding_key,
                           s.mld_statuses_omschrijving,
                           m.mld_melding_datum,
                           mld_melding_einddatum,
                           aanvr.prs_perslid_naam_full     aanvrager,
                           einddatum.nieuwe_einddat        nieuwe_einddatum
                      FROM mld_melding              m,
                           mld_statuses             s,
                           prs_v_perslid_fullnames_all aanvr,
                           mld_stdmelding           sm,
                           ((SELECT mld_melding_key               einddat_melding_key,
                                    mld_kenmerkmelding_waarde     nieuwe_einddat
                               FROM mld_kenmerkmelding km
                              WHERE     km.mld_kenmerk_key = 1561 -- nieuwe einddatum
                                    AND km.mld_kenmerkmelding_verwijder IS NULL)
                            UNION ALL
                            (SELECT mld_melding_key               einddat_melding_key,
                                    mld_kenmerkmelding_waarde     einddat
                               FROM mld_kenmerkmelding km
                              WHERE     km.mld_kenmerk_key = 305  -- einddatum
                                    AND km.mld_kenmerkmelding_verwijder IS NULL)
                            UNION ALL
                            (SELECT mld_melding_key               einddat_melding_key,
                                    mld_kenmerkmelding_waarde     einddat
                               FROM mld_kenmerkmelding km
                              WHERE     km.mld_kenmerk_key = 304  -- einddatum
                                    AND km.mld_kenmerkmelding_verwijder IS NULL)
                            UNION ALL
                            (SELECT mld_melding_key               einddat_melding_key,
                                    mld_kenmerkmelding_waarde     einddat
                               FROM mld_kenmerkmelding km
                              WHERE     km.mld_kenmerk_key = 304  -- einddatum
                                    AND km.mld_kenmerkmelding_verwijder IS NULL)
                            UNION ALL
                            (SELECT mld_melding_key               einddat_melding_key,
                                    mld_kenmerkmelding_waarde     einddat
                               FROM mld_kenmerkmelding km
                              WHERE     km.mld_kenmerk_key = 320  -- einddatum
                                    AND km.mld_kenmerkmelding_verwijder IS NULL)
                            UNION ALL
                            (SELECT mld_melding_key               einddat_melding_key,
                                    mld_kenmerkmelding_waarde     einddat
                               FROM mld_kenmerkmelding km
                              WHERE     km.mld_kenmerk_key = 361  -- einddatum
                                    AND km.mld_kenmerkmelding_verwijder IS NULL)
                            UNION ALL
                            (SELECT mld_melding_key               einddat_melding_key,
                                    mld_kenmerkmelding_waarde     einddat
                               FROM mld_kenmerkmelding km
                              WHERE     km.mld_kenmerk_key = 1562 -- einddatum
                                    AND km.mld_kenmerkmelding_verwijder IS NULL)
                            UNION ALL
                            (SELECT mld_melding_key               einddat_melding_key,
                                    mld_kenmerkmelding_waarde     einddat
                               FROM mld_kenmerkmelding km
                              WHERE     km.mld_kenmerk_key = 364  -- einddatum
                                    AND km.mld_kenmerkmelding_verwijder IS NULL))
                           einddatum
                     WHERE     m.mld_melding_status = s.mld_statuses_key
                           AND m.mld_stdmelding_key = sm.mld_stdmelding_key
                           AND m.MLD_MELDING_KEY =
                               einddatum.einddat_melding_key(+)
                           AND m.prs_perslid_key_voor = aanvr.prs_perslid_key)
                   details
             WHERE max_aanvraag.max_mld_melding_key = details.mld_melding_key
          ORDER BY max_aanvraag.melding_voor) badges
   WHERE badgehouder_prskey = badges.melding_voor(+)
--   AND UPPER (soort_badge) = 'TIJDELIJKE BADGE'
ORDER BY mdw.badge_nr, mdw.badgehouder_prskey;  

 

   
CREATE OR REPLACE VIEW AKZA_V_NOTI_CTR_LOD
(
    CODE,
    SENDER,
    RECEIVER,
    TEXT,
    KEY,
    XKEY
)
AS    
SELECT fac_srtnotificatie_code,
       NULL
           SENDER,                                        --- dit is Facilitor
       (SELECT prs_perslid_key
          FROM prs_perslid p
         WHERE UPPER (p.PRS_PERSLID_EMAIL) = 'Theo.Vonk@nouryon.com')
           RECEIVER,
       'Informatie cLODs'
           TEKST,
       (SELECT fac_usrrap_key
          FROM fac_usrrap
         WHERE UPPER (fac_usrrap_view_name) = 'AKZA_V_RAP_CTR_LOD')
           key,                                    ---- refkey: is het rapport
       NULL
           xkey
  ---  'ANDRE.MIDDELBOS@AKZONOBEL.COM;ASTRID.KRAMER@AKZONOBEL.COM;HERMAN.HERBERS@AKZONOBEL.COM;BERT.EMMING@AKZONOBEL.COM;THEO.VONK@AKZONOBEL.COM' xemail
  FROM fac_srtnotificatie sn
 WHERE     sn.fac_srtnotificatie_code = 'CUST07'
       AND TO_CHAR (SYSDATE, 'dd') = '01'          -- Elke 1e dag van de maand
       AND TO_CHAR (SYSDATE, 'mm') IN ('01',
                                       '02',
                                       '03',
                                       '04',
                                       '05',
                                       '06',
                                       '07',
                                       '08',
                                       '09',
                                       '10',
                                       '11',
                                       '12');    

 CREATE OR REPLACE VIEW AKZA_V_PERSLID_BADGE_INT
(
    PRS_PERSLID_KEY,
    NAAM,
    PRS_PERSLID_VERWIJDER
)
AS
 SELECT p.prs_perslid_key,
           p.prs_perslid_string || ' / ' || fac_usrdata_code,
           p.prs_perslid_verwijder
      FROM AKZA_V_PERSLID p, PRS_KENMERKLINK kl, FAC_USRDATA ud
     WHERE     prs_link_key = prs_perslid_key
           AND prs_kenmerk_key = 1560
           AND fac_usrtab_key = 471
           AND ud.FAC_USRDATA_KEY in (4381, 1747,4382,4377)
           AND prs_kenmerklink_waarde = fac_usrdata_key          
           AND (   fac_usrdata_vervaldatum > SYSDATE
                OR fac_usrdata_vervaldatum IS NULL);

 CREATE OR REPLACE VIEW AKZA_V_PERSLID_BADGE_EXT
(
    PRS_PERSLID_KEY,
    NAAM,
    PRS_PERSLID_VERWIJDER
)
AS
 SELECT p.prs_perslid_key,
           p.prs_perslid_string || ' / ' || fac_usrdata_code,
           p.prs_perslid_verwijder
      FROM AKZA_V_PERSLID p, PRS_KENMERKLINK kl, FAC_USRDATA ud
     WHERE     prs_link_key = prs_perslid_key
           AND prs_kenmerk_key = 1560
           AND fac_usrtab_key = 471
           AND ud.FAC_USRDATA_KEY = 1746
           AND prs_kenmerklink_waarde = fac_usrdata_key          
           AND (   fac_usrdata_vervaldatum > SYSDATE
                OR fac_usrdata_vervaldatum IS NULL);            
--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------

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