--
-- $Id$
--
-- Script containing customer specific db-configuration for KFHT.
DEFINE thisfile = 'KFHT.SQL'
DEFINE dbuser   = '^KFHT'

SET ECHO ON
SET DEFINE ON
COLUMN fcltlogfile NEW_VALUE fcltlogfile NOPRINT;
COLUMN fcltcusttxt NEW_VALUE fcltcusttxt NOPRINT;
WHENEVER SQLERROR CONTINUE;
SELECT adm.getscriptspoolfile('&thisfile') AS fcltlogfile FROM DUAL;
SPOOL &fcltlogfile
WHENEVER SQLERROR EXIT;
SELECT adm.checkscriptcust('&dbuser') AS fcltcusttxt FROM DUAL;
WHENEVER SQLERROR CONTINUE;
---------------------------------------
PROMPT &fcltcusttxt
---------------------------------------
SET DEFINE OFF

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

CREATE OR REPLACE PACKAGE KFHT
AS

   PROCEDURE email_asml (pfrom        IN VARCHAR2,
                         pto          IN VARCHAR2,
                         psubject     IN VARCHAR2,
                         pbody        IN VARCHAR2,
                         psessionid   IN VARCHAR2,
                         pemailkey    IN NUMBER);
END;
/

CREATE OR REPLACE PACKAGE BODY KFHT
AS
   --
   --Rapportages
   --
   PROCEDURE email_asml (pfrom        IN VARCHAR2,
                         pto          IN VARCHAR2,
                         psubject     IN VARCHAR2,
                         pbody        IN VARCHAR2,
                         psessionid   IN VARCHAR2,
                         pemailkey    IN NUMBER)
   AS
      sender              prs_perslid.prs_perslid_key%TYPE;
      kostenplaats        prs_afdeling.prs_kostenplaats_key%TYPE;
      newkey              mld_melding.mld_melding_key%TYPE;
      defaultstdmelding   fac_setting.fac_setting_default%TYPE;
      kkey_att            mld_kenmerk.mld_kenmerk_key%TYPE;
      kkey_mail           mld_kenmerk.mld_kenmerk_key%TYPE;
      errormsg            fac_result.fac_result_waarde%TYPE;
   BEGIN

      CASE
         WHEN UPPER (pto) LIKE 'ASML@%'
         THEN

            sender := 45581;    -- Koppeling Planon

            SELECT fac_setting_pvalue
              INTO defaultstdmelding
              FROM fac_setting
             WHERE fac_setting_name = 'defaultstdmelding';

            --kkey_att := 1;
            kkey_mail := 2521;                           -- Kenmerk voor ontvangen mail

            -- suggested extensions:
            -- check for MLDUSE-write autorisations
            -- parse the subject to find an appropriate stdmelding, if uniquely possible
            -- append (as a note?) to an existing melding if #key is found in the subject
            BEGIN
               INSERT INTO mld_melding (mld_melding_module,
                                        mld_meldbron_key,
                                        mld_melding_datum,
                                        mld_melding_onderwerp,
                                        mld_melding_omschrijving,
                                        mld_melding_status,
                                        mld_alg_locatie_key,
                                        mld_stdmelding_key,
                                        prs_perslid_key,
                                        prs_perslid_key_voor,
                                        prs_kostenplaats_key,
                                        mld_melding_spoed)
                   VALUES ('MLD',
                           4,                                            -- email
                           SYSDATE,
                           SUBSTR (psubject, 1, 80),
                           SUBSTR (REPLACE (REPLACE( SUBSTR (pbody, 1, 4000),
                                                     CHR(13)),
                                            CHR (10) || CHR (10),
                                            CHR (10)),
                                   1,
                                   4000),              -- verwijder onnodige witregels
                           NULL,
                           1,
                           defaultstdmelding,
                           sender,
                           sender,
                           NULL,
                           3)
                RETURNING mld_melding_key
                     INTO newkey;

               INSERT INTO fac_result (fac_result_sessionid,
                                       fac_result_naam,
                                       fac_result_waarde)
                               VALUES (psessionid,
                                       'kenmerkorgmailpath',
                                       'MLD\M' || TO_CHAR (TRUNC (newkey / 1000), 'FM0000') || '___\M' || newkey || '\' || kkey_mail || '\');

               mld.setmeldingstatus (newkey, 2, sender);
            END;
         ELSE
            NULL;
      END CASE;

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


-- Import vanuit Strukton
CREATE OR REPLACE PROCEDURE kfht_import_opdrstat_strukton (p_import_key IN NUMBER)
AS
   c_delim                VARCHAR2 (1) := ';';
   v_newline              VARCHAR2 (4000);                       -- Input line
   v_errormsg             VARCHAR2 (1000);
   oracle_err_num         NUMBER;
   oracle_err_mes         VARCHAR2 (200);
   v_aanduiding           VARCHAR2 (1000) := '';
   header_is_valid        NUMBER := 0;
   v_count_tot            NUMBER (10) := 0;
   v_count_imp            NUMBER (10) := 0;
   v_ongeldig             NUMBER (1) := 0;
   -- De importvelden
   v_mld_opdr_key_tekst   VARCHAR2 (100);
   v_extern_nummer        VARCHAR2 (100);
   v_status_code          VARCHAR2 (100);
   v_status               NUMBER (10);
   v_datumtijd_tekst      VARCHAR2 (100);
   v_datumtijd            DATE;
   v_status_tekst         VARCHAR2 (100);
   v_opmerking            VARCHAR2 (4000);
   --v_totaal_tekst         VARCHAR2 (100);
   --v_totaal               NUMBER (8,2);
   --v_correctie_tekst      VARCHAR2 (100);
   --v_correctie            NUMBER (8,2);
   -- Overige velden
   v_mld_opdr_key         NUMBER (10);
   v_mld_opdr_opmerking   VARCHAR2 (4000);

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

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_newline := rec1.fac_imp_file_line;
         v_errormsg := 'Fout opvragen importregel';
         v_aanduiding := '';
         v_ongeldig := 0;
         -- Lees alle veldwaarden.
         fac.imp_getfield (v_newline, c_delim, v_mld_opdr_key_tekst);
         v_mld_opdr_key_tekst := TRIM (v_mld_opdr_key_tekst);
         fac.imp_getfield (v_newline, c_delim, v_extern_nummer);
         v_extern_nummer := TRIM (v_extern_nummer);
         fac.imp_getfield (v_newline, c_delim, v_status_code);       -- typeID
         v_status_code := TRIM (v_status_code);
         fac.imp_getfield (v_newline, c_delim, v_datumtijd_tekst);
         v_datumtijd_tekst := TRIM (v_datumtijd_tekst);
         fac.imp_getfield (v_newline, c_delim, v_status_tekst);
         v_status_tekst := TRIM (v_status_tekst);
         fac.imp_getfield (v_newline, c_delim, v_opmerking);
         v_opmerking := SUBSTR (TRIM (v_opmerking), 1, 1000);
         --fac.imp_getfield (v_newline, c_delim, v_totaal_tekst);
         --v_totaal := fac.safe_to_number (v_totaal_tekst);
         --fac.imp_getfield (v_newline, c_delim, v_correctie_tekst);
         --v_correctie := fac.safe_to_number (v_correctie_tekst);
         -- Verwijder de markering voor cr/lf die in stylesheet is toegevoegd.
         v_opmerking := REPLACE (v_opmerking, '@@', CHR (13));
         v_aanduiding := '[' || v_mld_opdr_key_tekst || '|' || v_extern_nummer || '|' || v_status_code || '|' || v_datumtijd_tekst || '|' || v_status_tekst || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (TRIM (v_mld_opdr_key_tekst)) = 'REFERENCEID'
               AND UPPER (TRIM (v_extern_nummer)) = 'SERVICEREQUESTID'
               AND UPPER (TRIM (v_status_code)) = 'TYPEID'
               AND UPPER (TRIM (v_datumtijd_tekst)) = 'DATETIME'
               AND UPPER (TRIM (v_opmerking)) = 'REMARKS'
               --AND UPPER (TRIM (v_totaal_tekst)) = 'TOTAL'
               --AND UPPER (TRIM (v_correctie_tekst)) = 'CORRECTION'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;

            -- Controleer alle veldwaarden.
            v_errormsg := 'Fout bepalen opdracht';

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

            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Status ongedefinieerd';

               CASE
                  WHEN v_status_code = '5'
                  THEN
                     v_status := 5;                              -- uitgegeven
                  WHEN v_status_code = '10'
                  THEN
                     v_status := 8;                            -- geaccepteerd
                  WHEN v_status_code = '20'                  -- monteur gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '25'               -- specialist gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  WHEN v_status_code = '30'                -- technisch gereed
                  THEN
                     v_status := 6;                                -- afgemeld
                  -- KFNS#52066: Uitprijs/fiatteer-functionaliteit!
                  --WHEN v_status_code = '40'                     -- uitgeprijst (fiattering aan FACILITOR-kant)
                  --THEN
                  --   v_status := 9;                                -- afgerond
                  --WHEN v_status_code = '45'                     -- gefiatteerd (fiattering aan Strukton-kant)
                  --THEN
                  --   v_status := 9;                                -- afgerond
                  WHEN v_status_code = '70'
                  THEN
                     v_status := 1;                             -- geannuleerd
                  WHEN v_status_code = '80'
                  THEN
                     v_status := 1;                               -- afgewezen
                  WHEN v_status_code = '200'                    -- onderbroken
                  THEN
                     --TODO: Notitie toevoegen (incl. reden?)
                     v_status := NULL;                          -- ongewijzigd
                  WHEN v_status_code = '210'                       -- herpland
                  THEN
                     --TODO: Notitie toevoegen
                     v_status := NULL;                          -- ongewijzigd
                  ELSE
                     v_status := NULL;
                     v_ongeldig := 1;                         -- nog te bezien
               END CASE;
            END IF;

            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Datumtijd ongeldig';

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

            IF v_ongeldig = 0
            THEN
               v_errormsg := 'Opmerking ongeldig';

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

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

                  INSERT INTO kfht_imp_opdrstat_strukton (mld_opdr_key,
                                                          extern_nummer,
                                                          status,
                                                          datumtijd,
                                                          opmerking) -- Geen totaal/correctie!
                      VALUES (v_mld_opdr_key,
                              v_extern_nummer,
                              v_status,
                              v_datumtijd,
                              v_opmerking);

                  v_count_imp := v_count_imp + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                     v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                     fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, '');
               END;
            ELSE
               -- Foutmeldingen onderdrukken als uitprijzen/fiatteren niet is aangeschakeld.
               IF v_status_code <> '40' AND v_status_code <> '45'
               THEN
                  fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, '');
               END IF;
            END IF;
         END IF;
      END;
   END LOOP;

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

