--
-- $Id$
--
-- Script containing customer specific configuration sql statements for CSUN: CSU National Accounts

DEFINE thisfile = 'CSUN.SQL'
DEFINE dbuser   = '^CSUN'

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

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

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

CREATE OR REPLACE VIEW csun_v_rap_errorlog
(
   hide_f_imp_log_datum,
   fclt_f_applicatie,
   fclt_f_datum,
   tijdstip,
   fclt_f_niveau,
   fclt_f_omschrijving,
   hint
)
AS
   SELECT imp_log_datum hide_f_imp_log_datum,
          COALESCE(fac_import_app_code,imp_log_applicatie),
          TO_CHAR (imp_log_datum, 'YYYYMMDD') fclt_f_datum,
          TO_CHAR (imp_log_datum, 'HH24:MI:SS') tijdstip,
          DECODE (imp_log_status,
                  'F', 'Fataal',
                  'E', 'Error',
                  'W', 'Waarschuwing',
                  'I', 'Informatief',
                  'S', 'Samenvatting',
                  '-')
             fclt_f_niveau,
          imp_log_omschrijving fclt_f_omschrijving,
          imp_log_hint
     FROM imp_log l, fac_import i, fac_import_app a
    WHERE l.fac_import_key = i.fac_import_key(+)
      AND i.fac_import_app_key = a.fac_import_app_key(+)
      AND l.imp_log_datum > sysdate -10;

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

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

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

CREATE OR REPLACE PACKAGE CSUN_RAP
AS
   -- PACKAGES voor de CSUN specifieke rapportages
   TYPE t_cursor IS REF CURSOR;

   PROCEDURE district_periode (user_key      IN     NUMBER,
                               p_datum_van   IN     VARCHAR2,
                               p_datum_tot   IN     VARCHAR2,
                               p_cursor         OUT t_cursor);
   PROCEDURE regio_periode (user_key      IN     NUMBER,
                            p_datum_van   IN     VARCHAR2,
                            p_datum_tot   IN     VARCHAR2,
                            p_cursor         OUT t_cursor);
   PROCEDURE client_periode (user_key      IN     NUMBER,
                             p_datum_van   IN     VARCHAR2,
                             p_datum_tot   IN     VARCHAR2,
                             p_cursor         OUT t_cursor);
   PROCEDURE ns_district_periode (user_key      IN     NUMBER,
                                  p_datum_van   IN     VARCHAR2,
                                  p_datum_tot   IN     VARCHAR2,
                                  p_cursor         OUT t_cursor);
   PROCEDURE ns_regio_periode (user_key      IN     NUMBER,
                               p_datum_van   IN     VARCHAR2,
                               p_datum_tot   IN     VARCHAR2,
                               p_cursor         OUT t_cursor);
   PROCEDURE ns_client_periode (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 CSUN_RAP
AS
   --
   --Rapportages
   --
   PROCEDURE district_periode (user_key      IN     NUMBER,
                               p_datum_van   IN     VARCHAR2, -- Let wel: formaat '13-05-2005'
                               p_datum_tot   IN     VARCHAR2,
                               p_cursor         OUT t_cursor)
   AS
      v_datum_van        DATE;
      v_datum_tot        DATE;
      v_alg_level_read   NUMBER;
   BEGIN
      v_datum_van := fac.safe_to_date (p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := fac.safe_to_date (p_datum_tot, 'dd-mm-yyyy')+1;

      OPEN p_cursor FOR
         SELECT district,
                COUNT (mld_key) aantal_meldingen,
                SUM (acceptoptijd) acceptoptijd,
                SUM (uitvoeringoptijd) uitvoeringoptijd
           FROM (
                 SELECT DISTINCT
                        m.mld_melding_key mld_key,
                        di.alg_district_upper district,
                        l.alg_locatie_code locatie,
                        CASE SIGN(fac.datumtijdplusuitvoertijd (
                                     fac.gettrackingdate ('MLDNEW', m.mld_melding_key),
                                     std.mld_stdmelding_t_accepttijd.tijdsduur, --was sm.mld_stdmelding_urgentie,
                                     std.mld_stdmelding_t_accepttijd.eenheid) --was 'UREN')
                                  - COALESCE (fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                                              fac.gettrackingdate ('MLDACP', m.mld_melding_key),
                                              SYSDATE))
                           WHEN -1 THEN 0
                           ELSE 1
                        END
                           acceptoptijd,
                        CASE
                           WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NULL
                           THEN
                              CASE SIGN(fac.datumtijdplusuitvoertijd (
                                           m.mld_melding_datum,
                                           m.mld_melding_t_uitvoertijd.tijdsduur, --was m.mld_melding_uitvoertijd,
                                           m.mld_melding_t_uitvoertijd.eenheid) --was 'DAGEN')
                                        - COALESCE (fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                                                    fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
                                                    SYSDATE))
                                 WHEN -1 THEN 0
                                 ELSE 1
                              END
                           ELSE 1
                        END
                           uitvoeringoptijd
                   FROM mld_melding m,
                        mld_discipline md,
                        alg_locatie l,
                        alg_district di,
                        prs_perslid p,
                        mld_stdmelding std
                  WHERE     m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = di.alg_district_key
                        AND m.prs_perslid_key = p.prs_perslid_key
                        AND md.ins_discipline_key = std.mld_ins_discipline_key
                        AND std.mld_stdmelding_key = m.mld_stdmelding_key
                        AND m.mld_melding_datum BETWEEN v_datum_van AND v_datum_tot
     )
     GROUP BY district;
   END;

   PROCEDURE regio_periode (user_key      IN     NUMBER,
                            p_datum_van   IN     VARCHAR2, -- Let wel: formaat '13-05-2005'
                            p_datum_tot   IN     VARCHAR2,
                            p_cursor         OUT t_cursor)
   AS
      v_datum_van        DATE;
      v_datum_tot        DATE;
      v_alg_level_read   NUMBER;
   BEGIN
      v_datum_van := fac.safe_to_date (p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := fac.safe_to_date (p_datum_tot, 'dd-mm-yyyy')+1;

      OPEN p_cursor FOR
         SELECT regio,
                COUNT (mld_key) aantal_meldingen,
                SUM (acceptoptijd) acceptoptijd,
                SUM (uitvoeringoptijd) uitvoeringoptijd
           FROM (
                 SELECT DISTINCT
                        m.mld_melding_key mld_key,
                        di.alg_district_upper district,
                        l.alg_locatie_code locatie,
                        r.alg_regio_omschrijving regio,
                        CASE SIGN(fac.datumtijdplusuitvoertijd (
                                     fac.gettrackingdate ('MLDNEW', m.mld_melding_key),
                                     std.mld_stdmelding_t_accepttijd.tijdsduur, --was sm.mld_stdmelding_urgentie,
                                     std.mld_stdmelding_t_accepttijd.eenheid) --was 'UREN')
                                  - COALESCE (fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                                              fac.gettrackingdate ('MLDACP', m.mld_melding_key),
                                              SYSDATE))
                           WHEN -1 THEN 0
                           ELSE 1
                        END
                           acceptoptijd,
                        CASE
                           WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NULL
                           THEN
                              CASE SIGN(fac.datumtijdplusuitvoertijd (
                                           m.mld_melding_datum,
                                           m.mld_melding_t_uitvoertijd.tijdsduur, --was m.mld_melding_uitvoertijd,
                                           m.mld_melding_t_uitvoertijd.eenheid) --was 'DAGEN')
                                        - COALESCE (fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                                                    fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
                                                    SYSDATE))
                                 WHEN -1 THEN 0
                                 ELSE 1
                              END
                           ELSE 1
                        END
                           uitvoeringoptijd
                   FROM mld_melding m,
                        mld_discipline md,
                        alg_regio r,
                        alg_locatie l,
                        alg_district di,
                        prs_perslid p,
                        mld_stdmelding std
                  WHERE     m.mld_alg_locatie_key = l.alg_locatie_key
                        AND l.alg_district_key = di.alg_district_key
                        AND di.alg_regio_key = r.alg_regio_key
                        AND m.prs_perslid_key = p.prs_perslid_key
                        AND md.ins_discipline_key = std.mld_ins_discipline_key
                        AND std.mld_stdmelding_key = m.mld_stdmelding_key
                        AND m.mld_melding_datum BETWEEN v_datum_van AND v_datum_tot
     )
     GROUP BY regio;
   END;

   PROCEDURE client_periode (user_key      IN     NUMBER,
                             p_datum_van   IN     VARCHAR2, -- Let wel: formaat '13-05-2005'
                             p_datum_tot   IN     VARCHAR2,
                             p_cursor         OUT t_cursor)
   AS
      v_datum_van        DATE;
      v_datum_tot        DATE;
      v_alg_level_read   NUMBER;
   BEGIN
      v_datum_van := fac.safe_to_date (p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := fac.safe_to_date (p_datum_tot, 'dd-mm-yyyy')+1;

      OPEN p_cursor FOR
         SELECT fac_usrdata_omschr client,
                 COUNT (mld_key) aantal_meldingen,
                 SUM (acceptoptijd) acceptoptijd,
                 SUM (uitvoeringoptijd) uitvoeringoptijd
            FROM (
                  SELECT DISTINCT
                         m.mld_melding_key mld_key,
                         fac_usrdata_omschr ,
                         CASE SIGN(fac.datumtijdplusuitvoertijd (
                                      fac.gettrackingdate ('MLDNEW', m.mld_melding_key),
                                      std.mld_stdmelding_t_accepttijd.tijdsduur, --was sm.mld_stdmelding_urgentie,
                                      std.mld_stdmelding_t_accepttijd.eenheid) --was 'UREN')
                                   - COALESCE (fac.gettrackingdate ('MLDREJ',  m.mld_melding_key),
                                               fac.gettrackingdate ('MLDACP', m.mld_melding_key),
                                               SYSDATE))
                            WHEN -1 THEN 0
                            ELSE 1
                         END
                            acceptoptijd,
                         CASE
                            WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NULL
                            THEN
                               CASE SIGN(fac.datumtijdplusuitvoertijd (
                                            m.mld_melding_datum,
                                            m.mld_melding_t_uitvoertijd.tijdsduur, --was m.mld_melding_uitvoertijd,
                                            m.mld_melding_t_uitvoertijd.eenheid) --was 'DAGEN')
                                         - COALESCE (fac.gettrackingdate ('MLDREJ',  m.mld_melding_key),
                                                     fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
                                                     SYSDATE))
                                  WHEN -1 THEN 0
                                  ELSE 1
                               END
                            ELSE 1
                         END
                            uitvoeringoptijd
                    FROM mld_melding m,
                         alg_onrgoedkenmerk ogk,
                         mld_stdmelding std,
                         fac_usrdata ud
                   WHERE     m.mld_alg_locatie_key = ogk.alg_onrgoed_key
                         AND ogk.alg_onrgoed_niveau = 'L'
                         AND ogk.alg_kenmerk_key = 1000
                         AND fac.safe_to_number(ogk.alg_onrgoedkenmerk_waarde) = fac_usrdata_key
                         AND m.mld_stdmelding_key = std.mld_stdmelding_key
                         AND m.mld_melding_datum BETWEEN v_datum_van AND v_datum_tot
        )
        GROUP BY fac_usrdata_omschr;
    END;

   PROCEDURE ns_district_periode (user_key      IN     NUMBER,
                                  p_datum_van   IN     VARCHAR2, -- Let wel: formaat '13-05-2005'
                                  p_datum_tot   IN     VARCHAR2,
                                  p_cursor         OUT t_cursor)
   AS
      v_datum_van        DATE;
      v_datum_tot        DATE;
      v_alg_level_read   NUMBER;
   BEGIN
      v_datum_van := fac.safe_to_date (p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := fac.safe_to_date (p_datum_tot, 'dd-mm-yyyy')+1;

      OPEN p_cursor FOR
         SELECT district,
                COUNT (mld_key) aantal_meldingen,
                SUM (acceptoptijd) acceptoptijd,
                SUM (uitvoeringoptijd) uitvoeringoptijd
           FROM (
                 SELECT DISTINCT
                        m.mld_melding_key mld_key,
                        di.alg_district_upper district,
                        l.alg_locatie_code locatie,
                        CASE SIGN(fac.datumtijdplusuitvoertijd (
                                     fac.gettrackingdate ('MLDNEW', m.mld_melding_key),
                                     std.mld_stdmelding_t_accepttijd.tijdsduur, --was sm.mld_stdmelding_urgentie,
                                     std.mld_stdmelding_t_accepttijd.eenheid) --was 'UREN')
                                  - COALESCE (fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                                              fac.gettrackingdate ('MLDACP', m.mld_melding_key),
                                              SYSDATE))
                           WHEN -1 THEN 0
                           ELSE 1
                        END
                           acceptoptijd,
                        CASE
                           WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NULL
                           THEN
                              CASE SIGN(fac.datumtijdplusuitvoertijd (
                                           m.mld_melding_datum,
                                           m.mld_melding_t_uitvoertijd.tijdsduur, --was m.mld_melding_uitvoertijd,
                                           m.mld_melding_t_uitvoertijd.eenheid) --was 'DAGEN')
                                        - COALESCE (fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                                                    fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
                                                    SYSDATE))
                                 WHEN -1 THEN 0
                                 ELSE 1
                              END
                           ELSE 1
                        END
                           uitvoeringoptijd
                   FROM mld_melding m,
                        mld_discipline md,
                        alg_locatie l,
                        alg_district di,
                        prs_perslid p,
                        mld_stdmelding std
                  WHERE     m.mld_alg_locatie_key = l.alg_locatie_key
                        AND m.mld_stdmelding_key = 61      -- Klacht No-Show
                        AND l.alg_district_key = di.alg_district_key
                        AND m.prs_perslid_key = p.prs_perslid_key
                        AND md.ins_discipline_key = std.mld_ins_discipline_key
                        AND std.mld_stdmelding_key = m.mld_stdmelding_key
                        AND m.mld_melding_datum BETWEEN v_datum_van AND v_datum_tot
     )
     GROUP BY district;
   END;

   PROCEDURE ns_regio_periode (user_key      IN     NUMBER,
                               p_datum_van   IN     VARCHAR2, -- Let wel: formaat '13-05-2005'
                               p_datum_tot   IN     VARCHAR2,
                               p_cursor         OUT t_cursor)
   AS
      v_datum_van        DATE;
      v_datum_tot        DATE;
      v_alg_level_read   NUMBER;
   BEGIN
      v_datum_van := fac.safe_to_date (p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := fac.safe_to_date (p_datum_tot, 'dd-mm-yyyy')+1;

      OPEN p_cursor FOR
         SELECT regio,
                COUNT (mld_key) aantal_meldingen,
                SUM (acceptoptijd) acceptoptijd,
                SUM (uitvoeringoptijd) uitvoeringoptijd
           FROM (
                 SELECT DISTINCT
                        m.mld_melding_key mld_key,
                        di.alg_district_upper district,
                        l.alg_locatie_code locatie,
                        r.alg_regio_omschrijving regio,
                        CASE SIGN(fac.datumtijdplusuitvoertijd (
                                     fac.gettrackingdate ('MLDNEW', m.mld_melding_key),
                                     std.mld_stdmelding_t_accepttijd.tijdsduur, --was sm.mld_stdmelding_urgentie,
                                     std.mld_stdmelding_t_accepttijd.eenheid) --was 'UREN')
                                  - COALESCE (fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                                              fac.gettrackingdate ('MLDACP', m.mld_melding_key),
                                              SYSDATE))
                           WHEN -1 THEN 0
                           ELSE 1
                        END
                           acceptoptijd,
                        CASE
                           WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NULL
                           THEN
                              CASE SIGN(fac.datumtijdplusuitvoertijd (
                                           m.mld_melding_datum,
                                           m.mld_melding_t_uitvoertijd.tijdsduur, --was m.mld_melding_uitvoertijd,
                                           m.mld_melding_t_uitvoertijd.eenheid) --was 'DAGEN')
                                        - COALESCE (fac.gettrackingdate ('MLDREJ', m.mld_melding_key),
                                                    fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
                                                    SYSDATE))
                                 WHEN -1 THEN 0
                                 ELSE 1
                              END
                           ELSE 1
                        END
                           uitvoeringoptijd
                   FROM mld_melding m,
                        mld_discipline md,
                        alg_regio r,
                        alg_locatie l,
                        alg_district di,
                        prs_perslid p,
                        mld_stdmelding std
                  WHERE     m.mld_alg_locatie_key = l.alg_locatie_key
                        AND m.mld_stdmelding_key = 61      -- Klacht No-Show
                        AND l.alg_district_key = di.alg_district_key
                        AND di.alg_regio_key = r.alg_regio_key
                        AND m.prs_perslid_key = p.prs_perslid_key
                        AND md.ins_discipline_key = std.mld_ins_discipline_key
                        AND std.mld_stdmelding_key = m.mld_stdmelding_key
                        AND m.mld_melding_datum BETWEEN v_datum_van AND v_datum_tot
     )
     GROUP BY regio;
   END;

   PROCEDURE ns_client_periode (user_key      IN     NUMBER,
                                p_datum_van   IN     VARCHAR2, -- Let wel: formaat '13-05-2005'
                                p_datum_tot   IN     VARCHAR2,
                                p_cursor         OUT t_cursor)
   AS
      v_datum_van        DATE;
      v_datum_tot        DATE;
      v_alg_level_read   NUMBER;
   BEGIN
      v_datum_van := fac.safe_to_date (p_datum_van, 'dd-mm-yyyy');
      v_datum_tot := fac.safe_to_date (p_datum_tot, 'dd-mm-yyyy')+1;

      OPEN p_cursor FOR
         SELECT fac_usrdata_omschr client,
                 COUNT (mld_key) aantal_meldingen,
                 SUM (acceptoptijd) acceptoptijd,
                 SUM (uitvoeringoptijd) uitvoeringoptijd
            FROM (
                  SELECT DISTINCT
                         m.mld_melding_key mld_key,
                         fac_usrdata_omschr ,
                         CASE SIGN(fac.datumtijdplusuitvoertijd (
                                      fac.gettrackingdate ('MLDNEW', m.mld_melding_key),
                                      std.mld_stdmelding_t_accepttijd.tijdsduur, --was sm.mld_stdmelding_urgentie,
                                      std.mld_stdmelding_t_accepttijd.eenheid) --was 'UREN')
                                   - COALESCE (fac.gettrackingdate ('MLDREJ',  m.mld_melding_key),
                                               fac.gettrackingdate ('MLDACP', m.mld_melding_key),
                                               SYSDATE))
                            WHEN -1 THEN 0
                            ELSE 1
                         END
                            acceptoptijd,
                         CASE
                            WHEN fac.gettrackingdate ('MLDREJ', m.mld_melding_key) IS NULL
                            THEN
                               CASE SIGN(fac.datumtijdplusuitvoertijd (
                                            m.mld_melding_datum,
                                            m.mld_melding_t_uitvoertijd.tijdsduur, --was m.mld_melding_uitvoertijd,
                                            m.mld_melding_t_uitvoertijd.eenheid) --was 'DAGEN')
                                         - COALESCE (fac.gettrackingdate ('MLDREJ',  m.mld_melding_key),
                                                     fac.gettrackingdate ('MLDAFM', m.mld_melding_key),
                                                     SYSDATE))
                                  WHEN -1 THEN 0
                                  ELSE 1
                               END
                            ELSE 1
                         END
                            uitvoeringoptijd
                    FROM mld_melding m,
                         alg_onrgoedkenmerk ogk,
                         mld_stdmelding std,
                         fac_usrdata ud
                   WHERE     m.mld_alg_locatie_key = ogk.alg_onrgoed_key
                         AND m.mld_stdmelding_key = 61      -- Klacht No-Show
                         AND ogk.alg_onrgoed_niveau = 'L'
                         AND ogk.alg_kenmerk_key = 1000
                         AND fac.safe_to_number(ogk.alg_onrgoedkenmerk_waarde) = fac_usrdata_key
                         AND m.mld_stdmelding_key = std.mld_stdmelding_key
                         AND m.mld_melding_datum BETWEEN v_datum_van AND v_datum_tot
        )
        GROUP BY fac_usrdata_omschr;
    END;
