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

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

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

CREATE OR REPLACE VIEW brcf_v_noti_bezoeker
AS
SELECT
x.sender,
x.receiver,
x.text,
x.code,
x.key,
x.xkey,
x.xemail,
x.xmobile,
NULL fac_srtnotificatie_key,
NULL attachments,
NULL xsender
  FROM (SELECT NULL sender,
               NULL receiver,
                  'Uw bezoek aan Brocacef op '
               || TO_CHAR (bez_afspraak_datum, 'DD-MM-YYYY')
               || ' , '
               || TO_CHAR (bez_afspraak_datum, 'HH24:MI')
                  text,
               'CUST01' code,
               a.bez_afspraak_key key,
               b.bez_bezoekers_key xkey,
               b.bez_bezoekers_email xemail,
               NULL xmobile,
               a.bez_afspraak_datum
          FROM bez_afspraak a, bez_bezoekers b
         WHERE a.bez_afspraak_key = b.bez_afspraak_key
               AND a.alg_locatie_key <> 2341     -- DC Amsterdam doet hier niet mee
               AND a.bez_afspraak_datum BETWEEN SYSDATE AND SYSDATE + 1-- Binnen 1 dag voor de afspraak versturen, bezoek voor dezelfde dag krijgt zo alsnog een mail
               AND NOT EXISTS
                     (SELECT 1
                        FROM fac_tracking t, fac_srtnotificatie sn
                       WHERE t.fac_srtnotificatie_key = 192 --BEZTRK
                             AND t.fac_tracking_refkey = a.bez_afspraak_key
                             AND b.bez_bezoekers_aanmaak < t.fac_tracking_datum))
       x
 WHERE x.xemail IS NOT NULL;
 
 CREATE OR REPLACE VIEW brcf_v_noti_bezoeker_dc
AS
SELECT
x.sender,
x.receiver,
x.text,
x.code,
x.key,
x.xkey,
x.xemail,
x.xmobile,
NULL fac_srtnotificatie_key,
NULL attachments,
NULL xsender
  FROM (SELECT NULL sender,
               NULL receiver,
                  'Uw bezoek aan Brocacef op '
               || TO_CHAR (bez_afspraak_datum, 'DD-MM-YYYY')
               || ' , '
               || TO_CHAR (bez_afspraak_datum, 'HH24:MI')
                  text,
               'CUST02' code,
               a.bez_afspraak_key key,
               b.bez_bezoekers_key xkey,
               b.bez_bezoekers_email xemail,
               NULL xmobile,
               a.bez_afspraak_datum
          FROM bez_afspraak a, bez_bezoekers b
         WHERE a.bez_afspraak_key = b.bez_afspraak_key
               AND a.alg_locatie_key = 2341     -- DC Amsterdam
               AND a.bez_afspraak_datum BETWEEN SYSDATE AND SYSDATE + 1-- Binnen 1 dag voor de afspraak versturen, bezoek voor dezelfde dag krijgt zo alsnog een mail
               AND NOT EXISTS
                     (SELECT 1
                        FROM fac_tracking t, fac_srtnotificatie sn
                       WHERE t.fac_srtnotificatie_key = 192 --BEZTRK
                             AND t.fac_tracking_refkey = a.bez_afspraak_key
                             AND b.bez_bezoekers_aanmaak < t.fac_tracking_datum))
       x
 WHERE x.xemail IS NOT NULL;
 
CREATE OR REPLACE VIEW brcf_v_rap_afdlogin
(
   afdeling,
   laatste_login,
   kostenplaats
)
AS
     SELECT pa.prs_afdeling_omschrijving,
            MAX (p.prs_perslid_login),
            pk.prs_kostenplaats_nr
       FROM prs_afdeling pa, prs_perslid p, prs_kostenplaats pk
      WHERE     p.prs_afdeling_key = pa.prs_afdeling_key
            AND pa.prs_kostenplaats_key = pk.prs_kostenplaats_key
            AND p.prs_perslid_verwijder IS NULL
   GROUP BY (pa.prs_afdeling_omschrijving, pk.prs_kostenplaats_nr);
   