CREATE OR REPLACE PROCEDURE kfht_update_opdrstat_strukton (p_import_key IN NUMBER)
AS
   -- Cursor loopt - per opdracht in volgorde! - over alle ingelezen statusberichten.
   CURSOR c1
   IS
        SELECT mld_opdr_key, extern_nummer, status, datumtijd, opmerking -- Geen totaal/correctie!
          FROM kfht_imp_opdrstat_strukton
      ORDER BY 1, 4;

   c_user_key              NUMBER (10) := 264;               -- _STRUKTON-user
   c_refnr_srtkkey         NUMBER (10) := 6;             -- Refnr. leverancier
   v_errormsg              VARCHAR2 (1000);
   oracle_err_num          NUMBER;
   oracle_err_mes          VARCHAR2 (200);
   v_aanduiding            VARCHAR2 (200);
   v_count_tot             NUMBER (10) := 0;
   v_count                 NUMBER (10) := 0;
   v_mld_key               NUMBER (10);
   v_opdr_key              NUMBER (10);
   v_opdr_status           NUMBER (10);
   v_mld_typeopdr_key      NUMBER (10);
   v_mld_kenmerk_key       NUMBER (10);
   v_mld_kenmerkopdr_key   NUMBER (10);
BEGIN
   -- Loop over alle ingelezen Strukton-statusberichten.
   FOR rec IN c1
   LOOP
      BEGIN
         v_aanduiding := '[' || rec.mld_opdr_key || '|' || SUBSTR (rec.opmerking, 1, 100) || '] ';
         v_count_tot := v_count_tot + 1;

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

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

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

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

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

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

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

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

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

            IF rec.status IS NOT NULL
            THEN
               v_errormsg := 'Fout bijwerken Opmerking (opdracht).';

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

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

               v_errormsg := 'Fout bijwerken Status.';

               IF rec.status = 8 AND v_opdr_status = 5
               THEN
                  -- Accepteer de opdracht als deze uitgegeven was
                  MLD.setopdrachtstatus (v_opdr_key, 8, c_user_key); -- Strukton
               ELSIF rec.status = 6 AND v_opdr_status = 5
               THEN
                  -- Meld de opdracht af als deze uitgegeven was (na eerst accepteren)
                  MLD.setopdrachtstatus (v_opdr_key, 8, c_user_key); -- Strukton
                  MLD.setopdrachtstatus (v_opdr_key, 6, c_user_key); -- Strukton
               ELSIF rec.status = 6 AND v_opdr_status = 8
               THEN
                  -- Meld de opdracht af als deze geaccepteerd was
                  MLD.setopdrachtstatus (v_opdr_key, 6, c_user_key); -- Strukton
               ELSIF rec.status = 1 AND v_opdr_status IN (5, 8)
               THEN
                  -- Wijs de opdracht af als deze niet/wel geaccepteerd was
                  MLD.setopdrachtstatus (v_opdr_key, 1, c_user_key); -- Strukton
                  MLD.updatemeldingstatusAV (v_mld_key, 0, c_user_key, 0);
               --ELSIF rec.status = 9 AND v_opdr_status = 6      -- Per KFNS#52066
               --THEN
                  -- Neem ontvangen kosten over zoals afgestemd met KFNS#59399!
                  --UPDATE mld_opdr
                  --   SET mld_opdr_materiaal = rec.totaal,
                  --       mld_opdr_kosten = rec.totaal + rec.correctie
                  -- WHERE mld_opdr_key = v_opdr_key;

                  -- Rond de opdracht af als deze afgemeld was
                  --MLD.setopdrachtstatus (v_opdr_key, 9, c_user_key); -- Strukton
               END IF;

               IF rec.status = 6 AND v_opdr_status <> 6
               THEN
                  -- AADO#30922: Melding niet meer automatisch afmelden.
                  -- KFNS#37965: Opmerking-veld bij melding niet meer bijwerken.
                  MLD.updatemeldingstatusAV (v_mld_key, 0, c_user_key, 0);
               END IF;
            ELSE -- rec.status IS NULL (= Onderbroken/Herpland), dan toevoegen Notitie!
               -- YAXX#59749: Toevoegen Notitie!
               v_errormsg := 'Fout toevoegen Notitie (opdracht).';

               INSERT INTO mld_opdr_note (mld_opdr_key, mld_opdr_note_omschrijving, prs_perslid_key)
                   VALUES (v_opdr_key, rec.opmerking, c_user_key);
            END IF;
         END IF;
         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
            fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Statusbericht-loop');
      END;
   END LOOP;
END;
/