END;
/


-- stuur mail notificatie naar alternatief emailadres dat bij de melding staat. srtkenmerk_key = 1
-- en stuur mail naar de BB-er die via een CSU locatie waar hij/zij een werkplek heeft onder hetzelfde
-- district als de locatie waar de melding op is ingevoerd. Uitzondering is het pand Gustav Mahlerlaan 10
-- in A'dam (hoofdgebouw ABN key = 6218) deze heeft een vast emailadres.
CREATE OR REPLACE PROCEDURE csun_export_mailnoti (
   p_applname   IN   VARCHAR2,
   p_applrun    IN   VARCHAR2,
   p_filedir    IN   VARCHAR2,
   p_filename   IN   VARCHAR2
)
AS
   CURSOR c
   IS
SELECT DISTINCT mld_melding_key, prs_perslid_email
  FROM (SELECT m.mld_melding_key,
               alg_onrgoedkenmerk_waarde prs_perslid_email,
               mld_melding_status
          FROM mld_melding m,
               (SELECT alg_onrgoed_key, alg_onrgoedkenmerk_waarde
                  FROM alg_onrgoedkenmerk aogk
                 WHERE alg_kenmerk_key = 1260) lse
         WHERE m.mld_alg_locatie_key = lse.alg_onrgoed_key
               AND m.mld_stdmelding_key != 41           -- ontvangen berichten
        UNION ALL
        SELECT m.mld_melding_key, prs_perslid_email, mld_melding_status
          FROM prs_perslid p,
               mld_melding m,
               alg_locatie l,
               alg_locatie l2,
               prs_v_perslidwerkplek_gegevens pwpg,
               prs_kenmerklink kl
         WHERE     m.mld_alg_locatie_key = l.alg_locatie_key
               AND m.mld_stdmelding_key != 41           -- ontvangen berichten
               AND pwpg.alg_locatie_key = l2.alg_locatie_key
               AND l.alg_district_key = l2.alg_district_key
               AND pwpg.prs_perslid_key = p.prs_perslid_key
               AND p.prs_srtperslid_key = 32                           -- BBer
               AND prs_kenmerk_key = 1100         -- notificatie enable vinkje
               AND fac.safe_to_number (prs_kenmerklink_waarde) = 1
               AND kl.prs_link_key = p.prs_perslid_key
               AND p.prs_perslid_email IS NOT NULL
        UNION ALL
        SELECT m.mld_melding_key, prs_perslid_email, mld_melding_status
          FROM prs_perslid p,
               mld_melding m,
               prs_v_perslidwerkplek_gegevens pwpg,
               prs_kenmerklink kl
         WHERE     m.mld_stdmelding_key != 41           -- ontvangen berichten
               AND pwpg.alg_locatie_key = m.mld_alg_locatie_key
               AND pwpg.prs_perslid_key = p.prs_perslid_key
               AND p.prs_srtperslid_key IN (4041, 50) -- Objectleider en Rayonleider
               AND prs_kenmerk_key = 1100         -- notificatie enable vinkje
               AND fac.safe_to_number (prs_kenmerklink_waarde) = 1
               AND kl.prs_link_key = p.prs_perslid_key
               AND p.prs_perslid_email IS NOT NULL) g
 WHERE g.mld_melding_status IN (0, 2, 3, 4, 7)
       AND NOT EXISTS
             (SELECT ft.fac_tracking_key
                FROM (  SELECT MAX (fac_tracking_key) fac_tracking_key
                          FROM fac_tracking t
                         WHERE ( (fac_tracking_oms LIKE 'Gemaild naar BBer:%'
                                  AND fac_srtnotificatie_key = 111)  -- MLDMAI
                                OR (UPPER (fac_tracking_oms) LIKE '%PLAATS:%'
                                    AND fac_srtnotificatie_key = 41)) -- MLDUPD
                      GROUP BY fac_tracking_refkey) ot,
                     fac_tracking ft
               WHERE     ot.fac_tracking_key = ft.fac_tracking_key
                     AND ft.fac_srtnotificatie_key = 111
                     AND ft.fac_tracking_refkey = g.mld_melding_key);

   v_dummy   VARCHAR2 (128);
BEGIN
    -- stuur de notificatie ook naar het emailadres kenmerk.
    INSERT INTO fac_notificatie (fac_srtnotificatie_key,
                                 fac_notificatie_status,
                                 fac_notificatie_receiver_email,
                                 fac_notificatie_oms,
                                 fac_notificatie_refkey,
                                 fac_notificatie_prioriteit,
                                 fac_notificatie_datum,
                                 fac_notificatie_sender_email,
                                 fac_notificatie_lang,
                                 prs_perslid_key_sender)
       SELECT n.fac_srtnotificatie_key,
              fac_notificatie_status,
              mld_kenmerkmelding_waarde,
              fac_notificatie_oms,
              fac_notificatie_refkey,
              fac_notificatie_prioriteit,
              fac_notificatie_datum,
              fac_notificatie_sender_email,
              fac_notificatie_lang,
              prs_perslid_key_sender
         FROM fac_notificatie n,
              fac_srtnotificatie sn,
              mld_kenmerkmelding km,
              mld_kenmerk k
        WHERE n.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
              AND (   sn.fac_srtnotificatie_code = 'MLDAFM'
                   OR sn.fac_srtnotificatie_code = 'MLDUPD'
                   OR sn.fac_srtnotificatie_code = 'MLDREJ')
              AND n.fac_notificatie_refkey = km.mld_melding_key
              AND km.mld_kenmerk_key = k.mld_kenmerk_key
              AND k.mld_srtkenmerk_key = 1;  -- email notificatie

   FOR rec IN c
   LOOP
      BEGIN
         IF rec.prs_perslid_email IS NOT NULL
         THEN
            fac.putnotificationsrtprio(null, null, 'MLDMAI', rec.mld_melding_key, 'BB: Melding ' || rec.mld_melding_key || ' is aan u in behandeling gegeven', 2, rec.prs_perslid_email, null, null, 2, null);
            fac.trackaction('MLDMAI', rec.mld_melding_key, 4, NULL, 'Gemaild naar BBer: ' || rec.prs_perslid_email);
         ELSE
            fac.trackaction('MLDMAI', rec.mld_melding_key, 4, NULL, 'Gemaild naar BBer: <Geen info gevonden>');
         END IF;
      END;
   END LOOP;

   -- Op verzoek van SVB worden mail notificaties naar een mailadres dat bij de locatie geconfigureerd is gestuurd.
   UPDATE fac_notificatie n
      SET prs_perslid_key_receiver = NULL,
          fac_notificatie_receiver_email =
              (SELECT aogk.alg_onrgoedkenmerk_waarde
                 FROM alg_onrgoedkenmerk aogk, mld_melding m
                WHERE     aogk.alg_onrgoed_key = m.mld_alg_locatie_key
                      AND aogk.alg_kenmerk_key = 1320   -- alternatief email adres.
                      AND n.fac_notificatie_refkey = m.mld_melding_key)
    WHERE EXISTS
              (SELECT sn.fac_srtnotificatie_key
                 FROM fac_srtnotificatie  sn,
                      mld_melding         m,
                      alg_onrgoedkenmerk  aogk
                WHERE     n.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
                      AND sn.fac_srtnotificatie_xmlnode = 'melding'
                      AND fac_notificatie_oms NOT LIKE 'BB: %'
                      AND (    sn.fac_srtnotificatie_code = 'MLDNEW'
                            OR sn.fac_srtnotificatie_code = 'MLDAFM'
                            OR sn.fac_srtnotificatie_code = 'MLDUPD'
                            OR sn.fac_srtnotificatie_code = 'MLDREJ')
                      AND fac_notificatie_refkey = m.mld_melding_key
                      AND m.mld_alg_locatie_key = aogk.alg_onrgoed_key
                      AND aogk.alg_kenmerk_key = 1320);
COMMIT;
END;
/

CREATE OR REPLACE PACKAGE csun
AS
   FUNCTION convert_esc (p_str VARCHAR2)
      RETURN VARCHAR2;

   PROCEDURE mld_after_insert (p_key IN NUMBER);
END;
/

CREATE OR REPLACE PACKAGE BODY csun
AS
   FUNCTION convert_esc (p_str VARCHAR2)
      RETURN VARCHAR2
   AS
      v_str   VARCHAR2 (4000);
      v_pos   NUMBER;
      v_chr   VARCHAR2 (1);
      v_asc   NUMBER;
      v_hex   VARCHAR2 (2);
   BEGIN
      v_str := p_str;
      v_pos := INSTR (p_str, '&#x');

      IF v_pos <> 0
      THEN
         v_hex := SUBSTR (p_str, v_pos + 3, 2);
         v_asc := TO_NUMBER (v_hex, 'XX');
         v_chr := CHR (v_asc);
         v_str := REPLACE (p_str, '&#x' || v_hex || ';', v_chr);

         IF v_str <> p_str
         THEN
            v_str := convert_esc (v_str);
         END IF;
      END IF;

      RETURN (v_str);
   END;

   -- Hook functie die na het invoeren van een melding aangeroepen wordt.
   PROCEDURE mld_after_insert (p_key IN NUMBER)
   AS
      v_melding_status          NUMBER;
      v_locatie_key             NUMBER;
      v_client                  NUMBER;                                                        -- klantcode
      v_perslid_key             NUMBER;                                                           -- melder
      v_stdmelding_key_old      NUMBER;
      v_stdmelding_key_new      NUMBER;
      v_melding_oms_old         VARCHAR2(100);
      v_melding_oms_new         VARCHAR2(100);
      v_mld_uitvoertijd_old     mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE;
      v_mld_accepttijd_old      mld_stdmelding.mld_stdmelding_t_accepttijd%TYPE;
      v_mld_uitvoertijd_new     mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE;
      v_mld_accepttijd_new      mld_stdmelding.mld_stdmelding_t_accepttijd%TYPE;
      v_melding_omschrijving    mld_melding.mld_melding_omschrijving%TYPE;
      v_melding_onderwerp       mld_melding.mld_melding_onderwerp%TYPE;
      v_melding_einddatum_std   DATE;
      v_melding_acceptdatum_std DATE;
      v_melding_einddatum_old   DATE;
      v_melding_datum           DATE;
      v_dienst_key              NUMBER(10);
      v_typeopdr_key            NUMBER(10);
      v_bedrijf_key             NUMBER(10);
      v_opdr_key                NUMBER(10);
      v_stdmelding_autoorder    mld_stdmelding.mld_stdmelding_autoorder%TYPE;
      v_locatie_change          NUMBER(1);
      v_melding_cat             VARCHAR2(400);
      v_locatie_code            VARCHAR2(100);
      v_locatie                 VARCHAR2(100);
      v_gebouw_code             VARCHAR2(100);
      v_errormsg                VARCHAR2(100);
   BEGIN
      v_errormsg := 'Ophalen meldinggegevens';
      BEGIN
         v_locatie_change := 0;

         SELECT mld_melding_status, mld_alg_locatie_key, prs_perslid_key, mld_stdmelding_key, mld_melding_einddatum, mld_melding_datum, mld_melding_omschrijving
           INTO v_melding_status, v_locatie_key, v_perslid_key, v_stdmelding_key_old, v_melding_einddatum_old, v_melding_datum, v_melding_omschrijving
           FROM mld_melding
          WHERE mld_melding_key = p_key;

         BEGIN
            SELECT fac.safe_to_number (prs_kenmerklink_waarde)
              INTO v_client
              FROM prs_kenmerklink
             WHERE prs_kenmerk_key = 1080 AND prs_link_key = v_perslid_key;
         EXCEPTION WHEN NO_DATA_FOUND
         THEN
           v_client := NULL;
         END;

         -- Nu gaan we kijken of we de melding aan een locatie kunnen koppelen
         -- Hiervoor hebben we een locatiecode en gebouwcode bij de mail melding
         -- Bij sommige klanten is de gebouwcode gevuld en bij sommige de locatiecode
         v_errormsg := 'Bepalen locatie';
         SELECT mld_kenmerkmelding_waarde
           INTO v_locatie_code
           FROM ( SELECT mld_kenmerkmelding_waarde, mld_melding_key
                    FROM mld_kenmerkmelding km,
                         mld_kenmerk k
                   WHERE k.mld_srtkenmerk_key = 181                                -- Klant locatiecode
                     AND km.mld_kenmerk_key = k.mld_kenmerk_key) kl,
                mld_melding m
           WHERE m.mld_melding_key = kl.mld_melding_key(+)
             AND m.mld_melding_key = p_key;

         SELECT mld_kenmerkmelding_waarde
           INTO v_gebouw_code
           FROM ( SELECT mld_kenmerkmelding_waarde, mld_melding_key
                    FROM mld_kenmerkmelding km,
                         mld_kenmerk k
                   WHERE k.mld_srtkenmerk_key = 201                                -- Klant gebouwcode
                     AND km.mld_kenmerk_key = k.mld_kenmerk_key) kg,
                mld_melding m
           WHERE m.mld_melding_key = kg.mld_melding_key(+)
             AND m.mld_melding_key = p_key;

         IF v_locatie_key = 28581 AND v_client IS NOT NULL -- Locatie key van locatie ONBEKEND
         THEN
            BEGIN
               IF    v_client = 462 -- pilot voor RWS
                  OR v_client = 241 -- Arcadis
                  OR v_client = 801 -- PostNL Pakket
                  OR v_client = 344 -- ABN Amro
                  OR v_client = 381 -- Mayfield
                  OR v_client = 301 -- Humanitas
                  OR v_client = 382 -- KPN Retail
                  OR v_client = 321 -- Tennet
                  OR v_client = 602 -- KPMG Meijburg
                  OR v_client = 601 -- KPMG
                  OR v_client = 701 -- Sanquin
               THEN
                  SELECT alg_locatie_key
                    INTO v_locatie_key
                    FROM alg_locatie l,
                         mld_kenmerkmelding km,
                         mld_kenmerk k,
                         alg_onrgoedkenmerk aogkk,
                         alg_onrgoedkenmerk aogkc
                   WHERE k.mld_srtkenmerk_key = 181                                -- Klant locatiecode
                     AND k.mld_kenmerk_key = km.mld_kenmerk_key
                     AND km.mld_melding_key = p_key
                     AND UPPER (trim(aogkk.alg_onrgoedkenmerk_waarde)) =
                            UPPER (km.mld_kenmerkmelding_waarde)
                     AND aogkk.alg_onrgoed_key = l.alg_locatie_key
                     AND l.alg_locatie_verwijder is null
                     AND aogkk.alg_kenmerk_key = 1203                              -- Klant locatiecode
                     AND fac.safe_to_number (aogkc.alg_onrgoedkenmerk_waarde) = v_client
                     AND aogkc.alg_onrgoed_key = l.alg_locatie_key
                     AND aogkc.alg_kenmerk_key = 1000;                                        -- Client
               ELSIF    v_client = 621     -- DB Schenker
                     OR v_client = 641     -- Alliance
                     OR v_client = 841     -- KPN (Yask)
                     OR v_client = 902     -- Hudson Bay
                     or v_client = 1262    -- Volksbank
               THEN
                  SELECT alg_locatie_key
                    INTO v_locatie_key
                    FROM alg_locatie l,
                         mld_kenmerkmelding km,
                         mld_kenmerk k,
                         alg_onrgoedkenmerk aogkk,
                         alg_onrgoedkenmerk aogkc
                   WHERE k.mld_srtkenmerk_key = 201                                -- Klant gebouwcode
                     AND k.mld_kenmerk_key = km.mld_kenmerk_key
                     AND km.mld_melding_key = p_key
                     AND UPPER (trim(aogkk.alg_onrgoedkenmerk_waarde)) =
                            UPPER (km.mld_kenmerkmelding_waarde)
                     AND aogkk.alg_onrgoed_key = l.alg_locatie_key
                     AND l.alg_locatie_verwijder is null
                     AND aogkk.alg_kenmerk_key = 1203                              -- Klant locatiecode
                     AND fac.safe_to_number (aogkc.alg_onrgoedkenmerk_waarde) = v_client
                     AND aogkc.alg_onrgoed_key = l.alg_locatie_key
                     AND aogkc.alg_kenmerk_key = 1000;                                        -- Client
               END IF;

               DBMS_OUTPUT.put_line (v_locatie_key);

               UPDATE mld_melding
                  SET mld_alg_locatie_key = v_locatie_key
                WHERE mld_melding_key = p_key;

               v_locatie_change := 1;
            EXCEPTION
               WHEN OTHERS
               THEN
                  -- Geen geldige locatie gevonden. Dan blijven we op onbekend staan.
                  -- 4 - Facilitor
                  INSERT INTO mld_melding_note (mld_melding_key,
                                                prs_perslid_key,
                                                mld_melding_note_omschrijving)
                       VALUES (p_key, 4, v_errormsg || ': ' || v_locatie_code || '-' || v_gebouw_code);
            END;
         END IF;

         -- Nu gaan we kijken of we ook de stdmelding kunnen invullen. Normaal staat deze op mail.
         -- Via de koppeling wordt het kenmerk meldingcategorie (key 361) gevuld. Dit is de tekst
         -- zoals de klant de melding gekwalificeerd heeft. In de eigen tabel 'Map klantmelding' wordt deze
         -- vertaald naar een stdmelding_key.
         v_errormsg := 'Bepalen stdmelding';
         SELECT MAX(mld_kenmerkmelding_waarde)
           INTO v_melding_cat
           FROM mld_kenmerkmelding km
          WHERE km.mld_melding_key = p_key
            AND km.mld_kenmerk_key = 361;

         -- CSUN#54801 Wanneer geen locatie bij mailmeldingen, dan ook niet de vakgroep herbepalen. Vervolgens notificatie.
         IF v_locatie <> 28581 AND v_locatie IS NOT NULL AND v_melding_cat IS NOT NULL  						-- Locatie key van locatie ONBEKEND
         THEN
            BEGIN
               v_errormsg := 'Bepalen stdmelding (zoek in eigen tabel)';
               SELECT fac_usrdata_volgnr
                 INTO v_stdmelding_key_new
                 FROM fac_usrdata ud
                WHERE ud.fac_usrdata_parentkey = v_client
                  AND ud.fac_usrtab_key = 101
                  AND UPPER(ud.fac_usrdata_omschr) = UPPER(SUBSTR(v_melding_cat,1,60));

               IF v_stdmelding_key_new <> v_stdmelding_key_old
               THEN
                  v_errormsg := 'Bepalen stdmelding (ophalen omschrijving nieuwe melding)';
                  SELECT ins_discipline_omschrijving || '/' || mld_stdmelding_omschrijving, mld_stdmelding_t_uitvoertijd,  mld_stdmelding_t_accepttijd
                    INTO v_melding_oms_new, v_mld_uitvoertijd_new, v_mld_accepttijd_new
                    FROM mld_stdmelding std,
                         ins_tab_discipline d
                   WHERE std.mld_stdmelding_key = v_stdmelding_key_new
                     AND std.mld_ins_discipline_key = d.ins_discipline_key;

                  v_errormsg := 'Bepalen stdmelding (ophalen omschrijving oude melding)';
                  SELECT ins_discipline_omschrijving || '/' || mld_stdmelding_omschrijving, mld_stdmelding_t_uitvoertijd,  mld_stdmelding_t_accepttijd
                    INTO v_melding_oms_old, v_mld_uitvoertijd_old, v_mld_accepttijd_old
                    FROM mld_stdmelding std,
                         ins_tab_discipline d
                   WHERE std.mld_stdmelding_key = v_stdmelding_key_old
                     AND std.mld_ins_discipline_key = d.ins_discipline_key;

                   v_errormsg := 'Bepalen stdmelding (pas stdmeldingkey aan)';
                   UPDATE mld_melding SET mld_stdmelding_key = v_stdmelding_key_new,
                                          mld_melding_t_uitvoertijd = v_mld_uitvoertijd_new,
                                          mld_melding_t_accepttijd = v_mld_accepttijd_new
                    WHERE mld_melding_key = p_key;

                   v_errormsg := 'Bepalen stdmelding (bepaal einddatum en accept)';
                    SELECT mld.geteinddatum(mld_melding_key), mld.getacceptdatum (mld_melding_datum, mld_stdmelding_key, NULL)
                      INTO v_melding_einddatum_std, v_melding_acceptdatum_std
                      FROM mld_melding
                     WHERE mld_melding_key = p_key;

                   v_errormsg := 'Bepalen stdmelding (pas std tijden aan)';
                    UPDATE mld_melding SET mld_melding_einddatum_std = v_melding_einddatum_std,
                                           mld_melding_acceptdatum_std = v_melding_acceptdatum_std
                     WHERE mld_melding_key = p_key;

                   v_errormsg := 'Bepalen stdmelding (update tracking)';
                   fac.trackaction('MLDUPD', p_key, 4, NULL, 'Melding M' || p_key || ' (' || v_melding_oms_new ||') is gewijzigd' || CHR(10) ||
                                                             'Melding: ' || v_melding_oms_old || ' --> ' || v_melding_oms_new || CHR(10) ||
                                                             'Gereed: ' || TO_CHAR(v_melding_einddatum_old, 'dd-mm-yyyy hh24:mi') || ' --> ' || TO_CHAR(v_melding_einddatum_std, 'dd-mm-yyyy hh24:mi'));

               END IF;
            EXCEPTION
               WHEN OTHERS
               THEN
                  -- Waarschijnlijk iets fout gegaan in de configuratie. Locatie wordt niet aangepast.
                  INSERT INTO mld_melding_note (mld_melding_key,
                                                prs_perslid_key,
                                                mld_melding_note_omschrijving)
                       VALUES (p_key, 4, v_errormsg || ': ' || v_locatie_code || '-' || v_gebouw_code || '-' || v_melding_cat);
            END;
         END IF;

         BEGIN
            -- Nu kijken of we automatisch een opdracht kunnen aanmaken.
            IF v_locatie_change = 1 AND v_stdmelding_key_old = 41 AND v_stdmelding_key_new <> 41  -- 41 = Ontvangen mail.
            THEN
               SELECT mld_stdmelding_autoorder,
                      ms.prs_dienst_key,
                      ms.mld_typeopdr_key
                 INTO v_stdmelding_autoorder,
                      v_dienst_key,
                      v_typeopdr_key
                 FROM mld_stdmelding ms
                WHERE mld_stdmelding_key = v_stdmelding_key_new;

               -- Heb ik genoeg informatie om een opdracht aan te kunnen maken.
               IF v_stdmelding_autoorder = 1 AND v_dienst_key IS NOT NULL AND v_typeopdr_key IS NOT NULL
               THEN
                  SELECT MIN (bdl.prs_bedrijf_key)
                    INTO v_bedrijf_key
                    FROM prs_bedrijfdienstlocatie bdl, prs_v_aanwezigbedrijf b
                   WHERE     bdl.prs_bedrijf_key = b.prs_bedrijf_key
                         AND bdl.prs_dienst_key = v_dienst_key
                         AND (bdl.alg_locatie_key = v_locatie_key OR bdl.alg_locatie_key IS NULL);

                  IF v_bedrijf_key IS NOT NULL
                  THEN
                     mld.setmeldingstatus(p_key, 4, v_perslid_key);

                     INSERT INTO mld_opdr (mld_uitvoerende_keys,
                                           mld_opdr_kosten,
                                           mld_opdr_uurloon,
                                           mld_melding_key,
                                           mld_opdr_module,
                                           mld_opdr_bedrijfopdr_volgnr,
                                           mld_opdr_datumbegin,
                                           mld_opdr_einddatum,
                                           mld_typeopdr_key,
                                           prs_perslid_key,
                                           mld_opdr_omschrijving,
                                           mld_opdr_uren,
                                           mld_opdr_teverzenden)
                          VALUES (v_bedrijf_key,
                                  0,
                                  0,
                                  p_key,
                                  'MLD',
                                  mld.bepaalopdrmeldingvolgnr (p_key),
                                  v_melding_datum,
                                  v_melding_einddatum_std,
                                  v_typeopdr_key,
                                  v_perslid_key,
                                  v_melding_onderwerp || CHR(10) || v_melding_omschrijving,
                                  0,
                                  1)
                          RETURNING mld_opdr_key INTO v_opdr_key;

                     mld.setopdrachtstatus(v_opdr_key, 5, v_perslid_key); -- Uitgegeven

                     mld.updatemeldingstatus (p_key, 0, v_perslid_key);

                  END IF;
               END IF;
            END IF;
         EXCEPTION WHEN OTHERS
         THEN
            -- Waarschijnlijk iets fout gegaan in de configuratie. Opdracht wordt niet aangemaakt.
            INSERT INTO mld_melding_note (mld_melding_key,
                                          prs_perslid_key,
                                          mld_melding_note_omschrijving)
                 VALUES (p_key, 4, 'Opdracht kan niet aangemaakt worden: ' || v_errormsg || ': ' || v_locatie_code || '-' || v_gebouw_code || '-' || v_melding_cat);
         END;
      EXCEPTION
         WHEN OTHERS
         THEN
            -- Waarschijnlijk iets fout gegaan in de configuratie. Locatie wordt niet aangepast.
            INSERT INTO mld_melding_note (mld_melding_key,
                                          prs_perslid_key,
                                          mld_melding_note_omschrijving)
                 VALUES (p_key, 4, v_errormsg || ': ' || v_locatie_code || '-' || v_gebouw_code || '-' || v_melding_cat);
      END;
   END;
