-- -- $Id$ -- -- Script containing customer specific db-configuration for WRTH. DEFINE thisfile = 'WRTH.SQL' DEFINE dbuser = '^WRTH' 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 wrth_v_rap_opdrkalender AS SELECT o.mld_opdr_key opdrkey, COALESCE (mld_opdr_plandatum, mld_opdr_einddatum) plan_einddatum, so.mld_statusopdr_omschrijving status, p.prs_perslid_naam_friendly uitvoerder, o.mld_opdr_omschrijving omschrijving, m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr opdrachtnummer, m.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr || ' - ' || so.mld_statusopdr_omschrijving || ' - ' || p.prs_perslid_naam_friendly || ' - ' || substr (o.mld_opdr_omschrijving, 1, 60) || '...' kalenderinhoud FROM mld_opdr o, mld_melding m, prs_v_perslid_fullnames p, mld_statusopdr so WHERE o.mld_uitvoerende_keys = p.prs_perslid_key AND o.mld_melding_key = m.mld_melding_key AND o.mld_statusopdr_key = so.mld_statusopdr_key; --Mail2Melding procedure CREATE OR REPLACE PROCEDURE WRTH_processemail (pfrom IN VARCHAR2, pto IN VARCHAR2, psubject IN VARCHAR2, pbody IN VARCHAR2, psessionid IN VARCHAR2, pemailkey IN NUMBER) AS c_onbekend_key NUMBER (10) := 4; -- TODO:API-user tbv. hMail-koppeling? v_errormsg VARCHAR2 (1000); oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_perslid_key NUMBER (10); v_kostenplaats_key NUMBER (10); v_locatie_key NUMBER (10); v_exists_id VARCHAR2 (255); v_melding_key NUMBER (10); v_melder_key NUMBER (10); v_opdracht_key NUMBER (10); v_typeopdr_key NUMBER (10); v_discipline_key NUMBER (10); v_stdmelding_key NUMBER (10); v_folder_kkey NUMBER (10); subject_regexp VARCHAR2 (1000); v_mldnum VARCHAR2 (1000); v_count NUMBER (10); BEGIN CASE WHEN UPPER (pto) LIKE 'SERVICEDESK@%' OR UPPER (pto) LIKE 'MELDING@WURTH.NL' THEN -- Bepaal de mailer op basis van e-mail adres zoals in pfrom? v_errormsg := 'Fout bepalen mailer'; SELECT COUNT ( * ) INTO v_count FROM prs_v_aanwezigperslid WHERE UPPER (prs_perslid_email) LIKE UPPER (pfrom) || '%'; IF v_count = 1 THEN SELECT p.prs_perslid_key, a.prs_kostenplaats_key INTO v_perslid_key, v_kostenplaats_key FROM prs_v_aanwezigperslid p, prs_afdeling a, (SELECT pw.prs_perslid_key, pw.prs_werkplek_key FROM prs_perslidwerkplek pw WHERE NOT EXISTS (SELECT 1 FROM prs_perslidwerkplek WHERE prs_perslid_key = pw.prs_perslid_key AND prs_perslidwerkplek_key > pw.prs_perslidwerkplek_key)) pw, prs_v_werkplekperslid_gegevens wpg WHERE p.prs_afdeling_key = a.prs_afdeling_key AND UPPER (p.prs_perslid_email) LIKE UPPER (pfrom) || '%' AND p.prs_perslid_key = pw.prs_perslid_key(+) AND pw.prs_werkplek_key = wpg.prs_werkplek_key(+) GROUP BY p.prs_perslid_key, a.prs_kostenplaats_key; ELSE -- Melder kan niet 1-duidig worden bepaald, dus Onbekend (hmailuser) SELECT p.prs_perslid_key, a.prs_kostenplaats_key INTO v_perslid_key, v_kostenplaats_key FROM prs_v_aanwezigperslid p, prs_afdeling a WHERE p.prs_afdeling_key = a.prs_afdeling_key AND p.prs_perslid_key = c_onbekend_key; END IF; -- 1) Eerst meldingnr 123 of opdrachtnr 123/1 gevolgd door spatie uit -- onderwerp proberen te bepalen. -- 2) Het eerste voorkomen beginnend met een cijfer wordt gezien als -- meldingnr of opdrachtnr en evt. andere voorkomens (verder naar -- rechts) worden genegeerd. v_errormsg := 'Fout bepalen melding/opdracht'; v_exists_id := psubject; IF REGEXP_INSTR (v_exists_id, '\d') > 0 THEN v_exists_id := SUBSTR (v_exists_id, REGEXP_INSTR (v_exists_id, '\d')) || ' '; -- Gedeelte vanaf eerste cijfer in v_exists_id plus ' '! v_exists_id := SUBSTR (v_exists_id, 1, REGEXP_INSTR (v_exists_id, '\s') - 1); -- Gedeelte tot eerste white space in v_exists_id! END IF; IF INSTR (v_exists_id, '/') = 0 -- Slash in eerste voorkomen beginnend met een cijfer? THEN -- Melding v_errormsg := 'Fout bepalen melding ' || v_exists_id; SELECT MAX (mld_melding_key), MAX (prs_perslid_key) -- MAX() om te zorgen dat v_melding_key=NULL als meldingnr niet bestaat! INTO v_melding_key, v_melder_key FROM mld_melding WHERE mld_melding_key = fac.safe_to_number (v_exists_id); IF v_melding_key IS NOT NULL THEN v_errormsg := 'Fout toevoegen notitie'; INSERT INTO mld_melding_note (mld_melding_key, mld_melding_note_omschrijving, prs_perslid_key, mld_melding_note_flag) VALUES (v_melding_key, SUBSTR (psubject || CHR (13) || CHR (10) || SUBSTR (pbody, 1, 4000 - (LENGTH (psubject) + 2)), 1, 4000), v_perslid_key, DECODE (v_perslid_key, -- Notitie open=1 als mailer=melder, anders gesloten=0! v_melder_key, 1, 0)); -- Default tracking is even goed genoeg. fac.trackaction ('MLDNOT', v_melding_key, v_perslid_key, 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 ' || TO_CHAR (v_melding_key)); ELSE -- Bepaal de afgesproken soortmelding met key=281=intake melding v_errormsg := 'Fout bepalen soortmelding'; SELECT mld_ins_discipline_key, mld_stdmelding_key INTO v_discipline_key, v_stdmelding_key FROM mld_stdmelding WHERE mld_stdmelding_key = 281; -- Suggested extensions: -- - Check for MLDUSE-write autorisations -- - Parse the subject to find the appropriate stdmelding, if uniquely possible -- - Append (as a note?) to an existing melding if #key is found in the subject v_errormsg := 'Fout toevoegen melding'; INSERT INTO mld_melding (mld_melding_module, mld_meldbron_key, mld_alg_locatie_key, mld_alg_onroerendgoed_keys, mld_melding_datum, mld_melding_omschrijving, mld_stdmelding_key, mld_melding_t_uitvoertijd, prs_kostenplaats_key, prs_perslid_key, prs_perslid_key_voor, mld_melding_status, mld_melding_spoed, mld_melding_onderwerp, mld_melding_behandelaar2_key, mld_ins_discipline_key) VALUES ('MLD', 4, -- Email COALESCE (v_locatie_key, 49), -- Fallback op 49 HQ Den Bosch NULL, --v_onrgoed_keys, SYSDATE, SUBSTR (pbody, 1, 2000), v_stdmelding_key, NULL, v_kostenplaats_key, v_perslid_key, v_perslid_key, NULL, 3, -- Prio normaal SUBSTR (psubject, 1, 80), NULL, NULL) RETURNING mld_melding_key INTO v_melding_key; mld.setmeldingstatus (v_melding_key, 2, v_perslid_key); INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde) VALUES (psessionid, 'maillog', 'Geregistreerd onder melding ' || TO_CHAR (v_melding_key)); END IF; -- Find the lowest volgnummer of the Folder-flexfield. -- PAS OP: 'Alle vakgroeptypen'-kenmerken hier niet beschouwd en dat bijt -- dus nooit met kenmerk hieronder tbv. Originele mail! v_errormsg := 'Fout toevoegen melding-bijlage'; SELECT MIN (k1.mld_kenmerk_key) INTO v_folder_kkey FROM mld_stdmelding sm1, ins_tab_discipline td1, mld_kenmerk k1, mld_srtkenmerk sk1 WHERE sm1.mld_stdmelding_key = v_stdmelding_key AND sm1.mld_ins_discipline_key = td1.ins_discipline_key AND k1.mld_kenmerk_verwijder IS NULL AND k1.mld_srtkenmerk_key = sk1.mld_srtkenmerk_key AND sk1.mld_srtkenmerk_kenmerktype = 'M' AND (k1.mld_kenmerk_niveau = 'A' OR (k1.mld_stdmelding_key = sm1.mld_stdmelding_key AND k1.mld_kenmerk_niveau = 'S') OR (k1.mld_stdmelding_key = td1.ins_discipline_key AND k1.mld_kenmerk_niveau = 'D') OR (k1.mld_stdmelding_key = td1.ins_srtdiscipline_key AND k1.mld_kenmerk_niveau = 'T')) AND NOT EXISTS (SELECT 1 FROM mld_stdmelding sm2, ins_tab_discipline td2, mld_kenmerk k2, mld_srtkenmerk sk2 WHERE sm2.mld_stdmelding_key = v_stdmelding_key AND sm2.mld_ins_discipline_key = td2.ins_discipline_key AND k2.mld_kenmerk_verwijder IS NULL AND k2.mld_srtkenmerk_key = sk2.mld_srtkenmerk_key AND sk2.mld_srtkenmerk_kenmerktype = 'M' AND (k2.mld_kenmerk_niveau = 'A' OR (k2.mld_stdmelding_key = sm2.mld_stdmelding_key AND k2.mld_kenmerk_niveau = 'S') OR (k2.mld_stdmelding_key = td2.ins_discipline_key AND k2.mld_kenmerk_niveau = 'D') OR (k2.mld_stdmelding_key = td2.ins_srtdiscipline_key AND k2.mld_kenmerk_niveau = 'T')) 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\M' || TO_CHAR (TRUNC (v_melding_key / 1000), 'FM0000') || '___\M' || v_melding_key || '\' || v_folder_kkey || '\'); END IF; ELSE -- Opdracht v_errormsg := 'Fout bepalen opdracht ' || v_exists_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_exists_id, REGEXP_INSTR (v_exists_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_perslid_key, pfrom || CHR (13) || CHR (10) || psubject || CHR (13) || CHR (10) || SUBSTR (pbody, 1, 2000)); v_errormsg := 'Fout bijwerken opdracht-kleurbolletje'; UPDATE mld_opdr SET mld_opdr_flag = 1 -- Zwart WHERE mld_opdr_key = v_opdracht_key; -- 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 IF; END CASE; 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.writelog ('PROCESSEMAIL', 'E', 'WRTH_processemail afgebroken!', '[' || pfrom || '] ' || v_errormsg); INSERT INTO fac_result (fac_result_sessionid, fac_result_naam, fac_result_waarde) VALUES (psessionid, 'errormsg', 'Database fout - Neem contact op met uw systeembeheerder '); COMMIT; 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