From ed285f40c0ccedfab47d92c4f623d53ac78c07d6 Mon Sep 17 00:00:00 2001 From: Robin Stoker Date: Wed, 15 May 2024 15:44:56 +0000 Subject: [PATCH] FCLT#76096 -- Eerste versie svn path=/Customer/trunk/; revision=64693 --- TDVB/tdvb.sql | 464 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 464 insertions(+) create mode 100644 TDVB/tdvb.sql diff --git a/TDVB/tdvb.sql b/TDVB/tdvb.sql new file mode 100644 index 000000000..bfe5f0697 --- /dev/null +++ b/TDVB/tdvb.sql @@ -0,0 +1,464 @@ +-- +-- $Id$ +-- +-- Script containing customer specific db-configuration for TDVB (Kantoor Keizer) + +DEFINE thisfile = 'TDVB.SQL' +DEFINE dbuser = '^TDVB' + +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 tdvb_v_noti_mailer +( + sender, + receiver, + text, + code, + key, + xkey, + xemail, + xmobile, + fac_srtnotificatie_key, + attachments, + xsender +) +AS + SELECT NULL, + NULL, + 'Uw melding met nummer ' + || m.mld_melding_key + || ' is geregistreerd.', + 'CUST01' code, + m.mld_melding_key, + NULL, + (SELECT mld_kenmerkmelding_waarde + FROM mld_kenmerkmelding km + WHERE km.mld_melding_key = m.mld_melding_key + AND mld_kenmerk_key = 1 -- Email kenmerk + AND UPPER (mld_kenmerkmelding_waarde) NOT LIKE '%BOUNCE%') + xemail, + NULL, + NULL, + NULL, + NULL + FROM mld_melding m, fac_tracking f + WHERE m.mld_melding_key = f.fac_tracking_refkey + AND m.prs_perslid_key = 4 -- Hmail user, anders is deze noti niet nodig + AND f.fac_srtnotificatie_key = 52 -- MLDNEW + AND f.fac_tracking_datum BETWEEN (SELECT fac_notificatie_job_nextrun + - fac_notificatie_job_interval + / 24 + FROM fac_notificatie_job + WHERE UPPER(fac_notificatie_job_view) = + 'TDVB_V_NOTI_MAILER') + AND (SELECT fac_notificatie_job_nextrun + FROM fac_notificatie_job + WHERE UPPER(fac_notificatie_job_view) = + 'TDVB_V_NOTI_MAILER'); + +CREATE OR REPLACE PROCEDURE tdvb_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_alg_ruimte_key NUMBER (10); + v_locatie_key NUMBER (10); + +BEGIN + -- Niet alle mails komen van te herleiden personen, dus als sender leeg is dan gebruiken we het generieke account. + + SELECT 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 p, prs_afdeling d + WHERE p.prs_afdeling_key = d.prs_afdeling_key + AND 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; + +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; + +-- Als de zender bekend is in Facilitor gebruiken we de hoogste werkplek van deze persoon als ruimte_key voor de melding. +IF sender IS NOT NULL +THEN + +SELECT MAX (p.prs_alg_ruimte_key) + INTO v_alg_ruimte_key + FROM prs_werkplek p, prs_perslidwerkplek pw + WHERE pw.prs_perslid_key = sender + AND pw.prs_werkplek_key = p.prs_werkplek_key; + + END IF; + +IF v_alg_ruimte_key IS NOT NULL +THEN + + SELECT MAX (g.alg_locatie_key) + INTO v_locatie_key + FROM alg_gebouw g, alg_verdieping v, alg_ruimte r + WHERE r.alg_verdieping_key = v.alg_verdieping_key + AND v.alg_gebouw_key = g.alg_gebouw_key + AND r.alg_ruimte_key = v_alg_ruimte_key; + + END IF; + +IF v_locatie_key IS NULL +THEN v_locatie_key := 41; -- Kantoor Keizer generieke locatie +END IF; + + +-- 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 = 5; + -- + -- + -- IF v_automailkey IS NOT NULL + -- THEN + -- defaultstdmelding := v_automailkey; + -- v_mailadres_kenmerk_key := 1; + -- END IF; + + + IF defaultstdmelding IS NULL + THEN + defaultstdmelding := fac.getsetting ('defaultstdmelding'); + v_mailadres_kenmerk_key := 1; + END IF; + + 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_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); + + -- 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, + SUBSTR ( + psubject || CHR (13) || CHR (10) + || REPLACE ( + SUBSTR (pbody, + 1, + 4000 - (LENGTH (psubject) + 2)), + CHR (13) || CHR (10) || CHR (13) || CHR (10), + CHR (13) || CHR (10)), + 1, + 4000), -- 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 -- tdvb 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; -- tdvb 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, -- ruimte_key + 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, + v_locatie_key, + v_alg_ruimte_key, -- werkplek van zender of generieke ruimte + SUBSTR (psubject, 1, 75), -- onderwerp is max 80 posities + CASE + WHEN LENGTH (psubject) > 75 + THEN + 'Volledig onderwerp: ' || psubject -- wanneeer het onderwerp is afgekapt plakken we het volledige onderwerp in de omschrijving + ELSE + NULL + END + || CHR (10) || CHR (13) || + SUBSTR ( REPLACE ( + SUBSTR (pbody, + 1, + 4000 - (LENGTH (psubject) + 2)), + CHR (13) || CHR (10) || CHR (13) || CHR (10), + CHR (13) || CHR (10)), + 1, + 4000), -- verwijder onnodige witregels + 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; -- defaultstdmelding IS NOT NULL + END IF; -- v_flexprop_mail = v_from + + -- Bijlage toevoegen, aangezien tdvb hetzelfde bijlage kenmerk gebruikt over alle vakgroeptypen kan de key gewoon hard worden meegegeven. + + kkey := 2; + + 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 \ No newline at end of file