Files
Customer/BRCF/brcf.sql
Robin Stoker c9205cecf3 BRCF#73270 -- Toekennen van melder en locatie via kostenplaats M2M
svn path=/Customer/trunk/; revision=56592
2022-07-15 13:55:07 +00:00

676 lines
26 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;
WHENEVER SQLERROR EXIT;
SELECT adm.scriptspoolfile('&dbuser', '&thisfile') AS fcltlogfile FROM DUAL;
WHENEVER SQLERROR CONTINUE;
SPOOL &fcltlogfile
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,
bez_bezoekers_key xkey,
(SELECT ba.bez_kenmerkwaarde_waarde
FROM bez_kenmerkwaarde ba
WHERE ba.bez_kenmerk_key = 1001
AND ba.bez_bezoekers_key = b.bez_bezoekers_key)
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.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 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 (prs_kostenplaats_nr) < 50000
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);
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;
END;
/
CREATE OR REPLACE PROCEDURE brcf_daily
AS
v_errormsg VARCHAR2 (1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
BEGIN
-- Dagelijks de nieuwe geregistreede uren in de weekbrief zetten.
brcf_schonen_bezoekers ();
brcf_toekennen_authgroep ();
END;
/
-- WP toekenning, moet nog generieker en in dagelijkse taak
/*
DECLARE
CURSOR c1
IS
SELECT p.prs_perslid_key, r.alg_ruimte_key ruimte
FROM prs_v_afdeling_perslid p,
alg_gebouw g,
alg_verdieping v,
alg_ruimte r,
prs_v_aanwezigperslid pa
WHERE g.alg_gebouw_naam LIKE 'BENU ' || p.prs_afdeling_omschrijving
AND p.prs_perslid_key IS NOT NULL
AND r.alg_verdieping_key = v.alg_verdieping_key
AND v.alg_gebouw_key = g.alg_gebouw_key
AND r.alg_ruimte_nr = '_'
AND p.prs_perslid_key = pa.prs_perslid_key
UNION ALL
SELECT DISTINCT p.prs_perslid_key, 4127 ruimte
FROM prs_v_afdeling_perslid p, prs_v_aanwezigperslid pa
WHERE p.prs_perslid_key IS NOT NULL
AND p.prs_perslid_key = pa.prs_perslid_key
AND p.prs_afdeling_key IN
(54,
22,
161,
521,
753,
754,
762,
763,
770,
774,
781,
786,
569,
543,
481,
744,
756,
768,
772,
62,
546,
745,
759,
771,
784,
787,
801,
141,
121,
552,
747,
749,
757,
779,
748,
751,
761,
764,
766,
773,
550,
743,
782,
783,
788,
790,
791,
802,
741,
767,
789,
542,
742,
758,
181,
765,
776,
778,
61,
746,
750,
752,
755,
760,
775,
777,
785,
821);
BEGIN
FOR rec IN c1
LOOP
BEGIN
prs.movetoruimte (rec.prs_perslid_key, rec.ruimte, NULL);
END;
END LOOP;
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_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 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;
-- 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;
IF v_kp_key IS NOT NULL
THEN
SELECT 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;
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,
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 -- 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,
COALESCE (v_locatie_key, 361), -- Maarssen Hoofdkantoor wanneer locatie zelf leeg is
SUBSTR (psubject, 1, 75), -- onderwerp is max 80 posities
CASE
WHEN LENGTH (psubject) > 75
THEN
'Volledig onderwerp: ' || psubject -- wanneer 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
-- 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