/* Formatted on 17-12-2015 12:58:02 (QP5 v5.136.908.31019) */
CREATE OR REPLACE VIEW kfht_v_export_exact (result, result_order)
AS
   SELECT fac_rapport_regel, fac_rapport_volgnr
     FROM fac_rapport
    WHERE fac_rapport_node = SUBSTR ('EXACT', 1, 12);

CREATE OR REPLACE PROCEDURE kfht_select_exact (p_applname   IN VARCHAR2,
                                               p_applrun    IN VARCHAR2)
AS
   CURSOR c_opdr
   IS
        SELECT DISTINCT
               o.mld_melding_key,
               o.mld_opdr_bedrijfopdr_volgnr,
               sd.ins_srtdiscipline_prefix || TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr)
                  ticketnumber,
               ot.mld_typeopdr_omschrijving ordertype,
               --a.prs_afdeling_omschrijving department, -- KFHT#60175: Verwijderen Department!
               b.prs_bedrijf_naam supplier,
               --SUBSTR (c.cnt_contract_nummer || DECODE (kl.jaarinkoopnr, NULL, '', '/' || kl.jaarinkoopnr), 1, 30)
               --DECODE (o.prs_kostenplaats_key,
               --        38, SUBSTR (COALESCE (c.cnt_contract_nummer, ko.opdrinkoopnr), 1, 30), -- HTCE (300002)
               --        SUBSTR (c.cnt_contract_nummer || DECODE (COALESCE (ko.opdrinkoopnr, kl.jaarinkoopnr), NULL, '', '/' || COALESCE (ko.opdrinkoopnr, kl.jaarinkoopnr)), 1, 30))
               DECODE (kl.jaarinkoopnr,
                       NULL, SUBSTR (c.cnt_contract_nummer || '|' || ko.opdrinkoopnr, 1, 30),
                       kl.jaarinkoopnr)
                  contract,        -- KFHT#60175: Anders gaan vullen Contract!
               td.ins_discipline_omschrijving || ' / ' || sm.mld_stdmelding_omschrijving
                  reporttype,
               aog.alg_gebouw_code buildingcode,
               kp.prs_kostenplaats_nr costcenter,
               COALESCE (ksm.prs_kostensoort_oms, ksv.prs_kostensoort_oms)
                  costunit,
               o.mld_opdr_kosten costs,
               b.prs_leverancier_nr supplierreference,
               --TO_CHAR (fac.gettrackingdate ('ORDNEW', o.mld_opdr_key), 'dd-mm-yyyy hh24:mi:ss')
               TO_CHAR (o.mld_opdr_datumbegin, 'dd-mm-yyyy')
               || 'T' || TO_CHAR (o.mld_opdr_datumbegin, 'hh24:mi:ss')
                  issued,
               DECODE (fac.gettrackingdate ('ORDAFM', o.mld_opdr_key),
                       NULL, NULL,
                       TO_CHAR (fac.gettrackingdate ('ORDAFM', o.mld_opdr_key), 'dd-mm-yyyy')
                       || 'T' || TO_CHAR (fac.gettrackingdate ('ORDAFM', o.mld_opdr_key), 'hh24:mi:ss'))
                  closed,
               os.mld_statusopdr_omschrijving orderstatus -- KFHT#60175: Toevoegen Orderstatus!
          FROM fac_tracking t,
               fac_srtnotificatie sn,
               mld_opdr o,
               mld_typeopdr ot,
               prs_bedrijf b,
               cnt_contract c,
               prs_kostenplaats kp,
               mld_melding m,
               mld_stdmelding sm,
               ins_tab_discipline td,
               ins_srtdiscipline sd,
               prs_kostensoort ksm,
               prs_kostensoort ksv,
               alg_v_allonrgoed_gegevens aog,
               prs_perslid p,
               prs_afdeling a,
               (SELECT prs_link_key, prs_kenmerklink_waarde jaarinkoopnr
                  FROM prs_v_aanwezigkenmerklink
                 WHERE prs_kenmerk_key = 1060) kl,        -- Inkoopordernummer
               (SELECT mld_opdr_key, mld_kenmerkopdr_waarde opdrinkoopnr
                  FROM mld_v_aanwezigkenmerkopdr
                 WHERE mld_kenmerk_key = 17) ko,                -- Inkooporder
               mld_statusopdr os
         WHERE t.fac_tracking_datum > TRUNC (SYSDATE - 1) -- Export draait na middernacht!
               AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
               AND sn.fac_srtnotificatie_xmlnode = 'opdracht'
               AND t.fac_tracking_refkey = o.mld_opdr_key -- KFHT#60175: Geen restrictie meer op opdrachtstatus (daarmee bij elke wijziging van status)!
               AND o.mld_typeopdr_key = ot.mld_typeopdr_key
               --AND ot.mld_typeopdr_key != 8 -- KFHT#60175: Geen restrictie meer op opdrachttype (daarmee ook Offerteaanvraag)!
               AND o.mld_uitvoerende_keys = b.prs_bedrijf_key -- Geen Interne opdracht, tenzij
               --AND b.prs_leverancier_nr IS NOT NULL -- KFHT#60175: Geen restrictie meer op leveranciernummer (daarmee ook zonder leveranciernummer)!
               AND o.cnt_contract_key = c.cnt_contract_key(+)
               AND o.prs_kostenplaats_key = kp.prs_kostenplaats_key(+) -- KFHT#60175: Geen restrictie meer op kostenplaats (daarmee ook Contractopdracht, Garantieopdracht, Offerte aanvraag, Klacht en Interne opdracht)!
               AND o.mld_melding_key = m.mld_melding_key
               AND m.mld_stdmelding_key = sm.mld_stdmelding_key
               AND sm.mld_ins_discipline_key = td.ins_discipline_key
               AND td.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
               AND sm.prs_kostensoort_key = ksm.prs_kostensoort_key(+)
               AND td.prs_kostensoort_key = ksv.prs_kostensoort_key(+)
               AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys
               AND m.prs_perslid_key = p.prs_perslid_key
               AND p.prs_afdeling_key = a.prs_afdeling_key
               AND a.prs_afdeling_key = kl.prs_link_key(+)
               AND o.mld_opdr_key = ko.mld_opdr_key(+)
               AND o.mld_statusopdr_key = os.mld_statusopdr_key(+)
      ORDER BY o.mld_melding_key, o.mld_opdr_bedrijfopdr_volgnr;

   v_count   NUMBER;

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

      v_count := v_count + 1;
   END;

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

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

   -- Header
   add_row ('<?xml version="1.0" encoding="utf-8" standalone="yes" ?>');
   add_row ('<eExact>');
   add_row ('<FacilitorImport>');
   --add_row ('<Tickets>');

   FOR rec IN c_opdr
   LOOP
      BEGIN
         add_row ('<Ticket>');
         add_element ('TicketNumber', rec.ticketnumber);
         add_element ('OrderType', rec.ordertype);
         --add_element ('Department', rec.department); -- KFHT#60175: Verwijderen Department!
         add_element ('Supplier', rec.supplier);
         add_element ('Contract', rec.contract); -- KFHT#60175: Anders gaan vullen Contract!
         add_element ('ReportType', rec.reporttype);
         add_element ('BuildingCode', rec.buildingcode);
         add_element ('CostCenter', rec.costcenter);
         add_element ('CostUnit', rec.costunit);
         add_element ('Costs', rec.costs);
         add_element ('SupplierReference', rec.supplierreference);
         add_element ('Issued', rec.issued);
         add_element ('Closed', rec.closed);
         add_element ('Department', rec.orderstatus); -- KFHT#60175: Toevoegen Orderstatus (als Department, don't ask why)!
         add_row ('</Ticket>');

         -- Markeer als geexporteerd?
      END;
   END LOOP;

   --add_row ('</Tickets>');
   add_row ('</FacilitorImport>');
   add_row ('</eExact>');