END;
/

CREATE OR REPLACE FUNCTION csun_get_html_valuepair (p_text    IN VARCHAR2,
                                                    p_start   IN VARCHAR2,
                                                    p_eind    IN VARCHAR2)
   RETURN VARCHAR2
AS
   v_pos         NUMBER;
   v_pos_begin   NUMBER;
   v_pos_eind    NUMBER;
   v_result      VARCHAR2(4000);
BEGIN
   -- controleer of de begintag aanwezig is. Zo nee, dan hebben we niets te tonen.
   v_pos := INSTR (p_text, p_start);

   --dbms_output.put_line('v_pos start:' || v_pos);
   IF v_pos = 0
   THEN
      RETURN NULL;
   END IF;


   v_pos_begin :=
      INSTR (p_text, CHR (10) || CHR (13) || p_start || CHR (10) || CHR (13))
      + LENGTH (p_start)
      + 4;
   --dbms_output.put_line('v_pos_begin:' || v_pos_begin);

   -- controleer of de eindtag aanwezig is. Zo nee, dan gaan we opzoek naar de volgende.
   v_pos := INSTR (p_text, p_eind);

   --dbms_output.put_line('v_pos eind:' || v_pos);
   IF v_pos = 0
   THEN
      v_pos_eind :=
         INSTR (p_text,
                CHR (10) || CHR (13),
                v_pos_begin,
                1);
   ELSE
      v_pos_eind :=
         INSTR (p_text,
                CHR (10) || CHR (13) || p_eind || CHR (10) || CHR (13));
   END IF;

   -- dbms_output.put_line('v_pos_eind:' || v_pos_eind);
   v_result := p_start
          || ': '
          || SUBSTR (p_text, v_pos_begin, v_pos_eind - v_pos_begin);

   -- Soms wordt een tag niet gevonden. Dan wordt de hele body inclusief CSS meegestuurd.
   -- Dat willen we natuurlijk niet. Daarom maken we daar maar een lege tag van.
   IF LENGTH(v_result) > 1000
   THEN
      v_result := p_start || ':';
   END IF;

   RETURN v_result;
END;
/

CREATE OR REPLACE PROCEDURE csun_processemail (pfrom      IN VARCHAR2,
                                               pto        IN VARCHAR2,
                                               psubject   IN VARCHAR2,
                                               pbody      IN VARCHAR2,
                                               psessionid IN VARCHAR2,
                                               puserkey   IN NUMBER DEFAULT NULL)
AS
   sender             prs_perslid.prs_perslid_key%TYPE;
   kostenplaats       prs_afdeling.prs_kostenplaats_key%TYPE;
   mldkey             mld_melding.mld_melding_key%TYPE;
   stdmelding         mld_stdmelding.mld_stdmelding_key%TYPE;
   subject_regexp     fac_setting.fac_setting_default%TYPE;
   kkey               mld_kenmerk.mld_kenmerk_key%TYPE;
   errormsg           fac_result.fac_result_waarde%TYPE;
   behandelaar_key    mld_melding.mld_melding_behandelaar_key%TYPE;
   mldnum             VARCHAR2 (4000);
   srtdisc            VARCHAR2 (4000);
   cnt                NUMBER (10);
   v_flag_on_fenote   NUMBER (10);
   v_flag_on_bonote   NUMBER (10);
   v_from             VARCHAR2 (4000);
   v_body             VARCHAR2 (4000);
   m_body             VARCHAR2 (4000);
   v_locatie_code     VARCHAR2 (1000);   -- om te voorkomen dat we foutmeldingen krijgen als de locatie niet bepaald kan worden.
   v_pos              NUMBER;
   v_externnr         VARCHAR2 (1000);
   v_omschrijving_ruimte VARCHAR2(1000);
   v_client           NUMBER;
   v_new              NUMBER;            -- vlag om te testen of het om een nieuwe melding gaat.