CREATE OR REPLACE VIEW brcf_v_ins_qrc_mld
AS
   SELECT i.ins_deel_omschrijving hide_f_sort,
          l.alg_locatie_code||' '||l.alg_locatie_omschrijving fclt_f_locatie,
          o.alg_gebouw_omschrijving fclt_f_gebouw,
          o.alg_plaatsaanduiding fclt_f_plaats,
          d.ins_discipline_omschrijving fclt_f_discipline,
          g.ins_srtgroep_omschrijving fclt_f_objectgroep,
          s.ins_srtdeel_omschrijving fclt_f_objectsoort,
          i.ins_deel_omschrijving fclt_f_identificatie,
          d.ins_discipline_omschrijving||' / '||sm.mld_stdmelding_omschrijving fclt_f_melding,
          i.ins_deel_key,
          s.ins_srtdeel_key,
          o.alg_gebouw_code,
          o.alg_verdieping_code,
          i.ins_discipline_key fclt_3d_discipline_key,
          l.alg_locatie_key fclt_3d_locatie_key,
          i.ins_alg_ruimte_type,
          i.ins_alg_ruimte_key,
          b.fac_bookmark_id hide_f_bookmark_id
     FROM ins_deel i,
          ins_v_alg_overzicht o,
          ins_srtdeel s,
          ins_srtgroep g,
          ins_discipline d,
          alg_locatie l,
          fac_bookmark b,
          mld_stdmelding sm,
          mld_stdmelding_srtinst si
    WHERE b.fac_bookmark_naam = 'QRC_MELDING'
      AND (b.fac_bookmark_expire IS NULL OR b.fac_bookmark_expire > SYSDATE)
      AND ins_deel_verwijder IS NULL
      AND i.ins_deel_module = 'INS'
      AND i.ins_deel_parent_key IS NULL
      AND s.ins_srtdeel_key = i.ins_srtdeel_key
      AND g.ins_srtgroep_key = s.ins_srtgroep_key
      AND d.ins_discipline_key = g.ins_discipline_key
      AND o.alg_onroerendgoed_keys = i.ins_alg_ruimte_key
      AND o.alg_onroerendgoed_type = i.ins_alg_ruimte_type
      AND i.ins_alg_ruimte_type IN ('T', 'R', 'W')
      AND o.alg_locatie_key = i.ins_alg_locatie_key
      AND i.ins_alg_locatie_key = l.alg_locatie_key
      AND sm.mld_stdmelding_key = si.mld_stdmelding_key
      AND si.ins_srtinstallatie_key = DECODE(si.ins_srtinstallatie_niveau,
                                      'S', i.ins_srtdeel_key,
                                      'G', s.ins_srtgroep_key,
                                      'D', g.ins_discipline_key);
                                      
-- Rapportage t.b.v. de HEYDAY servicedesk bij BRCF om opdrachten te tracken (notities en status wijzigingen)
-- We kijken alleen naar reacties van contactpersonen (leveranciers) of het generieke Afmelder account.
CREATE OR REPLACE VIEW brcf_v_rap_ordertracking
(
   opdrachtnr,
   mld_opdr_key,
   uitvoerder,
   behandelaar,
   opdracht_type,
   soort,   -- soort wijziging: Status of notitie of opdrachtgegevens-wijziging
   datum,
   actie_door,
   actie_omschrijving,
   actie_details
)
AS
SELECT                                                        -- Voor notities
       m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr
           opdrachtnr,
       o.mld_opdr_key,
       u.naam
           uitvoerder,
       po.prs_perslid_naam || ' (' || po.prs_perslid_voornaam || ')'
           behandelaar,
       ot.mld_typeopdr_omschrijving
           opdracht_type,
       'Notitie'
           soort, -- soort wijziging: Status of notitie of opdrachtgegevens-wijziging
       note.mld_opdr_note_aanmaak
           datum,
       pn.prs_perslid_naam || ' (' || pn.prs_perslid_voornaam || ')'
           actie_door,
       'Notitie'
           actie_omschrijving,                         -- Subsoort voor status
       mld_opdr_note_omschrijving
           actie_details
  FROM mld_melding             m,
       mld_opdr                o,
       mld_typeopdr            ot,
       mld_v_uitvoerende       u,
       mld_opdr_note           note,
       prs_perslid             pn,
       prs_perslid             po,
       mld_stdmelding          sm,
       ins_tab_discipline      d,
       mld_disc_params         dp
 WHERE     o.mld_opdr_key = note.mld_opdr_key
       AND m.mld_melding_key = o.mld_melding_key
       AND o.mld_typeopdr_key = ot.mld_typeopdr_key
       AND m.mld_stdmelding_key = sm.mld_stdmelding_key
       AND sm.mld_ins_discipline_key = d.ins_discipline_key
       AND d.ins_discipline_module = 'MLD'
       AND d.ins_discipline_key = dp.mld_ins_discipline_key
       AND note.prs_perslid_key = pn.prs_perslid_key
       AND pn.prs_perslid_verwijder IS NULL
       AND o.mld_uitvoerende_keys = u.mld_uitvoerende_key
       AND o.prs_perslid_key = po.prs_perslid_key(+)
       AND (pn.prs_perslid_key IN (SELECT prs_perslid_key from prs_contactpersoon WHERE prs_contactpersoon_verwijder IS NULL) OR pn.prs_perslid_key = 9142)
