-- -- $Id$ -- -- Script containing customer specific sql statements for the VRTW database DEFINE thisfile = 'VRTW.SQL' DEFINE dbuser = 'VRTW' 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 PROCEDURE vrtw_import_prs (p_import_key IN NUMBER) AS oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_errormsg VARCHAR2 (400); v_errorhint VARCHAR2 (400); v_newline FAC_IMP_FILE.FAC_IMP_FILE_LINE%TYPE; BEGIN BEGIN SELECT fac_imp_file_line INTO v_newline FROM fac_imp_file WHERE fac_import_key = p_import_key AND fac_imp_file_index = 1; IF v_newline LIKE CHR (TO_NUMBER ('EF', 'xx')) || CHR (TO_NUMBER ('BB', 'xx')) || CHR (TO_NUMBER ('BF', 'xx')) || '%' 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; -- Verwijder de dubbele quotes v_newline := REPLACE (v_newline, '"'); UPDATE fac_imp_file SET fac_imp_file_line = v_newline WHERE fac_import_key = p_import_key AND fac_imp_file_index = 1; EXCEPTION WHEN OTHERS THEN fac.imp_writelog (p_import_key, 'E', 'Fout bij controle op Byte Order Mark', '' ); END; v_errorhint := 'Generieke update'; -- de sequence array staat beschreven in PRS_PAC.SRC bij de prs.import_perslid proc prs.import_perslid (p_import_key, '9;0;0;0;0;0;8;6;5;4;' || '0;0;0;0;0;0;10;2;0;0;' || '7;1;0;0;0;0;0;0;0;0;'|| '0;0;0;0;0;0;0;0;0;0;'|| '0;0;0;0;0;0', 'adfs_login;email;initialen;voornaam;tussenvoegsel;achternaam;functie;afdeling;locatie;mobiel%' ); COMMIT; -- Tot dummyruimte nog even de import tabel vullen, voor de werkplektoekenning DECLARE CURSOR alg IS SELECT l.alg_locatie_code, g.alg_gebouw_code, v.alg_verdieping_volgnr, r.alg_ruimte_nr FROM alg_locatie l, alg_gebouw g, alg_verdieping v, alg_ruimte r WHERE g.alg_locatie_key = l.alg_locatie_key AND v.alg_gebouw_key = g.alg_gebouw_key AND r.alg_verdieping_key = v.alg_verdieping_key AND r.alg_ruimte_nr = '_-' AND alg_gebouw_verwijder IS NULL; BEGIN FOR rec IN alg LOOP BEGIN UPDATE fac_imp_perslid SET alg_gebouw_code = rec.alg_gebouw_code, alg_verdieping_volgnr = rec.alg_verdieping_volgnr, alg_ruimte_nr = rec.alg_ruimte_nr WHERE UPPER (alg_locatie_code) = UPPER (TRIM (rec.alg_locatie_code)); END; END LOOP; END; 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_errorhint); END vrtw_import_prs; / CREATE OR REPLACE PROCEDURE vrtw_update_prs ( p_import_key IN NUMBER ) IS -- Alle personen verwijderen die niet meer in import bestand voorkomen. CURSOR c_del IS SELECT p.prs_perslid_key, p.prs_perslid_oslogin, pf.prs_perslid_naam_full FROM fac_imp_perslid i, prs_perslid p, prs_v_perslid_fullnames_all pf WHERE UPPER (p.prs_perslid_oslogin) = UPPER (i.prs_perslid_oslogin(+)) AND pf.prs_perslid_key = p.prs_perslid_key AND p.prs_perslid_oslogin IS NOT NULL AND i.prs_perslid_oslogin IS NULL AND p.prs_perslid_verwijder IS NULL AND substr(p.prs_perslid_oslogin, 1, 1) != '_' ORDER BY 2; v_count NUMBER; BEGIN -- generic update SELECT count(*) INTO v_count FROM fac_imp_perslid; IF v_count < 150 THEN fac.imp_writelog (p_import_key, 'E', 'Het aantal te importeren personen is te klein (' || TO_CHAR (v_count) || ')', 'Zie Specificatie' ); RETURN; END IF; -- 'LOGIN' betekent dat op basis van oslogin wordt gematched. -- 'A' betekent altijd alle (andere/overige) werkplekken verwijderen prs.update_perslid (p_import_key, 'LOGIN', 'A'); -- Verwijder personen die niet meer in de import voorkomen. FOR rec IN c_del LOOP BEGIN prs.delete_perslid (p_import_key, rec.prs_perslid_key); END; END LOOP; END vrtw_update_prs; / -- Vanaf hier volgen rapportages -- Rapport voor de brandmeester van dienst om zo makkelijk in te zien wat er speelt op een locatie (beperkt tot Almelo, Hengelo, Enschede) CREATE OR REPLACE VIEW vrtw_v_rap_bmvd ( melding_datum, locatie, type_melding, vakgroep, specifieke_melding, melding_nummer, onderwerp, omschrijving, aangemeld_door, status ) AS SELECT m.mld_melding_datum, l.alg_locatie_omschrijving, sd.ins_srtdiscipline_omschrijving, md.ins_discipline_omschrijving, std.mld_stdmelding_omschrijving, m.mld_melding_key, COALESCE (m.mld_melding_onderwerp, 'leeg'), COALESCE (TO_CHAR(SUBSTR(m.mld_melding_omschrijving,1,4000)), 'leeg'), pf.prs_perslid_naam_friendly, mld_statuses_omschrijving FROM mld_melding m, mld_stdmelding std, mld_discipline md, ins_srtdiscipline sd, prs_v_perslid_fullnames pf, mld_statuses ms, alg_locatie l WHERE m.mld_alg_locatie_key = l.alg_locatie_key AND m.mld_melding_status = ms.mld_statuses_key AND m.mld_alg_locatie_key IN (55, 52, 65, 57, 64) -- Enschede Centrum en Noord, Almelo Centrum, Hengelo Centrum, Almelo tijdelijk AND m.mld_stdmelding_key = std.mld_stdmelding_key AND std.mld_ins_discipline_key IN (52, 70, 60) -- Gebouwgerelateerd, Voertuigen, Operationeel AND std.mld_ins_discipline_key = md.ins_discipline_key AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key AND m.prs_perslid_key = pf.prs_perslid_key AND NOT EXISTS (SELECT 'X' FROM fac_tracking f WHERE fac_srtnotificatie_key = 47 -- MLDAFM AND fac_tracking_refkey = m.mld_melding_key AND f.fac_tracking_datum < SYSDATE - 10); -- Rapport tbv QR codes CREATE OR REPLACE VIEW vrtw_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, 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, CASE WHEN d.ins_discipline_key = 81 -- ICT THEN (SELECT k.ins_kenmerkdeel_waarde FROM ins_kenmerkdeel k WHERE k.ins_deel_key = i.ins_deel_key AND k.ins_kenmerk_key = 1) ELSE NULL END serienummer, CASE WHEN d.ins_discipline_key = 81 -- ICT THEN (SELECT k.ins_kenmerkdeel_waarde FROM ins_kenmerkdeel k WHERE k.ins_deel_key = i.ins_deel_key AND k.ins_kenmerk_key = 2) ELSE NULL END model, 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 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; CREATE OR REPLACE VIEW vrtw_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 = 9 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 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) = 'VRTW_V_NOTI_MAILER') AND (SELECT fac_notificatie_job_nextrun FROM fac_notificatie_job WHERE UPPER(fac_notificatie_job_view) = 'VRTW_V_NOTI_MAILER'); CREATE OR REPLACE PROCEDURE vrtw_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); 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; -- 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 := 9; END IF; IF defaultstdmelding IS NULL THEN defaultstdmelding := fac.getsetting ('defaultstdmelding'); v_mailadres_kenmerk_key := 9; 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, 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_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, 301, -- fictief 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))), -- 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 VRTW hetzelfde bijlage kenmerk gebruikt over alle vakgroeptypen kan de key gewoon hard worden meegegeven. kkey := 1041; 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