END;
/

-- Multi variant voor automatische import via gen_import van kosten uit Exact.
/* Formatted on 25-1-2016 17:40:20 (QP5 v5.136.908.31019) */
CREATE OR REPLACE PROCEDURE kfht_import_exact (p_import_key IN NUMBER)
AS
   c_delim           VARCHAR2 (1) := ';';
   v_newline         VARCHAR2 (1000);                            -- Input line
   v_errormsg        VARCHAR2 (1000);
   oracle_err_num    NUMBER;
   oracle_err_mes    VARCHAR2 (200);
   v_aanduiding      VARCHAR2 (200);
   header_is_valid   NUMBER := 0;
   v_count_tot       NUMBER (10) := 0;
   v_count_import    NUMBER (10) := 0;
   v_ongeldig        NUMBER (1) := 0;
   -- De importvelden
   v_ticketnumber    VARCHAR2 (255);                                    -- C24
   v_amount          VARCHAR2 (255);                                  -- N12,2
   v_changedate      VARCHAR2 (255);                                   -- DATE

   -- Overige velden:
   CURSOR c1
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   DELETE FROM kfht_imp_exactmulti
         WHERE imp_log_run <> p_import_key;

   COMMIT;

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

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_delim, v_ticketnumber);
         fac.imp_getfield (v_newline, c_delim, v_amount);
         fac.imp_getfield (v_newline, c_delim, v_changedate);
         v_aanduiding :=
               '['
            || v_ticketnumber
            || '|'
            || v_amount
            || '|'
            || v_changedate
            || '] ';

         -- Ik controleer of ik een geldige header heb, dat is: in de juiste kolommen
         -- de juiste kolomkop. Ik controleer daarbij ALLE kolommen!
         -- Ik negeer alles totdat ik een geldige header ben gepasseerd.
         IF (header_is_valid = 0)
         THEN
            IF     UPPER (TRIM (v_ticketnumber)) = 'TICKETNUMBER'
               AND UPPER (TRIM (v_amount)) = 'AMOUNT'
               AND UPPER (TRIM (v_changedate)) = 'CHANGEDATE'
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            v_count_tot := v_count_tot + 1;
            -- Controleer alle veldwaarden
            v_errormsg := 'Fout inlezen ticketnumber';
            v_ticketnumber := TRIM (v_ticketnumber);

            IF (v_ticketnumber IS NULL)
            THEN
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Ticketnumber ongeldig; regel wordt overgeslagen!');
               v_ongeldig := 1;
            END IF;

            --
            v_errormsg := 'Fout inlezen amount';
            v_amount := TRIM (REPLACE (v_amount, ',', '.'));

            IF (fac.safe_to_number (v_amount) IS NULL)
            THEN
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Amount ongeldig; regel wordt overgeslagen!');
               v_ongeldig := 1;
            END IF;

            --
            v_errormsg := 'Fout inlezen changedate';
            v_changedate := TRIM (v_changedate);

            IF (fac.safe_to_date (v_changedate, 'dd-mm-yyyy hh24:mi:ss') IS NULL)
            THEN
               fac.imp_writelog (p_import_key, 'W', v_aanduiding || v_errormsg, 'Changedate ongeldig; regel wordt overgeslagen!');
               v_ongeldig := 1;
            END IF;

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

                  INSERT INTO kfht_imp_exactmulti (imp_log_run,
                                                   ticketnumber,
                                                   amount,
                                                   changedate)
                      VALUES (p_import_key,
                              v_ticketnumber,
                              fac.safe_to_number (v_amount),
                              fac.safe_to_date (v_changedate, 'dd-mm-yyyy hh24:mi:ss'));

                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
                     v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
                     fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, '');
               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', 'Inleesproces/#ingelezen importregels: ' || TO_CHAR (v_count_tot), '');
      fac.imp_writelog (p_import_key, 'S', 'Inleesproces/#ongeldige niet ingelezen importregels: ' || TO_CHAR (v_count_tot - v_count_import), '');
   END IF;

   DELETE FROM fac_imp_file
         WHERE fac_import_key = p_import_key;

   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 kostenregels uit Exact afgebroken!');
END;
/

CREATE OR REPLACE PROCEDURE kfht_update_exact (p_import_key IN NUMBER)
AS
   -- Cursor loopt over alle ingelezen kostenregels uit Exact.
   CURSOR c1
   IS
        SELECT ticketnumber,             -- Ticketnumber met of zonder prefix!
               DECODE (fac.safe_to_number (SUBSTR (ticketnumber, 1, 1)),
                       NULL, TRIM (SUBSTR (ticketnumber, 2)),
                       ticketnumber)
                  opdr_id,                      -- Ticketnumber zonder prefix!
               amount,
               changedate
          FROM kfht_imp_exactmulti
         WHERE imp_log_run = p_import_key
      ORDER BY 4, 2;

   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_aanduiding     VARCHAR2 (200);
   v_count_tot      NUMBER (10);
   v_mld_key        NUMBER (10);
   v_opdr_key       NUMBER (10);
   v_opdr_status    NUMBER (10);
   v_typeopdr_key   NUMBER (10);
BEGIN
   -- Loop door alle ingelezen kostenregels uit Exact en verwerk deze.
   v_count_tot := 0;

   FOR rec IN c1
   LOOP
      BEGIN
         v_aanduiding := '[' || rec.ticketnumber || '|' || TO_CHAR (rec.amount) || '] ';
         v_count_tot := v_count_tot + 1;
         v_mld_key := -1;
         v_opdr_key := -1;

         v_errormsg := 'Fout bepalen melding/opdracht.';

         BEGIN
            SELECT mld_melding_key, mld_opdr_key, mld_statusopdr_key, mld_typeopdr_key
              INTO v_mld_key, v_opdr_key, v_opdr_status, v_typeopdr_key
              FROM mld_opdr
             WHERE mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr = rec.opdr_id;
         EXCEPTION
            WHEN OTHERS
            THEN
               oracle_err_num := SQLCODE;
               oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
               v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
               -- KFHT#60175: Voortaan bij bepalen melding/opdracht foutmelding onderdrukken als amount=0!
               IF rec.amount != 0
               THEN
                  fac.imp_writelog (p_import_key, 'E', v_aanduiding || v_errormsg, 'Fout verwerken kostenregels uit Exact.');
               END IF;
         END;

         -- Alleen iets doen als melding/opdracht succesvol is bepaald.
         IF (v_mld_key > 0 AND v_opdr_key > 0)
         THEN
            -- Bijwerken kosten met amount.
            v_errormsg := 'Fout bijwerken kosten.';

            --UPDATE mld_opdr
            --   SET mld_opdr_kosten = rec.amount,
            --       mld_opdr_uren = 0,
            --       mld_opdr_uurloon = 0,
            --       mld_opdr_materiaal = 0
            -- WHERE mld_opdr_key = v_opdr_key;
            UPDATE mld_opdr
               SET mld_opdr_kosten = rec.amount
             WHERE mld_opdr_key = v_opdr_key;

            -- Bijwerken ordernr met changedate.
            v_errormsg := 'Fout bijwerken ordernr.';

            UPDATE mld_opdr
               SET mld_opdr_ordernr = TO_CHAR (rec.changedate, 'dd-mm-yyyy hh24:mi:ss')
             WHERE mld_opdr_key = v_opdr_key;

            -- Verwerken opdracht.
            IF (v_opdr_status = 6 OR v_opdr_status = 9) AND v_typeopdr_key != 8
            THEN
               v_errormsg := 'Fout verwerken opdracht.';

               MLD.setopdrachtstatus (v_opdr_key, 7, NULL);
            END IF;

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

   fac.imp_writelog (p_import_key, 'S', 'Proces: ' || TO_CHAR (v_count_tot) || ' kostenregels uit Exact afgehandeld.', '');
   COMMIT;
