Files
Customer/BRCF/brcf.sql
Robin Stoker d144926869 BRCF#90081 -- Werkplektoekenning DC Ede
svn path=/Customer/trunk/; revision=70180
2025-09-02 08:54:15 +00:00

944 lines
39 KiB
SQL

--
-- $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,
DECODE (a.alg_locatie_key, 361, 'CUST01', 2341, 'CUST02', 2461, 'CUST03', 1201, 'CUST04') 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 IN (361, 2341, 2461, 1201) -- Maarssen Hoofdkantoor, DC Amsterdam, MM Zevenbergen, BHL Ede
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 LIKE '%@%';
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);
-- Ordertrackinglijst van vandaag, bedoeld om te mailen
CREATE OR REPLACE VIEW brcf_v_rap_ordertracking_today
(
opdrachtnr,
mld_opdr_key,
uitvoerder,
behandelaar,
opdracht_type,
soort,
datum,
actie_door,
actie_omschrijving,
actie_details
)
AS
SELECT
opdrachtnr,
mld_opdr_key,
uitvoerder,
behandelaar,
opdracht_type,
soort,
datum,
actie_door,
actie_omschrijving,
actie_details
FROM brcf_v_rap_ordertracking
WHERE TRUNC (datum) = TRUNC (SYSDATE);
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 < 40000) 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) < 40000
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) < 40000
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, 31810, 31820) -- DC Amsterdam en Ede doen 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)
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 (31810, 31820) -- DC Ede
AND r.alg_ruimte_key = 5244 -- DC Ede 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
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