BEGIN
   v_new := 0;
   errormsg := '(0x143)';
   v_externnr := NULL;

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

   v_body := pbody;
   m_body := pbody;

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

   -- Valideer de sender in pfrom: kennen we deze?
   SELECT MIN (prs_perslid_key), MIN (d.prs_kostenplaats_key)
     INTO sender, kostenplaats
     FROM prs_perslid p, prs_afdeling d
    WHERE p.prs_afdeling_key = d.prs_afdeling_key
      AND prs_perslid_verwijder IS NULL
      AND (UPPER (prs_perslid_email) = UPPER (v_from)
        OR EXISTS
              (SELECT *
                 FROM prs_kenmerklink kl
                WHERE prs_kenmerk_key = 1020
                  AND prs_link_key = p.prs_perslid_key
                  AND UPPER (kl.prs_kenmerklink_waarde) = UPPER (v_from)));

   BEGIN
      SELECT fac.safe_to_number (prs_kenmerklink_waarde)
        INTO v_client
        FROM prs_kenmerklink
       WHERE prs_kenmerk_key = 1080 AND prs_link_key = sender;
   EXCEPTION WHEN NO_DATA_FOUND
   THEN
      v_client := NULL;
   END;


   CASE
      WHEN UPPER (pto) LIKE 'SERVICEDESK@%' OR UPPER (pto) LIKE 'DJI@%'
      THEN
         errormsg := '(0x145)';

         BEGIN
            -- bij abnamro gaan we de html body nog even opschonen
            IF sender = 23
            THEN
               -- pas de omschrijving van de melding aan. Verwijder onnodige html ballast.
               v_body := REPLACE(v_body, '&#x20;', ' ');   -- spatie
               v_body := REPLACE(v_body, '&#x21;', '!');
               v_body := REPLACE(v_body, '&#x22;', CHR(34));   -- double quote
               v_body := REPLACE(v_body, '&#x23;', '#');
               v_body := REPLACE(v_body, '&#x24;', '$');
               v_body := REPLACE(v_body, '&#x25;', '%');
               v_body := REPLACE(v_body, '&#x26;', '&');
               v_body := REPLACE(v_body, '&#x27;', CHR(39));   -- single quote
               v_body := REPLACE(v_body, '&#x28;', '(');
               v_body := REPLACE(v_body, '&#x29;', ')');
               v_body := REPLACE(v_body, '&#x2a;', '*');
               v_body := REPLACE(v_body, '&#x2b;', '+');
               v_body := REPLACE(v_body, '&#x2c;', ',');   --  komma
               v_body := REPLACE(v_body, '&#x2d;', '-');   --  min teken
               v_body := REPLACE(v_body, '&#x2e;', '.');   -- punt
               v_body := REPLACE(v_body, '&#x2f;', '/');
               v_body := REPLACE(v_body, '&#x3a;', ':');   -- dubbele punt
               v_body := REPLACE(v_body, '&#x3b;', ';');   -- punt komma
               v_body := REPLACE(v_body, '&#x3c;', '<');
               v_body := REPLACE(v_body, '&#x3d;', '=');
               v_body := REPLACE(v_body, '&#x3e;', '>');
               v_body := REPLACE(v_body, '&#x3f;', '?');
               v_body := REPLACE(v_body, '&#x40;', '@');
               v_body := REPLACE(v_body, ' ' || CHR (10) || CHR (13), CHR (10) || CHR (13));   -- soms komt er ineens een een spatie achter de tag.
               -- gaat het om een normale werkbon, dan is v_pos > 0; anders gaat het om een klacht.
               v_pos := INSTR (v_body, '--> Werkbon');

               IF v_pos = 0
               THEN
                  v_omschrijving_ruimte := csun_get_html_valuepair (v_body,
                                                                    'Omschrijving ruimte',
                                                                    'Klacht! Wat moet je doen?');
               ELSE
                  v_omschrijving_ruimte := csun_get_html_valuepair (v_body,
                                                                    'Omschrijving ruimte',
                                                                    'Met vriendelijke groet');
               END IF;

               v_externnr := csun_get_html_valuepair (v_body,
                                              'Aanvraagnr.',
                                              'Omschrijving aanvraag');
               m_body :=
                  csun_get_html_valuepair (v_body,
                                           'Naam',
                                           'Telefoonnr.')
                  || CHR (10)
                  || csun_get_html_valuepair (v_body,
                                              'Telefoonnr.',
                                              'Mobiel nr.')
                  || CHR (10)
                  || csun_get_html_valuepair (v_body,
                                              'Mobiel nr.',
                                              'E-mail')
                  || CHR (10)
                  || csun_get_html_valuepair (v_body,
                                              'E-mail',
                                              'Melddatum')
                  || CHR (10)
                  || csun_get_html_valuepair (v_body,
                                              'Melddatum',
                                              'Aanvraagnr.')
                  || CHR (10)
                  || csun_get_html_valuepair (v_body,
                                              'Aanvraagnr.',
                                              'Omschrijving aanvraag')
                  || CHR (10)
                  || csun_get_html_valuepair (v_body,
                                              'Omschrijving aanvraag',
                                              'Toelichting')
                  || CHR (10)
                  || csun_get_html_valuepair (v_body,
                                              'Toelichting',
                                              'Object')
                  || CHR (10)
                  || csun_get_html_valuepair (v_body,
                                              'Object',
                                              'Postcode')
                  || CHR (10)
                  || csun_get_html_valuepair (v_body,
                                              'Postcode',
                                              'Plaats')
                  || CHR (10)
                  || csun_get_html_valuepair (v_body,
                                              'Plaats',
                                              'Omschrijving ruimte')
                  || CHR (10)
                  || v_omschrijving_ruimte;

               -- zoek de locatie
               v_locatie_code := csun_get_html_valuepair (v_body, 'Object', 'Postcode');
               v_locatie_code := SUBSTR(v_locatie_code, 9, INSTR(v_locatie_code, ' ',1,2)-9);
            END IF;

            -- Humanitas / KPMG Meijburg heeft de locatiecode ergens in het onderwerp staan
            IF v_client = 301 OR v_client = 602
            THEN
               BEGIN
                  SELECT lc.alg_onrgoedkenmerk_waarde
                    INTO v_locatie_code
                    FROM alg_onrgoedkenmerk lc,
                         alg_onrgoedkenmerk cl
                   WHERE lc.alg_onrgoed_key = cl.alg_onrgoed_key
                     AND lc.alg_kenmerk_key = 1203                              -- Klant locatiecode
                     AND fac.safe_to_number (cl.alg_onrgoedkenmerk_waarde) = v_client
                     AND cl.alg_kenmerk_key = 1000                              -- Client
                     AND UPPER(psubject) LIKE '%' || UPPER(lc.alg_onrgoedkenmerk_waarde) || '%';
               EXCEPTION WHEN OTHERS
               THEN
                  v_locatie_code := NULL;
               END;
            END IF;

            -- Mayfield bericht bevat een regel als: Betreft locatie	 :	 Apeldoorn, Wapenrustlaan 11-31 (NLV03001)
            IF v_client = 381  -- Mayfield
            THEN
               -- eerst de regel vinden
               v_locatie_code := SUBSTR(v_body, INSTR(v_body, 'Betreft locatie'),  -- start vd regel
                                                    INSTR(v_body, CHR(13),             -- op zoek naar het einde vd regel
                                                    INSTR(v_body, 'Betreft locatie') -- waarbij we beginnen te zoeken aan het begin vd regel
                                                             )-
                                                    INSTR(v_body, 'Betreft locatie')); -- verminderd met het begin vd regel omdat we alleen het verschil mee moeten geven.
               -- nu de locatiecode
               v_locatie_code := SUBSTR(v_locatie_code, INSTR(v_locatie_code, '(')+1, INSTR(v_locatie_code, ')')-1 - (INSTR(v_locatie_code, '(')+1));
            END IF;

            IF v_client = 601  -- KPMG
            THEN
               -- eerst de regel vinden
               v_locatie_code := SUBSTR(v_body, INSTR(v_body, 'Locatie: '),  -- start vd regel
                                                    INSTR(v_body, CHR(13),             -- op zoek naar het einde vd regel
                                                    INSTR(v_body, 'Locatie: ') -- waarbij we beginnen te zoeken aan het begin vd regel
                                                             )-
                                                    INSTR(v_body, 'Locatie: ')); -- verminderd met het begin vd regel omdat we alleen het verschil mee moeten geven.
               -- nu de locatiecode
               v_locatie_code := TRIM(SUBSTR(v_locatie_code, 9));
            END IF;

            -- Bij Sanquin komt de locatie ergens achter de tekst Locatie: te staan
            IF v_client = 701 -- Sanquin
            THEN
               BEGIN
                  SELECT lc.alg_onrgoedkenmerk_waarde
                    INTO v_locatie_code
                    FROM alg_onrgoedkenmerk lc,
                         alg_onrgoedkenmerk cl
                   WHERE lc.alg_onrgoed_key = cl.alg_onrgoed_key
                     AND lc.alg_kenmerk_key = 1203                              -- Klant locatiecode
                     AND fac.safe_to_number (cl.alg_onrgoedkenmerk_waarde) = v_client
                     AND cl.alg_kenmerk_key = 1000                              -- Client
                     AND UPPER(v_body) LIKE '%LOCATIE: ' || UPPER(lc.alg_onrgoedkenmerk_waarde) || '%';
               EXCEPTION WHEN OTHERS
               THEN
                  v_locatie_code := NULL;
               END;
            END IF;



            -- Tennet
            -- Afleveradres:	 TenneT TSO B.V.
            -- Frankeneng 116
            -- 6716 AA EDE
            IF v_client = 321 -- Tennet
            THEN
               v_pos := INSTR(v_body, 'Afleveradres:	 TenneT TSO B.V.');   -- We zoeken de postcode onder het afleveradres
               v_pos := INSTR(v_body, CHR(10), v_pos, 2);                   -- Vervolgens zoeken we de tweede line feed vanaf het afleveradres
               v_locatie_code := UPPER(SUBSTR(v_body, v_pos +1, 7));
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               fac.writelog (
                  'PROCESSEMAIL',
                  'W',
                     'Mail kon niet geformateerd worden afzender:'
                  || pfrom
                  || '['
                  || errormsg
                  || ']',
                     'OTHERS (error '
                  || SQLCODE
                  || '/'
                  || SUBSTR (SQLERRM, 1, 100)
                  || ')');
         END;

         -- append (as a note?) to an existing melding if #key is found in the subject
         -- Alternatief was: scannen van fac_srtnotificatie_oms maar dat voelt ook niet echt lekker
         -- subject_regexp := fac.getsetting ('mld_reply_subject_regexp'); -- [[:alpha:]]*[[:digit:]]{3,}
         subject_regexp := '[[:alpha:]]*[[:digit:]]{3,}';
         mldnum :=
            REGEXP_SUBSTR (psubject,
                           subject_regexp,
                           1,
                           1,
                           'i');                                    -- MA12345
         srtdisc :=
            REGEXP_SUBSTR (mldnum,
                           '[[:alpha:]]',
                           1,
                           1,
                           'i');                                         -- MA
         mldkey := fac.safe_to_number (SUBSTR (mldnum, LENGTH (srtdisc) + 1));

         --         DBMS_OUTPUT.PUT_LINE('mldnum: ' || mldnum);
         --         DBMS_OUTPUT.PUT_LINE('srtdisc: ' || srtdisc);
         --         DBMS_OUTPUT.PUT_LINE('mldkey: ' || mldkey);
         -- We eisen
         --   - Goed meldingnummer
         --   - Goede srtdiscipline
         --   - Afzender is degene voor wie de melding was
         -- suggested extensions: ook collega's toestaan?
         SELECT MIN (mm.mld_stdmelding_key)
           INTO stdmelding
           FROM mld_melding mm,
                mld_stdmelding msm,
                ins_tab_discipline insd,
                ins_srtdiscipline isd
          WHERE mm.mld_melding_key = mldkey
            AND mm.mld_stdmelding_key = msm.mld_stdmelding_key
            AND msm.mld_ins_discipline_key = insd.ins_discipline_key
            AND insd.ins_srtdiscipline_key = isd.ins_srtdiscipline_key
            -- Controle op srtdisc werkt niet goed. Mails worden na binnenkomst namelijk doorgezet
            -- naar de definitieve stdmelding(/discipline/srtdiscpline) en daarmee verandert de
            -- prefix letter
            --AND isd.ins_srtdiscipline_prefix = srtdisc
            AND mm.prs_perslid_key_voor = sender;

         --         DBMS_OUTPUT.PUT_LINE('mld_stdmelding_key: ' || TO_CHAR(stdmelding));

         IF mldkey IS NULL
         THEN
            BEGIN
            -- controleren of we deze melding al eerder ontvangen hebben en dit een update / reminder betreft.
            SELECT mld_melding_key, mld_stdmelding_key
              INTO mldkey, stdmelding
              FROM mld_melding m
             WHERE m.prs_perslid_key = sender
               AND ( (psubject LIKE '%' || m.mld_melding_externnr || '%'
                  AND m.mld_melding_externnr IS NOT NULL)
                 OR (EXISTS
                        (SELECT mld_kenmerkmelding_key
                           FROM mld_kenmerkmelding km, mld_kenmerk k
                          WHERE km.mld_melding_key = m.mld_melding_key
                            AND km.mld_kenmerk_key = k.mld_kenmerk_key
                            AND k.mld_srtkenmerk_key = 2
                            AND psubject LIKE '%' || km.mld_kenmerkmelding_waarde || '%')));
             EXCEPTION WHEN OTHERS
             THEN
                mldkey := NULL;
                stdmelding := NULL;
             END;
         END IF;
         BEGIN
            SELECT mld_melding_behandelaar_key
              INTO behandelaar_key
              FROM mld_melding m, prs_perslid p
             WHERE mld_melding_key = mldkey
               AND mld_melding_behandelaar_key = p.prs_perslid_key
               AND p.prs_perslid_email IS NOT NULL
               AND p.prs_perslid_verwijder IS NULL;
         EXCEPTION
            WHEN OTHERS
            THEN
               behandelaar_key := NULL;
         END;

         IF     stdmelding IS NOT NULL
            AND behandelaar_key IS NOT NULL
            AND sender <> 23
         THEN                   -- Bestaande melding en behandelaar is bekend en niet ABN AMRO (23)
            INSERT INTO mld_melding_note (mld_melding_key,
                                          mld_melding_note_omschrijving,
                                          prs_perslid_key,
                                          mld_melding_note_flag)
                VALUES (mldkey,
                        SUBSTR (
                           psubject || CHR (13) || CHR (10)
                           || REPLACE (
                                 SUBSTR (v_body,
                                         1,
                                         4000 - (LENGTH (psubject) + 2)),
                                 CHR (13) || CHR (10) || CHR (13) || CHR (10),
                                 CHR (13) || CHR (10)),
                           1,
                           4000),              -- verwijder onnodige witregels
                        sender,
                        1);          -- 1 is zichtbaar FE want zelf ingevoerd.

            -- Default tracking is even goed genoeg
            fac.trackaction ('MLDNOT',
                             mldkey,
                             sender,
                             NULL,
                             '#Notitie toegevoegd vanuit e-mail'); -- # voorkomt notificatie
            --            DBMS_OUTPUT.PUT_LINE('Notitie toegevoegd.');

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

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

            -- Vlaggetjes zetten zoals mld_edit_note.asp dat doet
            BEGIN
               IF fac.getdbversion() >= 'DB36' -- DB36 forward compatible
               THEN
                  IF fac.getsetting('mld_melding_actiecode') = 1
                  THEN
                     UPDATE mld_melding
                        SET mld_melding_actiecode = 1+128 -- Backoffice + Attentie
                      WHERE mld_melding_key = mldkey;
                  END IF;
               ELSE
                  v_flag_on_fenote := fac.getsetting('mld_flag_on_fenote');
                  v_flag_on_bonote := fac.getsetting('mld_flag_on_bonote');

                  IF v_flag_on_fenote <> 0 AND v_flag_on_fenote IS NOT NULL
                  THEN
                     UPDATE mld_melding
                        SET mld_melding_flag = v_flag_on_fenote
                      WHERE mld_melding_key = mldkey
                        AND ( (mld_melding_flag = v_flag_on_bonote)
                         OR (mld_melding_flag = 0 OR mld_melding_flag IS NULL));
                  --  DBMS_OUTPUT.PUT_LINE('Flag: ' || v_flag_on_fenote || ' gezet.');
                  END IF;
               END IF;
            EXCEPTION
               WHEN OTHERS
               THEN
                  DBMS_OUTPUT.put_line(   'Niet gelukt om flag '
                                       || v_flag_on_fenote
                                       || ' te zetten.');
            END;
         ELSE
            -- suggested extensions:
            -- check for MLDUSE-write autorisations
            -- parse the subject to find an appropriate stdmelding, if uniquely possible
            errormsg := '(0x148)';

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

               v_new := 1;           -- nieuwe melding
               INSERT INTO mld_melding (mld_melding_module,
                                        mld_meldbron_key,
                                        mld_melding_datum,
                                        mld_melding_omschrijving,
                                        mld_melding_status,
                                        mld_melding_t_uitvoertijd,
                                        mld_stdmelding_key,
                                        mld_alg_locatie_key,
                                        mld_melding_externnr,
                                        prs_perslid_key,
                                        prs_perslid_key_voor,
                                        prs_kostenplaats_key,
                                        mld_melding_spoed)
                   VALUES ('MLD',
                           4,                                         -- email
                           SYSDATE,
                           SUBSTR (
                              psubject || CHR (13)
                              || REPLACE (
                                    SUBSTR (m_body,
                                            1,
                                            4000 - (LENGTH (psubject) + 1)),
                                       CHR (13)
                                    || CHR (10)
                                    || CHR (13)
                                    || CHR (10),
                                    CHR (13) || CHR (10)),
                              1,
                              4000),           -- verwijder onnodige witregels
                           NULL,
                           MLD_T_UITVOERTIJD (2, 'D'),
                           stdmelding,
                           28581,              -- Locatie onbekend.
                           SUBSTR(v_externnr,1,30),
                           sender,
                           sender,
                           kostenplaats,
                           3)
                RETURNING mld_melding_key
                     INTO mldkey;

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

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

            END;

            -- Zoek het laagste bijlagen kenmerk om de bijlagen onder te stoppen
            errormsg := '(0x151)';

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

            errormsg := '(0x153)';

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

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

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

   -- alleen locatiekenmerk aanmaken als het een nieuwe melding betreft. Anders krijgen we dubbele kenmerken.
   IF v_locatie_code IS NOT NULL AND v_new = 1
   THEN
      csun_set_kenmerk('MLD',281, mldkey, v_locatie_code, 0);  -- locatie_code klant kenmerk
      CSUN.mld_after_insert (mldkey);
   END IF;
   --  Log het binnenkomende bericht als dat nodig is.
   --  IF sender = 23 THEN    -- ABNAMRO
   -- Verwijder records uit de fac_rapport tabel omdat de key uniek moet zijn.
   DELETE fac_rapport WHERE fac_rapport_volgnr = mldkey;
   INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_volgnr, fac_rapport_regel, fac_rapport_soort)
          VALUES (SUBSTR('MELDING_' || v_client, 1, 12), mldkey, SUBSTR(pbody, 1, 1990), 1);
   -- END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      --      DBMS_OUTPUT.PUT_LINE('Mail niet geaccepteerd: ' || 'OTHERS (error ' ||  SQLCODE  || '/' || SUBSTR (SQLERRM, 1, 100) || ')');
      INSERT INTO fac_result (fac_result_sessionid,
                              fac_result_naam,
                              fac_result_waarde)
          VALUES (psessionid,
                  'errormsg',
                  'Database fout - Neem contact op met uw systeembeheerder '
                  || errormsg);

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

CREATE OR REPLACE VIEW CSUN_V_RAP_MAIL_ERROR
(
   hide_f_offset,
   datum,
   hint,
   error
)
AS
   SELECT SYSDATE - imp_log_datum,
          imp_log_datum,
          imp_log_hint,
          imp_log_omschrijving
     FROM imp_log
    WHERE imp_log_applicatie = 'PROCESSEMAIL'
          AND imp_log_datum > SYSDATE - 30;



CREATE OR REPLACE VIEW CSUN_V_RAP_MELDING
(
   ACCOUNTCODE,
   FCLT_F_CLIENT,
   WERKBEDRIJF,
   DATUM,
   TIJDSTIP,
   SOORT_MELDING,
   WERKBON,
   MELDING,
   TYPE,
   SOORT,
   FCLT_F_BEHANDELAAR,
   OMSCHRIJVING,
   LOCATIE,
   LOCATIE_ADRES,
   LOCATIE_PLAATS,
   OPLOSTIJD,
   DATUM_REACTIE,
   REACTIE_OPTIJD,
   REACTIE,
   UITVOERTIJD,
   UITGEVOERD,
   STATUS,
   AFHANDELTIJD_DAGEN,
   AFHANDELTIJD_UREN
)
AS
   SELECT   (SELECT   fac_usrdata_code
               FROM   alg_onrgoedkenmerk, fac_usrdata ud
              WHERE   alg_kenmerk_key = 1000
                      AND alg_onrgoed_key = l.alg_locatie_key
                      AND fac.safe_to_number (alg_onrgoedkenmerk_waarde) =
                            fac_usrdata_key)
               accountcode,
            (SELECT   fac_usrdata_omschr
               FROM   alg_onrgoedkenmerk, fac_usrdata ud
              WHERE   alg_kenmerk_key = 1000
                      AND alg_onrgoed_key = l.alg_locatie_key
                      AND fac.safe_to_number (alg_onrgoedkenmerk_waarde) =
                            fac_usrdata_key)
               client,
            own.fac_usrdata_omschr werkbedrijf,
            mld_melding_datum Datum,
            TO_CHAR (mld_melding_datum, 'HH24:MI') Tijdstip,
            sd.ins_srtdiscipline_omschrijving Soort_melding,
            (SELECT   mld_kenmerkmelding_waarde
               FROM   mld_kenmerkmelding km, mld_kenmerk k
              WHERE       km.mld_melding_key = m.mld_melding_key
                      AND km.mld_kenmerk_key = k.mld_kenmerk_key
                      AND k.mld_srtkenmerk_key = 2)
               werkbon,
            m.mld_melding_key Melding,
               sd.ins_srtdiscipline_prefix
            || ' - '
            || d.ins_discipline_omschrijving
               TYPE,
            std.mld_stdmelding_omschrijving Soort,
            p.prs_perslid_naam_full,
            m.mld_melding_omschrijving Omschrijving,
            l.alg_locatie_omschrijving Locatie,
            l.alg_locatie_adres locatie_adres,
            l.alg_locatie_plaats locatie_plaats,
            TO_CHAR (m.mld_melding_acceptdatum_std, 'dd-mm-yyyy hh24:mi')
               oplostijd,
            TO_CHAR (tr.fac_tracking_datum, 'dd-mm-yyyy hh24:mi')
               datum_reactie,
            DECODE (
               SIGN (tr.fac_tracking_datum - m.mld_melding_acceptdatum_std),
               -1,
               'ja',
               NULL
            )
               reactie_optijd,
            mld_melding_opmerking reactie,
            TO_CHAR (m.mld_melding_einddatum_std, 'dd-mm-yyyy hh24:mi')
               uitvoertijd,
            TO_CHAR (tr2.fac_tracking_datum, 'dd-mm-yyyy hh24:mi') uitgevoerd,
            st.mld_statuses_omschrijving,
            ROUND (
               DECODE (mld.getactualuitvoer (m.mld_melding_key).eenheid,
                       'D',
                       mld.getactualuitvoer (m.mld_melding_key).tijdsduur,
                       NULL),
               2
            )
               doorlooptijd_werkdgn,
            ROUND (
               DECODE (
                  mld.getactualuitvoer (m.mld_melding_key).eenheid,
                  'U',
                  mld.getactualuitvoer (m.mld_melding_key).tijdsduur,
                  'D',
                  (mld.getactualuitvoer (m.mld_melding_key).tijdsduur
                   * (SELECT   COALESCE (e.fac_setting_pvalue,
                                         e.fac_setting_default)
                               - COALESCE (s.fac_setting_pvalue,
                                           s.fac_setting_default)
                        FROM   fac_setting s, fac_setting e
                       WHERE   s.fac_setting_name = 'fac_t_startofworkday'
                               AND e.fac_setting_name = 'fac_t_endofworkday')),
                  NULL
               ),
               2
            )
               doorlooptijd_werkuren
     FROM   mld_melding m,
            alg_locatie l,
            mld_stdmelding std,
            ins_tab_discipline d,
            ins_srtdiscipline sd,
            prs_v_perslid_fullnames p,
            mld_statuses st,
            (SELECT   fac_usrdata_omschr, aok.alg_onrgoed_key
               FROM   alg_onrgoedkenmerk aok,
                      alg_kenmerk ak,
                      fac_kenmerkdomein fc,
                      fac_usrdata fu,
                      fac_usrtab ft
              WHERE       ak.alg_kenmerk_key = 1001
                      AND alg_onrgoedkenmerk_verwijder IS NULL
                      AND aok.alg_kenmerk_key = ak.alg_kenmerk_key
                      AND ak.fac_kenmerkdomein_key = fc.fac_kenmerkdomein_key
                      AND ft.fac_usrtab_key = fc.fac_usrtab_key
                      AND fu.fac_usrtab_key = ft.fac_usrtab_key
                      AND alg_onrgoedkenmerk_waarde = fac_usrdata_key) own,
            (SELECT   fac_tracking_datum, fac_tracking_refkey
               FROM   fac_tracking t
              WHERE   t.fac_tracking_oms LIKE '%Afhandeling: (leeg) -->%') tr,
            (SELECT   fac_tracking_datum, fac_tracking_refkey
               FROM   fac_tracking t, fac_srtnotificatie srt
              WHERE   t.fac_srtnotificatie_key = srt.fac_srtnotificatie_key
                      AND srt.fac_srtnotificatie_code = 'MLDAFM') tr2
    WHERE       m.mld_alg_locatie_key = l.alg_locatie_key(+)
            AND m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_ins_discipline_key = d.ins_discipline_key
            AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key(+)
            AND m.mld_melding_key = tr.fac_tracking_refkey(+)
            AND m.mld_melding_key = tr2.fac_tracking_refkey(+)
            AND m.mld_melding_status = st.mld_statuses_key
            AND alg_locatie_key = own.alg_onrgoed_key(+)
            AND m.mld_melding_behandelaar_key = p.prs_perslid_key(+);

