diff --git a/CIZN/cizn.sql b/CIZN/cizn.sql index ef0ef1146..97b48ea2c 100644 --- a/CIZN/cizn.sql +++ b/CIZN/cizn.sql @@ -26,38 +26,124 @@ SET DEFINE OFF CREATE OR REPLACE PACKAGE CIZN AS PROCEDURE update_devices_from_ad; + PROCEDURE select_asset_jaar_not; END; / CREATE OR REPLACE PACKAGE BODY CIZN AS - PROCEDURE update_devices_from_ad - AS - CURSOR c IS - SELECT i.serialnumber, - CAST ( - FROM_TZ (CAST (TO_DATE (REPLACE (i.lastsyncdatetime, 'Z'), 'yyyy-mm-dd"T"hh24:mi:ss') AS TIMESTAMP), 'UTC') - AT TIME ZONE 'Europe/Amsterdam' AS DATE) lastLocalSyncDateTime, - i.userDisplayName, - i.emailaddress, - i.phoneNumber, - i.imei, - i.manufacturer, - i.model, - d.ins_deel_key - FROM cizn_imp_device_info i, ins_deel d - WHERE serialnumber = COALESCE (ins_deel_opmerking, 'QueQuLeQue'); + PROCEDURE update_devices_from_ad + AS + CURSOR c IS + SELECT i.serialnumber, + CAST ( + FROM_TZ (CAST (TO_DATE (REPLACE (i.lastsyncdatetime, 'Z'), 'yyyy-mm-dd"T"hh24:mi:ss') AS TIMESTAMP), 'UTC') + AT TIME ZONE 'Europe/Amsterdam' AS DATE) lastLocalSyncDateTime, + i.userDisplayName, + i.emailaddress, + i.phoneNumber, + i.imei, + i.manufacturer, + i.model, + d.ins_deel_key + FROM cizn_imp_device_info i, ins_deel d + WHERE serialnumber = COALESCE (ins_deel_opmerking, 'QueQuLeQue'); + + BEGIN + FOR rec IN c LOOP + FLX.setflex('INS', 47, rec.ins_deel_key, rec.lastLocalSyncDateTime); + FLX.setflex('INS', 45, rec.ins_deel_key, rec.userDisplayName); + FLX.setflex('INS', 44, rec.ins_deel_key, rec.imei); + FLX.setflex('INS', 82, rec.ins_deel_key, rec.manufacturer); + FLX.setflex('INS', 81, rec.ins_deel_key, rec.model); + UPDATE ins_deel SET ins_deel_externsyncdate = SYSDATE WHERE ins_deel_key = rec.ins_deel_key; + END LOOP; + END; + + -- Procedure om ieder jaar een notificatie te sturen naar personen die één of meerdere voorzieningen + -- in hun bezit hebben. Als een persoon al eerder een notificiatie ontvangen heeft omdat er een voorziening + -- op zijn/haar naam is gezet CUST03 of omdat er een voorziening is ingeleverd CUST04, dan zal dit als laatste + -- notificatiemoment genomen worden. Om het systeem op te starten wordt vanaf 4 juli per week een letter uit het + -- alfabet genotificeerd. + PROCEDURE select_asset_jaar_not + AS + CURSOR c_jaar IS + SELECT * + FROM (SELECT DISTINCT + p.prs_perslid_key, + p.prs_perslid_email, + ASCII (UPPER (SUBSTR (prs_perslid_naam, 1, 1))) - 64, + prs_perslid_naam, + -- De positie van de letter in het alfabet: (ASCII (UPPER (SUBSTR (prs_perslid_naam, 1, 1))) - 64) + TO_DATE ('2023-07-04', 'yyyy-mm-dd') + (ASCII (UPPER (SUBSTR (prs_perslid_naam, 1, 1))) - 64) * 7 + ddefault, + GREATEST ( + COALESCE ( + FAC.gettrackingdate ('CUST03', p.prs_perslid_key), + TO_DATE ('2023-07-04', 'yyyy-mm-dd') + (ASCII (UPPER (SUBSTR (prs_perslid_naam, 1, 1))) - 64) * 7), + COALESCE ( + FAC.gettrackingdate ('CUST04', p.prs_perslid_key), + TO_DATE ('2023-07-04', 'yyyy-mm-dd') + (ASCII (UPPER (SUBSTR (prs_perslid_naam, 1, 1))) - 64) * 7), + COALESCE ( + FAC.gettrackingdate ('CUST05', p.prs_perslid_key), + TO_DATE ('2023-07-04', 'yyyy-mm-dd') + (ASCII (UPPER (SUBSTR (prs_perslid_naam, 1, 1))) - 64) * 7)) + laatsteNot + FROM prs_perslid p, ins_deel_uitgifte u + WHERE p.prs_perslid_key = u.prs_perslid_key + AND ins_deel_uitgifte_ingeleverd IS NULL + AND prs_perslid_inactief IS NULL + AND prs_perslid_verwijder IS NULL + AND prs_perslid_email IS NOT NULL) + WHERE laatsteNot + 355 < SYSDATE; + + v_cust06_key NUMBER; + v_rapport_key NUMBER; + v_timestamp DATE; + BEGIN + v_timestamp := SYSDATE; + + SELECT fac_srtnotificatie_key + INTO v_cust06_key + FROM fac_srtnotificatie + WHERE fac_srtnotificatie_code = 'CUST06'; + + SELECT fac_usrrap_key + INTO v_rapport_key + FROM fac_usrrap + WHERE fac_usrrap_code = 'ICTJAARNOT'; + + FOR rec IN c_jaar + LOOP + + INSERT INTO fac_notificatie (fac_srtnotificatie_key, + fac_notificatie_status, + fac_notificatie_oms, + fac_notificatie_refkey, + fac_notificatie_extrakey, + fac_notificatie_datum, + prs_perslid_key_receiver, + fac_notificatie_receiver_email, + fac_notificatie_sender_email) + VALUES (v_cust06_key, + 2, + 'Jaarlijkse controle ICT voorzieningen', + v_rapport_key, + rec.prs_perslid_key, + v_timestamp, + rec.prs_perslid_key, + rec.prs_perslid_email, + 'servicedesk@ciz.nl'); + + FAC.trackaction ('CUST05', + rec.prs_perslid_key, + NULL, + v_timestamp, + 'Jaarlijkse controle ICT voorzieningen'); + END LOOP; + + END; + - BEGIN - FOR rec IN c LOOP - FLX.setflex('INS', 47, rec.ins_deel_key, rec.lastLocalSyncDateTime); - FLX.setflex('INS', 45, rec.ins_deel_key, rec.userDisplayName); - FLX.setflex('INS', 44, rec.ins_deel_key, rec.imei); - FLX.setflex('INS', 82, rec.ins_deel_key, rec.manufacturer); - FLX.setflex('INS', 81, rec.ins_deel_key, rec.model); - UPDATE ins_deel SET ins_deel_externsyncdate = SYSDATE WHERE ins_deel_key = rec.ins_deel_key; - END LOOP; - END; END; / @@ -112,18 +198,17 @@ SELECT 'bezoekers' typebezoek, ELSE NULL END END datum_te_laat - FROM bez_bezoekers b, - bez_afspraak a, - res_rsv_deel rrd, - res_deel rd, - ins_v_deel_gegevens dg, - alg_locatie l + FROM bez_bezoekers b, + bez_afspraak a, + res_v_aanwezigrsv_deel rrd, + res_deel rd, + ins_v_deel_gegevens dg, + alg_locatie l WHERE b.bez_afspraak_key = a.bez_afspraak_key - AND b.bez_bezoekers_key = rrd.bez_bezoekers_key - AND rrd.res_deel_key = rd.res_deel_key - AND rd.res_ins_deel_key = dg.ins_deel_key - AND dg.alg_locatie_key = l.alg_locatie_key - AND rrd.res_rsv_deel_verwijder IS NULL; + AND b.bez_bezoekers_key = rrd.bez_bezoekers_key(+) + AND rrd.res_deel_key = rd.res_deel_key(+) + AND rd.res_ins_deel_key = dg.ins_deel_key(+) + AND a.alg_locatie_key = l.alg_locatie_key(+); -- View om de juiste labels te tonen in het werkplekreserveringsscherm. CREATE OR REPLACE FORCE VIEW CIZN_V_LABEL_DEEL_RES_DATUM @@ -530,6 +615,161 @@ BEGIN END; / + + +-- Overzicht van ICT voorzieningen die niet gevonden worden in de intune database. +CREATE OR REPLACE VIEW cizn_v_rap_asset_not_in_intune +AS + SELECT ins_srtgroep_omschrijving, + ins_srtdeel_omschrijving, + ins_deel_opmerking, + alg_gebouw_naam, + prs_perslid_volnaam, + flx.getdomeinwaarde (21, flx.getflex ('INS', 41, ins_deel_key)) status + FROM ins_v_deel_gegevens + WHERE ins_discipline_omschrijving = 'ICT' + AND ins_srtgroep_omschrijving IN ('Computer', 'Telefoon', 'Tablet') + AND COALESCE (ins_deel_opmerking, 'Leeg') NOT IN + (SELECT COALESCE (serialnumber, 'QueQeLeQue') FROM cizn_imp_device_info) + AND ins_deel_vervaldatum IS NULL; + +-- Rapportage met algemene gegevens van de ICT voorziening. Hierbij wordt ook de aanmaakdatum getoond. Deze +-- is op andere manieren niet te achterhalen. +CREATE OR REPLACE VIEW cizn_v_rap_asset_gegevens +AS + SELECT d.ins_deel_aanmaak, + sg.ins_srtgroep_omschrijving, + sd.ins_srtdeel_omschrijving, + d.ins_deel_omschrijving, + d.ins_deel_opmerking, + flx.getdomeinwaarde (21, flx.getflex ('INS', 41, d.ins_deel_key)) status, + flx.getdomeinwaarde (22, flx.getflex ('INS', 48, d.ins_deel_key)) regio, + alg_gebouw_naam, + prs_perslid_volnaam, + d.ins_deel_key + FROM ins_deel d, + ins_srtdeel sd, + ins_srtgroep sg, + ins_discipline di, + ins_v_deel_gegevens dg + WHERE d.ins_srtdeel_key = sd.ins_srtdeel_key + AND sd.ins_srtgroep_key = sg.ins_srtgroep_key + AND sg.ins_discipline_key = di.ins_discipline_key + AND di.ins_discipline_omschrijving = 'ICT' + AND d.ins_deel_verwijder IS NULL + AND d.ins_deel_vervaldatum IS NULL + AND d.ins_deel_key = dg.ins_deel_key(+); + +-- Rapportage met de gegevens van de ICT voorzieningen waarbij de gedurende de laatste 30 dagen ingelogd is +-- en waar de gebruiker die ingelogd is niet overeenkomt met de persoon aan wie het device is uitgegeven. +CREATE OR REPLACE VIEW cizn_v_rap_asset_login_mismatch +AS + SELECT manufacturer Merk, + model TYPE, + serialnumber serienummer, + prs_perslid_email gekoppeld_aan, + emailaddress ingelogd_door, + FAC.safe_TO_DATE (lastsyncdatetime, 'yyyy-mm-dd"T"hh24:mi:ss"Z"') laastelogin + FROM cizn_imp_device_info i, + (SELECT * + FROM ins_deel + WHERE ins_alg_ruimte_type = 'P') d, + prs_perslid p + WHERE COALESCE (ins_deel_opmerking, '-2') = COALESCE (i.serialnumber, '-1') + AND d.ins_alg_ruimte_key = p.prs_perslid_key(+) + AND UPPER (COALESCE (prs_perslid_email, 'Leeg')) <> UPPER (COALESCE (emailaddress, 'Leeg')) + AND FAC.safe_TO_DATE (lastsyncdatetime, 'yyyy-mm-dd"T"hh24:mi:ss"Z"') > SYSDATE - 30; + +-- Rapport om de historie van bezittingen per persoon te kunnen raadplegen. +CREATE OR REPLACE VIEW cizn_v_rap_asset_prs_historie +AS +SELECT ins_srtgroep_omschrijving, + ins_srtdeel_omschrijving, + ins_deel_omschrijving, + ins_deel_opmerking, + flx.getdomeinwaarde (21, flx.getflex ('INS', 41, d.ins_deel_key)) status, + u.ins_deel_uitgifte_begin uitgegeven, + u.ins_deel_uitgifte_ingeleverd ingenomen, + pf.prs_perslid_naam_full, + pf.prs_perslid_naam_friendly, + p.prs_perslid_verwijder, + p.prs_perslid_inactief, + d.ins_deel_key, + p.prs_perslid_key, + d.ins_deel_verwijder, + d.ins_deel_vervaldatum + FROM ins_deel_uitgifte u, + ins_deel d, + ins_srtdeel sd, + ins_srtgroep sg, + ins_discipline di, + prs_v_perslid_fullnames_all pf, + prs_perslid p + WHERE u.ins_deel_key = d.ins_deel_key + AND u.prs_perslid_key = p.prs_perslid_key + AND p.prs_perslid_key = pf.prs_perslid_key + AND d.ins_srtdeel_key = sd.ins_srtdeel_key + AND sd.ins_srtgroep_key = sg.ins_srtgroep_key + AND sg.ins_discipline_key = di.ins_discipline_key + AND di.ins_discipline_omschrijving = 'ICT'; + + +-- Rapport om inzichtelijk te maken welke personen die door de SCIM koppeling op Inactief zijn gezet +-- toch nog ICT voorzieningen in het bezit hebben. +CREATE OR REPLACE VIEW cizn_v_rap_asset_einde_contract +AS + SELECT pf.prs_perslid_naam_full, + p.prs_perslid_inactief, + d.ins_deel_opmerking, + sd.ins_srtdeel_omschrijving, + d.ins_deel_key, + p.prs_perslid_key + FROM prs_perslid p, + ins_deel_uitgifte u, + ins_deel d, + prs_v_perslid_fullnames_all pf, + ins_srtdeel sd + WHERE prs_perslid_inactief IS NOT NULL + AND u.prs_perslid_key = p.prs_perslid_key + AND ins_deel_uitgifte_ingeleverd IS NULL + AND u.ins_deel_key = d.ins_deel_key + AND p.prs_perslid_key = pf.prs_perslid_key + AND d.ins_srtdeel_key = sd.ins_srtdeel_key + AND d.ins_deel_vervaldatum IS NULL + AND d.ins_deel_verwijder IS NULL; + +-- Dashboard met informatie omtrent assetbeheer. Per regel wordt het aantal van een rapport getoond. Doorklikken leidt tot het rapport zelf. +CREATE OR REPLACE VIEW cizn_v_rap_asset_dashboard +AS + SELECT 1 volgorde, + '' + || 'Apparaten toegewezen aan gebruikers met beëindigd contract' + || '' html_omschrijving, + (SELECT COUNT (*) FROM cizn_v_rap_asset_einde_contract) aantal + FROM DUAL; + +-- View om te gebuiken in de notificatie CUST06 om jaarlijks de ICT voorzieningen te noticeren +CREATE OR REPLACE VIEW cizn_v_rap_asset_jaar +AS + SELECT ins_deel_omschrijving, + ins_srtgroep_omschrijving, + ins_srtdeel_omschrijving, + ins_deel_opmerking serienummer, + uitgegeven, + prs_perslid_naam_friendly, + prs_perslid_key extra_key + FROM cizn_v_rap_asset_prs_historie + WHERE ins_deel_verwijder IS NULL + AND ins_deel_vervaldatum IS NULL + AND ingenomen IS NULL; + +CREATE OR REPLACE PROCEDURE cizn_daily +AS +BEGIN + cizn.select_asset_jaar_not; +END; +/ + ------ payload end ------ SET DEFINE OFF