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