--
-- $Id$
--
-- Script containing customer specific sql statements for gemeente Den Helder (DHLD)

DEFINE thisfile = 'DHLD.SQL'
DEFINE dbuser   = 'DHLD'

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 DHLD_V_RAP_MLD_QRC
(
    FCLT_3D_LOCATIE_KEY,
    FCLT_3D_DISCIPLINE_KEY,
    FCLT_F_DISCIPLINE,
    FCLT_F_SOORTMELDING,
    FCLT_F_LOCATIE,
    FCLT_F_GEBOUW,
    FCLT_F_VERDIEPING,
    PLAATS,
    RUIMTE_KEY,
    RUIMTEFUNCTIE,
    FCLT_F_OBJECTDISCIPLINE,
    FCLT_F_OBJECTGROEP,
    OBJECTSOORT_KEY,
    FCLT_F_OBJECTSOORT,
    OBJECTSOORT_CODE,
    INS_DEEL_KEY,
    INS_DEEL_OMSCHRIJVING,
    INS_DEEL_UPPER,
    SERIENUMMER,
    HIDE_F_BOOKMARK_ID,
    URL
)
AS    
SELECT l.alg_locatie_key,
       disc.ins_discipline_key,
       disc.ins_discipline_omschrijving,
       msd.mld_stdmelding_omschrijving,
       l.alg_locatie_omschrijving,
       o.alg_gebouw_omschrijving,
       o.alg_verdieping_omschrijving,
       o.alg_plaatsaanduiding
           plaats,
       d.ins_alg_ruimte_key
           ruimte_key,
       sr.alg_srtruimte_omschrijving,
       disc.ins_discipline_omschrijving,
       sg.ins_srtgroep_omschrijving,
       sd.ins_srtdeel_key,
       sd.ins_srtdeel_omschrijving,
       sd.ins_srtdeel_code,
       d.ins_deel_key,
       d.ins_deel_omschrijving,
       d.ins_deel_upper,
       (SELECT MAX (kmd.ins_kenmerkdeel_waarde)
          FROM ins_kenmerkdeel kmd, ins_kenmerk km, ins_srtkenmerk skm
         WHERE     skm.ins_srtkenmerk_key = km.ins_srtkenmerk_key
               AND km.ins_kenmerk_key = kmd.ins_kenmerk_key
               AND skm.ins_srtkenmerk_key = 2                   -- Serienummer
               AND kmd.ins_deel_key = d.ins_deel_key)
           AS serie_nummer,         
       b.fac_bookmark_id,
          'https://dhld.facilitor.nl/?u='
       || b.fac_bookmark_id
       || CHR (38)
       || 'ins_key='
       || d.ins_deel_key
  FROM (SELECT DECODE (
                   INSTR (
                       SUBSTR (
                           UPPER (fac_bookmark_query),
                           INSTR (UPPER (fac_bookmark_query), 'STDM_KEY=')),
                       '&'),
                   0, SUBSTR (
                          SUBSTR (
                              UPPER (fac_bookmark_query),
                              INSTR (UPPER (fac_bookmark_query), 'STDM_KEY=')),
                          10),
                   SUBSTR (
                       SUBSTR (
                           UPPER (fac_bookmark_query),
                           INSTR (UPPER (fac_bookmark_query), 'STDM_KEY=')),
                       10,
                         INSTR (
                             SUBSTR (
                                 UPPER (fac_bookmark_query),
                                 INSTR (UPPER (fac_bookmark_query),
                                        'STDM_KEY=')),
                             '&')
                       - 10))    stdm_key,
               fac_bookmark_id
          FROM fac_bookmark
         WHERE     UPPER (fac_bookmark_path) = 'APPL/PDA/MELDING.ASP'
               AND INSTR (UPPER (fac_bookmark_query), 'STDM_KEY') > 0) b, -- stdm_key-bookmarks
       (SELECT sm.mld_stdmelding_key,
               sm.mld_stdmelding_omschrijving,
               si.ins_srtinstallatie_key     ins_srtdeel_key
          FROM mld_stdmelding sm, mld_stdmelding_srtinst si
         WHERE     sm.mld_stdmelding_key = si.mld_stdmelding_key
               AND sm.mld_stdmelding_verwijder IS NULL
               AND si.ins_srtinstallatie_niveau = 'S'
        UNION ALL
        SELECT sm.mld_stdmelding_key,
               sm.mld_stdmelding_omschrijving,
               sd.ins_srtdeel_key
          FROM mld_stdmelding sm, mld_stdmelding_srtinst si, ins_srtdeel sd
         WHERE     sm.mld_stdmelding_key = si.mld_stdmelding_key
               AND sm.mld_stdmelding_verwijder IS NULL
               AND si.ins_srtinstallatie_niveau = 'G'
               AND si.ins_srtinstallatie_key = sd.ins_srtgroep_key
        UNION ALL
        SELECT sm.mld_stdmelding_key,
               sm.mld_stdmelding_omschrijving,
               sd.ins_srtdeel_key
          FROM mld_stdmelding          sm,
               mld_stdmelding_srtinst  si,
               ins_srtgroep            sg,
               ins_srtdeel             sd
         WHERE     sm.mld_stdmelding_key = si.mld_stdmelding_key
               AND sm.mld_stdmelding_verwijder IS NULL
               AND si.ins_srtinstallatie_niveau = 'D'
               AND si.ins_srtinstallatie_key = sg.ins_discipline_key
               AND sg.ins_srtgroep_key = sd.ins_srtgroep_key) msd, -- object-meldingen
       ins_v_aanwezigdeel   d,
       ins_srtdeel          sd,
       ins_srtgroep         sg,
       ins_discipline       disc,
       ins_v_alg_overzicht  o,
       alg_locatie          l,
       alg_ruimte           r,
       alg_srtruimte        sr
 WHERE     fac.safe_to_number (b.stdm_key) = msd.mld_stdmelding_key
       AND msd.ins_srtdeel_key = d.ins_srtdeel_key
       AND d.ins_alg_ruimte_type IN ('T', 'R', 'W')
       AND d.ins_deel_parent_key IS NULL
       AND d.ins_srtdeel_key = sd.ins_srtdeel_key
       AND sd.ins_srtgroep_key = sg.ins_srtgroep_key
       AND sg.ins_discipline_key = disc.ins_discipline_key
       AND d.ins_alg_ruimte_key = o.alg_onroerendgoed_keys
       AND d.ins_alg_ruimte_type = o.alg_onroerendgoed_type
       AND d.ins_alg_locatie_key = o.alg_locatie_key             -- redundant?
       AND o.alg_locatie_key = l.alg_locatie_key
       AND d.ins_alg_ruimte_key = r.alg_ruimte_key
       AND r.alg_srtruimte_key = sr.alg_srtruimte_key(+);