UNION
SELECT                                                          -- Voor status
       m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr
           opdrachtnr,
       o.mld_opdr_key,
       u.naam
           uitvoerder,
       po.prs_perslid_naam || ' (' || po.prs_perslid_voornaam || ')'
           behandelaar,
       ot.mld_typeopdr_omschrijving
           opdracht_type,
       'Status'
           soort, -- soort wijziging: Status of notitie of opdrachtgegevens-wijziging
        t.fac_tracking_datum
           datum,
       pt.prs_perslid_naam || ' (' || pt.prs_perslid_voornaam || ')'
           actie_door,
       COALESCE (vert.actiecode_tekst, ts.fac_srtnotificatie_code)
           actie_omschrijving,
       t.fac_tracking_oms
           actie_details
  FROM mld_melding             m,
       mld_opdr                o,
       mld_typeopdr            ot,
       (SELECT UPPER (SUBSTR (fac_locale_xsl_label, 12)) AS actiecode,
               fac_locale_xsl_tekst                      AS actiecode_tekst
          FROM fac_locale_xsl
         WHERE     INSTR (fac_locale_xsl_label, 'lcl_ord_is_') > 0
               AND fac_locale_xsl_lang = 'NL') vert,
       mld_v_uitvoerende       u,
       prs_perslid             pt,
       prs_perslid             po,
       mld_stdmelding          sm,
       ins_tab_discipline      d,
       mld_disc_params         dp,
       fac_tracking            t,
       fac_srtnotificatie      ts
 WHERE     o.mld_opdr_key = t.fac_tracking_refkey
       AND t.fac_srtnotificatie_key = ts.fac_srtnotificatie_key
       AND ts.fac_srtnotificatie_xmlnode = 'opdracht'
       AND ts.fac_srtnotificatie_code = vert.actiecode(+)
       AND o.mld_typeopdr_key = ot.mld_typeopdr_key
       AND m.mld_melding_key = o.mld_melding_key
       AND m.mld_stdmelding_key = sm.mld_stdmelding_key
       AND sm.mld_ins_discipline_key = d.ins_discipline_key
       AND d.ins_discipline_module = 'MLD'
       AND d.ins_discipline_key = dp.mld_ins_discipline_key
       AND t.prs_perslid_key = pt.prs_perslid_key
       AND pt.prs_perslid_verwijder IS NULL
       AND o.mld_uitvoerende_keys = u.mld_uitvoerende_key
       AND o.prs_perslid_key = po.prs_perslid_key(+)
       AND (pt.prs_perslid_key IN (SELECT prs_perslid_key from prs_contactpersoon WHERE prs_contactpersoon_verwijder IS NULL) OR pt.prs_perslid_key = 9142);

CREATE OR REPLACE PROCEDURE brcf_schonen_bezoekers
    AS
    BEGIN
        ANO.anonymizebez (SYSDATE - (10 * 14), SYSDATE - fac.getsetting ('anonymize_period'));
    END;
    /
    
--Onderstaande procedure is voor het toekennen van autorisatiegroepen nadat de IAM koppeling een nieuw prs heeft aangemaakt.
--Standaard krijgt iedereen DEFAULT, dat is voor de apothekers.
--Niet-apothekers (te herkennen aan kostenplaatsnummer < 50000) worden overgezet naar de FE Hoofdkantoor groep en uit de Default groep gehaald

CREATE OR REPLACE PROCEDURE brcf_toekennen_authgroep
AS
   CURSOR c1
   IS
      SELECT p.prs_perslid_key,
             pk.prs_kostenplaats_nr,
             pk.prs_kostenplaats_omschrijving
        FROM prs_perslid p, prs_afdeling pa, prs_kostenplaats pk
       WHERE     p.prs_afdeling_key = pa.prs_afdeling_key
             AND pa.prs_kostenplaats_key = pk.prs_kostenplaats_key
             AND p.prs_perslid_verwijder IS NULL
             AND fac.safe_to_number (pk.prs_kostenplaats_nr) < 50000
             AND UPPER (pa.prs_afdeling_omschrijving)  NOT LIKE '%BZF%'  -- BZF afdelingen zijn een uitzondering, die moeten altijd Default houden
             AND UPPER (pa.prs_afdeling_omschrijving)  NOT LIKE '%WAREHOUSE%' -- Warehouse afdelingen zijn ook een uitzondering, die moeten altijd Default houden
             AND fac.safe_to_number (pk.prs_kostenplaats_nr) NOT IN (20821, 20871, 20840, 20820) -- DC Amsterdam doet hier niet mee
             AND NOT EXISTS
                   (SELECT 'x'
                      FROM fac_gebruikersgroep f
                     WHERE f.fac_groep_key = 121  -- Komt nog niet voor in de hoofdkantoor groep
                           AND f.prs_perslid_key = p.prs_perslid_key);
                           
   CURSOR c2
   IS
      SELECT p.prs_perslid_key,
             pk.prs_kostenplaats_nr,
             pk.prs_kostenplaats_omschrijving
        FROM prs_perslid p, prs_afdeling pa, prs_kostenplaats pk
       WHERE     p.prs_afdeling_key = pa.prs_afdeling_key
             AND pa.prs_kostenplaats_key = pk.prs_kostenplaats_key
             AND p.prs_perslid_verwijder IS NULL
             AND fac.safe_to_number (pk.prs_kostenplaats_nr) IN (20821, 20871, 20840, 20820)
             AND NOT EXISTS
                   (SELECT 'x'
                      FROM fac_gebruikersgroep f
                     WHERE f.fac_groep_key = 461  -- Komt nog niet voor in de DC Amsterdam groep
                           AND f.prs_perslid_key = p.prs_perslid_key);
