CREATE OR REPLACE PROCEDURE CALCOLA_SLA_RECIPIENT ( mese_in IN NUMBER, anno_in IN NUMBER, cod_errore IN OUT NUMBER ) IS -- Purpose: Calcolo degli SLA Recipient -- La procedura calcola gli SLA Recipient relativi al mese di riferimento per tutte -- le richieste contenute nella tabella MNP_DW_REC_DELTA ed inserisce un record -- con i valori caolcolati nella tabella MNP_DW_REC_SLA -- MODIFICATION HISTORY -- A.Parati 15/07/2004 Versione Iniziale -- A.Parati 18/08/2004 Modifica al calcolo degli SLA -- L.Marcucci 15/10/2004 Modifica al calcolo degli SLA1 e SLA2 -- Ultimo giorno lavorativo del mese di riferiemnto ultimo_giorno_mese DATE; -- Primo giorno lavorativo del mese di riferimento primo_giorno_mese DATE; -- identificativo della richiesta di cui calcolare gli sla app_id_richiesta dwh.mnp_dw_rec_delta.id_richiesta%TYPE; -- numero di giorni di SLA0<=4 relativi al mese sla0_minore dwh.mnp_dw_rec_sla.sla_zero_minore%TYPE; -- numero di giorni di SLA0>4 relativi al mese sla0_maggiore dwh.mnp_dw_rec_sla.sla_zero_maggiore%TYPE; -- numero di giorni di SLA1<=4 relativi al mese sla1_minore dwh.mnp_dw_rec_sla.sla_uno_minore%TYPE; -- numero di giorni di SLA1>4 relativi al mese sla1_maggiore dwh.mnp_dw_rec_sla.sla_uno_maggiore%TYPE; -- numero di giorni di SLA2<=4 relativi al mese sla2_minore dwh.mnp_dw_rec_sla.sla_due_minore%TYPE; -- numero di giorni di SLA2>4 relativi al mese sla2_maggiore dwh.mnp_dw_rec_sla.sla_due_maggiore%TYPE; -- numero di giorni di SLA3<=4 relativi al mese sla3_minore dwh.mnp_dw_rec_sla_terzeparti.sla_tre_minore%TYPE; -- numero di giorni di SLA3>4 relativi al mese sla3_maggiore dwh.mnp_dw_rec_sla_terzeparti.sla_tre_maggiore%TYPE; sla0 NUMBER; -- numero di giorni di SLA0 totale sla1 NUMBER; -- numero di giorni di SLA1 totale sla2 NUMBER; -- numero di giorni di SLA2 totale sla3 NUMBER; -- numero di giorni di SLA3 totale app_stato NUMBER; -- stato attuale della richiesta app_data_stato_finale DATE; -- data di transizione nello stato app_data_presa_in_carico DATE; -- data di presa in carico data_presa_in_carico_presunta DATE; -- data di presa in carico presunta app_data_invio_aom DATE; -- data di invio del file XML di attivazione app_data_validazione DATE; -- data di validazione data_validazione_presunta DATE; -- data di validazione presunta app_data_esple_donating DATE; -- data di espletamento del donating data_esple_donating_presunta DATE; -- data di espletamento del donating presunta app_data_cut_over_aom DATE; -- data di cut over dell'AOM donating app_data_config_teorica DATE; -- data di invio del file XML di porting alla Terza Parte app_data_config_effettiva DATE; -- data di ricezione del file XML di espletamento dalla Terza Parte app_aom_tp VARCHAR2 (4); -- Operatore terza parte data_config_presunta DATE; -- data di configurazione presunta bound NUMBER := 4; dco_calc_aom_ora DATE; dco_conf_teorica_19 DATE; -- Identificativo della richiesta sulla tabella delta delle terze parti app_id_richiesta_tp dwh.mnp_dw_rec_terzeparti_delta.id_richiesta%TYPE; sla1_mese_corrente NUMBER; -- numero di giorni di SLA1 nel mese di riferimento sla1_mesi_precedenti NUMBER; -- numero di giorni di SLA1 dei mesi precedenti sla2_mese_corrente NUMBER; -- numero di giorni di SLA2 nel mese di riferimento sla2_mesi_precedenti NUMBER; -- numero di giorni di SLA2 dei mesi precedenti sla3_mese_corrente NUMBER; -- numero di giorni di SLA3 nel mese di riferimento sla3_mesi_precedenti NUMBER; -- numero di giorni di SLA3 dei mesi precedenti var_stato_finale NUMBER; -- variabile di appoggio per il codice dello sto finale file_log UTL_FILE.file_type; -- file di log dir_out_log VARCHAR2 (200); line_log VARCHAR2 (200); -- Cursore per le richieste di cui calcolare gli SLA CURSOR cur_richiesta IS SELECT id_richiesta, stato, data_stato_finale, data_presa_in_carico, data_invio_ad_aom, data_validazione, data_espletamento_donating, data_cut_over_aom FROM dwh.mnp_dw_rec_delta; -- Cursore per le terze parti di cui calcolare gli SLA3 CURSOR cur_terzaparte (var_richiesta IN VARCHAR2) IS SELECT id_richiesta, aom_terze_parti, data_configurazione_teorica, data_configurazione_effettiva FROM dwh.mnp_dw_rec_terzeparti_delta WHERE id_richiesta = var_richiesta; BEGIN cod_errore := 0; dir_out_log := 'SLA'; file_log := UTL_FILE.fopen ( dir_out_log, 'SLA_RECIPIENT_' || TO_CHAR (SYSDATE, 'yyyyMMdd') || '.log', 'w' ); UTL_FILE.put_line ( file_log, TO_CHAR (SYSDATE, 'yyyyMMdd HH24:mi:ss') || ': INIZIO CALCOLO SLA RECIPIENT' ); UTL_FILE.fflush (file_log); DELETE FROM dwh.mnp_dw_rec_sla WHERE mese = mese_in AND anno = anno_in; DELETE FROM dwh.mnp_dw_rec_sla_terzeparti WHERE mese = mese_in AND anno = anno_in; COMMIT; -- Calcolo ultimo giorno lavorativo del mese ultimo_giorno_mese := dwh.fun_ultimo_giorno_lavorativo (mese_in, anno_in); -- Calcolo primo giorno lavorativo del mese primo_giorno_mese := dwh.fun_primo_giorno_lavorativo (mese_in, anno_in); OPEN cur_richiesta; -- Per ogni richiesta di cui devo calcolare gli SLA LOOP FETCH cur_richiesta INTO app_id_richiesta, app_stato, app_data_stato_finale, app_data_presa_in_carico, app_data_invio_aom, app_data_validazione, app_data_esple_donating, app_data_cut_over_aom; EXIT WHEN cur_richiesta%NOTFOUND; -- Inizializzazione variabili sla0_minore := 0; sla0_maggiore := 0; sla1_minore := 0; sla1_maggiore := 0; sla2_minore := 0; sla2_maggiore := 0; sla0 := 0; sla1 := 0; sla2 := 0; sla1_mese_corrente := 0; sla1_mesi_precedenti := 0; sla2_mese_corrente := 0; sla2_mesi_precedenti := 0; -- Calcolo le date presunte IF app_data_invio_aom IS NOT NULL THEN data_presa_in_carico_presunta := dwh.fun_giorni_piu (app_data_invio_aom, 1); data_validazione_presunta := dwh.fun_giorni_piu (app_data_invio_aom, 3); data_esple_donating_presunta := dwh.fun_giorni_piu (app_data_invio_aom, 6); -- Calcolo SLA0 totale IF app_data_presa_in_carico IS NULL THEN sla0 := 0; ELSE IF (TRUNC (app_data_presa_in_carico) <= ultimo_giorno_mese) AND (TRUNC (app_data_presa_in_carico) >= primo_giorno_mese) THEN sla0 := dwh.fun_giorni_lavorativi ( app_data_presa_in_carico, data_presa_in_carico_presunta ); ELSE sla0 := 0; END IF; END IF; BEGIN SELECT DECODE (finale, 1, id_stato, 0, -1) INTO var_stato_finale FROM mnp.mnp_stato_rec WHERE id_stato = app_stato; EXCEPTION WHEN NO_DATA_FOUND THEN var_stato_finale := -1; END; -- Calcolo SLA1 totale e corrente IF (TRUNC (data_validazione_presunta) <= ultimo_giorno_mese) AND ( app_data_validazione IS NULL OR app_data_validazione >= primo_giorno_mese ) THEN IF app_data_validazione IS NULL THEN IF app_stato = var_stato_finale THEN app_data_validazione := app_data_stato_finale; ELSE app_data_validazione := FUN_GIORNI_PIU(ultimo_giorno_mese,1); END IF; END IF; sla1 := dwh.fun_giorni_lavorativi ( app_data_validazione, data_validazione_presunta ); IF sla1 > 0 THEN IF TRUNC (data_validazione_presunta) >= primo_giorno_mese THEN sla1_mese_corrente := sla1; ELSE sla1_mese_corrente := dwh.fun_giorni_lavorativi ( app_data_validazione, primo_giorno_mese ); END IF; ELSE sla1 := 0; sla1_mese_corrente := 0; END IF; ELSE sla1 := 0; sla1_mese_corrente := 0; END IF; -- Calcolo SLA1 mesi precedenti sla1_mesi_precedenti := sla1 - sla1_mese_corrente; -- Verifico se gli SLA1 sono positivi IF sla1 < 0 THEN sla1 := 0; END IF; IF sla1_mese_corrente < 0 THEN sla1_mese_corrente := 0; END IF; IF sla1_mesi_precedenti < 0 THEN sla1_mesi_precedenti := 0; END IF; -- Calcolo SLA2 totale e corrente IF (TRUNC (data_esple_donating_presunta) <= ultimo_giorno_mese) AND ( app_data_esple_donating IS NULL OR app_data_esple_donating >= primo_giorno_mese ) THEN IF app_data_esple_donating IS NULL THEN IF app_stato = var_stato_finale THEN app_data_esple_donating := app_data_stato_finale; ELSE app_data_esple_donating := FUN_GIORNI_PIU(ultimo_giorno_mese,1); END IF; END IF; sla2 := dwh.fun_giorni_lavorativi ( app_data_esple_donating, data_esple_donating_presunta ); IF sla2 > 0 THEN IF TRUNC (data_esple_donating_presunta) >= primo_giorno_mese THEN sla2_mese_corrente := sla2; ELSE sla2_mese_corrente := dwh.fun_giorni_lavorativi ( app_data_esple_donating, primo_giorno_mese ); END IF; ELSE sla2 := 0; sla2_mese_corrente := 0; END IF; ELSE sla2 := 0; sla2_mese_corrente := 0; END IF; -- Calcolo SLA2 mesi precedenti sla2_mesi_precedenti := sla2 - sla2_mese_corrente; -- Verifico se gli SLA2 sono positivi IF sla2 < 0 THEN sla2 := 0; END IF; IF sla2_mese_corrente < 0 THEN sla2_mese_corrente := 0; END IF; IF sla2_mesi_precedenti < 0 THEN sla2_mesi_precedenti := 0; END IF; -- Calcolo SLA0 relativo al mese di riferimento IF sla0 > 0 THEN IF sla0 <= bound THEN sla0_minore := sla0; sla0_maggiore := 0; ELSE sla0_minore := bound; sla0_maggiore := sla0 - bound; END IF; ELSE -- se lo SLA totale h <= 0 gli SLA relativi al mese sono 0 sla0_minore := 0; sla0_maggiore := 0; END IF; -- Calcolo SLA1 relativo al mese di riferimento IF sla1_mese_corrente = 0 THEN sla1_minore := 0; sla1_maggiore := 0; ELSE -- lo SLA1 del mese corrente h positivo IF sla1_mesi_precedenti >= bound THEN sla1_minore := 0; sla1_maggiore := sla1_mese_corrente; ELSE IF sla1_mese_corrente >= bound - sla1_mesi_precedenti THEN sla1_minore := bound - sla1_mesi_precedenti; sla1_maggiore := sla1 - bound; ELSE -- lo SLA1 del mese corrente h minore di 4 - SLA1 dei mesi precedenti sla1_minore := sla1_mese_corrente; sla1_maggiore := 0; END IF; END IF; END IF; -- Calcolo SLA2 relativo al mese di riferimento IF sla2_mese_corrente = 0 THEN sla2_minore := 0; sla2_maggiore := 0; ELSE -- lo SLA2 del mese corrente h positivo IF sla2_mesi_precedenti >= bound THEN sla2_minore := 0; sla2_maggiore := sla2_mese_corrente; ELSE IF sla2_mese_corrente >= bound - sla2_mesi_precedenti THEN sla2_minore := bound - sla2_mesi_precedenti; sla2_maggiore := sla2 - bound; ELSE -- lo SLA2 del mese corrente h minore di 4 - SLA2 dei mesi precedenti sla2_minore := sla2_mese_corrente; sla2_maggiore := 0; END IF; END IF; END IF; -- Se esiste almeno uno SLA nel mese di riferimento IF sla0_minore > 0 OR sla0_maggiore > 0 OR sla1_minore > 0 OR sla1_maggiore > 0 OR sla2_minore > 0 OR sla2_maggiore > 0 THEN -- Inserimento del record relativo al mese nella tabella degli SLA INSERT INTO dwh.mnp_dw_rec_sla (id_richiesta, mese, anno, sla_zero_minore, sla_zero_maggiore, sla_uno_minore, sla_uno_maggiore, sla_due_minore, sla_due_maggiore) VALUES (app_id_richiesta, mese_in, anno_in, sla0_minore, sla0_maggiore, sla1_minore, sla1_maggiore, sla2_minore, sla2_maggiore); END IF; OPEN cur_terzaparte (app_id_richiesta); -- Per ogni richiesta di cui devo calcolare gli SLA sulle Terze Parti LOOP FETCH cur_terzaparte INTO app_id_richiesta_tp, app_aom_tp, app_data_config_teorica, app_data_config_effettiva; EXIT WHEN cur_terzaparte%NOTFOUND; -- Inizializzazione variabili sla3_minore := 0; sla3_maggiore := 0; sla3 := 0; sla3_mese_corrente := 0; sla3_mesi_precedenti := 0; IF app_data_config_teorica IS NOT NULL THEN -- Data cut over contenuta nel file XML di Porting con l'ora impostata alle 08:00 dco_calc_aom_ora := app_data_cut_over_aom + 8 / 24; -- Data di invio del file XML di Porting alla Terza Parte con l'ora impostata alle 19:00 dco_conf_teorica_19 := TRUNC (app_data_config_teorica) + 19 / 24; IF app_data_config_teorica <= dwh.fun_meno_ore_lavorative (dco_calc_aom_ora, 39) THEN data_config_presunta := dwh.fun_piu_ore_lavorative (dco_calc_aom_ora, 2); ELSE data_config_presunta := dwh.fun_piu_ore_lavorative (dco_conf_teorica_19, 39); END IF; -- Calcolo SLA3 totale IF (TRUNC (data_config_presunta) <= ultimo_giorno_mese) AND ( app_data_config_effettiva IS NULL OR app_data_config_effettiva >= primo_giorno_mese ) THEN IF app_data_config_effettiva IS NULL THEN IF app_stato = var_stato_finale THEN app_data_config_effettiva := app_data_stato_finale; ELSE app_data_config_effettiva := dwh.fun_giorni_piu (ultimo_giorno_mese, 1); END IF; END IF; sla3 := dwh.fun_ore_lavorative ( app_data_config_effettiva, data_config_presunta ); IF TRUNC (data_config_presunta) >= primo_giorno_mese THEN sla3_mese_corrente := sla3; ELSE sla3_mese_corrente := dwh.fun_ore_lavorative ( app_data_config_effettiva, primo_giorno_mese ); END IF; ELSE sla3 := 0; sla3_mese_corrente := 0; END IF; -- Calcolo SLA1 mesi precedenti sla3_mesi_precedenti := sla3 - sla3_mese_corrente; -- Verifico se gli SLA sono positivi IF sla3 < 0 THEN sla3 := 0; END IF; IF sla3_mese_corrente < 0 THEN sla3_mese_corrente := 0; END IF; IF sla3_mesi_precedenti < 0 THEN sla3_mesi_precedenti := 0; END IF; -- Calcolo SLA3 relativo al mese di riferimento IF sla3_mese_corrente = 0 THEN -- lo SLA3 del mese corrente h 0 sla3_minore := 0; sla3_maggiore := 0; ELSE -- lo SLA3 del mese corrente h positivo IF sla3_mesi_precedenti >= bound THEN sla3_minore := 0; sla3_maggiore := sla3_mese_corrente; ELSE IF sla3_mese_corrente >= bound - sla3_mesi_precedenti THEN sla3_minore := bound - sla3_mesi_precedenti; sla3_maggiore := sla3 - bound; ELSE -- lo SLA3 del mese corrente h minore di 4 - SLA3 dei mesi precedenti sla3_minore := sla3_mese_corrente; sla3_maggiore := 0; END IF; END IF; END IF; -- Se esiste almeno uno SLA nel mese di riferimento IF sla3_minore > 0 OR sla3_maggiore > 0 THEN -- Inserimento del record relativo al mese nella tabella degli SLA INSERT INTO dwh.mnp_dw_rec_sla_terzeparti (id_richiesta, aom_terze_parti, mese, anno, sla_tre_minore, sla_tre_maggiore) VALUES (app_id_richiesta_tp, app_aom_tp, mese_in, anno_in, sla3_minore, sla3_maggiore); END IF; END IF; END LOOP; -- cur_terzaparte CLOSE cur_terzaparte; END IF; -- data_invio_aom non nulla COMMIT; END LOOP; -- cur_richiesta CLOSE cur_richiesta; DELETE FROM dwh.mnp_dw_rec_terzeparti d WHERE NOT EXISTS ( SELECT id_richiesta FROM dwh.mnp_dw_rec_sla ds WHERE ds.id_richiesta = d.id_richiesta) AND NOT EXISTS ( SELECT id_richiesta FROM dwh.mnp_dw_rec_sla_terzeparti ds WHERE ds.id_richiesta = d.id_richiesta); COMMIT; DELETE FROM dwh.mnp_dw_rec d WHERE NOT EXISTS ( SELECT id_richiesta FROM dwh.mnp_dw_rec_sla ds WHERE ds.id_richiesta = d.id_richiesta) AND NOT EXISTS ( SELECT id_richiesta FROM dwh.mnp_dw_rec_sla_terzeparti ds WHERE ds.id_richiesta = d.id_richiesta); COMMIT; UTL_FILE.put_line ( file_log, TO_CHAR (SYSDATE, 'yyyyMMdd HH24:mi:ss') || ': FINE CALCOLO SLA RECIPIENT' ); UTL_FILE.fflush (file_log); UTL_FILE.fclose (file_log); EXCEPTION WHEN OTHERS THEN cod_errore := 1; DBMS_OUTPUT.put_line ( 'Errore in CALCOLA_SLA_RECIPIENT ' || SQLERRM); RETURN; END; -- Procedure /