CREATE OR REPLACE VIEW CSUN_V_RAP_MELDING_SANQ
(
   MELDING,
   RL,
   DM,
   LOCATIE,
   RC,
   RC_TELEFOON,
   RC_MAIL,
   FCLT_D_DATUM_MELDING,
   TIJDSTIP_MELDING,
   MAAND_MELDING,
   MELDER,
   AARD_MELDING,
   OMSCHRIJVING,
   RUIMTE_CATEGORIE,
   RUIMTE_NUMMER,
   URGENTIEKLASSE,
   ONDERNOMEN_ACTIES,
   RESULTAAT,
   PREVENTIE,
   STATUS,
   DATUM_AFGEHANDELD,
   TIJDSTIP_AFGEHANDELD,
   AFHANDELTIJD_UREN,
   AFHANDELTIJD_DAGEN,
   BIJZONDERHEDEN
)
AS
   SELECT mld_melding_key,
          NULL rl,
          NULL dm,
          alg_locatie_omschrijving,
          NULL rc_sanquin,
          NULL telefoonnummer,
          NULL mailadres,
          TO_CHAR (mld_melding_datum, 'dd-mm-yyyy') datum,
          TO_CHAR (mld_melding_datum, 'hh24:mi') tijdstip,
          fac.safe_to_number (TO_CHAR (mld_melding_datum, 'mm')) maand,
          pf.prs_perslid_naam_full melder,
          std.mld_stdmelding_omschrijving aard,
          mld_melding_omschrijving omschrijving,
          NULL ruimte_categorie,
          NULL ruimte_nummer,
          mld_melding_spoed urgentieklasse,
          --  decode (mld_melding_spoed, null vereistehersteltijd,
          mld_melding_opmerking ondernomenacties,
          NULL resultaat,
          NULL preventie,
          mld_statuses_omschrijving status,
          TO_CHAR (einddatum.datum, 'dd-mm-yyyy') datumafgehandeld,
          TO_CHAR (einddatum.datum, 'hh24:mi') tijdstipafgehandeld,
          csu_count_WorkHours (mld_melding_datum, einddatum.datum)
             afgehandelduren,
          ROUND (
             csu_count_WorkHours (mld_melding_datum, einddatum.datum) / 9,
             2)
             afgehandelddagen,
          NULL bijzonderheden
     FROM mld_melding m,
          alg_locatie l,
          prs_v_perslid_fullnames_all pf,
          mld_stdmelding std,
          mld_statuses st,
          (SELECT fac_tracking_refkey, fac_tracking_datum datum
             FROM fac_tracking
            WHERE fac_srtnotificatie_key = 35) einddatum
    WHERE     m.mld_alg_locatie_key = l.alg_locatie_key
          AND m.prs_perslid_key = pf.prs_perslid_key
          AND m.mld_stdmelding_key = std.mld_stdmelding_key
          AND m.mld_melding_key = einddatum.fac_tracking_refkey(+)
          AND m.mld_melding_status = st.mld_statuses_key;


CREATE OR REPLACE FORCE VIEW CSUN_V_RAP_DISTRICTGEGEVENS
(
   FCLT_F_BUSINESSUNIT,
   DISTRICT,
   BBER
)
AS
   SELECT alg_regio_omschrijving,
          alg_district_omschrijving,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames pf
            WHERE pf.prs_perslid_key = p.prs_perslid_key)
             BBer
     FROM alg_district d,
          alg_regio r,
          prs_perslid p,
          alg_locatie l2,
          prs_v_perslidwerkplek_gegevens pwpg
    WHERE d.alg_regio_key = r.alg_regio_key
          AND pwpg.alg_locatie_key = l2.alg_locatie_key
          AND d.alg_district_key = l2.alg_district_key
          AND pwpg.prs_perslid_key = p.prs_perslid_key
          AND p.prs_srtperslid_key = 32;                               -- BBer

CREATE OR REPLACE VIEW csun_v_rap_locatiegegevens
(
   prjnr,
   fclt_f_regioomschrijving,
   fclt_f_districtomschrijving,
   locatiecode,
   locatieomschrijving,
   bezoekadres,
   postcode,
   plaats,
   fclt_f_client,
   bud,
   bb
)
AS
   SELECT (SELECT alg_onrgoedkenmerk_waarde
             FROM alg_onrgoedkenmerk ogk
            WHERE alg_kenmerk_key = 1040
              AND ogk.alg_onrgoed_key = l.alg_locatie_key)
             prjnr,
          alg_regio_omschrijving,
          alg_district_omschrijving,
          l.alg_locatie_code,
          l.alg_locatie_omschrijving,
          l.alg_locatie_adres,
          l.alg_locatie_postcode,
          l.alg_locatie_plaats,
          (SELECT u.fac_usrdata_omschr
             FROM fac_usrdata u, alg_onrgoedkenmerk ogk
            WHERE alg_kenmerk_key = 1000
              AND ogk.alg_onrgoed_key = l.alg_locatie_key
              AND fac.safe_to_number (alg_onrgoedkenmerk_waarde) =
                     u.fac_usrdata_key)
             client,
          (SELECT prs_perslid_naam_full
             FROM prs_v_perslid_fullnames pf, alg_onrgoedkenmerk ogk
            WHERE alg_kenmerk_key = 1006
              AND ogk.alg_onrgoed_key = l.alg_locatie_key
              AND fac.safe_to_number (alg_onrgoedkenmerk_waarde) =
                     pf.prs_perslid_key)
             bud,
      (SELECT max(prs_perslid_naam_full) || DECODE (count(p.prs_perslid_key), 1, '', '*')
        FROM prs_v_perslid_fullnames pf,
             prs_perslid p,
             alg_locatie l2,
             prs_v_perslidwerkplek_gegevens pwpg
       WHERE     pwpg.alg_locatie_key = l2.alg_locatie_key
             AND l.alg_district_key = l2.alg_district_key
             AND pwpg.prs_perslid_key = p.prs_perslid_key
             AND p.prs_srtperslid_key = 32                                   -- BBer
             AND p.prs_perslid_key = pf.prs_perslid_key) bb
     FROM alg_locatie l, alg_district d, alg_regio r
    WHERE l.alg_district_key = d.alg_district_key
      AND d.alg_regio_key = r.alg_regio_key
      AND alg_locatie_verwijder IS NULL;


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

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

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

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

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

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

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

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

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

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


CREATE OR REPLACE PROCEDURE csun_import_project (p_import_key   IN NUMBER)
AS
   c_fielddelimitor          VARCHAR2 (1) := ',';
   v_newline                 VARCHAR2 (1000);                    -- Input line
   v_errormsg                VARCHAR2 (1000);
   v_error_hint              VARCHAR2 (1000);
   oracle_err_num            NUMBER;
   oracle_err_mes            VARCHAR2 (200);
   header_is_valid           NUMBER;
   v_count                   NUMBER;
   v_error                   NUMBER (1);
   v_aanduiding              VARCHAR2 (200);
   -- De importvelden:
   v_accountcode             VARCHAR2 (255);                             -- 14
   v_accountnaam             VARCHAR2 (255);                             -- 60
   v_project                 VARCHAR2 (255);                             -- 8

   v_locatie_omschrijving    VARCHAR2 (255);                             -- 30
   v_locatie_adres           VARCHAR2 (255);                             -- 35
   v_locatie_postcode        VARCHAR2 (255);                             -- 12
   v_locatie_plaats          VARCHAR2 (255);                             -- 30
   v_dm                      VARCHAR2 (255);                             -- 100
   v_voornaam                VARCHAR2 (255);                             -- 30
   v_voorletters             VARCHAR2 (255);                             -- 10
   v_tussenvoegsels          VARCHAR2 (255);                             -- 15
   v_achternaam              VARCHAR2 (255);                             -- 60
   v_bu                      VARCHAR2 (255);
   v_vervallen               VARCHAR2 (255);
   v_rayonl_persnr           VARCHAR2 (255);                             -- 16
   v_rayonl_naam             VARCHAR2 (255);                             -- 60
   v_kenmerk1                VARCHAR2 (255);
   v_kenmerk2                VARCHAR2 (255);
   v_kenmerk3                VARCHAR2 (255);
   v_kenmerk4                VARCHAR2 (255);
   v_kenmerk5                VARCHAR2 (255);


   CURSOR c1
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   v_error_hint := 'Verwijderen oude records';
   -- Eerst opruiming
   DELETE
     FROM imp_log l
    WHERE EXISTS
          (SELECT i.fac_import_key
             FROM fac_import i, fac_import i2
            WHERE l.fac_import_key = i.fac_import_key
              AND i.fac_import_app_key = i2.fac_import_app_key
              AND i2.fac_import_key = p_import_key)
      AND l.fac_import_key <> p_import_key;

   DELETE FROM csun_imp_project;

   header_is_valid := 0;
   v_count := 0;
   COMMIT;

   FOR rec1 IN c1
   LOOP
      BEGIN
         v_error_hint := 'Fout FETCH te importeren rij';
         v_newline := rec1.fac_imp_file_line;
         v_error_hint := 'Fout opvragen te importeren rij';
         v_aanduiding := '';
         v_error := 0;
         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_accountcode);              --  FPACCC
         fac.imp_getfield (v_newline, c_fielddelimitor, v_accountnaam);              --  FPACCO
         fac.imp_getfield (v_newline, c_fielddelimitor, v_project);                  --  FPPRJ#
         fac.imp_getfield (v_newline, c_fielddelimitor, v_bu);                       --  FPREGO
         fac.imp_getfield (v_newline, c_fielddelimitor, v_dm);                       --  FPDISC
         fac.imp_getfield (v_newline, c_fielddelimitor, v_voorletters);              --  FPDIVL
         fac.imp_getfield (v_newline, c_fielddelimitor, v_voornaam);                 --  FPDIVN
         fac.imp_getfield (v_newline, c_fielddelimitor, v_tussenvoegsels);           --  FPDIVV
         fac.imp_getfield (v_newline, c_fielddelimitor, v_achternaam);               --  FPDINM
         fac.imp_getfield (v_newline, c_fielddelimitor, v_locatie_omschrijving);     --  FPLOCO
         fac.imp_getfield (v_newline, c_fielddelimitor, v_locatie_adres);            --  FPADBA
         fac.imp_getfield (v_newline, c_fielddelimitor, v_locatie_postcode);         --  FPPKBA
         fac.imp_getfield (v_newline, c_fielddelimitor, v_locatie_plaats);           --  FPPLBA
         fac.imp_getfield (v_newline, c_fielddelimitor, v_vervallen);                --  FPVERV
         fac.imp_getfield (v_newline, c_fielddelimitor, v_rayonl_persnr);            --  FPGEOK
         fac.imp_getfield (v_newline, c_fielddelimitor, v_rayonl_naam);              --  FPRLNM
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kenmerk1);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kenmerk2);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kenmerk3);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kenmerk4);
         fac.imp_getfield (v_newline, c_fielddelimitor, v_kenmerk5);

         v_aanduiding :=
            v_project || '|' || v_locatie_omschrijving || '| ';

         IF (header_is_valid = 0)
         THEN
            IF UPPER (v_accountcode) = 'FPACCC'
           AND UPPER (v_project) = 'FPPRJ#'
           AND UPPER (v_achternaam) = 'FPDINM'
           AND UPPER (v_bu) = 'FPREGO'
           AND UPPER (v_locatie_omschrijving) = 'FPLOCO'
           AND UPPER (v_locatie_plaats) = 'FPPLBA'
            THEN
               header_is_valid := 1;
            ELSE
               IF rec1.fac_imp_file_index = 1 THEN
                  fac.imp_writelog (p_import_key,
                  'I',
                  'Header FPACCC:'||v_accountcode||'-FPPRJ#:'||v_project||'-FPDINM:'||v_achternaam||'-FPREGO:'||v_bu||'-FPLOCO:'||v_locatie_omschrijving||'-FPPLBA:'||v_locatie_plaats,
                  'Geen geldige headerregel aanwezig');
               END IF;
            END IF;
         ELSE
            -- Insert geformatteerde import record
            IF v_error = 0
            THEN

                v_error_hint :=
                      'Fout bij toevoegen te impoteren locatie ['
                   || v_project
                   || ']';

                INSERT INTO csun_imp_project (accountcode,
                                              accountnaam,
                                              project,
                                              vervallen,
                                              bu,
                                              dm,
                                              voornaam,
                                              voorletters,
                                              tussenvoegsels,
                                              achternaam,
                                              code,
                                              omschrijving,
                                              adres,
                                              postcode,
                                              woonplaats,
                                              rayonl_persnr,
                                              rayonl_naam,
                                              kenmerk1,
                                              kenmerk2,
                                              kenmerk3,
                                              kenmerk4,
                                              kenmerk5)
                    VALUES (SUBSTR(TRIM(v_accountcode),1,14),
                            SUBSTR(TRIM(v_accountnaam),1,60),
                            SUBSTR(TRIM(v_project),1,14),
                            SUBSTR(TRIM(v_vervallen),1,1),
                            SUBSTR(TRIM(v_bu),1,14),
                            TO_NUMBER(TRIM(v_dm)),
                            SUBSTR(TRIM(v_voornaam),1,14),
                            SUBSTR(TRIM(v_voorletters),1,14),
                            SUBSTR(TRIM(v_tussenvoegsels),1,14),
                            SUBSTR(TRIM(v_achternaam),1,60),
                            NULL,                     -- Wordt niet meer gebruikt.
                            SUBSTR(TRIM(v_locatie_omschrijving),1,60),
                            SUBSTR(TRIM(v_locatie_adres),1,35),
                            SUBSTR(TRIM(v_locatie_postcode),1,9),
                            SUBSTR(TRIM(v_locatie_plaats),1,35),
                            SUBSTR(TRIM(v_rayonl_persnr),1,16),
                            SUBSTR(TRIM(v_rayonl_naam),1,60),
                            v_kenmerk1,
                            v_kenmerk2,
                            v_kenmerk3,
                            v_kenmerk4,
                            v_kenmerk5);
                v_count := v_count + 1;
            END IF;
         END IF;
      END;
   END LOOP;

   IF (header_is_valid = 0)
   THEN
      fac.imp_writelog (p_import_key,
                        'E',
                        v_aanduiding || 'Ongeldig importbestand',
                        'Geen geldige headerregel aanwezig');
   ELSE
      fac.imp_writelog (
         p_import_key,
         'S',
         'Locaties: aantal ingelezen regels: ' || TO_CHAR (v_count),
         '');
   END IF;

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


CREATE OR REPLACE PROCEDURE csun_update_project (p_import_key IN NUMBER)
IS
   v_errormsg                 VARCHAR2 (1000);
   v_error_hint                VARCHAR2 (1000);
   oracle_err_num             NUMBER;
   oracle_err_mes             VARCHAR2 (1000);
   v_aanduiding               VARCHAR2 (200);
   v_count                    NUMBER (10);
   v_ongeldig                 NUMBER (1);
   v_count_update             NUMBER (10);
   v_count_tot                NUMBER (10);

   -- De importvelden:
   v_locatie_key              NUMBER (10);
   v_bud_key                  NUMBER (10);
   v_account_key              NUMBER (10);
   v_district_key             NUMBER (10);
   v_perslid_key              NUMBER (10);
   v_afdeling_key             NUMBER (10);
   v_tussenv                  VARCHAR2 (15);
   v_achternaam               VARCHAR2 (60);

   CURSOR c_account
   IS
       SELECT distinct accountcode, accountnaam
         FROM csun_imp_project
        WHERE COALESCE(UPPER(vervallen), 'N') <> 'J';

   CURSOR c_district (c_accountcode IN VARCHAR2)
   IS
      SELECT distinct dm, voornaam, voorletters, tussenvoegsels, achternaam
        FROM csun_imp_project
       WHERE accountcode = c_accountcode
         AND COALESCE(UPPER(vervallen), 'N') <> 'J';

   CURSOR c (c_accountcode IN VARCHAR2, c_dm IN NUMBER)
   IS
      SELECT * FROM csun_imp_project
       WHERE accountcode = c_accountcode
         AND dm = c_dm
         AND COALESCE(UPPER(vervallen), 'N') <> 'J';

   CURSOR c_verv (c_accountcode IN VARCHAR2)
   IS
      SELECT alg_locatie_key, fac_usrdata_code
        FROM alg_locatie l,
             alg_onrgoedkenmerk aogka,
             alg_onrgoedkenmerk aogkp,
             fac_usrdata u
       WHERE aogka.alg_kenmerk_key = 1000                                  -- client
         AND l.alg_locatie_key = aogka.alg_onrgoed_key
         AND fac.safe_to_number (aogka.alg_onrgoedkenmerk_waarde) =
                u.fac_usrdata_key
         AND aogkp.alg_kenmerk_key = 1040                           -- projectnummer
         AND l.alg_locatie_key = aogkp.alg_onrgoed_key
         AND NOT EXISTS
                (SELECT project
                   FROM csun_imp_project
                  WHERE project = aogkp.alg_onrgoedkenmerk_waarde
                    AND COALESCE (UPPER (vervallen), 'N') = 'N')
         AND NOT EXISTS
                (SELECT alg_onrgoedkenmerk_waarde
                   FROM alg_onrgoedkenmerk aogkv
                  WHERE aogkv.alg_kenmerk_key = 1160                  -- vervaldatum
                    AND l.alg_locatie_key = aogkv.alg_onrgoed_key);

   CURSOR c_del
   IS
      SELECT alg_locatie_key, alg_locatie_code
        FROM alg_locatie l, alg_onrgoedkenmerk aogk
       WHERE alg_locatie_verwijder IS NULL
         AND aogk.alg_kenmerk_key = 1160                              -- vervaldatum
         AND l.alg_locatie_key = aogk.alg_onrgoed_key
         AND fac.safe_to_date(aogk.alg_onrgoedkenmerk_waarde, 'dd-mm-yyyy') < SYSDATE - 10;

    CURSOR c_rayonl
    IS
        SELECT DISTINCT
               bu,
               rayonl_persnr,
               TRIM (SUBSTR (rayonl_naam, 1, INSTR (rayonl_naam, ' ')))
                   voornaam,
               TRIM (SUBSTR (rayonl_naam, INSTR (rayonl_naam, ' '), 60))
                   achternaam,
               rayonl_naam
          FROM csun_imp_project
         WHERE rayonl_naam IS NOT NULL;


   FUNCTION get_alg_kenmerk (p_kenmerk_key IN NUMBER, p_onrgoed_key IN NUMBER) RETURN VARCHAR2
   AS
      v_waarde VARCHAR2(255);
   BEGIN
      SELECT alg_onrgoedkenmerk_waarde
        INTO v_waarde
        FROM alg_onrgoedkenmerk
       WHERE alg_kenmerk_key = p_kenmerk_key
         AND alg_onrgoed_key = p_onrgoed_key;

      RETURN v_waarde;

   EXCEPTION WHEN NO_DATA_FOUND
   THEN
      RETURN NULL;
   END;