CREATE OR REPLACE PROCEDURE dhld_processemail (pfrom        IN VARCHAR2,
                                               pto          IN VARCHAR2,
                                               psubject     IN VARCHAR2,
                                               pbody        IN VARCHAR2,
                                               psessionid   IN VARCHAR2,
                                               pemailkey    IN NUMBER)
AS
    v_sender           prs_perslid.prs_perslid_key%TYPE;
    v_perslid_key      prs_perslid.prs_perslid_key%TYPE;
    v_kostenplaats     prs_afdeling.prs_kostenplaats_key%TYPE;
    v_kostenplaatsf    prs_afdeling.prs_kostenplaats_key%TYPE;
    v_kostenplaatsfa   prs_afdeling.prs_kostenplaats_key%TYPE;
    v_mldstat          mld_melding.mld_melding_status%TYPE;
    v_stdmelding       mld_stdmelding.mld_stdmelding_key%TYPE;
    v_behandelteam     ins_tab_discipline.ins_discipline_key%TYPE;
    v_stduitvoer       mld_stdmelding.mld_stdmelding_t_uitvoertijd%TYPE;
    v_errormsg         fac_result.fac_result_waarde%TYPE;
    v_from             VARCHAR2 (4000);
    v_from_key         prs_perslid.prs_perslid_key%TYPE;
    v_fromaddr         VARCHAR2 (4000);
    v_fromaddr_key     prs_perslid.prs_perslid_key%TYPE;
    v_body             VARCHAR2 (4000);
    m_body             VARCHAR2 (4000);
    v_mldkey           mld_melding.mld_melding_key%TYPE;
    v_mailorigin       mld_kenmerk.mld_kenmerk_key%TYPE;
    v_mailattach       mld_kenmerk.mld_kenmerk_key%TYPE;
    v_locatiekey       alg_locatie.alg_locatie_key%TYPE;
    v_stroming         VARCHAR2 (255);
    v_folder_kkey      NUMBER (10);
    v_opdracht_id      VARCHAR2 (255);
    v_opdracht_key     NUMBER (10);
    v_typeopdr_key     NUMBER (10);
    v_count            NUMBER (10);
    c_onbekend_key     NUMBER (10) := 12141;                       -- Onbekend