END;
/


-- Dummy export NACHTWERK!
-- KFHT#56229: Verwijderen inactieve accounts (6 maanden niet ingelogd).
CREATE OR REPLACE PROCEDURE kfht_select_nachtwerk (p_applname   IN VARCHAR2,
                                                   p_applrun    IN VARCHAR2)
AS
   v_errormsg       VARCHAR2 (1000);
   oracle_err_num   NUMBER;
   oracle_err_mes   VARCHAR2 (200);
   v_count          NUMBER;
BEGIN
   v_count := 0;

   FOR rec
      IN (  SELECT p.prs_perslid_key, p.prs_perslid_oslogin, COUNT (vp.prs_perslid_key) aant
              FROM prs_v_aanwezigperslid p, prs_v_verplichting_keys vp
             WHERE TO_CHAR (SYSDATE, 'dd') = '01' -- Op 1e van de maand >180d niet ingelogd
                   AND p.prs_perslid_login < TRUNC (ADD_MONTHS (SYSDATE, -6), 'mm')
                   AND p.prs_perslid_key = vp.prs_perslid_key(+) -- Actuele verplichtingen?
          GROUP BY p.prs_perslid_key, p.prs_perslid_oslogin
          ORDER BY 1)
   LOOP
      BEGIN
         IF rec.aant = 0
         THEN
            UPDATE prs_perslid
               SET prs_perslid_verwijder = SYSDATE
             WHERE prs_perslid_key = rec.prs_perslid_key;

            v_count := v_count + 1;
         ELSE
            fac.writelog (p_applname, 'I',
                          '[' || rec.prs_perslid_oslogin || ']/#Verplichtingen: ' || TO_CHAR (rec.aant),
                          'Persoon niet geïnactiveerd');
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN     -- Kennelijk heeft persoon toch nog ernstige verplichtingen!
            oracle_err_num := SQLCODE;
            oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
            v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
            fac.writelog (p_applname, 'E',
                          '[' || rec.prs_perslid_oslogin || ']/' || v_errormsg,
                          'Fout inactiveren persoon');
      END;
   END LOOP;

   fac.writelog (p_applname, 'S', '#Personen geïnactiveerd:' || TO_CHAR (v_count), '');
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := 'ORACLE (error ' || oracle_err_num  || '/' || oracle_err_mes  || ')';
      fac.writelog (p_applname, 'E', v_errormsg, 'Proces NACHTWERK afgebroken!');
END kfht_select_nachtwerk;
/

CREATE OR REPLACE VIEW KFHT_V_NOTI_MLD_WVGREMINDER
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   PAR1,
   PAR2,
   XKEY
)
AS
   SELECT 'CUST01',
          NULL,
          COALESCE (m.prs_perslid_key_voor, prs_perslid_key),
             'Uw melding '
          || sd.ins_srtdiscipline_prefix
          || m.mld_melding_key
          || ' staat nog open ter goedkeuring',
          m.mld_melding_key,
          NULL,
          NULL,
          NULL
     FROM mld_kenmerkmelding km,
          mld_kenmerk k,
          mld_melding m,
          mld_stdmelding sm,
          mld_discipline md,
          ins_srtdiscipline sd
    WHERE km.mld_kenmerk_key = k.mld_kenmerk_key
          AND k.mld_kenmerk_verwijder IS NULL
          AND k.mld_srtkenmerk_key = 122                         -- Begindatum
          AND fac.safe_to_date (km.mld_kenmerkmelding_waarde, 'DD-MM-YYYY') = TRUNC (SYSDATE) + 2
          AND km.mld_melding_key = m.mld_melding_key
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.mld_ins_discipline_key = md.ins_discipline_key
          AND md.ins_discipline_key = 208           -- Aanvraag werkvergunning
          AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
          AND m.mld_melding_status NOT IN (1, 5, 6)
          AND m.mld_melding_key = m.mld_melding_start_key;

-- Notijob om ASML gebouwen te notificeren bij afronden WF rondom WVG.
-- KFHT#66052: Toevoegen soortgelijke notificaties voor NXP gebouwen.
CREATE OR REPLACE VIEW KFHT_V_NOTI_MLD_ASMLREMINDER
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   PAR1,
   PAR2,
   XKEY,
   XEMAIL,
   XMOBILE
)
AS
   SELECT 'MLDMAI',
          NULL,
          NULL,
             'Er zullen werkzaamheden plaatsvinden betreft '
          || sd.ins_srtdiscipline_prefix
          || m.mld_melding_key
          || ' op locatie '
          || aog.alg_gebouw_naam,
          m.mld_melding_key,
          NULL,
          NULL,
          NULL,
          'operation_maintenance@asml.com',
          NULL
     FROM mld_melding m,
          mld_stdmelding sm,
          mld_discipline md,
          ins_srtdiscipline sd,
          alg_v_onroerendgoed_gegevens aog
    WHERE m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.mld_ins_discipline_key = md.ins_discipline_key
          AND md.ins_discipline_key = 208           -- Aanvraag werkvergunning
          AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
          AND m.mld_melding_key = m.mld_melding_start_key
          AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys
          AND aog.alg_gebouw_key IN (37, 39)
          AND EXISTS
                (SELECT 1
                   FROM fac_tracking
                  WHERE fac_srtnotificatie_key = 38                  -- MLDAFM
                        AND fac_tracking_datum > TRUNC (SYSDATE - 1)
                        AND fac_tracking_refkey = m.mld_melding_key)
   UNION ALL
   SELECT sn.fac_srtnotificatie_code,
          NULL,
          NULL,
          REPLACE (
             REPLACE (
                REPLACE (
                   sn.fac_srtnotificatie_oms,
                   '##KEY##', sd.ins_srtdiscipline_prefix || TO_CHAR (m.mld_melding_key)),
                '##STDMLD##', sm.mld_stdmelding_omschrijving),
             '##GEBOUW##', aog.alg_gebouw_code || ' - ' || aog.alg_gebouw_naam),
          m.mld_melding_key,
          NULL,
          NULL,
          NULL,
          'servicedesknxp@facilicom.nl',
          NULL
     FROM mld_melding m,
          mld_stdmelding sm,
          mld_discipline md,
          ins_srtdiscipline sd,
          alg_v_onroerendgoed_gegevens aog,
          fac_srtnotificatie sn
    WHERE m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.mld_ins_discipline_key = md.ins_discipline_key
          AND md.ins_discipline_key = 206       -- Beoordeling gebouwbeheerder
          AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
          --AND m.mld_melding_start_key IS NOT NULL
          AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys
          AND aog.alg_gebouw_key IN (41, 46)                    -- HTC46/HTC60
          AND sn.fac_srtnotificatie_code = 'CUST02'
          AND EXISTS -- Gisteren aangemaakt altijd notificeren ongeacht status
                (SELECT 1
                   FROM fac_tracking
                  WHERE fac_srtnotificatie_key = 43                  -- MLDNEW
                        AND TRUNC (fac_tracking_datum) = TRUNC (SYSDATE - 1)
                        AND fac_tracking_refkey = m.mld_melding_key);