BEGIN
   -- v_count_update := 0;
   -- v_count_tot := 0;
   v_error_hint := 'Start met doorlopen accounts';


   FOR rec_a IN c_account
   LOOP
      BEGIN
         v_error_hint := 'Ophalen data voor accountcode: ' || rec_a.accountcode;
         BEGIN
            SELECT fac_usrdata_key
              INTO v_account_key
              FROM fac_usrdata
             WHERE fac_usrtab_key = 1  -- Eigentabel met client
               AND fac_usrdata_code = rec_a.accountcode;
         EXCEPTION WHEN NO_DATA_FOUND
         THEN
            INSERT INTO fac_usrdata
                   ( fac_usrtab_key, fac_usrdata_code, fac_usrdata_omschr )
                   VALUES
                   ( 1, rec_a.accountcode, rec_a.accountnaam)
                   RETURNING fac_usrdata_key INTO v_account_key;
         END;

         FOR rec_d IN c_district(rec_a.accountcode)
         LOOP
            BEGIN
               v_error_hint := 'Ophalen data voor dm: ' || rec_d.dm || ' Naam:' || rec_d.achternaam;

               BEGIN
                  SELECT alg_onrgoed_key
                    INTO v_district_key
                    FROM prs_perslid p,
                         alg_onrgoedkenmerk aog,
                         alg_district d
                   WHERE p.prs_perslid_naam = rec_d.achternaam
                     AND p.prs_perslid_voorletters = rec_d.voorletters
                     AND COALESCE(p.prs_perslid_tussenvoegsel, '.') = COALESCE(rec_d.tussenvoegsels, '.')
                     AND alg_kenmerk_key = 1021  -- key van districtmanager
                     AND prs_perslid_key = fac.safe_to_number(alg_onrgoedkenmerk_waarde)
                     AND aog.alg_onrgoed_key = d.alg_district_key
                     AND d.alg_district_verwijder IS NULL
                     AND aog.alg_onrgoedkenmerk_verwijder IS NULL;

               EXCEPTION WHEN NO_DATA_FOUND THEN
                  fac.imp_writelog (
                     p_import_key,
                     'E',
                     'Import locaties afgebroken, distrinctmanager niet gevonden ( district mngr:' || rec_d.dm || '(' || rec_d.voorletters || ' ' || rec_d.tussenvoegsels || ' ' || rec_d.achternaam || ')'  || '- account:' || rec_a.accountcode || '-' || rec_a.accountnaam ||  ')',
                     v_error_hint);
               END;

               IF v_district_key IS NOT NULL THEN
                  FOR rec IN c(rec_a.accountcode, rec_d.dm)
                  LOOP
                     BEGIN
                        v_locatie_key := NULL;
                        -- Get BUD reference
                        v_error_hint := 'Bepalen bb referentie: ' || rec.dm;
                        v_bud_key := get_alg_kenmerk (1060, v_district_key);

                        BEGIN
                           v_error_hint := 'Kijk of de locatie al bestaat: ' || rec.project;
                           SELECT alg_onrgoed_key
                             INTO v_locatie_key
                             FROM alg_onrgoedkenmerk, alg_locatie
                            WHERE alg_kenmerk_key = 1040  -- projectnummer
                              AND alg_onrgoedkenmerk_waarde = rec.project
                              AND alg_onrgoed_key = alg_locatie_key
                              AND alg_locatie_verwijder IS NULL;

                        EXCEPTION WHEN NO_DATA_FOUND
                        THEN
                           -- Kijk of de locatieomschrijving al voorkomt. Als dat het geval is mogen we de
                           -- nieuwe locatie niet aanmaken.
                           SELECT count(*)
                             INTO v_count
                             FROM alg_locatie
                            WHERE alg_locatie_upper = UPPER(SUBSTR(rec.omschrijving,1,50))
                              AND alg_locatie_verwijder IS NULL;

                           IF v_count = 0 THEN

                              INSERT INTO alg_locatie (alg_district_key, alg_locatie_code, alg_locatie_omschrijving)
                              VALUES (v_district_key, 'P' || rec.project, SUBSTR(rec.omschrijving,1,50))
                              RETURNING alg_locatie_key
                              INTO v_locatie_key;
                           ELSE
                              fac.imp_writelog (
                                 p_import_key,
                                 'E',
                                 'Import locaties afgebroken, locatie omschrijving bestaat al ( district mngr:' || rec_d.dm || '(' || rec_d.voorletters || ' ' || rec_d.tussenvoegsels || ' ' || rec_d.achternaam || ')'  || '- account:' || rec_a.accountcode || '-' || rec_a.accountnaam || ' Projectnr: ' || rec.project || ')',
                                 'Locatie met omschrijving: ' || rec.omschrijving || ' bestaat al');
                           END IF;
                        END;

                        IF v_locatie_key IS NOT NULL THEN
                           UPDATE alg_locatie
                              SET alg_locatie_omschrijving = SUBSTR(rec.omschrijving,1,50),
                                  alg_district_key = v_district_key,
                                  alg_locatie_adres = rec.adres,
                                  alg_locatie_postcode = rec.postcode,
                                  alg_locatie_plaats = rec.woonplaats
                            WHERE alg_locatie_key = v_locatie_key;

                           csun_set_kenmerk ('ALG', 1006, v_locatie_key, v_bud_key, 0);
                           csun_set_kenmerk ('ALG', 1000, v_locatie_key, v_account_key, 0);
                           csun_set_kenmerk ('ALG', 1040, v_locatie_key, rec.project, 0);
                           -- reanimeer verwijderde locaties
                           csun_set_kenmerk ('ALG', 1160, v_locatie_key, NULL, 0);
                        END IF;

                     EXCEPTION WHEN OTHERS THEN
                        oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
                        v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
                        fac.imp_writelog (
                           p_import_key,
                           'E',
                           'Import locaties afgebroken ( district mngr:' || rec_d.dm || '(' || rec_d.voorletters || ' ' || rec_d.tussenvoegsels || ' ' || rec_d.achternaam || ')'  || '- account:' || rec_a.accountcode || '-' || rec_a.accountnaam || ' Projectnr: ' || rec.project || '):' ||  v_errormsg,
                           v_error_hint);

                     END;
                  END LOOP;
               END IF;

            EXCEPTION WHEN OTHERS THEN
               oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
               v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
               fac.imp_writelog (
                  p_import_key,
                  'E',
                  'Import locaties afgebroken ( district mngr:' || rec_d.dm || '(' || rec_d.voorletters || ' ' || rec_d.tussenvoegsels || ' ' || rec_d.achternaam || ')'  || '- account:' || rec_a.accountcode || '-' || rec_a.accountnaam ||  '):' ||  v_errormsg,
                  v_error_hint);
            END;
         END LOOP;

      FOR rec_verv IN c_verv(rec_a.accountcode)
      LOOP
         BEGIN
            -- zet de vervaldatum bij de locatie zodat deze na 6 maanden verwijderd kan worden.
            csun_set_kenmerk ('ALG', 1160, rec_verv.alg_locatie_key, TO_CHAR(SYSDATE, 'dd-mm-yyyy'), 0);
         END;
      END LOOP;

      EXCEPTION WHEN OTHERS THEN
         oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
         v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
         fac.imp_writelog (
            p_import_key,
            'E',
            'Import locaties afgebroken (' || rec_a.accountcode ||  '):' ||  v_errormsg,
            v_error_hint);

      END;
   END LOOP;

   csun_export_set_werkplek (p_import_key);

   FOR rec_del IN c_del
   LOOP
      BEGIN
         v_error_hint := 'Verwijderen gebouwen - Locatie_code: ' || rec_del.alg_locatie_code;
         UPDATE alg_gebouw SET alg_gebouw_verwijder = SYSDATE WHERE alg_locatie_key = rec_del.alg_locatie_key;

         v_error_hint := 'Verwijderen locatie - Locatie_code: ' || rec_del.alg_locatie_code;
         UPDATE alg_locatie SET alg_locatie_verwijder = SYSDATE WHERE alg_locatie_key = rec_del.alg_locatie_key;

      EXCEPTION WHEN OTHERS THEN
         oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
         v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
         fac.imp_writelog (
            p_import_key,
            'E',
            'Verwijderen locaties:' || v_errormsg,
            v_error_hint);
      END;
   END LOOP;


   -- voeg de rayonleiders toe als ze nog niet bestaan
   FOR rec_ray IN c_rayonl
   LOOP
       BEGIN
           -- Een rayonleider kan meerdere geo-kodes hebben. Het personeelsnummer is dan gevuld met meerdere codes.
           SELECT MAX(prs_perslid_key)
             INTO v_perslid_key
             FROM prs_perslid
            WHERE     prs_perslid_verwijder IS NULL
                  AND prs_perslid_nr LIKE '%' || rec_ray.rayonl_persnr || '%';

           IF v_perslid_key IS NULL
           THEN
               -- nieuwe rayonleider aanmaken tijdelijk onder CSU NA.
               INSERT INTO prs_perslid (prs_srtperslid_key,
                                        prs_afdeling_key,
                                        prs_perslid_nr,
                                        prs_perslid_naam,
                                        prs_perslid_voornaam)
                    VALUES (50,
                            1,
                            rec_ray.rayonl_persnr,
                            rec_ray.achternaam,
                            rec_ray.voornaam)
                 RETURNING prs_perslid_key
                      INTO v_perslid_key;

               v_achternaam := rec_ray.achternaam;
               v_tussenv := '';

               IF INSTR (v_achternaam, 'van der ') = 1 THEN v_achternaam := SUBSTR (v_achternaam, 9); v_tussenv := 'van der'; END IF;
               IF INSTR (v_achternaam, 'van den ') = 1 THEN v_achternaam := SUBSTR (v_achternaam, 9); v_tussenv := 'van den'; END IF;
               IF INSTR (v_achternaam, 'van de ') = 1  THEN v_achternaam := SUBSTR (v_achternaam, 8); v_tussenv := 'van de';  END IF;
               IF INSTR (v_achternaam, 'van ') = 1     THEN v_achternaam := SUBSTR (v_achternaam, 5); v_tussenv := 'van';     END IF;
               IF INSTR (v_achternaam, 'de ') = 1      THEN v_achternaam := SUBSTR (v_achternaam, 4); v_tussenv := 'de';      END IF;

               UPDATE prs_perslid
                  SET prs_perslid_naam = v_achternaam,
                      prs_perslid_tussenvoegsel = v_tussenv
                WHERE prs_perslid_key = v_perslid_key;
           END IF;
       END;

       BEGIN
           -- Eigen tabel met key 61 wordt gebruikt om de mapping tussen business unit en CSU afdeling vast te leggen.
           SELECT prs_afdeling_key
             INTO v_afdeling_key
             FROM prs_afdeling a, fac_usrdata ud
            WHERE     ud.fac_usrtab_key = 61
                  AND prs_afdeling_omschrijving =
                      'CSU ' || fac_usrdata_omschr
                  AND fac_usrdata_code = rec_ray.bu;

           UPDATE prs_perslid
              SET prs_afdeling_key = v_afdeling_key
            WHERE prs_perslid_key = v_perslid_key;
       EXCEPTION
           WHEN NO_DATA_FOUND
           THEN
              fac.imp_writelog (p_import_key,
                                'E',
                                'Afdeling van Rayonleider kan niet gevonden worden ( Rayonleider:' || rec_ray.voornaam || ' - ' || rec_ray.achternaam ||   ')',
                                '');
       END;
   END LOOP;

   -- Geef de rayonleiders een werkplek als ze deze nog niet hebben.
   INSERT INTO prs_perslidwerkplek (prs_perslid_key, prs_perslidwerkplek_bezetting, prs_werkplek_key)
   SELECT p.prs_perslid_key, 100, wpg.prs_werkplek_key
     FROM csun_imp_project i,
          alg_locatie l,
          prs_perslid p,
          prs_v_werkplek_gegevens  wpg
    WHERE     p.prs_perslid_nr LIKE '%' || i.rayonl_persnr || '%'
          AND 'P' || i.PROJECT = l.alg_locatie_code
          AND l.alg_locatie_key = wpg.alg_locatie_key
          AND wpg.alg_ruimte_nr = '-'
          AND prs_srtperslid_key = 50                              -- rayonleider
          AND NOT EXISTS
                  (SELECT *
                     FROM prs_v_perslidwerkplek_gegevens pwpg
                    WHERE     pwpg.prs_perslid_key = p.prs_perslid_key
                          AND pwpg.alg_locatie_key = l.alg_locatie_key);


   -- Verwijder de werkplek van een rayonleider als deze niet meer gekoppeld is.
   DELETE prs_perslidwerkplek
    WHERE prs_perslidwerkplek_key IN
              (SELECT prs_perslidwerkplek_key
                 FROM prs_v_perslidwerkplek_gegevens pwpg, prs_perslid p, alg_locatie l
                WHERE     pwpg.prs_perslid_key = p.prs_perslid_key
                      AND p.prs_srtperslid_key = 50  -- Rayonleider
                      AND l.alg_locatie_key = pwpg.alg_locatie_key
                      AND l.alg_locatie_code LIKE 'P%'
                      AND NOT EXISTS
                              (SELECT i.project
                                 FROM csun_imp_project i, alg_locatie l
                                WHERE     p.prs_perslid_nr LIKE '%' || i.rayonl_persnr || '%'
                                      AND 'P' || i.project = l.alg_locatie_code
                                      AND l.alg_locatie_key =
                                          pwpg.alg_locatie_key
                                      AND pwpg.alg_ruimte_nr = '-'));

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oracle_err_mes := SUBSTR (SQLERRM, 1, 150);
      v_errormsg := '(ORACLE error ' || oracle_err_mes || ')';
      fac.imp_writelog (
         p_import_key,
         'E',
         'Fout tijdens importeren van onroerend goed (locatie en gebouw) ',
         v_errormsg);
END csun_update_project;
/

-- rapport om de ingelezen gegevens op te zoeken.
CREATE OR REPLACE VIEW csun_v_rap_imp_project
(
   accountcode,
   accountnaam,
   project,
   vervallen,
   bu,
   dm,
   voornaam,
   voorletters,
   tussenvoegsels,
   achternaam,
   code,
   omschrijving,
   adres,
   postcode,
   woonplaats
)
AS
   SELECT accountcode,
          accountnaam,
          project,
          vervallen,
          bu,
          dm,
          voornaam,
          voorletters,
          tussenvoegsels,
          achternaam,
          code,
          omschrijving,
          adres,
          postcode,
          woonplaats
     FROM csun_imp_project;

--
-- Procedures en functies om de doorlooptijd van meldingen te bepalen
--
CREATE OR REPLACE FUNCTION csu_find_next_workingday (pdate1 IN DATE)
   RETURN DATE
IS
   result          DATE;
   v_vrije_dagen   NUMBER;
   v_date          DATE;
BEGIN
   v_date := pdate1;

   IF pdate1 < (TRUNC (v_date) + 8 / 24)
   THEN
      v_date := TRUNC (v_date) + 8 / 24;
   END IF;

   IF pdate1 > (TRUNC (v_date) + 17 / 24)
   THEN
      v_date := TRUNC (v_date) + 17 / 24;
   END IF;

   IF TO_CHAR (v_date, 'd') IN (1, 7)
   THEN
      result := csu_find_next_workingday (TRUNC (v_date) + 1 + 8 / 24);
   ELSE
      SELECT COUNT ( * )
        INTO v_vrije_dagen
        FROM mld_vrije_dagen
       WHERE mld_vrije_dagen_datum = TRUNC (v_date);

      IF v_vrije_dagen = 1
      THEN
         result := csu_find_next_workingday (TRUNC (v_date) + 1 + 8 / 24);
      ELSE
         result := v_date;
      END IF;
   END IF;

   RETURN result;
END;
/

CREATE OR REPLACE FUNCTION csu_find_prev_workingday (pdate1 IN DATE)
   RETURN DATE
IS
   result          DATE;
   v_vrije_dagen   NUMBER;
   v_date          DATE;
BEGIN
   v_date := pdate1;

   IF pdate1 < (TRUNC (v_date) + 8 / 24)
   THEN
      v_date := TRUNC (v_date) + 8 / 24;
   END IF;

   IF pdate1 > (TRUNC (v_date) + 17 / 24)
   THEN
      v_date := TRUNC (v_date) + 17 / 24;
   END IF;

   IF TO_CHAR (v_date, 'd') IN (1, 7)
   THEN
      result := csu_find_prev_workingday (TRUNC (v_date) - 1 + 17 / 24);
   ELSE
      SELECT COUNT ( * )
        INTO v_vrije_dagen
        FROM mld_vrije_dagen
       WHERE mld_vrije_dagen_datum = TRUNC (v_date);

      IF v_vrije_dagen = 1
      THEN
         result := csu_find_prev_workingday (TRUNC (v_date) - 1 + 17 / 24);
      ELSE
         result := v_date;
      END IF;
   END IF;

   RETURN result;
END;
/

CREATE OR REPLACE FUNCTION csu_count_WorkHours (pdate_from   IN DATE,
                                                pdate_to     IN DATE)
   RETURN NUMBER
IS
   eikdag         NUMBER;
   v_date_from    DATE;
   v_date_to      DATE;
   v_week         NUMBER;
   v_mod          NUMBER;
   v_holidays     NUMBER;
   v_beginuur     NUMBER (5, 2);
   v_einduur      NUMBER (5, 2);
   v_correction   NUMBER;
BEGIN
   -- Dit is een maandag, is dat volgens de huidige territory dag 2?
   SELECT TO_NUMBER (TO_CHAR (TO_DATE ('01-01-2007', 'DD-MM-YYYY'), 'D'))
     INTO eikdag
     FROM DUAL;

   IF eikdag <> 2
   THEN
      -- WE MOETEN met zondag=1 werken (geen nieuwe eis, wel duidelijker probleem)
      raise_application_error (-20000, 'Facilitor: Invalid NLS_TERRITORY');
   END IF;

   v_date_from := csu_find_prev_workingday (pdate_from);
   v_date_to := csu_find_next_workingday (pdate_to);

   DBMS_OUTPUT.put_line (
      'v_date_from:' || v_date_from || ' v_date_to:' || v_date_to);

   -- Determine whole weeks (v_week) and remaining days (v_mod) between FROM and TO
   v_week := TRUNC ( (TRUNC (v_date_to) - TRUNC (v_date_from)) / 7);
   v_mod := MOD ( (TRUNC (v_date_to) - TRUNC (v_date_from)), 7);

   -- Determine the registered holidays between FROM and TO
   SELECT COUNT ( * )
     INTO v_holidays
     FROM MLD_VRIJE_DAGEN
    WHERE MLD_VRIJE_DAGEN_DATUM BETWEEN v_date_from AND v_date_to;

   v_beginuur := (TRUNC (v_date_from, 'MI') - TRUNC (v_date_from)) * 24;
   v_einduur := (TRUNC (v_date_to, 'MI') - TRUNC (v_date_to)) * 24;

   DBMS_OUTPUT.put_line (
      'v_beginuur:' || v_beginuur || ' v_einduur:' || v_einduur);

   IF v_einduur - v_beginuur > 0
   THEN
      v_correction := v_einduur - v_beginuur;
   ELSE
      v_correction := v_einduur - v_beginuur;
   END IF;

   DBMS_OUTPUT.put_line(   'v_week:'
                        || v_week
                        || ' v_mod:'
                        || v_mod
                        || ' v_holidays:'
                        || v_holidays
                        || ' v_correction: '
                        || v_correction);
   RETURN 9 * ( (5 * v_week) + v_mod - v_holidays) + v_correction;
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      RETURN NULL;
END;
/


CREATE OR REPLACE PROCEDURE csun_export_set_werkplek (p_import_key IN NUMBER)
AS
BEGIN
-- toevoegen gebouwen
INSERT INTO alg_gebouw (alg_locatie_key,
                        alg_srtgebouw_key,
                        alg_gebouw_naam,
                        alg_gebouw_code)
   SELECT alg_locatie_key,
          40,
          'Onbekend',
          'O'
     FROM alg_locatie l
    WHERE NOT EXISTS (SELECT alg_locatie_key
                        FROM alg_gebouw g
                       WHERE g.alg_locatie_key = l.alg_locatie_key)
          AND alg_locatie_omschrijving NOT LIKE 'CSU%';

-- toevoegen verdiepingen
INSERT INTO alg_verdieping (alg_gebouw_key,
                            alg_verdieping_omschrijving,
                            alg_verdieping_volgnr,
                            alg_verdieping_code)
   SELECT alg_gebouw_key,
          'Onbekend',
          1,
          'O'
     FROM alg_gebouw g
    WHERE NOT EXISTS (SELECT alg_gebouw_key
                        FROM alg_verdieping v
                       WHERE v.alg_gebouw_key = g.alg_gebouw_key);