BEGIN
   FOR rec IN c1
   LOOP
      BEGIN
         DELETE FROM fac_gebruikersgroep   -- Eerst persoon verwijderen uit de default apothekers groep.
               WHERE prs_perslid_key = rec.prs_perslid_key
                 AND fac_groep_key = 1;

         INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key) -- Dan persoon toekennen aan de hoofdkantoor groep
             VALUES (121, rec.prs_perslid_key);
      END;
   END LOOP;
   
   FOR rec IN c2
   LOOP
      BEGIN
         DELETE FROM fac_gebruikersgroep   -- Eerst persoon verwijderen uit de default apothekers groep.
               WHERE prs_perslid_key = rec.prs_perslid_key
                 AND fac_groep_key = 1;

         INSERT INTO fac_gebruikersgroep (fac_groep_key, prs_perslid_key) -- Dan persoon toekennen aan de DC Amsterdam groep
             VALUES (461, rec.prs_perslid_key);
      END;
   END LOOP;
END;
/

CREATE OR REPLACE PROCEDURE brcf_wp_toekenning
AS
   CURSOR c1
   IS
      SELECT p.prs_perslid_key, pk.prs_kostenplaats_nr, r.alg_ruimte_key
        FROM prs_perslid p,
             prs_afdeling pa,
             prs_kostenplaats pk,
             alg_gebouw g,
             alg_verdieping v,
             alg_ruimte r
       WHERE     p.prs_afdeling_key = pa.prs_afdeling_key
             AND pa.prs_kostenplaats_key = pk.prs_kostenplaats_key
             AND p.prs_perslid_verwijder IS NULL
             AND pa.prs_afdeling_upper = 'CC-' || g.alg_gebouw_upper
             AND pa.prs_afdeling_verwijder IS NULL
             AND g.alg_gebouw_key = v.alg_gebouw_key
             AND v.alg_verdieping_key = r.alg_verdieping_key
             AND r.alg_ruimte_upper_nr = '_'
             AND NOT EXISTS
                   (SELECT 'x'
                      FROM prs_werkplek pw, prs_perslidwerkplek ppw
                     WHERE     p.prs_perslid_key = ppw.prs_perslid_key
                           AND ppw.prs_werkplek_key = pw.prs_werkplek_key
                           AND pw.prs_alg_ruimte_key = r.alg_ruimte_key)
                           
     UNION ALL
      SELECT p.prs_perslid_key, pk.prs_kostenplaats_nr, r.alg_ruimte_key
        FROM prs_perslid p,
             prs_afdeling pa,
             prs_kostenplaats pk,
             alg_ruimte r
       WHERE     p.prs_afdeling_key = pa.prs_afdeling_key
             AND pa.prs_kostenplaats_key = pk.prs_kostenplaats_key
             AND p.prs_perslid_verwijder IS NULL
             AND fac.safe_to_number (pk.prs_kostenplaats_nr) < 50000
             AND UPPER (pa.prs_afdeling_omschrijving)  NOT LIKE '%BZF%'  -- BZF afdelingen zijn een uitzondering
             AND UPPER (pa.prs_afdeling_omschrijving)  NOT LIKE '%WAREHOUSE%' -- Warehouse afdelingen zijn ook een uitzondering
             AND fac.safe_to_number (pk.prs_kostenplaats_nr) NOT IN (20821, 20871, 20840, 20820) -- DC Amsterdam doet hier niet mee
             AND r.alg_ruimte_key = 4127 -- Hoofdkantoor dummy ruimte
             AND p.prs_perslid_verwijder IS NULL
             AND p.prs_perslid_inactief IS NULL
             AND p.prs_perslid_apikey IS NULL
             AND NOT EXISTS
                   (SELECT 'x'
                      FROM prs_werkplek pw, prs_perslidwerkplek ppw
                     WHERE     p.prs_perslid_key = ppw.prs_perslid_key
                           AND ppw.prs_werkplek_key = pw.prs_werkplek_key
                           AND pw.prs_alg_ruimte_key = r.alg_ruimte_key)
    UNION ALL
      SELECT p.prs_perslid_key, pk.prs_kostenplaats_nr, r.alg_ruimte_key
        FROM prs_perslid p,
             prs_afdeling pa,
             prs_kostenplaats pk,
             alg_ruimte r
       WHERE     p.prs_afdeling_key = pa.prs_afdeling_key
             AND pa.prs_kostenplaats_key = pk.prs_kostenplaats_key
             AND p.prs_perslid_verwijder IS NULL
             AND fac.safe_to_number (pk.prs_kostenplaats_nr) IN (20821, 20871, 20840, 20820) -- DC Amsterdam
             AND r.alg_ruimte_key = 8063 -- DC Amsterdam dummy ruimte
             AND p.prs_perslid_verwijder IS NULL
             AND p.prs_perslid_inactief IS NULL
             AND p.prs_perslid_apikey IS NULL
             AND NOT EXISTS
                   (SELECT 'x'
                      FROM prs_werkplek pw, prs_perslidwerkplek ppw
                     WHERE     p.prs_perslid_key = ppw.prs_perslid_key
                           AND ppw.prs_werkplek_key = pw.prs_werkplek_key
                           AND pw.prs_alg_ruimte_key = r.alg_ruimte_key);