-- KFHT#86988: Bij sluiten van WF igv. HTC09+HTC10 CUST05-notificatie naar
--             meldpunt.security@hightechcampus.com & office.htce@twice.nl.
CREATE OR REPLACE VIEW KFHT_V_NOTI_WVGAFM
(
   CODE,
   SENDER,
   RECEIVER,
   TEXT,
   KEY,
   PAR1,
   PAR2,
   XKEY,
   XEMAIL,
   XMOBILE
)
AS
   SELECT sn.fac_srtnotificatie_code,
          NULL,
          NULL,
          REPLACE (
             REPLACE (
                REPLACE (
                   sn.fac_srtnotificatie_oms,
                   '##KEY##', sd.ins_srtdiscipline_prefix || TO_CHAR (m.mld_melding_key)),
                '##STDMLD##', sm.mld_stdmelding_omschrijving),
             '##GEBOUW##', aog.alg_gebouw_code), --|| ' - ' || aog.alg_gebouw_naam),
          m.mld_melding_key,
          NULL,
          NULL,
          NULL,
          'meldpunt.security@hightechcampus.com;office.htce@twice.nl',
          NULL
     FROM fac_tracking t,
          mld_melding m,
          mld_stdmelding sm,
          mld_discipline md,
          ins_srtdiscipline sd,
          alg_v_onroerendgoed_gegevens aog,
          fac_srtnotificatie sn,
          fac_notificatie_job nj
    WHERE t.fac_srtnotificatie_key = 38                              -- MLDAFM
          AND t.fac_tracking_refkey = m.mld_melding_key
          AND m.mld_melding_key = m.mld_melding_start_key   -- WF-startmelding
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.mld_ins_discipline_key = md.ins_discipline_key
          AND md.ins_discipline_key = 208           -- Aanvraag werkvergunning
          AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
          AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys
          AND aog.alg_gebouw_key IN (13, 14)                    -- HTC09/HTC10
          AND sn.fac_srtnotificatie_code = 'CUST05'
          AND nj.fac_notificatie_job_view = 'KFHT_V_NOTI_WVGAFM'
          AND t.fac_tracking_datum > nj.fac_notificatie_job_lastrun;

-- KFHT#61132: Opdrachtkosten per object.
-- KFHT#65899: Toevoegen Gebouw/Terrein-kolom(men).
CREATE OR REPLACE VIEW kfht_v_rap_ins_opdr_kosten
(
   objectdiscipline,
   objectgroep,
   objectsoortcode,
   objectsoort,
   objectid,
   objectopm,
   vakgroeptype,
   vakgroep,
   meldingsoort,
   meldingnr,
   meldingstatus,
   mld_aanmaak,
   mld_gepland,
   mld_afgemeld,
   opdrachttype,
   opdrachtnr,
   opdrachtstatus,
   ord_aanmaak,
   ord_gepland,
   ord_afgemeld,
   --ord_afgerond,
   opdrachtkosten,
   ins_gebouw_terrein,
   mld_gebouw_terrein
)
AS
   SELECT td.ins_discipline_omschrijving,
          sg.ins_srtgroep_omschrijving,
          sd.ins_srtdeel_code,
          sd.ins_srtdeel_omschrijving,
          d.ins_deel_omschrijving,
          d.ins_deel_opmerking,
          sd.ins_srtdiscipline_omschrijving,
          md.ins_discipline_omschrijving,
          sm.mld_stdmelding_omschrijving,
          COALESCE (sd.ins_srtdiscipline_prefix, '') || TO_CHAR (m.mld_melding_key) meldingnr,
          ms.mld_statuses_omschrijving,
          m.mld_melding_datum mld_aanmaak,
          m.mld_melding_einddatum mld_gepland,
          fac.gettrackingdate ('MLDAFM', m.mld_melding_key) afgemeld,
          ot.mld_typeopdr_omschrijving,
          TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) opdrachtnr,
          os.mld_statusopdr_omschrijving,
          o.mld_opdr_datumbegin ord_aanmaak,
          o.mld_opdr_einddatum ord_gepland,
          fac.gettrackingdate ('ORDAFM', o.mld_opdr_key) ord_afgemeld,
          --fac.gettrackingdate ('ORDAFR', o.mld_opdr_key) ord_afgerond,
          o.mld_opdr_kosten,
          DECODE (d.ins_alg_ruimte_type, 'R', aog2.alg_gebouw_code || ' - ' || aog1.alg_gebouw_naam, 'T', aog1.alg_terreinsector_code || ' - ' || aog1.alg_terreinsector_code, NULL)
             gebouw_terrein1,
          DECODE (m.mld_alg_onroerendgoed_keys, NULL, NULL, DECODE (aog2.alg_terreinsector_key, NULL, aog2.alg_gebouw_code || ' - ' || aog2.alg_gebouw_naam, aog2.alg_terreinsector_code || ' - ' || aog2.alg_terreinsector_code))
             gebouw_terrein2
     FROM ins_deel d,
          ins_srtdeel sd,
          ins_srtgroep sg,
          ins_discipline td,
          mld_melding_object mo,
          mld_melding m,
          mld_statuses ms,
          mld_stdmelding sm,
          mld_discipline md,
          ins_srtdiscipline sd,
          mld_opdr o,
          mld_statusopdr os,
          mld_typeopdr ot,
          alg_v_onroerendgoed_gegevens aog1,       --  Tbv. ins_gebouw_terrein
          alg_v_onroerendgoed_gegevens aog2        --  Tbv. ins_gebouw_terrein
    WHERE d.ins_deel_verwijder IS NULL
          AND d.ins_srtdeel_key = sd.ins_srtdeel_key
          AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
          AND sg.ins_discipline_key = td.ins_discipline_key
          AND d.ins_deel_key = mo.ins_deel_key
          AND mo.mld_melding_key = m.mld_melding_key
          AND m.mld_melding_status = ms.mld_statuses_key(+)
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.mld_ins_discipline_key = md.ins_discipline_key
          AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
          AND m.mld_melding_key = o.mld_melding_key
          AND o.mld_statusopdr_key = os.mld_statusopdr_key(+)
          AND o.mld_typeopdr_key = ot.mld_typeopdr_key
          AND d.ins_alg_ruimte_key = aog1.alg_onroerendgoed_keys(+)
          AND m.mld_alg_onroerendgoed_keys = aog2.alg_onroerendgoed_keys(+);