--    v_van_email      VARCHAR2 (255) := '';
BEGIN
    v_sender := 3;                            --Standaard de persoon Facilitor
    v_stdmelding := fac.safe_to_number (fac.getsetting ('defaultstdmelding'));
    v_mailorigin := 362;                    --Kenmerk_key oorspronkelijke mail
    v_mailattach := 1; --Kenmerk_key bijlagen bij vakgroeptype Meldingen (onderstaande 3 meldings-stromen vallen daar allen onder)
    v_typeopdr_key := 5;                              --Opdrachttype Standaard
    v_behandelteam := 175;                     --Default behandelteam Meldpunt

    -- Bepalen Stroming: Facilitair of ICT (of anders)
    CASE
        WHEN UPPER (pto) LIKE 'MELDPUNT@%'
        THEN
            v_stdmelding := 242;                --Overige meldingen Facilitair
            v_behandelteam := 175;                   -- Behandelteam  Meldpunt
            v_stroming := 'melding';
        WHEN UPPER (pto) LIKE 'HELPDESK@%'
        THEN
            v_stdmelding := 243;                       --Overige meldingen ICT
            v_behandelteam := 167;                   -- Behandelteam  Helpdesk
            v_stroming := 'melding';
        WHEN UPPER (pto) LIKE 'MELDINGEN-SYSTEEMBEHEER@%'
        THEN
            v_stdmelding := 341;                       --Overige meldingen ICT
            v_behandelteam := 180;               -- Behandelteam  Systembeheer
            v_stroming := 'melding';
        WHEN UPPER (pto) LIKE 'REPLY_ORDERS@%'
        THEN
            v_stroming := 'opdracht';
        ELSE
            v_stdmelding :=
                fac.safe_to_number (fac.getsetting ('defaultstdmelding'));
            v_stroming := 'melding';
    END CASE;

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

    SELECT fac_result_waarde
      INTO v_from
      FROM fac_result
     WHERE fac_result_sessionid = psessionid AND fac_result_naam = 'from';
    
    v_from := REPLACE (REPLACE (v_from, '>', ''), '<', '');     

    -- Valideer de sender in pfrom: kennen we deze?
    v_errormsg := 'Valideren afzender';

    SELECT COALESCE (MIN (p.prs_perslid_key), c_onbekend_key),
           MIN (d.prs_kostenplaats_key)
      INTO v_from_key, v_kostenplaatsf
      FROM prs_perslid p, prs_afdeling d
     WHERE     p.prs_afdeling_key = d.prs_afdeling_key
           AND p.prs_perslid_verwijder IS NULL
           AND UPPER (prs_perslid_email) = UPPER (v_from);

    -- Indien een mail is doorgestuurd, dan moet er teruggevallen worden op de v_fromaddr.
    SELECT fac_result_waarde
      INTO v_fromaddr
      FROM fac_result
     WHERE fac_result_sessionid = psessionid AND fac_result_naam = 'fromaddr';

    v_fromaddr := REPLACE (REPLACE (v_fromaddr, '>', ''), '<', '');

    SELECT MIN (p.prs_perslid_key), MIN (d.prs_kostenplaats_key)
      INTO v_fromaddr_key, v_kostenplaatsfa
      FROM prs_perslid p, prs_afdeling d
     WHERE     p.prs_afdeling_key = d.prs_afdeling_key
           AND p.prs_perslid_verwijder IS NULL
           AND UPPER (prs_perslid_email) = UPPER (v_fromaddr);

    --Samenvoegen: afzender als deze bekend is (from), anders oorspronkelijke afzender bij doorgestuurd bericht (fromaddr)
    SELECT COALESCE (v_fromaddr_key, v_from_key, c_onbekend_key),
           COALESCE (v_kostenplaatsfa, v_kostenplaatsf)
      INTO v_sender, v_kostenplaats
      FROM DUAL;

    v_body := pbody;
    m_body := pbody;

    CASE
        WHEN v_stroming = 'melding'
        THEN
            --Hieronder de acties die gedaan moeten worden.
            BEGIN
                v_errormsg := 'Melding aanmaken' || pfrom || psubject;
                v_mldstat := 2;           -- Standaard de status in Nieuw (2).
                v_stduitvoer :=
                    mld.getstduitvoer (v_stdmelding,
                                       NULL,
                                       NULL,
                                       NULL);

                INSERT INTO mld_melding (mld_melding_module,
                                         mld_meldbron_key,
                                         mld_melding_datum,
                                         mld_melding_onderwerp,
                                         mld_melding_omschrijving,
                                         mld_melding_status,
                                         mld_melding_t_uitvoertijd,
                                         mld_stdmelding_key,
                                         mld_ins_discipline_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, 1, 200),
                                -- fac.safe_concat(
                                    -- SUBSTR(psubject, 1, 200) || CHR(13) || CHR(10),
                                    -- REPLACE(
                                        -- pbody,
                                        -- CHR(13) || CHR(10) || CHR(13) || CHR(10),
                                        -- CHR(13) || CHR(10)
                                    -- )
                                -- ),
                                fac.safe_concat(
                                    'Mail van: ' || v_from || ':' || CHR(13) || CHR(10),
                                    REPLACE(
                                        v_body,
                                        CHR(13) || CHR(10) || CHR(13) || CHR(10),
                                        CHR(13) || CHR(10)
                                    )
                                ),     -- verwijder onnodige witregels
                                v_mldstat,
                                NULL,                          -- v_stduitvoer
                                v_stdmelding,
                                v_behandelteam,
                                v_locatiekey, -- Locatie bepaald via standaardlocatie v_sender (indien ingesteld)
                                NULL,
                                v_sender,
                                v_sender,
                                v_kostenplaats,
                                3)
                  RETURNING mld_melding_key
                       INTO v_mldkey;

                v_errormsg := 'Status melding';
                mld.setmeldingstatus (v_mldkey, v_mldstat, v_sender);

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

            IF v_mldkey IS NOT NULL
            THEN
                BEGIN
                    -- Originele email wordt opgeslagen
                    v_errormsg :=
                           'Oorspronkelijke email opslaan'
                        || v_mldkey
                        || psubject;

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


            v_errormsg := 'Fout toevoegen bijlage(n)';

            IF v_mailattach IS NOT NULL
            THEN
                BEGIN
                    -- Toevoegen bijlage(n)
                    v_errormsg := 'Bijlagen opslaan' || v_mldkey || psubject;

                    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
                                        || '\'
                                        || v_mailattach
                                        || '\');
                END;
            END IF;
        WHEN v_stroming = 'opdracht'
        THEN
            v_errormsg := 'Fout: de opdracht id kon niet worden bepaald';
            v_opdracht_id := psubject;

            IF REGEXP_INSTR (v_opdracht_id, '\d') > 0
            THEN
                v_opdracht_id :=
                       SUBSTR (v_opdracht_id,
                               REGEXP_INSTR (v_opdracht_id, '\d'))
                    || ' '; -- Gedeelte vanaf eerste cijfer in v_exist_ticket plus ' '!
                v_opdracht_id :=
                    SUBSTR (v_opdracht_id,
                            1,
                            REGEXP_INSTR (v_opdracht_id, '\s') - 1); -- Gedeelte tot eerste white space in v_exist_ticket!
            END IF;

            v_errormsg :=
                   'Fout: het opdrachtnummer kon niet worden bepaald'
                || v_opdracht_id;

            SELECT mld_opdr_key, mld_typeopdr_key
              INTO v_opdracht_key, v_typeopdr_key
              FROM mld_opdr
             WHERE    TO_CHAR (mld_melding_key)
                   || '/'
                   || TO_CHAR (mld_opdr_bedrijfopdr_volgnr) =
                   SUBSTR (v_opdracht_id, REGEXP_INSTR (v_opdracht_id, '\d'));

            v_errormsg := 'Fout toevoegen opdracht-notitie';

            INSERT INTO mld_opdr_note (
                mld_opdr_key,
                prs_perslid_key,
                mld_opdr_note_omschrijving
            )
            VALUES (
                v_opdracht_key,
                v_sender,
                fac.safe_concat(
                    'Mail van: ' || NVL(v_from, '(onbekend)') || ':' || CHR(13) || CHR(10) ||
                    NVL(psubject, '') || CHR(13) || CHR(10),
                    REPLACE(
                        NVL(v_body, ''),
                        CHR(13) || CHR(10) || CHR(13) || CHR(10),
                        CHR(13) || CHR(10)
                    )
                )
            );    -- verwijder onnodige witregels

            -- Find the lowest volgnummer of the Folder-flexfield.
            v_errormsg := 'Fout toevoegen opdracht-bijlage';

            SELECT MIN (k1.mld_kenmerk_key)
              INTO v_folder_kkey
              FROM mld_kenmerk k1, mld_srtkenmerk sk1
             WHERE     k1.mld_typeopdr_key = v_typeopdr_key
                   AND k1.mld_kenmerk_verwijder IS NULL
                   AND k1.mld_kenmerk_niveau = 'O'
                   AND k1.mld_srtkenmerk_key = sk1.mld_srtkenmerk_key
                   AND sk1.mld_srtkenmerk_kenmerktype = 'M'
                   AND NOT EXISTS
                           (SELECT 1
                              FROM mld_kenmerk k2, mld_srtkenmerk sk2
                             WHERE     k2.mld_typeopdr_key = v_typeopdr_key
                                   AND k2.mld_kenmerk_verwijder IS NULL
                                   AND k2.mld_kenmerk_niveau = 'O'
                                   AND k2.mld_srtkenmerk_key =
                                       sk2.mld_srtkenmerk_key
                                   AND sk2.mld_srtkenmerk_kenmerktype = 'M'
                                   AND k2.mld_kenmerk_volgnummer <
                                       k1.mld_kenmerk_volgnummer);

            IF v_folder_kkey IS NOT NULL
            THEN
                INSERT INTO fac_result (fac_result_sessionid,
                                        fac_result_naam,
                                        fac_result_waarde)
                         VALUES (
                                    psessionid,
                                    'kenmerkpath',
                                       'MLD\O'
                                    || TO_CHAR (
                                           TRUNC (v_opdracht_key / 1000),
                                           'FM0000')
                                    || '___\O'
                                    || v_opdracht_key
                                    || '\'
                                    || v_folder_kkey
                                    || '\');
            END IF;
    END CASE;
EXCEPTION
    WHEN OTHERS
    THEN
        INSERT INTO fac_result (fac_result_sessionid,
                                fac_result_naam,
                                fac_result_waarde)
             VALUES (psessionid, 'maillog', SUBSTR(v_errormsg, 1, 4000));

        fac.writelog(
            'PROCESSEMAIL',
            'E',
            SUBSTR(
                fac.safe_concat(
                    'Mail kon niet ingelezen worden afzender: ' || NVL(pfrom, '(onbekend)') || CHR(13) || CHR(10),
                    '[' || NVL(v_errormsg, '') || ' ' || NVL(v_mldkey, '') || ' ' || NVL(psubject, '') || ']'
                ),
                1,
                1000
            ),
            'OTHERS (error ' || SQLCODE || '/' || SUBSTR(SQLERRM, 1, 100) || ')'
        );
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