BEGIN
   FOR rec IN c1
   LOOP
      BEGIN
         prs.movetoruimte (rec.prs_perslid_key,
                           rec.alg_ruimte_key,
                           'R',
                           0);
      END;
   END LOOP;
END;
/

CREATE OR REPLACE PROCEDURE brcf_delete_persons
AS
    v_importkey      NUMBER;
    v_importappkey   NUMBER;

    CURSOR c1 IS
        SELECT prs_perslid_key
          FROM prs_perslid
         WHERE     prs_perslid_inactief IS NOT NULL -- Als inactief gemarkeerd door IAM koppeling
               AND prs_perslid_verwijder IS NULL;
          
-- Voor het verwijderen hebben we een import_key nodig, dus die gaan we nu aanmaken
BEGIN
    SELECT fac_import_app_key
      INTO v_importappkey
      FROM fac_import_app
     WHERE fac_import_app_code = 'IAM_DEL';

    INSERT INTO fac_import (fac_import_app_key,
                            fac_import_datum_gelezen,
                            fac_import_datum_verwerkt,
                            fac_import_filenaam,
                            prs_perslid_key)
         VALUES (v_importappkey,
                 SYSDATE,
                 SYSDATE,
                 NULL,
                 121);

    SELECT MAX (fac_import_key) INTO v_importkey FROM fac_import;

    FOR rec IN c1
    LOOP
        BEGIN
            prs.delete_perslid (v_importkey, rec.prs_perslid_key);
        END;
    END LOOP;
    
    -- Dan nog even alle overgebleven logins leeg maken t.b.v. de IAM koppeling
    
    UPDATE prs_perslid
       SET prs_perslid_oslogin = NULL
     WHERE prs_perslid_verwijder IS NOT NULL
       AND prs_perslid_oslogin IS NOT NULL;
END;
/

CREATE OR REPLACE PROCEDURE brcf_daily
AS
   v_errormsg          VARCHAR2 (1000);
   oracle_err_num      NUMBER;
   oracle_err_mes      VARCHAR2 (200);
BEGIN
    brcf_schonen_bezoekers ();
    brcf_toekennen_authgroep ();
    brcf_wp_toekenning ();
  --  brcf_delete_persons ();
END;
/

CREATE OR REPLACE PROCEDURE brcf_processemail
                      (pfrom      IN VARCHAR2,
                       pto        IN VARCHAR2,
                       psubject   IN VARCHAR2,
                       pbody      IN VARCHAR2,
                       psessionid IN VARCHAR2,
                       puserkey   IN NUMBER DEFAULT NULL
                      )