-- KFHT#77979: CUST03-noti ipv. ORD2GO bij overschrijden 1e limiet naar:
--             1. campus.hardservices@hightechcampus.com voor de vakgroepen
--                geautoriseerd via 'Vebego Opdrachtgoedk. 500 Hard'
--             2. alle personen zoals nu voor alle andere vakgroepen
-- BELANGRIJK: Deze notijob vervangt ORD2GO-noti en moet dus de notificatie
--             bij overschrijden van alle limieten verzorgen (uitdaging)!
CREATE OR REPLACE VIEW KFHT_V_NOTI_ORDGOE
(
   code,
   sender,
   receiver,
   text,
   key,
   xkey,
   xemail,
   xmobile
)
AS                        -- Voor 'Vebego Opdrachtgoedk. 500 Hard'-vakgroepen!
   SELECT sn.fac_srtnotificatie_code,
          NULL,
          NULL,
          REPLACE (sn.fac_srtnotificatie_oms, '##OPDRKEY##', TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr)),
          o.mld_opdr_key,
          NULL,
          'campus.hardservices@hightechcampus.com ',
          NULL
     FROM fac_tracking t,
          mld_opdr o,
          mld_melding m,
          mld_stdmelding sm,
          fac_srtnotificatie sn,
          fac_notificatie_job nj
    WHERE t.fac_srtnotificatie_key = 72 -- ORDGOE-trackig alleen bij overschrijven 1e limiet!
          AND t.fac_tracking_refkey = o.mld_opdr_key
          AND o.mld_statusopdr_key = 10                    -- Ter goedkeuring!
          --AND o.mld_opdr_approved IS NULL                    -- 1e goedkeuring
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND EXISTS -- ORDGOE-geautoriseerden Vebego Opdrachtgoedk. 500 Hard!
                (SELECT 1
                   FROM fac_groeprechten
                  WHERE fac_groep_key = 102  -- Vebego Opdrachtgoedk. 500 Hard
                        AND fac_functie_key = 42                 -- WEB_ORDGOE
                        AND ins_discipline_key = sm.mld_ins_discipline_key)
          AND sn.fac_srtnotificatie_code = 'CUST03'
          AND nj.fac_notificatie_job_view = 'KFHT_V_NOTI_ORDGOE'
          AND t.fac_tracking_datum > nj.fac_notificatie_job_lastrun
   UNION ALL   -- Voor andere dan 'Vebego Opdrachtgoedk. 500 Hard'-vakgroepen!
   SELECT DISTINCT
          sn.fac_srtnotificatie_code,
          NULL,
          NULL,
          REPLACE (sn.fac_srtnotificatie_oms, '##OPDRKEY##', TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr)),
          o.mld_opdr_key,
          NULL,
          p.prs_perslid_email, -- Alle ORDGOE-geautoriseerden op vakgroep van meldingen!
          NULL
     FROM fac_tracking t,
          mld_opdr o,
          mld_melding m,
          mld_stdmelding sm,
          fac_groeprechten gr,
          fac_gebruikersgroep gg,
          prs_v_aanwezigperslid p,
          fac_srtnotificatie sn,
          fac_notificatie_job nj
    WHERE t.fac_srtnotificatie_key = 72 -- ORDGOE-trackig alleen bij overschrijven 1e limiet!
          AND t.fac_tracking_refkey = o.mld_opdr_key
          AND o.mld_statusopdr_key = 10                    -- Ter goedkeuring!
          --AND o.mld_opdr_approved IS NULL                    -- 1e goedkeuring
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND NOT EXISTS -- ORDGOE-geautoriseerden op alle andere vakgroepen
                (SELECT 1
                   FROM fac_groeprechten
                  WHERE fac_groep_key = 102  -- Vebego Opdrachtgoedk. 500 Hard
                        AND fac_functie_key = 42                 -- WEB_ORDGOE
                        AND ins_discipline_key = sm.mld_ins_discipline_key)
          AND sm.mld_ins_discipline_key = gr.ins_discipline_key
          AND gr.fac_groep_key != 102        -- Vebego Opdrachtgoedk. 500 Hard
          AND gr.fac_functie_key = 42                            -- WEB_ORDGOE
          AND gr.fac_gebruiker_alg_level_write < 9
          AND gr.fac_groep_key = gg.fac_groep_key
          AND gg.prs_perslid_key = p.prs_perslid_key
          AND p.prs_perslid_email IS NOT NULL
          AND sn.fac_srtnotificatie_code = 'CUST03'
          AND nj.fac_notificatie_job_view = 'KFHT_V_NOTI_ORDGOE'
          AND t.fac_tracking_datum > nj.fac_notificatie_job_lastrun
   UNION ALL           -- Bij overschrijden 2e en - bij KFHT - laatste limiet!
   SELECT DISTINCT
          sn.fac_srtnotificatie_code,
          NULL,
          NULL,
          REPLACE (sn.fac_srtnotificatie_oms, '##OPDRKEY##', TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr)),
          o.mld_opdr_key,
          NULL,
          p.prs_perslid_email, -- Alle ORDGOE-geautoriseerden op vakgroep van meldingen!
          NULL
     FROM fac_tracking t,
          mld_opdr o,
          mld_melding m,
          mld_stdmelding sm,
          mld_disc_params dp,
          fac_groeprechten gr,
          fac_gebruikersgroep gg,
          prs_v_aanwezigperslid p,
          fac_srtnotificatie sn,
          fac_notificatie_job nj
    WHERE t.fac_srtnotificatie_key = 137 -- ORDMAI-tracking bij overschrijven van elke limiet!
          AND INSTR (UPPER (t.fac_tracking_oms), 'NOTIFICATIE') > 0    -- Bah!
          AND INSTR (UPPER (t.fac_tracking_oms), 'GOEDKEURING') > 0    -- Bah!
          AND INSTR (UPPER (t.fac_tracking_oms), 'VERSTUURD') > 0      -- Bah!
          AND t.fac_tracking_refkey = o.mld_opdr_key
          AND o.mld_statusopdr_key = 10                    -- Ter goedkeuring!
          AND o.mld_melding_key = m.mld_melding_key
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.mld_ins_discipline_key = dp.mld_ins_discipline_key
          AND o.mld_opdr_approved BETWEEN dp.mld_disc_params_bestellimiet2 AND dp.mld_disc_params_bestellimiet3 -- 2e goedkeuring
          AND sm.mld_ins_discipline_key = gr.ins_discipline_key
          AND gr.fac_functie_key = 43                            -- WEB_ORDGO2
          AND gr.fac_gebruiker_alg_level_write < 9
          AND gr.fac_groep_key = gg.fac_groep_key
          AND gg.prs_perslid_key = p.prs_perslid_key
          AND p.prs_perslid_email IS NOT NULL
          AND sn.fac_srtnotificatie_code = 'CUST03'
          AND nj.fac_notificatie_job_view = 'KFHT_V_NOTI_ORDGOE'
          AND t.fac_tracking_datum > nj.fac_notificatie_job_lastrun;

CREATE OR REPLACE PACKAGE KFHT
AS
   PROCEDURE sluiten_wvg_wf_csm;
END;
/

