diff --git a/DSMA/dsma.sql b/DSMA/dsma.sql new file mode 100644 index 000000000..e99317b6b --- /dev/null +++ b/DSMA/dsma.sql @@ -0,0 +1,488 @@ +-- +-- $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. + -- Locatie/Gebouw/Verdieping/Ruimte bepalen via Kenmerk1-kolom -> Eigen tabel (key = 1) -> + -- 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 + -- '_' op de meegegeven locatie. + -- Eventuele WPs onder andere locaties dan import-locatie blijven ook 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 = -1 + AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1) + 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 = -1 + AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1) + 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 = -1 + AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1) + 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 = '_000' + AND NOT EXISTS + (SELECT 1 + FROM alg_v_aanwezigruimte r, alg_verdieping v + WHERE r.alg_ruimte_nr = '_000' + AND r.alg_verdieping_key = v.alg_verdieping_key + AND v.alg_verdieping_volgnr < iv.alg_verdieping_volgnr)), + i.alg_ruimte_nr = + (SELECT '_000' + FROM fac_v_aanwezigusrdata ud, -- Mapping Kenmerk1-code -> Gebouwcode + alg_v_aanweziggebouw ig, + alg_locatie il + WHERE ud.fac_usrtab_key = -1 + AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1) + 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 = -1 + AND UPPER (ud.fac_usrdata_code) = UPPER (i.prs_kenmerk1) + 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_nr = i.prs_perslid_nr + 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 Indienst-datum (= kenmerk2), Uitdienst-datum (= kenmerk3) en + -- Leidinggevende-kenmerkveld (= kenmerk4). + CURSOR c_prs + IS + SELECT x.prs_perslid_key, + x.prs_perslid_email, + 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 -- TODO:Of check op bepaalde afdeling? + --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 -- TODO:Of check op bepaalde afdeling? + 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_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; +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. Relevante wijzigingen in opdracht (anders dan door Base27 +-- via API) opnieuw 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! + CURSOR c_sync + IS + SELECT '[' || TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) || '] ' + aanduiding, + o.mld_opdr_key, + COALESCE (o.mld_opdr_externsyncdate, TRUNC (SYSDATE)) syncdate_old, + MAX (GREATEST (mon.mld_opdr_note_aanmaak, mon.mld_opdr_note_wijzigdatum)) syncdate_new + FROM mld_opdr o, mld_opdr_note mon + WHERE o.mld_statusopdr_key IN (5, 8) -- Toegekend/Geaccepteerd + AND o.mld_uitvoerende_keys = 101 -- Base27 + AND o.mld_opdr_key = mon.mld_opdr_key + AND mon.prs_perslid_key != 682 -- API-user tbv. Base27 + AND GREATEST (mon.mld_opdr_note_aanmaak, mon.mld_opdr_note_wijzigdatum) > COALESCE (o.mld_opdr_externsyncdate, TRUNC (SYSDATE)) + GROUP BY '[' || TO_CHAR (o.mld_melding_key) || '/' || TO_CHAR (o.mld_opdr_bedrijfopdr_volgnr) || '] ', + o.mld_opdr_key, + COALESCE (o.mld_opdr_externsyncdate, TRUNC (SYSDATE)); + + v_errormsg VARCHAR2 (1000); + oracle_err_num NUMBER; + oracle_err_mes VARCHAR2 (200); + v_count NUMBER; +BEGIN + v_count := 0; + + -- Sync-en wijziging(en)! + FOR rec IN c_sync + LOOP + BEGIN + v_errormsg := 'Fout sync-en wijziging(en)'; + + -- 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! + UPDATE mld_opdr_note + SET mld_opdr_note_wijzigdatum = rec.syncdate_new + WHERE mld_opdr_key = rec.mld_opdr_key + 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.mld_opdr_key; + + fac.trackaction ('ORDUPD', rec.mld_opdr_key, NULL, NULL, 'Wijzigingen doorgezet naar 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', 'Opdrachten/#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', 'Base27-export afgebroken!', v_errormsg); +END DSMA_SELECT_BASE27; +/ + +------ 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