-- toevoegen ruimten
INSERT INTO alg_ruimte (alg_verdieping_key,
                        alg_ruimte_nr,
                        alg_srtruimte_key,
                        alg_ruimte_omschrijving)
   SELECT alg_verdieping_key,
          '-',
          1,
          'Onbekend'
     FROM alg_v_aanwezigverdieping v
    WHERE NOT EXISTS (SELECT alg_verdieping_key
                        FROM alg_ruimte r
                       WHERE r.alg_verdieping_key = v.alg_verdieping_key);

-- toevoegen werkplekken
INSERT INTO prs_werkplek (prs_werkplek_volgnr, prs_werkplek_virtueel, prs_alg_ruimte_key)  -- Werkplek virtueel (zie ticket 58018)
   SELECT 1, 1, alg_ruimte_key
     FROM alg_v_aanwezigruimte r
    WHERE NOT EXISTS
             (SELECT wp.prs_alg_ruimte_key
                FROM prs_werkplek wp
               WHERE r.alg_ruimte_key = wp.prs_alg_ruimte_key
                     AND prs_werkplek_volgnr = 1);

-- toevoegen prs_perslidwerkplekken
INSERT INTO prs_perslidwerkplek (prs_perslid_key, prs_perslidwerkplek_bezetting, prs_werkplek_key)
   SELECT prs_perslid_key, 100, prs_werkplek_key
     FROM prs_v_aanwezigperslid p,
          prs_afdeling a,
          alg_onrgoedkenmerk aogk,
          fac_usrdata ud,
          prs_v_werkplek_gegevens wpg,
          alg_locatie l
    WHERE p.prs_afdeling_key = a.prs_afdeling_key
          AND a.prs_afdeling_verwijder IS NULL
          AND (a.prs_afdeling_naam IN
                   ('Adecco',
                    'Manpower',
                    'Luba',
                    'Servex',
                    'USG PA',
                    'USG People',
                    'NS Retail',
                    'DJI')
          AND (EXISTS
                (SELECT gg.prs_perslid_key
                   FROM fac_gebruikersgroep gg
                  WHERE fac_groep_key = 61
                        AND gg.prs_perslid_key = p.prs_perslid_key))
                OR
                (     a.prs_afdeling_naam = 'Kentalis'
                  AND EXISTS (SELECT alg_onrgoedkenmerk_key
                                FROM alg_onrgoedkenmerk aog,
                                     prs_kenmerklink kl
                               WHERE ((aog.alg_onrgoedkenmerk_waarde = kl.prs_kenmerklink_waarde
                                       AND aog.alg_kenmerk_key = 1123  -- klantspecifieke regioindeling
                                       AND aog.alg_onrgoed_key = wpg.alg_locatie_key)
                                      OR (kl.prs_kenmerklink_waarde = 'alles'))
                                     AND kl.prs_link_key = p.prs_perslid_key
                                     AND kl.prs_kenmerk_key = 1060))) -- klantspecifieke regioautorisatie)
          AND fac.safe_to_number (aogk.alg_onrgoedkenmerk_waarde) =
                fac_usrdata_key
          AND aogk.alg_kenmerk_key = 1000
          AND aogk.alg_onrgoed_key = wpg.alg_locatie_key
          AND wpg.prs_werkplek_volgnr = 1
          AND UPPER (prs_afdeling_naam) LIKE UPPER (fac_usrdata_omschr) || '%'
          AND fac_usrtab_key = 1
          AND l.alg_locatie_key = wpg.alg_locatie_key
          AND l.alg_locatie_verwijder IS NULL
          AND NOT EXISTS
                (SELECT prs_perslidwerkplek_key
                   FROM prs_perslidwerkplek pwp
                  WHERE pwp.prs_perslid_key = p.prs_perslid_key
                        AND wpg.prs_werkplek_key = pwp.prs_werkplek_key);
END;
/


-- Statusberichten die voor de koppeling met Axxerion op de SFTP server geplaatst worden.
-- Is copy van RABO
CREATE OR REPLACE VIEW csun_v_export_status_axxerion (
   result,
   result_order
   )
AS
   SELECT fac_rapport_regel, fac_rapport_volgnr
     FROM fac_rapport
    WHERE fac_rapport_node = SUBSTR ('STATUS_AXXERION', 1, 12);


CREATE OR REPLACE PROCEDURE csun_select_status_axxerion (p_applname   IN VARCHAR2,
                                                         p_applrun    IN VARCHAR2)
AS
   CURSOR c (
      p_from                 DATE,
      p_to                   DATE)
   IS
        SELECT mld_melding_externnr,
               fac_tracking_datum,
               DECODE (sn.fac_srtnotificatie_code,
                       'MLDACP', 'ACCEPT',
                       'MLDREJ', 'REJECT',
                       'MLDAFM', 'CLOSE',
                       'MLDAFR', 'FINCLOSE',
                       'MLDUPD', 'UPDATE',
                       'Invalid')
                  status,
               mld_melding_einddatum,
               mld_melding_opmerking,
               DECODE (fac_srtnotificatie_code, 'MLDUPD', 1, 0) volgorde
          FROM fac_tracking t, fac_srtnotificatie sn, mld_melding m
         WHERE fac_tracking_datum BETWEEN p_from AND p_to
           AND t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key
           AND t.fac_tracking_refkey = m.mld_melding_key
           AND m.mld_melding_externnr IS NOT NULL
           AND m.prs_perslid_key = 8902            -- melding is geinitieerd via de PostNL koppeling.
           AND (sn.fac_srtnotificatie_code = 'MLDACP'
             OR sn.fac_srtnotificatie_code = 'MLDREJ'
             OR sn.fac_srtnotificatie_code = 'MLDAFM'
             OR sn.fac_srtnotificatie_code = 'MLDAFR'
             OR sn.fac_srtnotificatie_code = 'MLDUPD')
      ORDER BY mld_melding_externnr, volgorde, fac_tracking_datum;

   v_from       DATE;
   v_to         DATE;
   v_count      NUMBER;
   v_externnr   VARCHAR2 (10);
   v_bestand    VARCHAR2 (100);
   v_empty      NUMBER;
BEGIN
   v_count := 0;
   v_empty := 1;
   v_externnr := '9999';
   v_bestand := SUBSTR (p_applname, 1, 12);

   -- de laatste synchronisatietijd wordt opgeslagen in fac_rapport met een speciale node naam eindigend op een 1.
   -- mocht deze niet gevuld zijn (initieel) dan gebruiken we het huidige uur.
   BEGIN
      SELECT fac.safe_to_date (fac_rapport_regel, 'yyyy-mm-dd hh24:mi')
        INTO v_from
        FROM fac_rapport
       WHERE SUBSTR (v_bestand, 1, 11) || '1' = fac_rapport_node;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         v_from := TRUNC (SYSDATE, 'HH24');
   END;

   -- het einde van de periode mag niet verder liggen dan de huidige tijd
   v_to := v_from + 1 / (24 * 4);

   IF v_to > SYSDATE
   THEN
      v_to := v_from;
   END IF;

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

   DELETE fac_rapport
    WHERE fac_rapport_node = v_bestand;

   -- als de export een tijdje niet gedraaid is dan halen we dit weer in door de periode groter te maken.
   WHILE v_to + 1 / (24 * 4) < SYSDATE AND v_count < 10
   LOOP
      v_to := v_to + 1 / (24 * 4);
      v_count := v_count + 1;
   END LOOP;

   -- header
   csun_add_xml_row (v_bestand, '<?xml version="1.0" encoding="windows-1252"?>');
   csun_add_xml_row (v_bestand, '<facilitor>');
   csun_add_xml_row (v_bestand, '<meldingstatusses>');

   FOR rec IN c (v_from, v_to)
   LOOP
      v_empty := 0;

      IF NOT (rec.mld_melding_externnr = v_externnr AND rec.status = 'UPDATE')
      THEN
         v_externnr := rec.mld_melding_externnr;
         csun_add_xml_row (v_bestand, '<meldingstatus key="' || rec.mld_melding_externnr || '">');
         csun_add_xml_element (v_bestand,
                               'timestamp',
                               TO_CHAR (rec.fac_tracking_datum, 'dd-mm-yyyy hh24:mi'));
         csun_add_xml_element (v_bestand, 'status', rec.status);
         csun_add_xml_element (v_bestand, 'afhandeling', rec.mld_melding_opmerking);
         csun_add_xml_element (v_bestand,
                               'oplosdatum',
                               TO_CHAR (rec.mld_melding_einddatum, 'dd-mm-yyyy hh24:mi'));
         csun_add_xml_row (v_bestand, '</meldingstatus>');
      END IF;
   END LOOP;

   csun_add_xml_row (v_bestand, '</meldingstatusses>');
   csun_add_xml_row (v_bestand, '</facilitor>');

   -- Als er niet geexporteerd is dan gaan we alle regels verwijderen
   -- zodat er niet een leeg xml bestand komt te staan met alleen de facilitor tags.
   IF v_empty = 1
   THEN
      DELETE fac_rapport
       WHERE fac_rapport_node = v_bestand;
   END IF;

   DELETE fac_rapport
    WHERE fac_rapport_node = SUBSTR (v_bestand, 1, 11) || '1';

   INSERT INTO fac_rapport (fac_rapport_node, fac_rapport_regel)
       VALUES (SUBSTR (v_bestand, 1, 11) || '1', TO_CHAR (v_to, 'yyyy-mm-dd hh24:mi'));
END;
/

---- CSUN#25915: Portaal specials...
---- Drie Grafieken, scope op afdelingnivo1 (BU):
--  1. openstaande meldingen per vakgroep.
--  2. meldingen per maand.
--  3. gemiddelde uitvoertijd per maand.

--  1. openstaande meldingen per vakgroep.
CREATE OR REPLACE VIEW csun_v_graph_vakgroep_open
(
   FCLT_XAS_,
   FCLT_YAS_,
   FCLT_URL,
   FCLT_3D_AFDELING_KEY
)
AS
     SELECT sd.ins_srtdiscipline_prefix || '-' || d.ins_discipline_omschrijving,
            COUNT (d.ins_discipline_omschrijving),
            'appl/mld/mld_search.asp?urole=fo' || '&' || 'autosearch=1' || '&' || 'disc_key_str='  || d.ins_discipline_key || '&' || 'dep_key='  || p.prs_afdeling_key,
            p.prs_afdeling_key
      FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d, ins_srtdiscipline sd, prs_perslid p
      WHERE     m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_ins_discipline_key = d.ins_discipline_key
            AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key
            AND mld_melding_status IN (2, 3, 4, 7, 0) -- 2-ingevoerd, 3-ingezien, 4-geaccepteerd, 7-uitgegeven, 0-pending
            AND m.prs_perslid_key = p.prs_perslid_key
   GROUP BY d.ins_discipline_key, sd.ins_srtdiscipline_prefix || '-' || d.ins_discipline_omschrijving, p.prs_afdeling_key;


--  2. meldingen per maand.
CREATE OR REPLACE VIEW csun_v_graph_meldingpm
(
   FCLT_XAS_,
   FCLT_YAS_,
   VOLGORDE,
   FCLT_3D_AFDELING_KEY
)
AS
     SELECT DECODE (SUBSTR (TO_CHAR (mld_melding_datum, 'yyyymm'), 5),
                    '01', 'Januari',
                    '02', 'Februari',
                    '03', 'Maart',
                    '04', 'April',
                    '05', 'Mei',
                    '06', 'Juni',
                    '07', 'Juli',
                    '08', 'Augustus',
                    '09', 'September',
                    '10', 'Oktober',
                    '11', 'November',
                    'December'),
            COUNT (d.ins_discipline_omschrijving),
            TO_CHAR (mld_melding_datum, 'yyyymm'),
            p.prs_afdeling_key
       FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d, prs_perslid p
      WHERE mld_melding_datum BETWEEN ADD_MONTHS (
                                         TO_DATE (
                                            TO_CHAR (SYSDATE, 'yyyymm') || '01',
                                            'yyyymmdd'),
                                         -11)
                                  AND  SYSDATE
            AND m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_ins_discipline_key = d.ins_discipline_key
            AND m.prs_perslid_key = p.prs_perslid_key
   GROUP BY TO_CHAR (mld_melding_datum, 'yyyymm'),p.prs_afdeling_key;

--  3. gemiddelde uitvoertijd per maand.
CREATE OR REPLACE VIEW csun_v_graph_uitvtijd_pm
(
   FCLT_XAS_,
   FCLT_YAS_,
   VOLGORDE,
   FCLT_3D_AFDELING_KEY
)
AS
     SELECT DECODE (SUBSTR (TO_CHAR (mld_melding_datum, 'yyyymm'), 5),
                    '01', 'Januari',
                    '02', 'Februari',
                    '03', 'Maart',
                    '04', 'April',
                    '05', 'Mei',
                    '06', 'Juni',
                    '07', 'Juli',
                    '08', 'Augustus',
                    '09', 'September',
                    '10', 'Oktober',
                    '11', 'November',
                    'December'),
            AVG(COALESCE (fac.gettrackingdate ('MLDREJ', m.mld_melding_key), COALESCE (fac.gettrackingdate ('MLDAFM', m.mld_melding_key), SYSDATE)) - m.mld_melding_datum),
            TO_CHAR (mld_melding_datum, 'yyyymm'),
            p.prs_afdeling_key
       FROM mld_melding m, mld_stdmelding std, ins_tab_discipline d, prs_perslid p
      WHERE mld_melding_datum BETWEEN ADD_MONTHS (
                                         TO_DATE (
                                            TO_CHAR (SYSDATE, 'yyyymm') || '01',
                                            'yyyymmdd'),
                                         -11)
                                  AND  SYSDATE
            AND m.mld_stdmelding_key = std.mld_stdmelding_key
            AND std.mld_ins_discipline_key = d.ins_discipline_key
            AND m.prs_perslid_key = p.prs_perslid_key
   GROUP BY TO_CHAR (mld_melding_datum, 'yyyymm'),p.prs_afdeling_key;

CREATE OR REPLACE VIEW csun_v_udr_melding
AS
   SELECT m.*,
          (SELECT mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding mk, mld_kenmerk k
            WHERE     mk.mld_kenmerk_key = k.mld_kenmerk_key
                  AND mld_srtkenmerk_key = 2
                  AND mk.mld_melding_key = m.melding_key)
             werkbon_opdracht_nr,
          (SELECT fac.safe_to_number (mld_kenmerkmelding_waarde)
             FROM mld_kenmerkmelding mk, mld_kenmerk k
            WHERE     mk.mld_kenmerk_key = k.mld_kenmerk_key
                  AND mld_srtkenmerk_key = 101
                  AND mk.mld_melding_key = m.melding_key)
             kosten,
          (SELECT fac.safe_to_number (mld_kenmerkmelding_waarde)
             FROM mld_kenmerkmelding mk, mld_kenmerk k
            WHERE     mk.mld_kenmerk_key = k.mld_kenmerk_key
                  AND mld_srtkenmerk_key = 141
                  AND mk.mld_melding_key = m.melding_key)
             offerte_bedrag,
          (SELECT mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding mk, mld_kenmerk k
            WHERE     mk.mld_kenmerk_key = k.mld_kenmerk_key
                  AND mld_srtkenmerk_key = 161
                  AND mk.mld_melding_key = m.melding_key)
             einddatum_klant,
          (SELECT alg_onrgoedkenmerk_waarde
             FROM alg_onrgoedkenmerk aok
            WHERE alg_kenmerk_key = 1240
                  AND aok.alg_onrgoed_key = fclt_3d_locatie_key)
             klantkenmerk,
          (SELECT alg_onrgoedkenmerk_waarde
             FROM alg_onrgoedkenmerk aok
            WHERE alg_kenmerk_key = 1123
                  AND aok.alg_onrgoed_key = fclt_3d_locatie_key)
             klantspec_regio_indeling
     FROM mld_v_udr_melding m;

-- CSUN#54801 Wanneer geen locatie bij mailmeldingen, dan ook niet de vakgroep herbepalen. Vervolgens notificatie.
CREATE OR REPLACE VIEW csun_v_rap_mldmail_nobo
(
   melding_nr,
   melding_datum,
   melding_omschrijving,
   melding_opmerking,
   lockey,
   locatie,
   voor,
   melding_externnr,
   gebouwcode_klant,
   locatiecode_klant
)
AS
   SELECT m.mld_melding_key,
          m.mld_melding_datum,
          SUBSTR (m.mld_melding_omschrijving,
                  1,
                  INSTR (m.mld_melding_omschrijving, CHR (13)))
             AS omschrijving,
          m.mld_melding_opmerking,
          m.mld_alg_locatie_key,
          l.alg_locatie_omschrijving,
          p.prs_perslid_naam AS voor,
          m.mld_melding_externnr,
          (SELECT mkm.mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding mkm, mld_kenmerk mk
            WHERE     mkm.mld_melding_key = m.mld_melding_key
                  AND mk.mld_kenmerk_key = mkm.mld_kenmerk_key
                  AND mk.mld_srtkenmerk_key = 201)
             AS gebouwcode_klant,    -- Key voor kenmerksoort Gebouwcode klant
          (SELECT mkm.mld_kenmerkmelding_waarde
             FROM mld_kenmerkmelding mkm, mld_kenmerk mk
            WHERE     mkm.mld_melding_key = m.mld_melding_key
                  AND mk.mld_kenmerk_key = mkm.mld_kenmerk_key
                  AND mk.mld_srtkenmerk_key = 181)
             AS locatiecode_klant   -- Key voor kenmerksoort Locatiecode klant
     FROM mld_melding m, alg_locatie l, prs_perslid p
    WHERE     m.mld_melding_status NOT IN (1, 5)
          AND m.mld_stdmelding_key = 41
          AND l.alg_locatie_key = m.mld_alg_locatie_key
          AND m.prs_perslid_key_voor = p.prs_perslid_key;

CREATE OR REPLACE VIEW csun_v_noti_mldmail_nobo
(
   code,
   sender,
   receiver,
   text,
   key,
   xkey
)
AS
   SELECT DISTINCT
          'CUST01' AS code,
          NULL,
          13141,                   -- Persoon Servicedesk NA (voor emailadres: Servicedesk.na@csu.nl).
          'Attentie: deze meldingen zijn niet automatisch doorgezet naar de juiste vakgroep en/of locatie',
          (SELECT fac_usrrap_key
             FROM fac_usrrap
            WHERE fac_usrrap_view_name = 'CSUN_V_RAP_MLDMAIL_NOBO')
             rapportnr,
          NULL
     FROM csun_v_rap_mldmail_nobo;