CREATE OR REPLACE PACKAGE BODY KFHT
AS
   -- KFHT#82282: Sluiten van - de laatste - Veiligheidskundige-stap igv. CSM-
   --             gebouwen (in beheer van Vebego) en daarmee sluiten van WF.
   PROCEDURE sluiten_wvg_wf_csm
   AS
      c_applname        VARCHAR2 (50) := 'SLUITEN_WF_CSM';
      v_errormsg        VARCHAR2 (1000);
      oracle_err_num    NUMBER;
      oracle_err_mes    VARCHAR2 (200);
      v_aanduiding      VARCHAR2 (200);
      v_count_tot       NUMBER (10) := 0;

      --12101 HTC01 The Strip
      --1 t/m 5 HTC01a-b-c-d-e
      --10 HTC05
      --12581 HTC05v
      --11981 HTC06
      --12301 HTC06A
      --12 HTC08
      --17 HTC12
      --19 HTC18
      --20 HTC21
      --4361 HTC25 HUB
      --12381 HTC25 h1
      --12401 HTC25 h2
      --12421 HTC25 h3
      --12441 HTC25 h4
      --12442 HTC25 h5
      --12443 HTC25 h6
      --? HTC25 h6 3de
      --22 HTC27
      --23 HTC27a
      --24 HTC29
      --25 HTC31
      --27 HTC32
      --8 HTC32b
      --33 HTC37
      --? HTC37v
      --? HTC37w
      --35 HTC41
      --37 HTC43
      --39 HTC45
      --42 HTC47a
      --48 HTC68
      --49 HTC69
      --50 HTC83
      --51 HTC84
      --12541 HTC85
      --13221 HTC91
      --4381 HTC96
      --53 HTC97
      --54 P0
      --55 P1
      --56 P2
      --57 P3E
      --58 P3W
      --59 P4E
      --60 P4S
      --61 P4W
      --62 P5
      --63 P6
      --64 P7-KWO
      --66 P9
      --67 P9-KWO
      --4281 Foodlab Strip
      --36 HTC42 (KFHT#83603)
      --68 Terrein (KFHT#83753)
      --13 HTC09 (KFHT#86446)
      --14 HTC10 (KFHT#86446)
      CURSOR c_wf_csm
      IS
         SELECT m.mld_melding_start_key, m.mld_melding_key, m.mld_melding_onderwerp, m.mld_melding_status
           FROM mld_melding m, mld_stdmelding sm, mld_discipline md
          WHERE m.mld_stdmelding_key = sm.mld_stdmelding_key
                AND sm.mld_ins_discipline_key = md.ins_discipline_key
                AND md.ins_srtdiscipline_key = 21            -- Werkvergunning
                AND md.ins_discipline_key = 202 -- Beoordeling veiligheidskundige
                AND m.mld_melding_status IN (2, 3, 4) -- Nieuw/Te accepteren/In behandeling (zou Nieuw moeten zijn)
                AND m.mld_melding_key != m.mld_melding_start_key -- Vervolgmelding en niet de startmelding zelf (zou zo moeten zijn)!
                AND EXISTS                               -- Betreft CSM-gebouw
                      (SELECT 1
                         FROM alg_v_onroerendgoed_gegevens
                        WHERE alg_gebouw_key IN (12101,1,2,3,4,5,10,12581,11981,12301,12,17,19,20,4361,12381,12401,12421,12441,12442,12443,22,23,24,25,27,8,33,35,37,39,42,48,49,50,51,12541,13221,4381,53,54,55,56,57,58,59,60,61,62,63,64,66,67,4281,36,68,13,14)
                              AND alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys);
   BEGIN
      FOR rec IN c_wf_csm
      LOOP
         v_aanduiding := '[' || TO_CHAR (rec.mld_melding_key) || '|' || rec.mld_melding_onderwerp || '] ';
         v_count_tot := v_count_tot + 1;
         MLD.setmeldingstatus (rec.mld_melding_key, 5, NULL); -- Afgemeld (incl. tracking)
         MLD.mld_nextworkflowstep (rec.mld_melding_key, 1);     -- 1=Completed
         IF MOD (v_count_tot, 500) = 0 THEN COMMIT; END IF;
      END LOOP;
      fac.writelog (c_applname, 'S', '#WFs gesloten: ' || TO_CHAR (v_count_tot), '');
      COMMIT;
   EXCEPTION
      WHEN OTHERS
      THEN
         oracle_err_num := SQLCODE;
         oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
         v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
         fac.writelog (c_applname, 'E', v_aanduiding || v_errormsg, 'Daily achtergrond taak afgebroken!');
   END;
END;
/

-- KFHT#82282: Sluiten van - de laatste - Veiligheidskundige-stap igv. CSM-
--             gebouwen (in beheer van Vebego) en daarmee sluiten van WF.
CREATE OR REPLACE PROCEDURE KFHT_DAILY
AS
   v_errormsg          VARCHAR2 (1000);
   oracle_err_num      NUMBER;
   oracle_err_mes      VARCHAR2 (200);
BEGIN
   kfht.sluiten_wvg_wf_csm;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_num := SQLCODE;
      oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
      v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')';
      fac.writelog ('DAILY', 'E', 'Proces afgebroken!', v_errormsg);
END KFHT_DAILY;
/

-- KFHT#83373: Opdrachten (gekoppeld aan contract).
CREATE OR REPLACE VIEW KFHT_V_RAP_CNT_OPDR
(
   vakgroeptype,
   vakgroep,
   meldingsoort,
   melding_key,
   meldingnr,
   meldingstatus,
   --mld_aanmaak,
   --mld_gepland,
   --mld_afgemeld,
   opdrachttype,
   opdr_key,
   opdrachtnr,
   opdrachtstatus,
   locatie,
   gebouw_terrein,
   uitvoerende,
   refnr_lev,
   inkooporder,
   contract_key,
   contractnr,
   extern_nr,
   ord_aanmaak,
   --ord_gepland,
   ord_afgemeld
)
AS
   SELECT sd.ins_srtdiscipline_omschrijving vakgroeptype,
          md.ins_discipline_omschrijving vakgroep,
          sm.mld_stdmelding_omschrijving meldingsoort,
          m.mld_melding_key melding_key,
          COALESCE (sd.ins_srtdiscipline_prefix, '') || TO_CHAR (m.mld_melding_key)
             meldingnr,
          ms.mld_statuses_omschrijving meldingstatus,
          --m.mld_melding_datum mld_aanmaak,
          --m.mld_melding_einddatum mld_gepland,
          --fac.gettrackingdate ('MLDAFM', m.mld_melding_key) afgemeld,
          ot.mld_typeopdr_omschrijving opdrachttype,
          o.mld_opdr_key opdracht_key,
          TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr)
             opdrachtnr,
          os.mld_statusopdr_omschrijving opdrachtstatus,
          l.alg_locatie_code || '-' || l.alg_locatie_omschrijving locatie,
          DECODE (
             m.mld_alg_onroerendgoed_keys,
             NULL, NULL,
             DECODE (
                aog.alg_terreinsector_key,
                NULL, aog.alg_gebouw_code || ' - ' || aog.alg_gebouw_naam,
                aog.alg_terreinsector_code || ' - ' || aog.alg_terreinsector_code))
             gebouw_terrein,
          uv.naam uitvoerende,
          rl.mld_kenmerkopdr_waarde refnr_lev,
          io.mld_kenmerkopdr_waarde inkooporder,
          c.cnt_contract_key contract_key,
          DECODE (
             c.cnt_contract_key,
             NULL, NULL,
             c.cnt_contract_nummer_intern || '.' || COALESCE (c.cnt_contract_versie, '0'))
             contractnr,
          c.cnt_contract_nummer externnr,
          o.mld_opdr_datumbegin ord_aanmaak,
          --o.mld_opdr_einddatum ord_gepland,
          fac.gettrackingdate ('ORDAFM', o.mld_opdr_key) ord_afgemeld
     FROM mld_melding m,
          mld_statuses ms,
          mld_stdmelding sm,
          mld_discipline md,
          ins_srtdiscipline sd,
          mld_opdr o,
          mld_statusopdr os,
          mld_typeopdr ot,
          alg_locatie l,
          alg_v_onroerendgoed_gegevens aog,
          mld_v_uitvoerende uv,
          (SELECT *
             FROM mld_kenmerkopdr ko
            WHERE EXISTS
                     (SELECT 1
                        FROM mld_kenmerk
                       WHERE mld_srtkenmerk_key = 6      -- Refnr. leverancier
                             AND mld_kenmerk_key = ko.mld_kenmerk_key)) rl,
          (SELECT *
             FROM mld_kenmerkopdr ko
            WHERE EXISTS
                     (SELECT 1
                        FROM mld_kenmerk
                       WHERE mld_srtkenmerk_key = 7             -- Inkooporder
                             AND mld_kenmerk_key = ko.mld_kenmerk_key)) io,
          cnt_v_aanwezigcontract c
    WHERE m.mld_melding_status = ms.mld_statuses_key(+)
          AND m.mld_stdmelding_key = sm.mld_stdmelding_key
          AND sm.mld_ins_discipline_key = md.ins_discipline_key
          AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
          AND m.mld_melding_key = o.mld_melding_key
          AND o.mld_opdr_datumbegin > TRUNC (ADD_MONTHS (SYSDATE, -12), 'yyyy')
          AND o.mld_statusopdr_key = os.mld_statusopdr_key(+)
          AND o.mld_typeopdr_key = ot.mld_typeopdr_key
          AND m.mld_alg_locatie_key = l.alg_locatie_key(+)
          AND m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys(+)
          AND o.mld_uitvoerende_keys = uv.mld_uitvoerende_key(+)
          AND o.mld_opdr_key = rl.mld_opdr_key(+)
          AND o.mld_opdr_key = io.mld_opdr_key(+)
          AND o.cnt_contract_key = c.cnt_contract_key(+);

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

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

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