AS
    -- puserkey is alvast een nieuwe parameter die per release 2015.2 er gaat komen (FSN#33503), als gevuld, dan deze als aanvrager van melding gebruiken.
  sender                          prs_perslid.prs_perslid_key%TYPE;
  kostenplaats                    prs_afdeling.prs_kostenplaats_key%TYPE;
  v_mldkey                        mld_melding.mld_melding_key%TYPE;
  defaultstdmelding               fac_setting.fac_setting_default%TYPE;
  kkey                            mld_kenmerk.mld_kenmerk_key%TYPE;
  errormsg                        fac_result.fac_result_waarde%TYPE;
  v_mailadres_kenmerk_key         mld_kenmerk.mld_kenmerk_key%TYPE;
  v_flexprop_mail                 VARCHAR2(1000);
  v_from                          VARCHAR2 (1000);

  subject_regexp                 fac_setting.fac_setting_default%TYPE;
  v_behandelaar_key              mld_melding.mld_melding_behandelaar_key%TYPE;
  v_mldnum                       VARCHAR2 (4000);
  v_srtdisc                      VARCHAR2 (4000);
  v_flag_on_fenote               NUMBER (10);
  v_flag_on_bonote               NUMBER (10);
  v_automailkey                  NUMBER (10);
  v_email                        prs_perslid.prs_perslid_email%TYPE;
  v_negeer                       NUMBER (10);
  v_kostenplaats                 VARCHAR2 (4000);
  v_kp_key                       NUMBER (10);
  v_locatie_key                  NUMBER (10);
  v_gebouw_key                   NUMBER (10);
  v_afdeling_key                 NUMBER (10);

BEGIN
  -- Niet alle mails komen van te herleiden personen, dus als sender leeg is dan gebruiken we het generieke account.
  
    SELECT MIN (x.prs_perslid_key)
    INTO sender
    FROM
    (SELECT p.prs_perslid_key
    FROM prs_perslid p
    WHERE UPPER (p.prs_perslid_email) = UPPER (pfrom)
    AND p.prs_perslid_verwijder IS NULL
    UNION ALL
    SELECT prs_perslid_key
        FROM prs_perslid
        WHERE prs_perslid_oslogin = '_HMAIL'
        AND NOT EXISTS (SELECT p.prs_perslid_key
                       FROM prs_perslid p
                      WHERE UPPER (p.prs_perslid_email) = UPPER (pfrom)
                           AND p.prs_perslid_verwijder IS NULL)) x;

-- Geautomatiseerde mails hebben altijd hetzelfde onderwerp, zo kan via een eigen tabel de melding achterhaald worden.
--   SELECT fac.safe_to_number (MIN(fac_usrdata_prijs))
--   INTO v_automailkey
--   FROM fac_usrdata
--   WHERE UPPER (psubject) LIKE  '%'||UPPER (fac_usrdata_omschr)||'%'
--   AND fac_usrtab_key = 101;
--   
--      
--   IF v_automailkey IS NOT NULL
--   THEN
--   defaultstdmelding := v_automailkey;
-- --  v_mailadres_kenmerk_key := ; Dit kan nu niet aangezien dit kenmerk niet bij ALLE meldingen aanwezig is.
--   END IF;
     
 --  IF defaultstdmelding IS NULL
 --  THEN 
   defaultstdmelding := fac.getsetting ('defaultstdmelding'); -- algemeen / werkbon
   v_mailadres_kenmerk_key := 381;
--   END IF;

-- Als mensen op vakantie zijn en een automatisch antwoord aan hebben staan dan wil je dat niet terug in de melding al notitie.
   IF UPPER (psubject) LIKE '%AUTOMATISCH ANTWOORD%'
   THEN 
   v_negeer := 1;
   ELSE
   v_negeer := 0;
   END IF;
  -------------------------------------------------

  -- Check of de afzender pfrom een reply op een bestaande melding doet, in dat geval wordt dat in notities genoteerd.
  -- Wat is een bestaande melding:
  -- 1) Eerst uit het onderwerp het meldingnummer proberen te onderscheppen, uitgangspunt dat in het onderwerp het meldingnummer '1234' kan worden opgevist, met ervoor en erna een spatie
  -- 2) Het 1e nummer dat in het onderwerp staat wordt gezien als meldingnummer, eventuele andere nummers later in het onderwerp worden genegeerd.
  -- 3) Het mailadres van de afzender is dezelfde als die van dat gevonden meldingnummer '1234' in het onderwerp, deze afzender (mailadres) staat in flexprop (zie verderop hieronder)

  subject_regexp := '[[:digit:]]{1,}';
  v_mldnum :=
      REGEXP_SUBSTR (psubject,
                     subject_regexp,
                     1,
                     1,
                     'i');                                    -- 1234, of 12345, of 12, of 1 etc.
                     
  v_kostenplaats := REGEXP_SUBSTR(psubject, '\d+$');         -- Laatste getal in het onderwerp is de kostenplaats.
  