-- CSUN#54997: Import en aanmaken meldingen vanuit een (jaar)planning
CREATE OR REPLACE PROCEDURE csun_import_meldingen (p_import_key IN NUMBER)
IS
   c_fielddelimitor       VARCHAR2 (1) := ';';
   v_newline              VARCHAR2 (1000);
   v_aanduiding           VARCHAR2 (200);
   v_errorhint            VARCHAR2 (1000);
   v_errormsg             VARCHAR2 (1000);
   oracle_err_num         NUMBER;
   oracle_err_mes         VARCHAR2 (200);
   header_is_valid        NUMBER;
   v_ongeldig             NUMBER (1);
   v_count_tot            NUMBER (10);
   v_count_import         NUMBER (10);
   v_count_melding        NUMBER := 1;
   v_count_alglocatie     NUMBER := 1;
   -- De importvelden:
   v_fac_import_key       VARCHAR (256);
   v_fac_import_index     VARCHAR (256);
   v_mld_stdmelding_key   VARCHAR (256);
   v_mld_stdmelding_oms   VARCHAR (256);
   v_alg_locatie_code     VARCHAR (256);
   v_alg_locatie_oms      VARCHAR (256);
   v_uitvoerjaar          VARCHAR (256);
   v_uitvoerweek          VARCHAR (256);
   v_onderwerp            VARCHAR (256);
   v_omschrijving         VARCHAR (256);

   CURSOR c
   IS
        SELECT *
          FROM fac_imp_file
         WHERE fac_import_key = p_import_key
      ORDER BY fac_imp_file_index;
BEGIN
   v_count_tot := 0;
   v_count_import := 0;
   header_is_valid := 0;

   DELETE FROM csun_imp_mld;

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

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

         -- Lees alle veldwaarden
         fac.imp_getfield (v_newline, c_fielddelimitor, v_mld_stdmelding_key); -- Soort melding key
         fac.imp_getfield (v_newline, c_fielddelimitor, v_mld_stdmelding_oms); -- Soort melding omschrijving
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_locatie_code); -- Locatie key
         fac.imp_getfield (v_newline, c_fielddelimitor, v_alg_locatie_oms); -- Locatieomschrijving
         fac.imp_getfield (v_newline, c_fielddelimitor, v_uitvoerjaar); -- Uitvoerjaar
         fac.imp_getfield (v_newline, c_fielddelimitor, v_uitvoerweek); -- Uitvoerweek
         fac.imp_getfield (v_newline, c_fielddelimitor, v_onderwerp); -- Onderwerp
         fac.imp_getfield (v_newline, c_fielddelimitor, v_omschrijving); -- Omschrijving

         IF (fac.safe_to_number (v_uitvoerweek) < 10)
         THEN
            v_uitvoerweek := (0 || v_uitvoerweek);
         END IF;

         v_aanduiding :=
               '['
            || v_mld_stdmelding_key
            || '|'
            || v_alg_locatie_code
            || '|'
            || v_uitvoerjaar
            || '|'
            || v_uitvoerweek
            || '] ';

         v_count_tot := v_count_tot + 1;

         -- 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_stdmelding_key) = 'MELDING'
               AND UPPER (v_mld_stdmelding_oms) = 'MELDINGOMSCHRIJVING'
               AND UPPER (v_alg_locatie_code) = 'LOCATIECODE'
               AND UPPER (v_alg_locatie_oms) = 'LOCATIE'
               AND UPPER (v_uitvoerjaar) = 'UITVOERJAAR'
               AND UPPER (v_uitvoerweek) = 'UITVOERWEEK'
               AND UPPER (v_onderwerp) = 'ONDERWERP'           --Lengte max 80
               AND UPPER (v_omschrijving) = 'OMSCHRIJVING'   --Lengte max 4000
            THEN
               header_is_valid := 1;
            END IF;
         ELSE
            --Controle of de opgegeven stdmelding wel aanwezig is
            SELECT COUNT ( * )
              INTO v_count_melding
              FROM mld_stdmelding sm
             WHERE v_mld_stdmelding_key = sm.mld_stdmelding_key
                   AND sm.mld_stdmelding_verwijder IS NULL;

            IF v_count_melding = 0
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Meldingnummer bestaat niet',
                  'Melding wordt niet ingelezen!');
            END IF;

            --Controle of de opgegeven locatiecode wel aanwezig is
            SELECT COUNT ( * )
              INTO v_count_alglocatie
              FROM alg_locatie l
             WHERE l.alg_locatie_code = v_alg_locatie_code
                   AND l.alg_locatie_verwijder IS NULL;

            IF v_count_alglocatie = 0
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (
                  p_import_key,
                  'W',
                  v_aanduiding || 'Locatie (locatiecode) bestaat niet',
                  'Melding wordt niet ingelezen!');
            END IF;

            -- Controle of de melding wel ingelezen moet worden. Meldingen moeten worden ingelezen na volgende week.
            -- Dus stel het is week 8, dan moeten meldingen ingelezen worden in week 10 en verder.
            -- De routine om meldingen automatisch aan te maken (csun_export_meldingen) maakt namelijk op maandag meldingen voor volgende week aan.
            IF TO_NUMBER (TO_CHAR (v_uitvoerjaar) || TO_CHAR (v_uitvoerweek)) <=
                  TO_NUMBER (
                     TO_CHAR (SYSDATE, 'YYYY') || TO_CHAR (SYSDATE, 'WW'))
                  + 1
            THEN
               v_ongeldig := 1;
               fac.imp_writelog (p_import_key,
                                 'W',
                                 v_aanduiding || 'Melding niet in toekomst',
                                 'Melding wordt niet ingelezen!');
            END IF;

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

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

            IF LENGTH (v_alg_locatie_oms) > 60
            THEN
               v_alg_locatie_oms := SUBSTR (v_alg_locatie_oms, 1, 60);
            END IF;

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

                  INSERT INTO csun_imp_mld (fac_import_key,
                                            fac_import_index,
                                            fac_import_datum,
                                            mld_stdmelding_key,
                                            mld_stdmelding_oms,
                                            alg_locatie_code,
                                            alg_locatie_oms,
                                            uitvoerdatum,
                                            uitvoerweek,
                                            uitvoerjaar,
                                            onderwerp,
                                            omschrijving)
                      VALUES (v_fac_import_key,
                              v_fac_import_index,
                              SYSDATE,
                              TO_NUMBER (v_mld_stdmelding_key),
                              v_mld_stdmelding_oms,
                              v_alg_locatie_code,
                              v_alg_locatie_oms,
                              NEXT_DAY (
                                 TO_DATE ('04-jan-' || v_uitvoerjaar,
                                          'dd-mm-yyyy')
                                 + (v_uitvoerweek - 2) * 7,
                                 'vrijd'),
                              v_uitvoerweek,
                              v_uitvoerjaar,
                              v_onderwerp,
                              v_omschrijving);

                  COMMIT;

                  v_count_import := v_count_import + 1;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     oracle_err_num := SQLCODE;
                     oracle_err_mes := SUBSTR (SQLERRM, 1, 100);
                     v_errormsg :=
                           v_errorhint
                        || ' ORACLE (error '
                        || oracle_err_num
                        || '/'
                        || oracle_err_mes
                        || ')';
                     fac.imp_writelog (
                        p_import_key,
                        'W',
                        v_aanduiding || v_errormsg,
                        'Ingelezen regel kan niet worden weggeschreven!');
                     COMMIT;
               END;
            END IF;
         END IF;
      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',
         'CSUN_MELDINGEN/#ingelezen importregels: ' || TO_CHAR (v_count_tot),
         '');
      fac.imp_writelog (
         p_import_key,
         'S',
         'CSUN_MELDINGEN/#ongeldige niet ingelezen importregels incl header: '
         || 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 CSUN_IMPORT_MELDINGEN afgebroken!');
END csun_import_meldingen;
/

-- CSUN#54997: Import en aanmaken meldingen vanuit een (jaar)planning
CREATE OR REPLACE PROCEDURE csun_update_meldingen (p_import_key IN NUMBER)
IS
BEGIN
   INSERT INTO csun_imp_mld2 (fac_import_key,
                              fac_import_index,
                              fac_import_datum,
                              mld_stdmelding_key,
                              mld_stdmelding_oms,
                              alg_locatie_key,
                              alg_locatie_oms,
                              uitvoerdatum,
                              uitvoerweek,
                              uitvoermaand,
                              uitvoerjaar,
                              onderwerp,
                              omschrijving,
                              mld_melding_key)
        SELECT fac_import_key,
               fac_import_index,
               fac_import_datum,
               mld_stdmelding_key,
               mld_stdmelding_oms,
               MAX (l.alg_locatie_key),
               alg_locatie_oms,
               uitvoerdatum,
               uitvoerweek,
               uitvoermaand,
               uitvoerjaar,
               onderwerp,
               omschrijving,
               mld_melding_key
          FROM csun_imp_mld imp, alg_locatie l
         WHERE l.alg_locatie_code = imp.alg_locatie_code
      GROUP BY fac_import_key,
               fac_import_index,
               fac_import_datum,
               mld_stdmelding_key,
               mld_stdmelding_oms,
               l.alg_locatie_key,
               alg_locatie_oms,
               uitvoerdatum,
               uitvoerweek,
               uitvoermaand,
               uitvoerjaar,
               onderwerp,
               omschrijving,
               mld_melding_key;
END;
/

-- CSUN#54997: Import en aanmaken meldingen vanuit een (jaar)planning
CREATE OR REPLACE PROCEDURE csun_export_meldingen (p_applname   IN VARCHAR2,
                                                   p_applrun    IN VARCHAR2,
                                                   p_filedir    IN VARCHAR2,
                                                   p_filename   IN VARCHAR2)
AS
   v_fac_import_key         NUMBER (10);
   v_fac_import_index       NUMBER (10);
   v_mld_melding_key        NUMBER (10);
   v_mld_stdmelding_key     NUMBER (10);
   v_mld_melding_datum      DATE;
   v_opdr_key               NUMBER (10);
   v_perslid_key            NUMBER (10) := 4;                     -- Facilitor
   v_stdmelding_autoorder   VARCHAR2 (200);
   v_dienst_key             NUMBER (10);
   v_typeopdr_key           NUMBER (10);
   v_bedrijf_key            NUMBER (10);

   -- Haal alle meldingen op uit de tussentabel van volgende week en die nog niet zijn aangemaakt. Deze hebben een datum op de vrijdag volgende week.
   CURSOR cmld
   IS
      SELECT m.*,
             (SELECT fac.safe_to_number (km.alg_onrgoedkenmerk_waarde)
                FROM alg_v_aanwezigonrgoedkenmerk km
               WHERE     km.alg_onrgoed_niveau = 'D'
                     AND km.alg_kenmerk_key = 1300 --Kenmerk bij district : Medewerker bedrijfsbureau
                     AND km.alg_onrgoed_key = l.alg_district_key)
                AS mld_behandelaar_key
        FROM csun_imp_mld2 m, alg_v_locatie_gegevens l
       WHERE     l.alg_locatie_key = m.alg_locatie_key
             AND TRUNC (m.uitvoerdatum) <= TRUNC (SYSDATE) + 11
             AND m.mld_melding_key IS NULL;
BEGIN
   FOR recmld IN cmld
   LOOP
      BEGIN
         INSERT INTO mld_melding (prs_perslid_key,
                                  mld_melding_module,
                                  mld_meldbron_key,
                                  mld_alg_locatie_key,
                                  mld_melding_datum,
                                  mld_stdmelding_key,
                                  mld_melding_einddatum,
                                  mld_melding_status,
                                  mld_melding_spoed,
                                  mld_melding_onderwerp,
                                  mld_melding_omschrijving,
                                  mld_melding_behandelaar_key)
             VALUES (v_perslid_key,
                     'MLD',
                     6,                                       --Bron = Systeem
                     recmld.alg_locatie_key,
                     SYSDATE,
                     recmld.mld_stdmelding_key,
                     TO_DATE(CONCAT (
                                TO_CHAR (recmld.uitvoerdatum, 'YYYY-MM-DD'),
                                ' 17:00:00')),
                     4,                              --Status = In behandeling
                     3,                                 --Prioriteit = Normaal
                     recmld.onderwerp,
                     recmld.omschrijving,
                     recmld.mld_behandelaar_key)
          RETURNING mld_melding_key, mld_stdmelding_key, mld_melding_datum
               INTO v_mld_melding_key,
                    v_mld_stdmelding_key,
                    v_mld_melding_datum;

         --PROCEDURE trackaction (pcode VARCHAR2, prefkey NUMBER, puserkey NUMBER, pdatum DATE, poms VARCHAR2);
         --Dit zorgt voor een juiste datum 'Laatste actiedatum' in het meldingsoverzicht.
         fac.trackaction ('MLDNEW',
                          v_mld_melding_key,
                          v_perslid_key,
                          SYSDATE,
                          'Melding is aangemaakt vanuit planning');

         UPDATE csun_imp_mld imp1
            SET imp1.mld_melding_key = v_mld_melding_key,
                imp1.mld_melding_datum = v_mld_melding_datum
          WHERE imp1.fac_import_key = recmld.fac_import_key
                AND imp1.fac_import_index = recmld.fac_import_index;

         UPDATE csun_imp_mld2 imp2
            SET imp2.mld_melding_key = v_mld_melding_key,
                imp2.mld_melding_datum = v_mld_melding_datum
          WHERE imp2.fac_import_key = recmld.fac_import_key
                AND imp2.fac_import_index = recmld.fac_import_index;

         -- Nu kijken of we automatisch een opdracht kunnen aanmaken.
         SELECT ms.mld_stdmelding_autoorder,
                ms.prs_dienst_key,
                ms.mld_typeopdr_key
           INTO v_stdmelding_autoorder, v_dienst_key, v_typeopdr_key
           FROM mld_stdmelding ms
          WHERE ms.mld_stdmelding_key = v_mld_stdmelding_key;

         -- Heb ik genoeg informatie om een opdracht aan te kunnen maken.
         IF     v_stdmelding_autoorder = 1
            AND v_dienst_key IS NOT NULL
            AND v_typeopdr_key IS NOT NULL
         THEN
            SELECT MIN (bdl.prs_bedrijf_key)
              INTO v_bedrijf_key
              FROM prs_bedrijfdienstlocatie bdl, prs_v_aanwezigbedrijf b
             WHERE bdl.prs_bedrijf_key = b.prs_bedrijf_key
                   AND bdl.prs_dienst_key = v_dienst_key
                   AND (bdl.alg_locatie_key = recmld.alg_locatie_key
                        OR bdl.alg_locatie_key IS NULL);

            IF v_bedrijf_key IS NOT NULL
            THEN
               INSERT INTO mld_opdr (mld_uitvoerende_keys,
                                     mld_opdr_kosten,
                                     mld_opdr_uurloon,
                                     mld_melding_key,
                                     mld_opdr_module,
                                     mld_opdr_bedrijfopdr_volgnr,
                                     mld_opdr_datumbegin,
                                     mld_opdr_einddatum,
                                     mld_typeopdr_key,
                                     prs_perslid_key,
                                     mld_opdr_omschrijving,
                                     mld_opdr_uren,
                                     mld_opdr_teverzenden)
                   VALUES (v_bedrijf_key,
                           0,
                           0,
                           v_mld_melding_key,
                           'MLD',
                           mld.bepaalopdrmeldingvolgnr (v_mld_melding_key),
                           v_mld_melding_datum,
                           recmld.uitvoerdatum,
                           v_typeopdr_key,
                           v_perslid_key,
                              recmld.onderwerp
                           || CHR (10)
                           || recmld.omschrijving,
                           0,
                           1)
                RETURNING mld_opdr_key
                     INTO v_opdr_key;
            END IF;

            mld.setopdrachtstatus (v_opdr_key, 5, v_perslid_key); -- Uitgegeven

            mld.updatemeldingstatus (v_mld_melding_key, 0, v_perslid_key);
         END IF;
      END;
   END LOOP;
END;
/

--CSUN#53832 Deze notificatie zorgt ervoor dat de districtmanager wordt genotificeerd over alle notities die worden ingevoerd bij meldingen waaraan geen behandelaar is gekoppeld.
CREATE OR REPLACE VIEW csun_v_noti_mldnote_nobo
(
   code,
   sender,
   receiver,
   text,
   key,
   xkey
)
AS
   SELECT 'CUST02' AS code,
          NULL AS sender,
          (SELECT fac.safe_to_number (km.alg_onrgoedkenmerk_waarde)
             FROM alg_v_aanwezigonrgoedkenmerk km
            WHERE     km.alg_onrgoed_niveau = 'D'
                  AND km.alg_kenmerk_key = 1021
                  AND km.alg_onrgoed_key = l.alg_district_key)
             AS receiver,
             'Er is een opmerking geplaatst bij melding '
          || m.mld_melding_key
          || ' ('
          || COALESCE (m.mld_melding_onderwerp,
                       sm.mld_stdmelding_omschrijving)
          || ')'
             AS text,
          m.mld_melding_key AS key,
          NULL AS extra_key
     FROM mld_melding_note n,
          mld_melding m,
          alg_v_locatie_gegevens l,
          mld_stdmelding sm
    WHERE     n.mld_melding_key = m.mld_melding_key
          AND l.alg_locatie_key = m.mld_alg_locatie_key
          AND m.mld_melding_behandelaar_key IS NULL
          AND sm.mld_stdmelding_key = m.mld_stdmelding_key
          AND ( (TO_CHAR (n.mld_melding_note_aanmaak, 'HH24') =
                    TO_CHAR (SYSDATE, 'HH24') - 1   --Vandaag, een uur geleden
                 AND TRUNC (n.mld_melding_note_aanmaak) = TRUNC (SYSDATE))
               OR (TO_CHAR (n.mld_melding_note_aanmaak, 'HH24') =
                      TO_CHAR (SYSDATE, 'HH24') - 1 --Gisteren, een uur geleden
                   AND TRUNC (n.mld_melding_note_aanmaak) =
                         TRUNC (SYSDATE) - 1));

CREATE OR REPLACE VIEW csun_v_rap_planning
(
   fac_import_key,
   fac_import_datum,
   vakgroeptype,
   vakgroep,
   mld_stdmelding_key,
   standaardmelding,
   regio,
   district,
   alg_locatie_key,
   locatie,
   klant,
   uitvoerdatum,
   uitvoerweek,
   uitvoermaand,
   uitvoerjaar,
   onderwerp,
   omschrijving,
   melding_key
)
AS
     SELECT imp.fac_import_key,
            imp.fac_import_datum,
            sd.ins_srtdiscipline_omschrijving,
            vg.ins_discipline_omschrijving,
            imp.mld_stdmelding_key,
            mld_stdmelding_oms,
            r.alg_regio_omschrijving,
            d.alg_district_omschrijving,
            imp.alg_locatie_key,
            imp.alg_locatie_oms,
            (SELECT DISTINCT akm.alg_onrgoedkenmerk_waarde
               FROM alg_onrgoedkenmerk akm
              WHERE akm.alg_kenmerk_key = 1000
                    AND akm.alg_onrgoed_key = imp.alg_locatie_key)
               AS klant,
            imp.uitvoerdatum,
            imp.uitvoerweek,
            imp.uitvoermaand,
            imp.uitvoerjaar,
            imp.onderwerp,
            imp.omschrijving,
            imp.mld_melding_key
       FROM csun_imp_mld2 imp,
            alg_locatie l,
            alg_district d,
            alg_regio r,
            ins_srtdiscipline sd,
            ins_tab_discipline vg,
            mld_stdmelding sm
      WHERE     imp.alg_locatie_key = l.alg_locatie_key
            AND l.alg_district_key = d.alg_district_key
            AND d.alg_regio_key = r.alg_regio_key
            AND sm.mld_stdmelding_key = imp.mld_stdmelding_key
            AND vg.ins_discipline_key = sm.mld_ins_discipline_key
            AND sd.ins_srtdiscipline_key = vg.ins_srtdiscipline_key
   ORDER BY alg_locatie_oms, uitvoerdatum;

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

