CREATE OR REPLACE PROCEDURE CALCOLA_SLA_TERZEPARTI ( mese_in IN NUMBER, anno_in IN NUMBER, cod_errore IN OUT NUMBER ) IS -- Purpose: Calcolo degli SLA Terze Parti -- La procedura calcola gli SLA Terze Parti relativi al mese di riferimento per tutte -- le richieste contenute nella tabella MNP_DW_PORTING_DELTA ed inserisce un record -- con i valori caolcolati nella tabella MNP_DW_PORTING_SLA -- MODIFICATION HISTORY -- A.Parati 15/07/2004 Versione Iniziale -- A.Parati 24/08/2004 Modifica al meccanismo di calcolo ultimo_giorno_mese DATE; -- Ultimo giorno lavorativo del mese di riferiemnto primo_giorno_mese DATE; -- Primo giorno lavorativo del mese di riferimento app_id_richiesta dwh.mnp_dw_porting_delta.id_richiesta%TYPE; -- identificativo della richiesta di cui calcolare gli sla sla3_minore dwh.mnp_dw_porting_sla.sla_tre_minore%TYPE; -- numero di giorni di SLA3<=4 relativi al mese sla3_maggiore dwh.mnp_dw_porting_sla.sla_tre_maggiore%TYPE; -- numero di giorni di SLA3>4 relativi al mese sla3 NUMBER; -- numero di giorni di SLA3 totale 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 app_data_config_teorica DATE; -- data di ricezione del file XML di porting app_data_config_effettiva DATE; -- data di invio del file di espletamento app_data_cut_over_calc DATE; -- data di cut over calcolata data_config_presunta DATE; -- data di configurazione presunta bound NUMBER := 4; dco_calc_ora DATE; dco_conf_teorica_19 DATE; file_log UTL_FILE.file_type; -- file di log dir_out_log VARCHAR2 (200); line_log VARCHAR2 (200); var_stato_finale NUMBER; -- variabile di appoggio per il codice dello sto finale app_stato NUMBER; -- stato attuale della richiesta app_data_stato_finale DATE; -- data di transizione nello stato -- Cursore per le richieste di cui calcolare gli SLA CURSOR cur_richiesta IS SELECT id_richiesta, stato, data_stato_finale, data_configurazione_teorica, data_configurazione_effettiva, data_cut_over_calc FROM dwh.mnp_dw_porting_delta; BEGIN cod_errore := 0; dir_out_log := 'SLA'; file_log := UTL_FILE.fopen ( dir_out_log, 'SLA_TERZAPARTE_' || TO_CHAR (SYSDATE, 'yyyyMMdd') || '.log', 'w' ); UTL_FILE.put_line ( file_log, TO_CHAR (SYSDATE, 'yyyyMMdd HH24:mi:ss') || ': INIZIO CALCOLO SLA TERZA PARTE' ); UTL_FILE.fflush (file_log); DELETE FROM dwh.mnp_dw_porting_sla 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_config_teorica, app_data_config_effettiva, app_data_cut_over_calc; EXIT WHEN cur_richiesta%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_ora := app_data_cut_over_calc + 8 / 24; -- Data di ricezione del file XML di Porting dall'operatore Recipient 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_ora, 39) THEN data_config_presunta := dwh.fun_piu_ore_lavorative (dco_calc_ora, 2); ELSE data_config_presunta := dwh.fun_piu_ore_lavorative (dco_conf_teorica_19, 39); END IF; BEGIN SELECT DECODE (finale, 1, id_stato, 0, -1) INTO var_stato_finale FROM mnp.mnp_stato_porting WHERE id_stato = app_stato; EXCEPTION WHEN NO_DATA_FOUND THEN var_stato_finale := -1; END; -- 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_porting_sla (id_richiesta, mese, anno, sla_tre_minore, sla_tre_maggiore) VALUES (app_id_richiesta, mese_in, anno_in, sla3_minore, sla3_maggiore); COMMIT; END IF; END IF; END LOOP; CLOSE cur_richiesta; DELETE FROM dwh.mnp_dw_porting d WHERE NOT EXISTS ( SELECT id_richiesta FROM dwh.mnp_dw_porting_sla 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 TERZA PARTE' ); 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_TERZEPARTI ' || SQLERRM); RETURN; END; -- Procedure /