--  v_srtdisc :=
--        REGEXP_SUBSTR (v_mldnum,
--                     '[[:alpha:]]',
--                     1,
--                     1,
--                     'i');                     -- M
    
--    v_mldkey := fac.safe_to_number (SUBSTR (v_mldnum, LENGTH (v_srtdisc) + 1)); -- 123, of 12345, of 12, of 1
      
      v_mldkey := fac.safe_to_number (v_mldnum);
      
      SELECT MAX (prs_kostenplaats_key)
            INTO v_kp_key
            FROM prs_kostenplaats
           WHERE prs_kostenplaats_upper = UPPER (v_kostenplaats)
             AND prs_kostenplaats_verwijder IS NULL;
             
 -- Hieronder gaan we voor de locatie altijd uit van het eerst aangemaakt gebouw die niet verwijderd is, magazijnen kunnen namelijk dezelfde gebouwcode hebben
  IF v_kp_key IS NOT NULL
      THEN
      SELECT MIN (g.alg_locatie_key)
        INTO v_locatie_key
        FROM alg_gebouw g, prs_afdeling p
       WHERE p.prs_afdeling_upper = 'CC-'||g.alg_gebouw_upper
         AND p.prs_kostenplaats_key = v_kp_key
         AND p.prs_afdeling_verwijder IS NULL
         AND g.alg_gebouw_verwijder IS NULL;
         
   IF v_locatie_key IS NOT NULL
      THEN
      SELECT MIN (g.alg_gebouw_key)
        INTO v_gebouw_key
        FROM alg_gebouw g
       WHERE g.alg_locatie_key = v_locatie_key;

   END IF;       
         
      SELECT MAX (p.prs_afdeling_key)
        INTO v_afdeling_key
        FROM alg_gebouw g, prs_afdeling p
       WHERE p.prs_kostenplaats_key = v_kp_key
         AND p.prs_afdeling_verwijder IS NULL;

     SELECT MAX (prs_perslid_key)
           INTO sender
           FROM prs_perslid
          WHERE prs_afdeling_key = v_afdeling_key
            AND prs_perslid_verwijder IS NULL;
            
  END IF;

IF sender IS NULL
THEN
     
     SELECT prs_perslid_key, 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_oslogin = '_HMAIL'; 
