-- -- $Id$ -- -- Script containing customer specific db-configuration for DSMA. DEFINE thisfile = 'DSMA.SQL' DEFINE dbuser = '^DSMA' 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 dsma_v_rap_import_log ( fclt_f_applicatie, datum, fclt_f_status, omschrijving, hint ) AS SELECT COALESCE (fac_import_app_code, imp_log_applicatie), TO_CHAR (imp_log_datum, 'dd-mm-yyyy hh24:mi'), imp_log_status, imp_log_omschrijving, imp_log_hint FROM imp_log il1, fac_import fi1, fac_import_app fia1 WHERE il1.fac_import_key = fi1.fac_import_key(+) AND fi1.fac_import_app_key = fia1.fac_import_app_key(+) AND NOT EXISTS (SELECT 1 FROM imp_log il2, fac_import fi2 WHERE il2.fac_import_key = fi2.fac_import_key AND fi2.fac_import_app_key = fi1.fac_import_app_key AND il2.fac_import_key > il1.fac_import_key); CREATE OR REPLACE PROCEDURE dsma_import_prs (p_import_key IN NUMBER) AS v_errormsg VARCHAR2 (1000) := '-'; oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); BEGIN -- Afdelingscode-kolom kopieren naar extra kolom 12 (= kenmerk5)! UPDATE fac_imp_file i SET i.fac_imp_file_line = i.fac_imp_file_line || ';' || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 2) + 1, INSTR (fac_imp_file_line, ';', 1, 3) - INSTR (fac_imp_file_line, ';', 1, 2) - 1) WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1; -- Afdelingscode-kolom=3 resetten (op 'XXX' want verplicht)! UPDATE fac_imp_file i SET i.fac_imp_file_line = SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 2)) || '"XXX"' || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 3)) WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1; COMMIT; -- Functie-kolom kopieren naar extra kolom 13 (= kenmerk6)! UPDATE fac_imp_file i SET i.fac_imp_file_line = i.fac_imp_file_line || ';' || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 3) + 1, INSTR (fac_imp_file_line, ';', 1, 4) - INSTR (fac_imp_file_line, ';', 1, 3) - 1) WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1; -- Functie-kolom resetten=4 (op 'XXX' want verplicht)! UPDATE fac_imp_file i SET i.fac_imp_file_line = SUBSTR (fac_imp_file_line, 1, INSTR (fac_imp_file_line, ';', 1, 3)) || '"XXX"' || SUBSTR (fac_imp_file_line, INSTR (fac_imp_file_line, ';', 1, 4)) WHERE fac_import_key = p_import_key AND fac_imp_file_index > 1; COMMIT; -- Generieke import. -- De sequence array staat beschreven in PRS_PAC.SRC bij de import_perslid-PROCEDURE. -- Met Stamplaats wordt nog niets gedaan! --'%Achternaam;Voornaam;Afdelingscode;Functie;Email;Telefoonnr;Mobiel;Stamplaats;Indienst;Uitdienst;Leidinggevende%'); prs.import_perslid ( p_import_key, '0;0;0;0;0;0;3;1;0;2;' || '0;0;0;0;0;6;7;5;0;0;' || '4;0;0;0;0;0;8;9;10;11;' || '12;13;0;0;0;0;0;0;0;0;' || '0;0;0;0;0;0', '%Achternaam;Voornaam;Afdelingscode;Functie;Email;Telefoonnr;Mobiel;Stamplaats;Indienst;Uitdienst;Leidinggevende%'); -- Klantspecifieke aanpassingen. -- Afdeling-kolom altijd op 'DSM' (en kenmerk5 negeren)! UPDATE fac_imp_perslid i SET i.prs_afdeling_naam = 'DSM'; COMMIT; -- Functie-kolom volgens kenmerk6 of anders op Onbekend! UPDATE fac_imp_perslid i SET i.prs_srtperslid_omschrijving = COALESCE (SUBSTR (i.prs_kenmerk6, 1, 60), 'Onbekend'); COMMIT; -- Als geen Voornaam aangeleverd, dan handmatig toegekende niet wissen. UPDATE fac_imp_perslid i SET i.prs_perslid_voornaam = (SELECT MAX (prs_perslid_voornaam) FROM prs_v_aanwezigperslid WHERE prs_perslid_nr = i.prs_perslid_nr) WHERE i.prs_perslid_voornaam IS NULL -- Aangeleverde Voornaam wint! AND EXISTS (SELECT 1 FROM prs_v_aanwezigperslid WHERE prs_perslid_voornaam IS NOT NULL AND prs_perslid_nr = i.prs_perslid_nr); COMMIT; -- Als geen Email aangeleverd, dan handmatig toegekende niet wissen. UPDATE fac_imp_perslid i SET i.prs_perslid_email = (SELECT MAX (prs_perslid_email) FROM prs_v_aanwezigperslid WHERE prs_perslid_nr = i.prs_perslid_nr) WHERE i.prs_perslid_email IS NULL -- Aangeleverde Email wint! AND EXISTS (SELECT 1 FROM prs_v_aanwezigperslid WHERE prs_perslid_email IS NOT NULL AND prs_perslid_nr = i.prs_perslid_nr); COMMIT; -- Als geen Telefoonnr aangeleverd, dan handmatig toegekende niet wissen. UPDATE fac_imp_perslid i SET i.prs_perslid_telefoonnr = (SELECT MAX (prs_perslid_telefoonnr) FROM prs_v_aanwezigperslid WHERE prs_perslid_nr = i.prs_perslid_nr) WHERE i.prs_perslid_telefoonnr IS NULL -- Aangeleverde Telefoonnr wint! AND EXISTS (SELECT 1 FROM prs_v_aanwezigperslid WHERE prs_perslid_telefoonnr IS NOT NULL AND prs_perslid_nr = i.prs_perslid_nr); COMMIT; -- Als geen Mobiel aangeleverd, dan handmatig toegekende niet wissen. UPDATE fac_imp_perslid i SET i.prs_perslid_mobiel = (SELECT MAX (prs_perslid_mobiel) FROM prs_v_aanwezigperslid WHERE prs_perslid_nr = i.prs_perslid_nr) WHERE i.prs_perslid_mobiel IS NULL -- Aangeleverde Mobiel wint! AND EXISTS (SELECT 1 FROM prs_v_aanwezigperslid WHERE prs_perslid_mobiel IS NOT NULL AND prs_perslid_nr = i.prs_perslid_nr); COMMIT; -- Klantspecifieke aanpassingen. -- Ruimte bepalen via Kenmerk1-kolom -> Eigen tabel (key = 161) -> Gebouw -- en daaronder Ruimte '_' op de Verdieping met het laagste volgnummer! -- Als persoon al een WP heeft op import-locatie, dan is dat de juiste en -- blijft deze (handmatig gecorrigeerde WP) ongewijzigd. -- In alle andere gevallen verhuist persoon naar Ruimte '_' op meegegeven -- locatie. -- Eventuele WPs op andere locaties dan volgens import blijven ongewijzigd! UPDATE fac_imp_perslid i SET i.alg_locatie_code = (SELECT il.alg_locatie_code FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode alg_v_aanweziggebouw ig, alg_locatie il WHERE ud.fac_usrtab_key = 161 --AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1) AND INSTR (UPPER (i.prs_kenmerk1), UPPER (ud.fac_usrdata_code)) = 1 AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code) AND ig.alg_locatie_key = il.alg_locatie_key AND NOT EXISTS (SELECT 1 FROM alg_v_aanweziggebouw WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr) AND alg_locatie_key < il.alg_locatie_key)), i.alg_gebouw_code = (SELECT ig.alg_gebouw_code FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode alg_v_aanweziggebouw ig, alg_locatie il WHERE ud.fac_usrtab_key = 161 --AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1) AND INSTR (UPPER (i.prs_kenmerk1), UPPER (ud.fac_usrdata_code)) = 1 AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code) AND ig.alg_locatie_key = il.alg_locatie_key AND NOT EXISTS (SELECT 1 FROM alg_v_aanweziggebouw WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr) AND alg_locatie_key < il.alg_locatie_key)), i.alg_verdieping_volgnr = (SELECT iv.alg_verdieping_volgnr FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode alg_v_aanweziggebouw ig, alg_locatie il, alg_verdieping iv, alg_ruimte ir WHERE ud.fac_usrtab_key = 161 --AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1) AND INSTR (UPPER (i.prs_kenmerk1), UPPER (ud.fac_usrdata_code)) = 1 AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code) AND ig.alg_locatie_key = il.alg_locatie_key AND NOT EXISTS (SELECT 1 FROM alg_v_aanweziggebouw WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr) AND alg_locatie_key < il.alg_locatie_key) AND ig.alg_gebouw_key = iv.alg_gebouw_key AND iv.alg_verdieping_key = ir.alg_verdieping_key AND ir.alg_ruimte_nr = '_' AND NOT EXISTS (SELECT 1 FROM alg_v_aanwezigruimte r, alg_verdieping v WHERE r.alg_ruimte_nr = '_' AND r.alg_verdieping_key = v.alg_verdieping_key AND v.alg_verdieping_volgnr < iv.alg_verdieping_volgnr)), i.alg_ruimte_nr = (SELECT '_' FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode alg_v_aanweziggebouw ig, alg_locatie il WHERE ud.fac_usrtab_key = 161 --AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1) AND INSTR (UPPER (i.prs_kenmerk1), UPPER (ud.fac_usrdata_code)) = 1 AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code) AND ig.alg_locatie_key = il.alg_locatie_key AND NOT EXISTS (SELECT 1 FROM alg_v_aanweziggebouw WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr) AND alg_locatie_key < il.alg_locatie_key)) WHERE NOT EXISTS -- Nog geen werkplek op Locatie! (SELECT 1 FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode alg_v_aanweziggebouw ig, alg_locatie il, prs_v_aanwezigperslid p, prs_perslidwerkplek pw, prs_werkplek cw, alg_v_aanwezigruimte cr, alg_verdieping cv, alg_gebouw cg WHERE ud.fac_usrtab_key = 161 --AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1) AND INSTR (UPPER (i.prs_kenmerk1), UPPER (ud.fac_usrdata_code)) = 1 AND UPPER (ud.fac_usrdata_omschr) = UPPER (ig.alg_gebouw_code) AND ig.alg_locatie_key = il.alg_locatie_key AND NOT EXISTS (SELECT 1 FROM alg_v_aanweziggebouw WHERE UPPER (alg_gebouw_code) = UPPER (ud.fac_usrdata_omschr) AND alg_locatie_key < il.alg_locatie_key) AND p.prs_perslid_email = i.prs_perslid_email AND p.prs_perslid_key = pw.prs_perslid_key AND pw.prs_werkplek_key = cw.prs_werkplek_key AND cw.prs_alg_ruimte_key = cr.alg_ruimte_key AND cr.alg_verdieping_key = cv.alg_verdieping_key AND cv.alg_gebouw_key = cg.alg_gebouw_key AND cg.alg_locatie_key = il.alg_locatie_key); COMMIT; -- Resulteert in nette foutmelding als ruimte niet kan worden bepaald. UPDATE fac_imp_perslid SET alg_verdieping_volgnr = 0 WHERE alg_gebouw_code IS NOT NULL AND alg_verdieping_volgnr IS NULL; COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_errormsg, 'Inleesproces personen afgebroken!'); END dsma_import_prs; / CREATE OR REPLACE PROCEDURE dsma_update_prs (p_import_key IN NUMBER) IS -- Toevoegen Stamplaats (=kenmerk1), Indienst-datum (=kenmerk2), Uitdienst- -- datum (=kenmerk3) en Leidinggevende-veld (=kenmerk4). CURSOR c_prs IS SELECT x.prs_perslid_key, x.prs_perslid_email, x.prs_kenmerk1, x.prs_kenmerk2, x.prs_kenmerk3, x.prs_kenmerk4 FROM fac_imp_perslid x WHERE (x.prs_kenmerk2 IS NOT NULL OR x.prs_kenmerk3 IS NOT NULL OR x.prs_kenmerk4 IS NOT NULL) AND EXISTS (SELECT 1 FROM prs_v_aanwezigperslid WHERE prs_perslid_key > 10 -- Voor de zekerheid! AND prs_perslid_apikey IS NULL AND prs_perslid_oslogin2 IS NULL -- Persoon in import-scope! --AND LOWER (prs_perslid_email) = LOWER (x.prs_perslid_email) AND prs_perslid_key = x.prs_perslid_key) ORDER BY 1; -- Verwijderen personen *binnen DSM* die niet meer in importbestand voorkomen. CURSOR c_del IS SELECT p.prs_perslid_key FROM prs_v_aanwezigperslid p WHERE p.prs_perslid_key > 10 -- Voor de zekerheid! AND p.prs_perslid_apikey IS NULL AND p.prs_perslid_oslogin2 IS NULL -- Persoon in import-scope! AND NOT EXISTS (SELECT 1 FROM fac_imp_perslid WHERE LOWER (prs_perslid_email) = LOWER (p.prs_perslid_email)) ORDER BY 1; v_errormsg VARCHAR2 (1000) := ''; oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_count NUMBER (10); BEGIN -- Generic update SELECT COUNT(*) INTO v_count FROM fac_imp_perslid; IF v_count < 250 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; -- Generieke update (op e-mail adres). prs.update_perslid (p_import_key, 'EMAIL', 'L'); -- Bijwerken extra persoonsvelden (niet ondersteund door standaard import). v_count := 0; FOR rec IN c_prs LOOP BEGIN v_errormsg := '[' || TO_CHAR (rec.prs_perslid_key) || '|' || rec.prs_perslid_email || '] Fout bijwerken In/Uitdienst-datumveld'; UPDATE prs_perslid SET prs_perslid_opmerking = rec.prs_kenmerk1, prs_perslid_ingangsdatum = fac.safe_to_date (rec.prs_kenmerk2, 'dd-mm-yyyy'), prs_perslid_einddatum = fac.safe_to_date (rec.prs_kenmerk3, 'dd-mm-yyyy') WHERE prs_perslid_key = rec.prs_perslid_key; v_errormsg := '[' || TO_CHAR (rec.prs_perslid_key) || '|' || rec.prs_perslid_email || '] Fout bijwerken Leidinggevende-kenmerk'; prs.upsertkenmerk (1000, rec.prs_perslid_key, rec.prs_kenmerk4); -- Leidinggevende v_count := v_count + 1; END; END LOOP; --fac.imp_writelog (p_import_key, 'S', 'Personen/#bijgewerkt: ' || TO_CHAR (v_count), ''); COMMIT; -- Verwijderen personen *binnen DSM* die niet meer in importbestand voorkomen. v_errormsg := 'Fout verwijderen personen'; FOR rec IN c_del LOOP BEGIN prs.delete_perslid (p_import_key, rec.prs_perslid_key); END; END LOOP; -- Verwijder ongebruikte functies; deze import bepaalt de functies! v_errormsg := 'Fout verwijderen functies'; DELETE FROM prs_srtperslid sp WHERE NOT EXISTS (SELECT 1 FROM prs_perslid WHERE prs_srtperslid_key = sp.prs_srtperslid_key); COMMIT; -- Toekennen _Default aan alle personen in import-scope! v_errormsg := 'Fout toekennen _Default'; INSERT INTO fac_gebruikersgroep (prs_perslid_key, fac_groep_key) SELECT prs_perslid_key, 1 FROM prs_v_aanwezigperslid p WHERE p.prs_perslid_key > 10 -- Voor de zekerheid! AND p.prs_perslid_apikey IS NULL AND p.prs_perslid_oslogin2 IS NULL -- Persoon in import-scope! AND NOT EXISTS -- Nog niet toegekend aan _Default! (SELECT 1 FROM fac_gebruikersgroep WHERE fac_groep_key = 1 -- _Default AND prs_perslid_key = p.prs_perslid_key); COMMIT; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.imp_writelog (p_import_key, 'E', v_errormsg, 'Importproces PRS afgebroken!'); END dsma_update_prs; / -- DSMA#74832: Export naar Base27 die telkens voorafgaand aan putOrders het -- volgende doet: -- 1. Nieuwe notitie(s) in opdracht of bovenliggende melding -- (anders dan door Base27 via API) uitgeven via orderqueue. -- 2. Laatste sync-datum registreren, zodat eerdere wijzigingen -- niet nogmaals worden doorgezet. CREATE OR REPLACE PROCEDURE DSMA_SELECT_BASE27 (p_applname IN VARCHAR2, p_applrun IN VARCHAR2) AS -- Nieuwe notitie(s) sinds laatste sync! -- TODO:Aanname is nooit tegelijk notitie(s) op zowel melding als opdracht! CURSOR c_dsm2base IS SELECT '[' || TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) || '] ' aanduiding, n.reftype, n.refkey, COALESCE (o.mld_opdr_externsyncdate, TRUNC (SYSDATE)) syncdate_old, MAX (n.note_datum) syncdate_new FROM mld_opdr o, (SELECT 'ORD' reftype, mld_opdr_key refkey, GREATEST (mld_opdr_note_aanmaak, mld_opdr_note_wijzigdatum) note_datum FROM mld_opdr_note WHERE prs_perslid_key != 682 -- API-user tbv. Base27 UNION ALL SELECT 'MLD' reftype, mld_melding_key refkey, GREATEST (mld_melding_note_aanmaak, mld_melding_note_wijzigdatum) note_datum FROM mld_melding_note WHERE prs_perslid_key != 682) n -- API-user tbv. Base27 WHERE o.mld_uitvoerende_keys = 681 -- Base27 AND o.mld_typeopdr_key = 61 -- Base27 AND o.mld_statusopdr_key IN (5, 8) -- Toegekend/Geaccepteerd AND ((n.reftype = 'ORD' AND o.mld_opdr_key = n.refkey) OR (n.reftype = 'MLD' AND o.mld_melding_key = n.refkey)) AND n.note_datum > COALESCE (o.mld_opdr_externsyncdate, TRUNC (SYSDATE)) GROUP BY '[' || TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) || '] ', n.reftype, n.refkey, COALESCE (o.mld_opdr_externsyncdate, TRUNC (SYSDATE)); /* -- Nieuwe notitie(s) sinds laatste sync! -- Deze sync blijkt Facilitor automatisch te doen (of doet Base27 het), mij -- niet geheel duidelijk??? CURSOR c_base2mld IS SELECT '[' || TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) || '] ' aanduiding, o.mld_melding_key, n.mld_opdr_note_omschrijving, n.mld_opdr_note_key FROM mld_opdr o, mld_opdr_note n WHERE o.mld_uitvoerende_keys = 681 -- Base27 AND o.mld_typeopdr_key = 61 -- Base27 AND o.mld_statusopdr_key IN (5, 8) -- Toegekend/Geaccepteerd AND o.mld_opdr_key = n.mld_opdr_key AND n.mld_opdr_note_aanmaak > fac.safe_to_date ('01-02-2023', 'dd-mm-yyyy') -- Sync-en vanaf 01-02-2023! AND n.mld_opdr_note_aanmaak = mld_opdr_note_wijzigdatum; */ v_errormsg VARCHAR2 (1000) := ''; oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_count NUMBER; BEGIN v_count := 0; -- Sync-en notities door DSM in opdracht of melding naar Base27! FOR rec IN c_dsm2base LOOP BEGIN v_errormsg := 'Fout dsm2base-sync'; -- TRUC: Zet wijzigdatum van te notificeren notities op syncdate_new! -- Bij 1 notitie zal gelden syncdate_new = wijzigdatum (en wijzigt er -- niets), maar truc gaat pas echt werken als er >1 notities zijn! IF (rec.reftype = 'ORD') THEN UPDATE mld_opdr_note SET mld_opdr_note_wijzigdatum = rec.syncdate_new WHERE prs_perslid_key != 682 -- API-user tbv. Base27 AND mld_opdr_key = rec.refkey AND GREATEST (mld_opdr_note_aanmaak, mld_opdr_note_wijzigdatum) > rec.syncdate_old; UPDATE mld_opdr SET mld_opdr_teverzenden = 2, mld_opdr_verzonden = NULL, mld_opdr_externsyncdate = rec.syncdate_new WHERE mld_opdr_key = rec.refkey; fac.trackaction ('ORDUPD', rec.refkey, NULL, NULL, 'Notities doorgezet naar Base27'); ELSE UPDATE mld_melding_note SET mld_melding_note_wijzigdatum = rec.syncdate_new WHERE prs_perslid_key != 682 -- API-user tbv. Base27 AND mld_melding_key = rec.refkey AND GREATEST (mld_melding_note_aanmaak, mld_melding_note_wijzigdatum) > rec.syncdate_old; -- TODO:Aanname is één Base27-opdracht per incident(melding)! UPDATE mld_opdr SET mld_opdr_teverzenden = 2, mld_opdr_verzonden = NULL, mld_opdr_externsyncdate = rec.syncdate_new WHERE mld_melding_key = rec.refkey; fac.trackaction ('MLDUPD', rec.refkey, NULL, NULL, 'Notities doorgezet naar Base27'); END IF; v_count := v_count + 1; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.writelog (p_applname, 'W', rec.aanduiding || v_errormsg, ''); COMMIT; END; END LOOP; fac.writelog (p_applname, 'S', 'DSM-notities to Base27/#sync: ' || TO_CHAR (v_count), ''); /* v_count := 0; -- Sync-en notities door Base27 in opdracht naar parent-melding! FOR rec IN c_base2mld LOOP BEGIN v_errormsg := 'Fout base2mld-sync'; INSERT INTO mld_melding_note (mld_melding_key, prs_perslid_key, mld_melding_note_omschrijving, mld_melding_note_flag) VALUES (rec.mld_melding_key, 682, -- API-user tbv. Base27 rec.mld_opdr_note_omschrijving, 0); UPDATE mld_opdr_note SET mld_opdr_note_wijzigdatum = SYSDATE -- Obscure truc! WHERE mld_opdr_note_key = rec.mld_opdr_note_key; fac.trackaction ('MLDUPD', rec.refkey, NULL, NULL, 'Notities geplaatst door Base27'); v_count := v_count + 1; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.writelog (p_applname, 'W', rec.aanduiding || v_errormsg, ''); COMMIT; END; END LOOP; fac.writelog (p_applname, 'S', 'Base27-notities to MLD/#sync: ' || TO_CHAR (v_count), ''); */ EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.writelog (p_applname, 'E', 'Export afgebroken!', v_errormsg); END DSMA_SELECT_BASE27; / CREATE OR REPLACE PACKAGE DSMA AS PROCEDURE afmelden_mld; END; / CREATE OR REPLACE PACKAGE BODY DSMA AS PROCEDURE afmelden_mld AS c_applname VARCHAR2 (50) := 'AFMELDEN_MLD'; v_errormsg VARCHAR2 (1000); oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_aanduiding VARCHAR2 (200); v_count_tot NUMBER (10); CURSOR c_mld_base27 IS SELECT m.mld_melding_key, m.mld_melding_onderwerp, m.mld_melding_status FROM mld_melding m, mld_stdmelding sm WHERE m.mld_stdmelding_key = sm.mld_stdmelding_key AND sm.mld_ins_discipline_key = 50 -- Privacy + Security AND m.mld_melding_status IN (4, 99) -- In behandeling/Niet opgelost AND NOT EXISTS -- Geen lopende opdrachten (zou zo moeten zijn) (SELECT 1 FROM mld_opdr WHERE mld_uitvoerende_keys = 101 -- Base27 AND mld_typeopdr_key = 61 -- Base27 AND mld_statusopdr_key IN (3, 4, 5, 8, 10) -- Ter fiattering/Gefiatteerd/Toegekend/Geaccepteerd/Ter goedkeuring AND mld_melding_key = m.mld_melding_key) ORDER BY 1; -- Afmelden Korton-meldingen (met onderliggende opdrachten naar Korton)! -- 23=Aanvraag/ICT/Toegang netwerk en mail -- 24=Aanvraag/ICT/Aanvraag laptop -- 25=Aanvraag/ICT/Aanvraag vaste computer -- 26=Aanvraag/ICT/Aanvraag beeldscherm -- 40=ICT incident/ICT/Printer defect -- 41=ICT incident/ICT/Dock defect -- 42=ICT incident/ICT/Beeldscherm -- 43=Aanvraag/ICT/Aanvraag dock -- 44=ICT incident/ICT/Laptop defect -- 45=ICT incident/ICT/Vaste computer defect -- 48=Overige meldingen/ICT/Overig ICT CURSOR c_ord_korton IS SELECT o.mld_opdr_key, o.mld_melding_key, o.mld_opdr_bedrijfopdr_volgnr FROM mld_opdr o, mld_melding m, mld_stdmelding sm WHERE o.mld_uitvoerende_keys = 841 -- Korton AND o.mld_typeopdr_key = 5 -- Uitvoeringsopdracht AND o.mld_statusopdr_key IN (5, 8) -- Toegekend/Geaccepteerd AND o.mld_melding_key = m.mld_melding_key AND m.mld_stdmelding_key = sm.mld_stdmelding_key AND sm.mld_stdmelding_key IN (23, 24, 25, 26, 40, 41, 42, 43, 44, 45, 48) -- Afgesproken ICT-meldingen ORDER BY 1; CURSOR c_mld_korton IS SELECT m.mld_melding_key, m.mld_melding_onderwerp, m.mld_melding_status FROM mld_melding m, mld_stdmelding sm WHERE m.mld_stdmelding_key = sm.mld_stdmelding_key AND sm.mld_stdmelding_key IN (23, 24, 25, 26, 40, 41, 42, 43, 44, 45, 48) -- Afgesproken ICT-meldingen AND m.mld_melding_status IN (4, 7, 99) -- In behandeling/Uitgegeven/Niet opgelost AND EXISTS (SELECT 1 FROM mld_opdr WHERE mld_uitvoerende_keys = 841 -- Korton AND mld_typeopdr_key = 5 -- Uitvoeringsopdracht AND mld_melding_key = m.mld_melding_key) AND NOT EXISTS -- Geen lopende opdrachten (zou zo moeten zijn) (SELECT 1 FROM mld_opdr WHERE mld_uitvoerende_keys = 841 -- Korton AND mld_typeopdr_key = 5 -- Uitvoeringsopdracht AND mld_statusopdr_key IN (3, 4, 5, 8, 10) -- Ter fiattering/Gefiatteerd/Toegekend/Geaccepteerd/Ter goedkeuring AND mld_melding_key = m.mld_melding_key) ORDER BY 1; BEGIN v_count_tot := 0; -- Alle lopende Base27-meldingen sluiten als onderliggende Base27-opdrachten zijn gesloten. v_count_tot := 0; FOR rec IN c_mld_base27 LOOP v_aanduiding := '[' || TO_CHAR (rec.mld_melding_key) || '|' || rec.mld_melding_onderwerp || '] '; v_count_tot := v_count_tot + 1; MLD.setmeldingstatus (rec.mld_melding_key, 5, NULL); -- Afgemeld (incl. tracking) IF MOD (v_count_tot, 500) = 0 THEN COMMIT; END IF; END LOOP; fac.writelog (c_applname, 'S', '#Base27-meldingen gesloten: ' || TO_CHAR (v_count_tot), ''); COMMIT; /* --Alle lopende Korton-opdrachten automatisch sluiten. v_count_tot := 0; FOR rec IN c_ord_korton LOOP v_aanduiding := '[' || TO_CHAR (rec.mld_opdr_key) || '|' || TO_CHAR (rec.mld_melding_key) || '/' || TO_CHAR (rec.mld_opdr_bedrijfopdr_volgnr) || '] '; v_count_tot := v_count_tot + 1; MLD.setopdrachtstatus (rec.mld_opdr_key, 6, NULL); -- Afgemeld (incl. tracking) IF MOD (v_count_tot, 500) = 0 THEN COMMIT; END IF; END LOOP; fac.writelog (c_applname, 'S', '#Korton-opdrachten gesloten: ' || TO_CHAR (v_count_tot), ''); COMMIT; -- Alle lopende Korton-meldingen sluiten als onderliggende Korton-opdrachten zijn gesloten. v_count_tot := 0; FOR rec IN c_mld_korton LOOP v_aanduiding := '[' || TO_CHAR (rec.mld_melding_key) || '|' || rec.mld_melding_onderwerp || '] '; v_count_tot := v_count_tot + 1; MLD.setmeldingstatus (rec.mld_melding_key, 5, NULL); -- Afgemeld (incl. tracking) IF MOD (v_count_tot, 500) = 0 THEN COMMIT; END IF; END LOOP; fac.writelog (c_applname, 'S', '#Korton-meldingen gesloten: ' || TO_CHAR (v_count_tot), ''); COMMIT; */ EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.writelog (c_applname, 'E', v_aanduiding || v_errormsg, 'Taak afgebroken!'); END; END; / CREATE OR REPLACE PROCEDURE DSMA_DAILY AS v_errormsg VARCHAR2 (1000); oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); BEGIN dsma.afmelden_mld; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.writelog ('DAILY', 'E', 'Proces afgebroken!', v_errormsg); END DSMA_DAILY; / CREATE OR REPLACE VIEW DSMA_V_RAP_BEZITTINGEN ( ins_deel_key, extra_key, -- Moet zo heten (in de veronderstelling dat DSM dit tzt. wil notificeren)! gebruiker, identificatie, objectsoort, beschrijving, registratiedatum, verwijderdatum, -- Geen toegevoegde waarde voor DSMA (gekopieerd van SVRZ) tonen, -- Geen toegevoegde waarde voor DSMA (gekopieerd van SVRZ) uitgiftedatum, innamedatum, redeninactief ) AS SELECT d.ins_deel_key, d.ins_alg_ruimte_key, -- Gebruiker pf.prs_perslid_naam_friendly, d.ins_deel_omschrijving, sd.ins_srtdeel_omschrijving, --x.kenmerken, DECODE (d.ins_srtdeel_key, 4, d.ins_deel_opmerking, -- SLEUTEL=Sleutel, dan nooit kenmerken! 8, d.ins_deel_opmerking, -- BTAG=Blauwe tag, dan nooit kenmerken! 261, d.ins_deel_opmerking, -- ALARM=Persoonlijke alarmcode, dan nooit kenmerken! x.kenmerken) beschrijving, d.ins_deel_aanmaak, d.ins_deel_verwijder, DECODE (d.ins_deel_verwijder, NULL, DECODE (SIGN (ADD_MONTHS (d.ins_deel_vervaldatum, 1) - SYSDATE), -1, 0, 1), 0) tonen, du.uitgiftedatum, di.innamedatum, ri.redeninactief FROM ins_deel d, -- Inclusief recent verwijderde objecten! prs_v_perslid_fullnames_all pf, ins_srtdeel sd, ( SELECT ins_deel_key, LISTAGG (kenmerk, ', ') WITHIN GROUP (ORDER BY ins_kenmerk_volgnummer) AS kenmerken FROM (SELECT kd.ins_deel_key, k.ins_kenmerk_volgnummer, DECODE (kd.ins_kenmerkdeel_waarde, '1', sk.ins_srtkenmerk_omschrijving, kd.ins_kenmerkdeel_waarde) kenmerk FROM ins_kenmerkdeel kd, ins_kenmerk k, ins_srtkenmerk sk WHERE kd.ins_kenmerk_key = k.ins_kenmerk_key AND k.ins_srtkenmerk_key = sk.ins_srtkenmerk_key AND (sk.ins_srtkenmerk_key IN (3, 5, 6, 7, 8, 9, 201, 202) -- Type/Laptop tas/Laptop standaard/Toetsenbord/Muis/Overig/Screenprotector mobiel/Beschermhoesje mobiel OR kd.ins_kenmerk_key IN (65, 67))) -- Model igv. Dock/Monitor GROUP BY ins_deel_key) x, (SELECT kd.ins_deel_key, kd.ins_kenmerkdeel_waarde uitgiftedatum FROM ins_v_aanwezigkenmerkdeel kd WHERE EXISTS (SELECT 1 FROM ins_v_aanwezigkenmerk WHERE ins_srtkenmerk_key = 1 -- Uitgifte datum AND ins_kenmerk_key = kd.ins_kenmerk_key)) du, (SELECT kd.ins_deel_key, kd.ins_kenmerkdeel_waarde innamedatum FROM ins_v_aanwezigkenmerkdeel kd WHERE EXISTS (SELECT 1 FROM ins_v_aanwezigkenmerk WHERE ins_srtkenmerk_key = 2 -- Inname datum AND ins_kenmerk_key = kd.ins_kenmerk_key)) di, (SELECT kd.ins_deel_key, ud.fac_usrdata_omschr redeninactief FROM ins_v_aanwezigkenmerkdeel kd, fac_v_aanwezigusrdata ud WHERE EXISTS (SELECT 1 FROM ins_v_aanwezigkenmerk WHERE ins_srtkenmerk_key = 41 -- Reden inactief AND ins_kenmerk_key = kd.ins_kenmerk_key) AND fac.safe_to_number (kd.ins_kenmerkdeel_waarde) = ud.fac_usrdata_key) ri WHERE d.ins_alg_ruimte_type = 'P' AND d.ins_alg_ruimte_key = pf.prs_perslid_key AND COALESCE (d.ins_deel_verwijder, SYSDATE) >= TRUNC (SYSDATE - 1) AND d.ins_srtdeel_key = sd.ins_srtdeel_key AND d.ins_deel_key = x.ins_deel_key(+) AND d.ins_deel_key = du.ins_deel_key(+) AND d.ins_deel_key = di.ins_deel_key(+) AND d.ins_deel_key = ri.ins_deel_key(+); -- DSMA#82480: QR-codes/Registreren meldingen! CREATE OR REPLACE VIEW DSMA_V_RAP_QRC ( --hide_f_sort, bookmark, persoon, locatie, -- Omschrijving gebouw, -- Omschrijving verdieping, -- Volgnr of Code ruimte, -- Nummer plaats, ruimte_key, ruimtefunctie, objectdiscipline, -- Omschrijving objectgroep, -- Omschrijving objectsoort_key, objectsoort_code, objectsoort_oms, deel_key, deel_id, bookmark_id, variabele, aantal ) AS SELECT --b.fac_bookmark_naam || '|' || d.ins_deel_omschrijving hide_f_sort, b.fac_bookmark_naam, -- 'Melding op P-object', pf.prs_perslid_naam_friendly, NULL alg_locatie_omschrijving, NULL alg_gebouw_omschrijving, NULL alg_verdieping_code, NULL alg_ruimte_nr, NULL plaats, TO_NUMBER (NULL) ruimte_key, NULL alg_srtruimte_omschrijving, dd.ins_discipline_omschrijving, sg.ins_srtgroep_omschrijving, sd.ins_srtdeel_key, sd.ins_srtdeel_code, sd.ins_srtdeel_omschrijving, d.ins_deel_key, d.ins_deel_omschrijving, b.fac_bookmark_id, 'INS_KEY' variabele, 1 aantal FROM fac_bookmark b, ins_v_aanwezigdeel d, ins_srtdeel sd, ins_srtgroep sg, ins_discipline dd, prs_v_perslid_fullnames pf, mld_stdmelding_srtinst smsd WHERE (b.fac_bookmark_expire IS NULL OR b.fac_bookmark_expire > SYSDATE) AND INSTR (UPPER (b.fac_bookmark_naam), 'P-OBJECT') > 0 AND INSTR (UPPER (b.fac_bookmark_naam), 'GENERIEK') > 0 AND UPPER (b.fac_bookmark_path) = 'APPL/PDA/INS_DEEL.ASP' AND d.ins_deel_parent_key IS NULL AND d.ins_srtdeel_key = sd.ins_srtdeel_key AND sd.ins_srtdeel_key NOT IN (21, 39, 46, 82, 89) -- 21=Vaste PC/39=Dock/46=Monitor/82=Scherm/89=Vaste telefoon AND sd.ins_srtgroep_key = sg.ins_srtgroep_key --AND sg.ins_srtgroep_key NOT IN (21, 23) -- 21=Kantoormeubilair/23=Meubilair AND sg.ins_discipline_key = dd.ins_discipline_key AND d.ins_alg_ruimte_type = 'P' AND d.ins_alg_ruimte_key = pf.prs_perslid_key AND smsd.ins_srtinstallatie_key = DECODE (smsd.ins_srtinstallatie_niveau, 'S', sd.ins_srtdeel_key, 'G', sg.ins_srtgroep_key, 'D', dd.ins_discipline_key) UNION ALL SELECT --b.fac_bookmark_naam || '|' || d.ins_deel_omschrijving hide_f_sort, b.fac_bookmark_naam, -- 'Melding op R-object', NULL prs_perslid_naam_friendly, l.alg_locatie_omschrijving, o.alg_gebouw_omschrijving, TO_CHAR (o.alg_verdieping_code), -- Gevuld met ALG_VERDIEPING_VOLGNR o.alg_ruimte_nr, o.alg_plaatsaanduiding plaats, TO_NUMBER (NULL) ruimte_key, NULL alg_srtruimte_omschrijving, dd.ins_discipline_omschrijving, sg.ins_srtgroep_omschrijving, sd.ins_srtdeel_key, sd.ins_srtdeel_code, sd.ins_srtdeel_omschrijving, d.ins_deel_key, d.ins_deel_omschrijving, b.fac_bookmark_id, 'INS_KEY' variabele, 1 aantal FROM fac_bookmark b, ins_v_aanwezigdeel d, ins_srtdeel sd, ins_srtgroep sg, ins_discipline dd, alg_ruimte r, ins_v_alg_overzicht o, alg_locatie l, mld_stdmelding_srtinst smsd WHERE (b.fac_bookmark_expire IS NULL OR b.fac_bookmark_expire > SYSDATE) AND INSTR (UPPER (b.fac_bookmark_naam), 'R-OBJECT') > 0 AND INSTR (UPPER (b.fac_bookmark_naam), 'GENERIEK') > 0 AND UPPER (b.fac_bookmark_path) = 'APPL/PDA/INS_DEEL.ASP' AND d.ins_deel_parent_key IS NULL AND d.ins_srtdeel_key = sd.ins_srtdeel_key AND sd.ins_srtdeel_key NOT IN (21, 39, 46, 82, 89) -- 21=Vaste PC/39=Dock/46=Monitor/82=Scherm/89=Vaste telefoon AND sd.ins_srtgroep_key = sg.ins_srtgroep_key AND sg.ins_srtgroep_key NOT IN (21, 23) -- 21=Kantoormeubilair/23=Meubilair AND sg.ins_discipline_key = dd.ins_discipline_key AND d.ins_alg_ruimte_type = 'R' AND d.ins_alg_ruimte_key = r.alg_ruimte_key AND d.ins_alg_ruimte_type = o.alg_onroerendgoed_type AND d.ins_alg_ruimte_key = o.alg_onroerendgoed_keys AND d.ins_alg_locatie_key = l.alg_locatie_key AND smsd.ins_srtinstallatie_key = DECODE (smsd.ins_srtinstallatie_niveau, 'S', sd.ins_srtdeel_key, 'G', sg.ins_srtgroep_key, 'D', dd.ins_discipline_key) UNION ALL SELECT --b.fac_bookmark_naam || '|' || aog.alg_plaatsaanduiding hide_f_sort, b.fac_bookmark_naam, -- 'Melding op Sanitaire ruimte', NULL prs_perslid_naam_friendly, l.alg_locatie_omschrijving, aog.alg_gebouw_code || ' - ' || aog.alg_gebouw_naam alg_gebouw_omschrijving, aog.alg_verdieping_code, aog.alg_ruimte_nr, aog.alg_plaatsaanduiding plaats, r.alg_ruimte_key ruimte_key, sr.alg_srtruimte_omschrijving, NULL ins_discipline_omschrijving, NULL ins_srtgroep_omschrijving, TO_NUMBER (NULL) ins_srtdeel_key, NULL ins_srtdeel_code, NULL ins_srtdeel_omschrijving, TO_NUMBER (NULL) ins_deel_key, NULL ins_deel_omschrijving, b.fac_bookmark_id, 'ALG_KEY' variabele, multiplier.aantal FROM (SELECT 1 aantal FROM DUAL UNION ALL SELECT 2 aantal FROM DUAL UNION ALL SELECT 2 aantal FROM DUAL UNION ALL SELECT 3 aantal FROM DUAL UNION ALL SELECT 3 aantal FROM DUAL UNION ALL SELECT 3 aantal FROM DUAL UNION ALL SELECT 4 aantal FROM DUAL UNION ALL SELECT 4 aantal FROM DUAL UNION ALL SELECT 4 aantal FROM DUAL UNION ALL SELECT 4 aantal FROM DUAL) multiplier, fac_bookmark b, alg_v_aanwezigruimte r, alg_srtruimte sr, alg_v_onroerendgoed_gegevens aog, alg_locatie l WHERE (b.fac_bookmark_expire IS NULL OR b.fac_bookmark_expire > SYSDATE) AND INSTR (UPPER (b.fac_bookmark_naam), 'SANITAIRE RUIMTE') > 0 AND INSTR (UPPER (b.fac_bookmark_naam), 'GENERIEK') > 0 AND UPPER (b.fac_bookmark_path) = 'APPL/PDA/MELDING.ASP' AND r.alg_srtruimte_key = sr.alg_srtruimte_key AND sr.alg_srtruimte_key = 7 -- Sanitaire ruimte AND r.alg_ruimte_key = aog.alg_onroerendgoed_keys AND aog.alg_type = 'R' AND aog.alg_locatie_key = l.alg_locatie_key UNION ALL SELECT --b.fac_bookmark_naam || '|' || aog.alg_plaatsaanduiding hide_f_sort, b.fac_bookmark_naam, -- 'Melding op Spreek- of Kantoorruimte', NULL prs_perslid_naam_friendly, l.alg_locatie_omschrijving, aog.alg_gebouw_code || ' - ' || aog.alg_gebouw_naam alg_gebouw_omschrijving, aog.alg_verdieping_code, aog.alg_ruimte_nr, aog.alg_plaatsaanduiding plaats, r.alg_ruimte_key ruimte_key, sr.alg_srtruimte_omschrijving, NULL ins_discipline_omschrijving, NULL ins_srtgroep_omschrijving, TO_NUMBER (NULL) ins_srtdeel_key, NULL ins_srtdeel_code, NULL ins_srtdeel_omschrijving, TO_NUMBER (NULL) ins_deel_key, NULL ins_deel_omschrijving, b.fac_bookmark_id, 'ALG_KEY' variabele, multiplier.aantal FROM (SELECT 1 aantal FROM DUAL UNION ALL SELECT 2 aantal FROM DUAL UNION ALL SELECT 2 aantal FROM DUAL UNION ALL SELECT 3 aantal FROM DUAL UNION ALL SELECT 3 aantal FROM DUAL UNION ALL SELECT 3 aantal FROM DUAL UNION ALL SELECT 4 aantal FROM DUAL UNION ALL SELECT 4 aantal FROM DUAL UNION ALL SELECT 4 aantal FROM DUAL UNION ALL SELECT 4 aantal FROM DUAL) multiplier, fac_bookmark b, alg_v_aanwezigruimte r, alg_srtruimte sr, alg_v_onroerendgoed_gegevens aog, alg_locatie l WHERE (b.fac_bookmark_expire IS NULL OR b.fac_bookmark_expire > SYSDATE) AND INSTR (UPPER (b.fac_bookmark_naam), 'SPREEK') > 0 AND INSTR (UPPER (b.fac_bookmark_naam), 'KANTOOR') > 0 AND INSTR (UPPER (b.fac_bookmark_naam), 'GENERIEK') > 0 AND UPPER (b.fac_bookmark_path) = 'APPL/PDA/MELDING.ASP' AND r.alg_srtruimte_key = sr.alg_srtruimte_key AND sr.alg_srtruimte_key IN (3, 4) -- Spreekruimte/Kantoorruimte AND r.alg_ruimte_key = aog.alg_onroerendgoed_keys AND aog.alg_type = 'R' AND aog.alg_locatie_key = l.alg_locatie_key ; CREATE OR REPLACE VIEW DSMA_V_RAP_EXP_KORTON AS SELECT fac.safe_to_number (n.note_key) extra_key, -- Moet zo heten! o.mld_opdr_key, o.mld_melding_key, o.mld_opdr_bedrijfopdr_volgnr, o.mld_statusopdr_key, refnr.mld_kenmerkopdr_waarde mld_opdr_externnr, -- TODO:Korton kan 'externalnr' niet zetten? n.reftype, o.mld_opdr_externsyncdate syncdate_old, n.note_datum syncdate_new, n.note_oms, p.prs_perslid_email, pf.prs_perslid_naam_friendly FROM mld_opdr o, (SELECT * FROM mld_kenmerkopdr WHERE mld_kenmerk_key = 621) refnr, -- Ref.nr. leverancier (SELECT '1' || SUBSTR ('00000' || TO_CHAR (mld_opdr_note_key), -9) note_key, 'ORD' reftype, mld_opdr_key refkey, GREATEST (mld_opdr_note_aanmaak, mld_opdr_note_wijzigdatum) note_datum, prs_perslid_key, mld_opdr_note_omschrijving note_oms FROM mld_opdr_note WHERE prs_perslid_key != 5383 -- API-user tbv. Korton AND BITAND (mld_opdr_note_flag, 4) = 4 -- Bitje 4 = 1/Notitie voor Korton UNION ALL SELECT '2' || SUBSTR ('00000' || TO_CHAR (mld_melding_note_key), -9) note_key, 'MLD' reftype, mld_melding_key refkey, GREATEST (mld_melding_note_aanmaak, mld_melding_note_wijzigdatum) note_datum, prs_perslid_key, mld_melding_note_omschrijving note_oms FROM mld_melding_note WHERE prs_perslid_key != 5383 -- API-user tbv. Korton AND BITAND (mld_melding_note_flag, 1) = 1) n, -- Bitje 1 = 1/Notitie voor Korton prs_perslid p, prs_v_perslid_fullnames_all pf WHERE o.mld_uitvoerende_keys = 841 -- Korton AND o.mld_opdr_key = refnr.mld_opdr_key(+) --AND o.mld_opdr_key = n.mld_opdr_key AND ((n.reftype = 'ORD' AND o.mld_opdr_key = n.refkey) OR (n.reftype = 'MLD' AND o.mld_melding_key = n.refkey)) AND n.note_datum > TRUNC (SYSDATE, 'IW') -- Alle notities deze week! AND n.prs_perslid_key = p.prs_perslid_key AND p.prs_perslid_key = pf.prs_perslid_key; CREATE OR REPLACE PROCEDURE DSMA_KORTON_UPDATE AS -- Nieuwe notitie(s) sinds laatste sync! -- TODO:Aanname is nooit tegelijk notitie(s) op zowel melding als opdracht! CURSOR c_dsm2korton IS SELECT '[' || TO_CHAR (x.mld_melding_key) || '/' || TO_CHAR (x.mld_opdr_bedrijfopdr_volgnr) || '] ' aanduiding, x.extra_key, x.mld_opdr_key, x.mld_melding_key, x.mld_opdr_bedrijfopdr_volgnr, x.mld_statusopdr_key, x.reftype, x.syncdate_old, x.syncdate_new FROM dsma_v_rap_exp_korton x WHERE x.mld_opdr_externnr IS NOT NULL -- Dan pas kunnen updates worden doorgezet! AND x.mld_statusopdr_key IN (5, 8) -- Toegekend/Geaccepteerd AND x.syncdate_new > COALESCE (x.syncdate_old, TRUNC (SYSDATE, 'IW')) --AND NOT EXISTS -- Alleen laatste notitie op basis van key (MLD voor ORD)! -- (SELECT 1 -- FROM dsma_v_rap_exp_korton -- WHERE mld_opdr_key = x.mld_opdr_key -- AND extra_key > x.extra_key) AND NOT EXISTS -- Alleen laatste notitie op basis van datum (ORD voor MLD)! (SELECT 1 FROM dsma_v_rap_exp_korton WHERE mld_opdr_key = x.mld_opdr_key AND syncdate_new > x.syncdate_new) ORDER BY x.extra_key; v_errormsg VARCHAR2 (1000) := ''; oracle_err_num NUMBER; oracle_err_mes VARCHAR2 (200); v_count NUMBER; BEGIN v_count := 0; -- Sync-en notities door DSM in opdracht of melding naar Korton! FOR rec IN c_dsm2korton LOOP BEGIN v_errormsg := 'Fout dsm2korton-sync'; -- TRUC: Zet wijzigdatum van te notificeren notities op syncdate_new! -- Bij 1 notitie zal gelden syncdate_new = wijzigdatum (en wijzigt er -- niets), maar truc gaat pas echt werken als er >1 notities zijn! IF (rec.reftype = 'ORD') THEN UPDATE mld_opdr_note SET mld_opdr_note_wijzigdatum = rec.syncdate_new WHERE prs_perslid_key != 5383 -- API-user tbv. Korton AND mld_opdr_key = rec.mld_opdr_key AND GREATEST (mld_opdr_note_aanmaak, mld_opdr_note_wijzigdatum) > rec.syncdate_old; --fac.trackaction ('ORDUPD', rec.refkey, NULL, NULL, 'Notitie doorgezet naar Korton'); ELSE UPDATE mld_melding_note SET mld_melding_note_wijzigdatum = rec.syncdate_new WHERE prs_perslid_key != 5383 -- API-user tbv. Korton AND mld_melding_key = rec.mld_melding_key AND GREATEST (mld_melding_note_aanmaak, mld_melding_note_wijzigdatum) > rec.syncdate_old; --fac.trackaction ('MLDUPD', rec.refkey, NULL, NULL, 'Notitie doorgezet naar Korton'); END IF; v_errormsg := 'Fout toevoegen CUST01-noti (Korton)'; INSERT INTO fac_notificatie (fac_srtnotificatie_key, fac_notificatie_status, fac_notificatie_refkey, fac_notificatie_extrakey, fac_notificatie_prioriteit, prs_bedrijfadres_key ) VALUES (321, -- CUST01 0, -- Don't care 201, -- DSMA_V_RAP_EXP_KORTON fac.safe_to_number (rec.extra_key), 2, 61 -- 4Me-kanaal voor updates naar Korton ); v_errormsg := 'Fout bijwerken opdracht'; UPDATE mld_opdr SET mld_opdr_externsyncdate = rec.syncdate_new WHERE mld_opdr_key = rec.mld_opdr_key; v_count := v_count + 1; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := v_errormsg || ' ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.writelog ('KORTON', 'E', rec.aanduiding || v_errormsg, ''); COMMIT; END; END LOOP; IF v_count > 0 THEN fac.writelog ('KORTON', 'S', 'DSM-notities to Korton/#sync: ' || TO_CHAR (v_count), ''); END IF; EXCEPTION WHEN OTHERS THEN oracle_err_num := SQLCODE; oracle_err_mes := SUBSTR (SQLERRM, 1, 200); v_errormsg := 'ORACLE (error ' || oracle_err_num || '/' || oracle_err_mes || ')'; fac.writelog ('KORTON', 'E', 'Update afgebroken!', v_errormsg); END DSMA_KORTON_UPDATE; / CREATE OR REPLACE PROCEDURE DSMA_PRE_PUTORDERS AS BEGIN dsma_korton_update; END DSMA_PRE_PUTORDERS; / ------ 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