END IF;       

    --  Uit onderwerp is de vermoedelijke juiste v_mldkey geparsed.
    -- Final check: is de afzender van de mail dezelfde als die van v_mldkey, deze afzender (mailadres) staat in flexprop (zie verderop hieronder in gedeelte bij insert melding).

    SELECT MAX(SUBSTR(TRIM(km.mld_kenmerkmelding_waarde),1,50))
    INTO v_flexprop_mail
    FROM mld_kenmerkmelding km
    WHERE mld_melding_key = v_mldkey
    AND mld_kenmerk_key = v_mailadres_kenmerk_key
    AND mld_kenmerkmelding_verwijder IS NULL;
    
    SELECT MAX (p.prs_perslid_email)
    INTO v_email
    FROM prs_perslid p, mld_melding m
    WHERE m.mld_melding_key = v_mldkey
    AND m.prs_perslid_key = p.prs_perslid_key;

    v_from := SUBSTR(TRIM(pfrom),1,50);

    IF v_flexprop_mail = v_from OR v_email = v_from
    THEN

          -- Gotcha: bestaande melding gevonden
          -- Van deze afzender is een eerdere melding geregistreerd, die  we plakken de subject en body nu als notitie toe (als perslid system-api user).

          INSERT INTO mld_melding_note (mld_melding_key,
                                    mld_melding_note_omschrijving,
                                    prs_perslid_key,
                                    mld_melding_note_flag)
              VALUES (v_mldkey,
                      fac.safe_concat (
                           psubject || CHR (10) || CHR (13),
                           REPLACE (pbody, 
                    CHR (13) || CHR (10) || CHR (13) || CHR (10), 
                    CHR (13) || CHR (10))),              -- verwijder onnodige witregels
                      sender,
                      0);          -- 0 is NIET zichtbaar FE (want is system-user, zinloos).

            -- Vlaggetjes zetten zoals mld_edit_note.asp dat doet
            IF 1=0 -- vrtw heeft geen melding valggetjes, dus onderstaande kan voor nu weg.
            THEN
             BEGIN
            v_flag_on_fenote := fac.getsetting('mld_flag_on_fenote');
            v_flag_on_bonote := fac.getsetting('mld_flag_on_bonote');

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

                END IF;
             EXCEPTION
                WHEN OTHERS
                THEN
                   DBMS_OUTPUT.put_line(   'Niet gelukt om flag '
                                        || v_flag_on_bonote
                                        || ' te zetten.');
             END;
          END IF; -- vrtw heef geen vlaggetjes

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

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

          -- Bepalen van de behandelaar van deze melding
            BEGIN
            SELECT mld_melding_behandelaar_key
              INTO v_behandelaar_key
              FROM mld_melding m, prs_perslid p
             WHERE mld_melding_key = v_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
               v_behandelaar_key := NULL;
         END;

         IF v_behandelaar_key IS NOT NULL
         THEN
          -- Bestaande melding en behandelaar is bekend.

        -- Notificatie naar behandelaar
        fac.putnotificationsrtprio (
           NULL,
           v_behandelaar_key,
           'MLDNOB',
           v_mldkey,
           'Melding ' || v_mldkey || ' is door de melder aangepast.',
           2,
           NULL,
           NULL,
           NULL,
           2,
           NULL);
            END IF; -- Bestaande melding en behandelaar is bekend.
  ELSE
        -- GEEN bestaande melding gevonden, we gaan een nieuwe mnelding toevoegen....

      IF defaultstdmelding IS NOT NULL AND v_negeer = 0
      THEN

          -- suggested extensions:
          -- check for MLDUSE-write autorisations
          -- parse the subject to find an appropriate stdmelding, if uniquely possible
          -- append (as a note?) to an existing melding if #key is found in the subject
          BEGIN
             INSERT INTO mld_melding (mld_melding_module,
                                      mld_meldbron_key,
                                      mld_melding_datum,
                                      mld_alg_locatie_key,
                                      mld_alg_onroerendgoed_keys,
                                      mld_melding_onderwerp,
                                      mld_melding_omschrijving,
                                      mld_melding_status,
                                      mld_stdmelding_key,
                                      prs_perslid_key,
                                      prs_perslid_key_voor,
                                      prs_kostenplaats_key,
                                      mld_melding_spoed)
                 VALUES ('MLD',
                         4,                                            -- email
                         SYSDATE,
                         COALESCE (v_locatie_key, 1281),               -- Locatie onbekend wanneer deze leeg is
                         COALESCE (v_gebouw_key, 5301),                 -- Gebouw onbekend wanneer deze leeg is
                         SUBSTR (psubject, 1, 75),                     -- onderwerp is max 80 posities
                         fac.safe_concat (
                           CASE WHEN LENGTH (psubject) > 75 
                           THEN 'Volledig onderwerp: ' || psubject || CHR (10) || CHR (13) 
                           ELSE psubject || CHR (10) || CHR (13) 
                           END,
                           REPLACE (pbody, 
                    CHR (13) || CHR (10) || CHR (13) || CHR (10), 
                    CHR (13) || CHR (10))),
                         NULL,
                         defaultstdmelding,
                         sender,
                         sender,
                         kostenplaats,
                         3)
              RETURNING mld_melding_key
                   INTO v_mldkey;

                    -- Vullen van kenmerkwaarde "e-mail adres"
                    IF pfrom IS NOT NULL AND v_mailadres_kenmerk_key IS NOT NULL
                    THEN
                        -- Kenmerk mailadres heeft max. 50 tekens, afkappen dus...


                        -- zet v_from met maximaal 50 tekens als kenmerk bij de zojuist aangemaakte melding.
                        INSERT INTO mld_kenmerkmelding (mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde)
                        VALUES (v_mldkey, v_mailadres_kenmerk_key, v_from);
                    END IF;

            mld.setmeldingstatus (v_mldkey, 2, sender);
            INSERT INTO fac_result (fac_result_sessionid,
                                    fac_result_naam,
                                    fac_result_waarde)
               VALUES (psessionid, 'maillog', 'Geregistreerd onder melding ' || v_mldkey);

          END;
          END IF;
         END IF; -- defaultstdmelding IS NOT NULL
  --  END IF;    -- v_flexprop_mail = v_from

    -- Bijlagen gaan we proberen toe te voegen, zowel bij een nieuwe als een bestaande melding....
     -- Dat doen we bij een flexprop van het type 'M' (=folder met bestanden), door het laagste volgnummer te vinden
     -- find the lowest volgnummer of the flexfield of type folder.
    
 --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 = defaultstdmelding
 --       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 =
 --                           defaultstdmelding
 --                     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);

     kkey := 21;   -- BRCF heeft een bijlage kenmerk over alle vakgroeptypen, lekker makkelijk

     IF kkey IS NOT NULL
     THEN
    INSERT INTO fac_result (fac_result_sessionid,
                            fac_result_naam,
                            fac_result_waarde)
        VALUES (psessionid,
                'kenmerkpath',
                'MLD\M' || to_char( TRUNC(v_mldkey/1000), 'FM0000') || '___\M' || v_mldkey || '\' || kkey || '\');
     END IF;

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

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

