CREATE OR REPLACE PACKAGE PKG_CALCOLO_SLA_MVNO AS
/******************************************************************************
   NAME:       PKG_CALCOLO_SLA_MVNO
   PURPOSE:

   REVISIONS:
   Ver        Date        Author           Description
   ---------  ----------  ---------------  ------------------------------------
   1.0        11/03/2010  NTT DATA         1. Created this package.
   2.0        04/04/2017  NTT DATA         2. Improve CARICAMENTO_SLA3_RECIPIENT
                                           separate UPSERT for PORTING and ESPLETA
                                           3. Improve CARICAMENTO_SLA3_RECIPIENT
                                           read oldest only into ackInizialeLetto
                                           or proc will crash on resubmitted files.
   3.0        04/05/2017  NTT DATA         4. Improve CARICAMENTO_SLAX_RECIPIENT
                                           5. Improve CARICAMENTO_SLAY_RECIPIENT
                                           6. Improve CARICAMENTO_SLAZ_RECIPIENT
                                           prevent ACCESS FULL TABLE MNP.MNP_XML_ACK_OUT 
                                           causing [ORA-01555: snapshot too old: 
										   rollback segment too small]
                                           add function-based (trunc 'MM') 
										   index on column 
										   MNP.MNP_XML_ACK_OUT.data_inserimento 
   4.0        05/05/2017  NTT DATA         7. Improve CALCOLO_SLA_MVNO prevent
                                           GoldenGate (to DBCBIESE) error
                                           "Discarding record on action DISCARD 
										   on error 1400 - Mapping problem with 
										   delete record (target format)"
                                           Add COMMIT after delete of earlier 
                                           records from month under processing									   
******************************************************************************/


  PROCEDURE CARICAMENTO_SLA0_RECIPIENT (dataRif IN DATE,cod_errore OUT NUMBER);
  PROCEDURE CARICAMENTO_SLA1_RECIPIENT (dataRif IN DATE,cod_errore OUT NUMBER);
  PROCEDURE CARICAMENTO_SLA2_RECIPIENT (dataRif IN DATE,cod_errore OUT NUMBER);
  PROCEDURE CARICAMENTO_SLA3_RECIPIENT (dataRif IN DATE,cod_errore OUT NUMBER);
 
  PROCEDURE CARICAMENTO_SLA1_REC_VIRT (dataRif IN DATE,cod_errore OUT NUMBER);
  PROCEDURE CARICAMENTO_SLA2_REC_VIRT (dataRif IN DATE,cod_errore OUT NUMBER);
  PROCEDURE CARICAMENTO_SLA3_REC_VIRT (dataRif IN DATE,cod_errore OUT NUMBER);

  PROCEDURE CARICAMENTO_SLAX_RECIPIENT (dataRif IN DATE,cod_errore OUT NUMBER);
  PROCEDURE CARICAMENTO_SLAY_RECIPIENT (dataRif IN DATE,cod_errore OUT NUMBER);
  PROCEDURE CARICAMENTO_SLAZ_RECIPIENT (dataRif IN DATE,cod_errore OUT NUMBER);
 
  PROCEDURE CARICAMENTO_SLAX_REC_VIRT (dataRif IN DATE,cod_errore OUT NUMBER);
  PROCEDURE CARICAMENTO_SLAZ_REC_VIRT (dataRif IN DATE,cod_errore OUT NUMBER);
  
  PROCEDURE CARICAMENTO_SLAX_M2M (dataRif IN DATE,cod_errore OUT NUMBER);
  PROCEDURE CARICAMENTO_SLAY_M2M (dataRif IN DATE,cod_errore OUT NUMBER);
  PROCEDURE CARICAMENTO_SLAZ_M2M (dataRif IN DATE,cod_errore OUT NUMBER);
 
  PROCEDURE CALCOLO_SLA_MVNO(dataRif IN DATE);


END PKG_CALCOLO_SLA_MVNO;
/
CREATE OR REPLACE package body PKG_CALCOLO_SLA_MVNO as

  procedure CARICAMENTO_SLA0_RECIPIENT(dataRif IN DATE,cod_errore   OUT      NUMBER) IS

ackInizialeLetto VARCHAR2(27);
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLA0_RECIPIENT';
D_ini DATE;
D_fine DATE;
dataFinale DATE;

CURSOR record_sla
   IS
 SELECT  rich_out.ID_RICHIESTA            AS idRichiesta
       ,rich_rec.CODICE_OPERATORE_DON_EFF AS donorEffettivo
       ,rich_rec.CODICE_OPERATORE_REC_EFF AS recipientEffettivo
       ,rich_rec.CODICE_OPERATORE_DONATING AS donorRete
       ,rich_rec.CODICE_OPERATORE_RECIPIENT AS recipientRete
       ,rich_rec.MSISDN                   AS msIsdn
       ,ack_in.NOME_FILE                  AS ackIniziale
       ,ack_out.NOME_FILE                 AS ackFinale
       ,TO_CHAR ( TO_DATE( SUBSTR( ack_out.NOME_FILE, 5 , 14) ,'YYYYMMDDHH24MISS' ), 'MM/YYYY')
                                          AS meseCompFinale
       ,xml_out.NOME_FILE                 AS nomeFileIniziale
       ,xml_in.NOME_FILE                  AS nomeFileFinale
FROM   mnp.MNP_XML_RICHIESTA_OUT rich_out
      ,mnp.MNP_XML_ACK_IN ack_in
      ,mnp.MNP_XML_OUT xml_out
      ,mnp.MNP_XML_ACK_OUT ack_out
      ,mnp.MNP_XML_IN xml_in
      ,mnp.MNP_XML_RICHIESTA_IN RICH_in
      ,mnp.MNP_GESTIONE_RICHIESTA_REC RICH_rec
WHERE rich_out.NOME_FILE = xml_out.NOME_FILE
AND   xml_in.NOME_FILE   = rich_in.NOME_FILE     ------calcolo pic
AND   xml_in.TIPO_FILE   = 5
AND   ack_out.NOME_FILE_RIFERITO = rich_in.NOME_FILE
AND   ack_in.NOME_FILE_RIFERITO  = rich_out.NOME_FILE
AND   xml_out.TIPO_FILE  IN( 1, 9 )                  ----ATTIVAZIONE progetti STD e HOC
AND   rich_rec.ID_RICHIESTA = rich_in.ID_RICHIESTA
AND   rich_out.ID_RICHIESTA = rich_in.ID_RICHIESTA
AND   rich_rec.CODICE_OPERATORE_REC_EFF <> 'TIMG'
AND   to_date( SUBSTR( ack_out.NOME_FILE, 5 , 8) ,'YYYYMMDDHH24MISS' )
      BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1)) ;

BEGIN
 D_ini:=sysdate;
 DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));


cod_errore := 0;
FOR rec IN record_sla LOOP
   n_rec := n_rec +1;
  BEGIN 
   -- ATTIVAZIONE 
   INSERT INTO MNP_DW_SLA_MVNO_OUT (
   UNIQUE_ID, MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
    FILE_XML, FILE_ACK, DATA_AGG)
    VALUES (
         seq_DW_SLA_MVNO_OUT.nextval
        ,rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'ATTIVAZ'
        ,rec.nomeFileIniziale
        ,rec.ackIniziale
        ,sysdate
  );
  

-- PRESA IN CARICO 
   INSERT INTO MNP_DW_SLA_MVNO_OUT (
     UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
    FILE_XML, FILE_ACK, DATA_AGG)
    VALUES (
          seq_DW_SLA_MVNO_OUT.nextval
        ,rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'PRESAIN'
        ,rec.nomeFileFinale
        ,rec.ackFinale
        ,sysdate
  );
EXCEPTION
      WHEN dup_val_on_index
      THEN BEGIN
           -- lettura dati preesistenti per gestione ack multipli sull'attivazione
           SELECT FILE_ACK
           INTO   ackInizialeLetto
           FROM   MNP_DW_SLA_MVNO_OUT
           WHERE  MESE = rec.meseCompFinale
           AND    ID_RICHIESTA   = rec.idRichiesta
           AND    TIPO_FILE = 'ATTIVAZ'
           AND    DON_OSPITATO = rec.donorEffettivo
           AND    REC_OSPITATO   = rec.recipientEffettivo 
           AND    DON_RETE = rec.donorRete;

           -- se data dell'ack della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
           IF to_date( SUBSTR( rec.ackIniziale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackInizialeLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
           THEN
               UPDATE MNP_DW_SLA_MVNO_OUT
               SET 
                   FILE_ACK = rec.ackIniziale
              WHERE  ID_RICHIESTA   = rec.idRichiesta
              AND    MESE = rec.meseCompFinale
              AND    DON_OSPITATO = rec.donorEffettivo
              AND    REC_OSPITATO   = rec.recipientEffettivo
              AND    DON_RETE=rec.donorRete
              AND    TIPO_FILE = 'ATTIVAZ';
           END IF;
      END;
END;
END LOOP;

COMMIT;

D_finE:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);

EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
      end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLA0_RECIPIENT ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLA0_RECIPIENT;


procedure CARICAMENTO_SLA1_RECIPIENT(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
ackFinaleLetto  VARCHAR2(27);
fileFinaleLetto  VARCHAR2(27);
n_rec integer := 0;
flagStop integer :=0;
num_validazioni NUMBER(1):=0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLA1_RECIPIENT';
D_ini DATE;
D_fine DATE;
dataFinale DATE;

CURSOR record_sla is
 SELECT  rich_in.ID_RICHIESTA               AS idRichiesta
       ,rich_rec.CODICE_OPERATORE_DON_EFF   AS donorEffettivo
       ,rich_rec.CODICE_OPERATORE_REC_EFF   AS recipientEffettivo
       ,rich_rec.CODICE_OPERATORE_DONATING  AS donorRete
       ,rich_rec.CODICE_OPERATORE_RECIPIENT AS recipientRete
       ,rich_rec.MSISDN                     AS msIsdn
       ,ack_out.NOME_FILE                   AS ackFinale
       ,TO_CHAR ( TO_DATE( SUBSTR( ack_out.NOME_FILE, 5 , 14) ,'YYYYMMDDHH24MISS' ), 'MM/YYYY')
                                            AS meseCompFinale
       ,xml_in.NOME_FILE                    AS nomeFileFinale
       ,rich_rec.RICHIESTAADHOCAOM           AS richiestaAdHocAom
      ,rich_rec.RICHIESTAADHOC              AS richiestaAdHoc
FROM 
       mnp.MNP_XML_ACK_OUT ack_out       ,
       mnp.MNP_XML_RICHIESTA_IN rich_in  ,
       mnp.MNP_XML_IN xml_in             ,
       mnp.MNP_GESTIONE_RICHIESTA_REC rich_rec
WHERE     xml_in.NOME_FILE                                                =RICH_in.NOME_FILE
AND    ack_out.NOME_FILE_RIFERITO                                      = rich_in.NOME_FILE
AND    xml_in.TIPO_FILE                                                =2 ----validazione
AND    rich_rec.ID_RICHIESTA                                           = rich_in.ID_RICHIESTA
AND    rich_rec.CODICE_OPERATORE_REC_EFF                              <> 'TIMG' 
AND    to_date( SUBSTR( ack_out.NOME_FILE, 5 , 8) ,'YYYYMMDDHH24MISS' )
BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS(dataRif,-1));

BEGIN
   cod_errore := 0;
  D_ini:=sysdate;
  DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));



  FOR rec IN record_sla LOOP
  flagStop:=0;
  n_rec := n_rec +1;
    
--verifico se esiste una validazione antecedente. In caso affermativo neanche inserisco.
 IF (rec.richiestaadhocaom > 0 OR rec.richiestaadhoc > 0)
    THEN
        BEGIN
           SELECT COUNT (*)
             INTO num_validazioni
             FROM mnp.mnp_xml_in xml,
                  mnp.mnp_xml_richiesta_in richin
            WHERE richin.id_richiesta = rec.idrichiesta
              AND xml.tipo_file = 2
              AND xml.nome_file = richin.nome_file
              AND xml.nome_file < rec.nomefilefinale;

           IF num_validazioni > 0
           THEN
              BEGIN
                 flagstop := 1;
              END;
           END IF;
        END;
  END IF;


IF FLAgstop = 0 then
  BEGIN --iniZXIA QUI
-- VALIDAZIONE 
   INSERT INTO MNP_DW_SLA_MVNO_OUT (
    UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
    FILE_XML, FILE_ACK, DATA_AGG)
    VALUES (
          seq_DW_SLA_MVNO_OUT.nextval
        , rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'VALIDAZ'
        ,rec.nomeFileFinale
        ,rec.ackFinale
        ,sysdate
  );
  EXCEPTION
      WHEN dup_val_on_index
      THEN BEGIN
           -- lettura dati preesistenti
           SELECT FILE_ACK,FILE_XML
           INTO   ackFinaleLetto, fileFinaleLetto
           FROM   MNP_DW_SLA_MVNO_OUT
           WHERE  ID_RICHIESTA   = rec.idRichiesta
           AND    TIPO_FILE = 'VALIDAZ'
           AND    FLAG_VALIDAZIONE = '1'
           AND    DON_OSPITATO = rec.donorEffettivo
           AND    REC_OSPITATO   = rec.recipientEffettivo
           AND    DON_RETE=rec.donorRete;

                -- gestisco la data di prima validazione
                 IF (to_date( SUBSTR( rec.nomeFileFinale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(fileFinaleLetto, 5 , 14) ,'YYYYMMDDHH24MISS' ))
                      OR
                      (to_date( SUBSTR( rec.nomeFileFinale, 5 , 14) ,'YYYYMMDDHH24MISS' ) = to_date( SUBSTR(fileFinaleLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
                       AND to_date( SUBSTR( rec.ackFinale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackFinaleLetto, 5 , 14) ,'YYYYMMDDHH24MISS' ))

                  THEN
                      UPDATE MNP_DW_SLA_MVNO_OUT
                      SET 
                           FILE_ACK = rec.ackFinale,
                           FILE_XML = rec.nomeFileFinale
                      WHERE  ID_RICHIESTA   = rec.idRichiesta
                      AND    MESE = rec.meseCompFinale
                      AND    DON_OSPITATO = rec.donorEffettivo
                      AND    REC_OSPITATO   = rec.recipientEffettivo
                      AND    DON_RETE=rec.donorRete
                      AND    TIPO_FILE = 'VALIDAZ'
                      AND    FLAG_VALIDAZIONE = '1';
                  END IF;
      END;
 END; --FINISCE QUI
 END IF;

END LOOP;

  COMMIT;
    D_finE:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);
EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
    end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLA1_RECIPIENT ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLA1_RECIPIENT;



procedure CARICAMENTO_SLA2_RECIPIENT(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
ackInizialeLetto VARCHAR2(27);
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLA2_RECIPIENT';
D_ini DATE;
D_fine DATE;

-- @FATTO deve fare la max sul nome del file di xml_in (QUINDI LA MAX SU RICH_IN NOME FILE)
CURSOR record_sla is
SELECT 
        rich_in.ID_RICHIESTA                AS idRichiesta
       ,rich_rec.CODICE_OPERATORE_DON_EFF   AS donorEffettivo
       ,rich_rec.CODICE_OPERATORE_REC_EFF   AS recipientEffettivo
       ,rich_rec.CODICE_OPERATORE_DONATING  AS donorRete
       ,rich_rec.CODICE_OPERATORE_RECIPIENT AS recipientRete
       ,rich_rec.MSISDN                     AS msIsdn
       ,ack_out.NOME_FILE                   AS ackIniziale
       ,ack_out_fin.NOME_FILE               AS ackFinale
       ,TO_CHAR ( TO_DATE( SUBSTR( ack_out_fin.NOME_FILE, 5 , 14) ,'YYYYMMDDHH24MISS' ), 'MM/YYYY')
                                            AS meseCompFinale
       ,xml_in.NOME_FILE                    AS nomeFileIniziale
       ,xml_in_fin.NOME_FILE                AS nomeFileFinale
       ,rich_rec.RICHIESTAADHOCAOM           AS richiestaAdHocAom
       ,rich_rec.RICHIESTAADHOC              AS richiestaAdHoc
FROM   mnp.MNP_XML_ACK_OUT ack_out            ,
       mnp.MNP_XML_IN xml_in                  ,
       mnp.MNP_XML_RICHIESTA_IN RICH_in       ,
       mnp.MNP_GESTIONE_RICHIESTA_REC RICH_rec,
       mnp.MNP_XML_ACK_OUT ack_out_fin        ,
       mnp.MNP_XML_IN xml_in_fin              ,
       mnp.MNP_XML_RICHIESTA_IN rich_in_fin   ,
       mnp.MNP_XML_OUT xml_out
WHERE  xml_in.NOME_FILE                   = rich_in.NOME_FILE
AND    xml_in.TIPO_FILE                   =2----VALIDAZIONE
AND    ack_out.NOME_FILE_RIFERITO         = rich_in.NOME_FILE
AND    ack_out.NOME_FILE                  = xml_out.nome_file
AND    rich_rec.ID_RICHIESTA              = rich_in.ID_RICHIESTA
AND    xml_in_fin.NOME_FILE               = rich_in_fin.NOME_FILE
AND    ack_out_fin.NOME_FILE_RIFERITO     = rich_in_fin.NOME_FILE
AND    xml_in_fin.TIPO_FILE               =6----espletamento
AND    rich_rec.CODICE_OPERATORE_DONATING = xml_in_fin.MITTENTE
AND    rich_rec.ID_RICHIESTA              = rich_in_fin.ID_RICHIESTA
AND    rich_rec.CODICE_OPERATORE_REC_EFF <> 'TIMG'
AND    to_date( SUBSTR( ack_out_fin.NOME_FILE, 5 , 8) ,'YYYYMMDDHH24MISS' ) BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1))
and    xml_in.NOME_FILE = (select MAX(X.NOME_FILE)
                           FROM mnp.MNP_XML_IN x,  mnp.MNP_XML_RICHIESTA_IN y
                           WHERE y.ID_RICHIESTA= rich_in.ID_RICHIESTA
                           AND   x.TIPO_FILE=2 --validazione (per selezionare la seconda)
                           AND   y.NOME_FILE = x.NOME_FILE
                          );
BEGIN
   cod_errore := 0;
D_ini:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_ini,'YYYY-MM-DD HH24:MI:SS'));


   FOR rec IN record_sla LOOP
    n_rec := n_rec +1;
BEGIN

-- ESPLETAMENTO
   INSERT INTO MNP_DW_SLA_MVNO_OUT (
    UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
    FILE_XML, FILE_ACK, DATA_AGG)
    VALUES (
         seq_DW_SLA_MVNO_OUT.nextval
        , rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'ESPLETA'
        ,rec.nomeFileFinale
        ,rec.ackFinale
        ,sysdate
  );
  
--VALIDAZIONE ( deve essere gestita solo la seconda validazione per i phoc))
 IF (rec.richiestaadhocaom > 0 OR rec.richiestaadhoc > 0)
    THEN
       INSERT INTO MNP_DW_SLA_MVNO_OUT (
          UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,FLAG_VALIDAZIONE,
          FILE_XML, FILE_ACK, DATA_AGG)
          VALUES (
               seq_DW_SLA_MVNO_OUT.nextval
              ,rec.meseCompFinale
              ,rec.donorEffettivo
              ,rec.recipientEffettivo
              ,rec.donorRete
              ,rec.recipientRete
              ,rec.msIsdn
              ,rec.idRichiesta
              ,'VALIDAZ'
              ,'2'
              ,rec.nomeFileIniziale
              ,rec.ackIniziale
              ,sysdate
        );
 END IF;
-- deve gestire la chiave duplicata ed aggiornare quando la data dell'ack_in minore della data dell'ack_in letto (primo ack della seconda validazione)
    EXCEPTION WHEN dup_val_on_index THEN
            begin
             IF (rec.richiestaadhocaom > 0 OR rec.richiestaadhoc > 0)
              THEN
              BEGIN-- lettura dati preesistenti
                 SELECT FILE_ACK
                 INTO   ackInizialeLetto
                 FROM   MNP_DW_SLA_MVNO_OUT
                 WHERE  ID_RICHIESTA   = rec.idRichiesta
                 AND    TIPO_FILE='VALIDAZ'
                 AND    FLAG_VALIDAZIONE = '2'
                 AND    DON_OSPITATO = rec.donorEffettivo
                 AND    REC_OSPITATO   = rec.recipientEffettivo AND DON_RETE=rec.donorRete;
            -- se data dell'ack della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
                 IF to_date( SUBSTR( rec.ackIniziale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackInizialeLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
                    THEN
                      UPDATE MNP_DW_SLA_MVNO_OUT
                     SET 
                         FILE_ACK = rec.ackIniziale
                    WHERE  ID_RICHIESTA   = rec.idRichiesta
                    AND    MESE = rec.meseCompFinale
                    AND    DON_OSPITATO = rec.donorEffettivo
                    AND    REC_OSPITATO   = rec.recipientEffettivo
                    AND    DON_RETE=rec.donorRete
                    AND    TIPO_FILE = 'VALIDAZ'
                    AND    FLAG_VALIDAZIONE='2';
                 END IF;
               END;
             END IF; 
            END;

END;
  END LOOP;

  COMMIT;
    D_fine:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_fine,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||n_rec);
EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
    end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLA2_RECIPIENT ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;

END CARICAMENTO_SLA2_RECIPIENT;


-- v. 2.0 | 2. separate UPSERT for PORTING and ESPLETA
-- v. 2.0 | 3. read oldest only into ackInizialeLetto
procedure CARICAMENTO_SLA3_RECIPIENT(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
ackInizialeLetto VARCHAR2(27);
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLA3_RECIPIENT';
D_ini DATE;
D_fine DATE;


CURSOR record_sla is
SELECT  
        rich_out.ID_RICHIESTA                 AS idRichiesta
       ,rich_rec.CODICE_OPERATORE_DON_EFF     AS donorEffettivo
       ,rich_rec.CODICE_OPERATORE_REC_EFF     AS recipientEffettivo
       ,xml_in.MITTENTE                       AS terzaParte
       ,rich_rec.CODICE_OPERATORE_RECIPIENT   AS recipientRete
       ,rich_rec.MSISDN                       AS msIsdn
       ,ack_in.NOME_FILE                      AS ackIniziale
       ,ack_out.NOME_FILE                     AS ackFinale
       ,TO_CHAR ( TO_DATE( SUBSTR( ack_out.NOME_FILE, 5 , 14) ,'YYYYMMDDHH24MISS' ), 'MM/YYYY')
                                              AS meseCompFinale
       ,xml_out.NOME_FILE                     AS nomeFileIniziale
       ,xml_in.NOME_FILE                      AS nomeFileFinale
FROM   mnp.MNP_XML_ACK_IN ack_in         ,
       mnp.MNP_XML_RICHIESTA_OUT rich_out,
       mnp.MNP_XML_OUT xml_out           ,
       mnp.MNP_XML_ACK_OUT ack_out       ,
       mnp.MNP_XML_RICHIESTA_IN rich_in  ,
       mnp.MNP_XML_IN xml_in             ,
       mnp.MNP_GESTIONE_RICHIESTA_REC rich_rec
WHERE  rich_out.NOME_FILE                     = xml_out.NOME_FILE
AND    ack_in.NOME_FILE_RIFERITO              = rich_out.NOME_FILE
AND    xml_out.TIPO_FILE                      =3 ----porting
AND    xml_out.DESTINATARIO                   <> 'NPTS'  -- filtrare espletamento da NPTS
AND    xml_in.NOME_FILE                       = rich_in.NOME_FILE
AND    ack_out.NOME_FILE_RIFERITO             = rich_in.NOME_FILE
AND    RICH_rec.ID_RICHIESTA                  = RICH_in.ID_RICHIESTA
AND    RICH_out.ID_RICHIESTA                  = RICH_in.ID_RICHIESTA
AND    xml_in.TIPO_FILE                       =6
AND    xml_in.MITTENTE                        <>rich_rec.CODICE_OPERATORE_DONATING
and    xml_out.destinatario                   = xml_in.mittente
AND    rich_rec.CODICE_OPERATORE_DON_EFF      <> 'TIMG' 
AND    to_date( SUBSTR( ack_out.NOME_FILE, 5 , 8) ,'YYYYMMDDHH24MISS' ) BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1));

BEGIN
cod_errore := 0;
D_ini:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));


FOR rec IN record_sla LOOP
	n_rec := n_rec +1;
	-- RICHIESTA PORTING TP 
	-- v. 2.0 | 2. separate UPSERT for PORTING and ESPLETA
	BEGIN
	   INSERT INTO MNP_DW_SLA_MVNO_OUT (
	    UNIQUE_ID, MESE, DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
	    FILE_XML, FILE_ACK, DATA_AGG)
	    VALUES (
	         seq_DW_SLA_MVNO_OUT.nextval
	        ,rec.meseCompFinale
	        ,rec.donorEffettivo
	        ,rec.recipientEffettivo
	        ,rec.terzaParte  -- Forzo la terza parte nel Donating di Rete
	        ,rec.recipientRete
	        ,rec.msIsdn
	        ,rec.idRichiesta
	        ,'PORTING'
	        ,rec.nomeFileIniziale
	        ,rec.ackIniziale
	        ,sysdate
		);
	EXCEPTION
		WHEN dup_val_on_index
		THEN BEGIN
			-- lettura dati preesistenti
			-- v. 2.0 | 3. read oldest only into ackInizialeLetto
		   SELECT FILE_ACK
		   INTO   ackInizialeLetto 
		   FROM (
			   SELECT FILE_ACK, DATA_AGG
	           FROM   MNP_DW_SLA_MVNO_OUT
	           WHERE  ID_RICHIESTA    = rec.idRichiesta
	           AND    TIPO_FILE       = 'PORTING'
	           AND    DON_OSPITATO    = rec.donorEffettivo
	           AND    REC_OSPITATO    = rec.recipientEffettivo
	           AND    DON_RETE        = rec.terzaParte
			   ORDER BY DATA_AGG
		   ) WHERE ROWNUM = 1;

           -- se data dell'ack iniziale della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
           IF to_date( SUBSTR( rec.ackIniziale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackInizialeLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
           THEN
               UPDATE MNP_DW_SLA_MVNO_OUT
               SET     FILE_ACK       = rec.ackIniziale
               WHERE   ID_RICHIESTA   = rec.idRichiesta
                AND    MESE           = rec.meseCompFinale
                AND    DON_OSPITATO   = rec.donorEffettivo
                AND    REC_OSPITATO   = rec.recipientEffettivo
                AND    DON_RETE       = rec.terzaParte
                AND    TIPO_FILE      = 'PORTING';
           END IF;
		END;
	END;

	-- ESPLETAMENTO TP 
	-- v. 2.0 | 2. separate UPSERT for PORTING and ESPLETA	
	BEGIN
		INSERT INTO MNP_DW_SLA_MVNO_OUT (
		    UNIQUE_ID,MESE, DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
		    FILE_XML, FILE_ACK, DATA_AGG)
		    VALUES (
		         seq_DW_SLA_MVNO_OUT.nextval
		        ,rec.meseCompFinale
		        ,rec.donorEffettivo
		        ,rec.recipientEffettivo
		        ,rec.terzaParte
		        ,rec.recipientRete
		        ,rec.msIsdn
		        ,rec.idRichiesta
		        ,'ESPLETA'
		        ,rec.nomeFileFinale
		        ,rec.ackFinale
		        ,sysdate
		 );
	EXCEPTION
		WHEN dup_val_on_index
		THEN BEGIN
			-- lettura dati preesistenti
			-- v. 2.0 | 3. read oldest only into ackInizialeLetto
		   SELECT FILE_ACK
		   INTO   ackInizialeLetto 
		   FROM (
			   SELECT FILE_ACK, DATA_AGG
			   FROM   MNP_DW_SLA_MVNO_OUT
			   WHERE  ID_RICHIESTA    = rec.idRichiesta
			   AND    TIPO_FILE       = 'ESPLETA'
			   AND    DON_OSPITATO    = rec.donorEffettivo
			   AND    REC_OSPITATO    = rec.recipientEffettivo
			   AND    DON_RETE        = rec.terzaParte
			   ORDER BY DATA_AGG
		   ) WHERE ROWNUM = 1;

           -- se data dell'ack iniziale della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
           IF to_date( SUBSTR( rec.ackIniziale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackInizialeLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
           THEN
               UPDATE MNP_DW_SLA_MVNO_OUT
               SET      FILE_ACK      = rec.ackIniziale
               WHERE   ID_RICHIESTA   = rec.idRichiesta
                AND    MESE           = rec.meseCompFinale
                AND    DON_OSPITATO   = rec.donorEffettivo
                AND    REC_OSPITATO   = rec.recipientEffettivo
                AND    DON_RETE       = rec.terzaParte
                AND    TIPO_FILE      = 'ESPLETA';
           END IF;
		END;
	END;

END LOOP;

  COMMIT;
   D_fine:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);
EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
      end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLA3_RECIPIENT ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;

END CARICAMENTO_SLA3_RECIPIENT;




procedure CARICAMENTO_SLA1_REC_VIRT(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLA1_REC_VIRT';
D_ini DATE;
D_fine DATE;

CURSOR record_sla is
 SELECT 
        rich_rec_virt.ID_RICHIESTA  AS idRichiesta
       ,rich_rec_virt.CODICE_OPERATORE_DONATING as donorEffettivo
       ,rich_rec_virt.CODICE_OPERATORE_RECIPIENT as recipientEffettivo
       ,'TIMG' AS donorRete
       ,'TIMG' AS recipientRete
       ,rich_rec_virt.MSISDN                       AS msIsdn
       ,stor_rec_virt_ini.DATA_I_O as ackIniziale
       ,stor_rec_virt_fin.DATA_I_O as ackFinale
       ,stor_rec_virt_ini.DATA_I_O as nomeFileIniziale
       ,stor_rec_virt_fin.DATA_I_O as nomeFileFinale
       ,TO_CHAR( stor_rec_virt_fin.DATA_I_O ,'MM/YYYY' ) as meseCompFinale
FROM   mnp.MNP_GEST_RICH_REC_VIRT rich_rec_virt,
       mnp.MNP_STORICO_RICH_REC_VIRT stor_rec_virt_ini,
       mnp.MNP_STORICO_RICH_REC_VIRT stor_rec_virt_fin
WHERE  rich_rec_virt.ID_RICHIESTA           = stor_rec_virt_ini.ID_RICHIESTA
AND    rich_rec_virt.ID_RICHIESTA           = stor_rec_virt_fin.ID_RICHIESTA
AND    stor_rec_virt_ini.STATO_A            = 2     ----LAVORABILE
AND    stor_rec_virt_fin.STATO_A            IN (6,7) ----VALIDAZIONE OK/KO
AND    stor_rec_virt_fin.DATA_I_O ---PRENDO TUTTE LE TRANSIZIONI DEL 1-30 DEL MESE PRECEDENTE
       BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1));

BEGIN
cod_errore := 0;
D_ini:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));

-- RICAVA FINESTRE TEMPORALI PER TIPO FILE ?
  FOR rec IN record_sla LOOP
    n_rec := n_rec +1;

--ATTIVAZIONE
     INSERT INTO MNP_DW_SLA_MVNO_OUT (
   UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
    FILE_XML, FILE_ACK, DATA_AGG)
    VALUES (
         seq_DW_SLA_MVNO_OUT.nextval
        ,rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'ATTIVAZ'
        ,TO_CHAR(rec.nomeFileIniziale, 'dd/mm/yyyy') -- valorizzo con la data di transizione di stato
        ,TO_CHAR(rec.ackIniziale, 'dd/mm/yyyy') -- valorizzo con la data di transizione di stato
        ,sysdate
  );

--validazione
     INSERT INTO MNP_DW_SLA_MVNO_OUT (
    UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
    FILE_XML, FILE_ACK, DATA_AGG)
    VALUES (
         seq_DW_SLA_MVNO_OUT.nextval
        ,rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'VALIDAZ'
        ,TO_CHAR(rec.nomeFileFinale, 'dd/mm/yyyy') -- valorizzo con la data di transizione di stato
        ,TO_CHAR(rec.ackFinale, 'dd/mm/yyyy') -- valorizzo con la data di transizione di stato
        ,sysdate
  );


   END LOOP;

  COMMIT;
   D_fine:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);
EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
    end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLA1_REC_VIRT ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLA1_REC_VIRT;


procedure CARICAMENTO_SLA2_REC_VIRT(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLA2_REC_VIRT';
D_ini DATE;
D_fine DATE;

CURSOR record_sla is
SELECT   
        rich_rec_virt.ID_RICHIESTA  AS idRichiesta
       ,rich_rec_virt.CODICE_OPERATORE_DONATING as donorEffettivo
       ,rich_rec_virt.CODICE_OPERATORE_RECIPIENT as recipientEffettivo
       ,'TIMG' AS donorRete
       ,'TIMG' AS recipientRete
       ,rich_rec_virt.MSISDN                       AS msIsdn
       ,stor_rec_virt_ini.DATA_I_O as ackIniziale
       ,stor_rec_virt_fin.DATA_I_O as ackFinale
       ,stor_rec_virt_ini.DATA_I_O as nomeFileIniziale
       ,stor_rec_virt_fin.DATA_I_O as nomeFileFinale
       ,TO_CHAR( stor_rec_virt_fin.DATA_I_O ,'MM/YYYY' ) as meseCompFinale
  FROM   mnp.MNP_GEST_RICH_REC_VIRT rich_rec_virt       ,
         mnp.MNP_STORICO_RICH_REC_VIRT stor_rec_virt_ini,
         mnp.MNP_STORICO_RICH_REC_VIRT stor_rec_virt_fin
  WHERE  rich_rec_virt.ID_RICHIESTA              = stor_rec_virt_ini.ID_RICHIESTA
  AND    rich_rec_virt.ID_RICHIESTA              = stor_rec_virt_fin.ID_RICHIESTA
  AND    stor_rec_virt_ini.STATO_A               = 6 ----VALIDAZIONE OK
  AND    stor_rec_virt_fin.STATO_A               =10 ----CESSATA
  AND    stor_rec_virt_fin.DATA_I_O ---PRENDO TUTTE LE TRANSIZIONI DEL 1-30 DEL MESE PRECEDENTE
         BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1));
BEGIN
cod_errore := 0;
D_ini:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));

  FOR rec IN record_sla LOOP
    n_rec := n_rec +1;

--ESPLETAMENTO
     INSERT INTO MNP_DW_SLA_MVNO_OUT (
    UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
    FILE_XML, FILE_ACK, DATA_AGG)
    VALUES (
         seq_DW_SLA_MVNO_OUT.nextval
        , rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'ESPLETA'
        ,TO_CHAR(rec.nomeFileFinale, 'dd/mm/yyyy') -- valorizzo con la data di transizione di stato
        ,TO_CHAR(rec.ackFinale, 'dd/mm/yyyy') -- valorizzo con la data di transizione di stato
        ,sysdate
  );
  
   END LOOP;

  COMMIT;
   D_fine:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);
EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
    end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLA2_RECIPIENT_VIRT ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLA2_REC_VIRT;


procedure CARICAMENTO_SLA3_REC_VIRT(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLA3_REC_VIRT';
ackInizialeLetto VARCHAR2(27);
ackFinaleLetto VARCHAR2(27);
D_ini DATE;
D_fine DATE;

CURSOR record_sla is

SELECT 
        rich_rec_virt.ID_RICHIESTA  AS idRichiesta
       ,rich_rec_virt.CODICE_OPERATORE_DONATING as donorEffettivo
       ,rich_rec_virt.CODICE_OPERATORE_RECIPIENT as recipientEffettivo
       ,xml_in.MITTENTE AS terzaParte
       ,'TIMG' AS recipientRete
       ,rich_rec_virt.MSISDN                       AS msIsdn
       ,ack_in.NOME_FILE as ackIniziale
       ,ack_out.nome_file as ackFinale
       ,TO_CHAR( to_date( SUBSTR( ack_out.NOME_FILE, 5 , 14) ,'YYYYMMDDHH24MISS' ) ,'MM/YYYY' ) AS meseCompFinale
       ,xml_out.NOME_FILE  AS nomeFileIniziale
       ,xml_in.NOME_FILE AS nomeFileFinale
FROM     mnp.MNP_GEST_RICH_REC_VIRT rich_rec_virt   ,
         mnp.MNP_XML_ACK_OUT ack_out                ,
         mnp.MNP_XML_IN xml_in                      ,
         mnp.MNP_XML_RICHIESTA_IN rich_in,
		 mnp.MNP_XML_ACK_IN ack_in         ,
         mnp.MNP_XML_RICHIESTA_OUT rich_out,
         mnp.MNP_XML_OUT xml_out
  WHERE  rich_out.id_richiesta = rich_in.id_richiesta
  AND    ack_in.nome_file_riferito=rich_out.nome_file
  and    rich_out.nome_file = xml_out.nome_file
  and    xml_out.tipo_file = 3 --porting
  and    xml_out.destinatario <> 'NPTS'
  and    xml_out.destinatario = xml_in.mittente
  AND    xml_in.TIPO_FILE                        = 6    -- ESPLETAMENTO
  AND    ack_out.NOME_FILE_RIFERITO              = rich_in.NOME_FILE
  AND    xml_in.NOME_FILE                        = rich_in.NOME_FILE
  AND    rich_in.ID_RICHIESTA                    = rich_rec_virt.ID_RICHIESTA
  AND    to_date( SUBSTR( ack_out.NOME_FILE, 5 , 8) ,'YYYYMMDDHH24MISS' ) BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1));
BEGIN

  cod_errore := 0;
  D_ini:=sysdate;
  DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));

  FOR rec IN record_sla LOOP
    n_rec := n_rec +1;

    BEGIN
      -- RICHIESTA PORTING TP
      INSERT INTO MNP_DW_SLA_MVNO_OUT (
      UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
      FILE_XML, FILE_ACK, DATA_AGG)
      VALUES (
           seq_DW_SLA_MVNO_OUT.nextval
          ,rec.meseCompFinale
          ,rec.donorEffettivo
          ,rec.recipientEffettivo
          ,rec.terzaParte  -- Forzo la terza parte nel Donating di Rete
          ,rec.recipientRete
          ,rec.msIsdn
          ,rec.idRichiesta
          ,'PORTING'
          ,rec.nomeFileIniziale
          ,rec.ackIniziale
          ,sysdate
      );
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
      BEGIN
        -- lettura dati preesistenti per gestione ack multipli sull'attivazione
        SELECT FILE_ACK
        INTO   ackInizialeLetto
        FROM   MNP_DW_SLA_MVNO_OUT
        WHERE  MESE = rec.meseCompFinale
          AND    ID_RICHIESTA   = rec.idRichiesta
          AND    TIPO_FILE = 'PORTING'
          AND    DON_OSPITATO = rec.donorEffettivo
          AND    REC_OSPITATO   = rec.recipientEffettivo 
          AND    DON_RETE = rec.terzaParte;

        -- se data dell'ack della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
        IF to_date( SUBSTR( rec.ackIniziale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackInizialeLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
        THEN
          UPDATE MNP_DW_SLA_MVNO_OUT
          SET 
             FILE_ACK = rec.ackIniziale
          WHERE  ID_RICHIESTA   = rec.idRichiesta
            AND    MESE = rec.meseCompFinale
            AND    DON_OSPITATO = rec.donorEffettivo
            AND    REC_OSPITATO   = rec.recipientEffettivo
            AND    DON_RETE=rec.terzaParte
            AND    TIPO_FILE = 'PORTING';
        END IF;
      END;
    END;
      
    BEGIN
      -- ESPLETAMENTO TP
      INSERT INTO MNP_DW_SLA_MVNO_OUT (
      UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
      FILE_XML, FILE_ACK, DATA_AGG)
      VALUES (
           seq_DW_SLA_MVNO_OUT.nextval
          ,rec.meseCompFinale
          ,rec.donorEffettivo
          ,rec.recipientEffettivo
          ,rec.terzaParte -- Forzo la terza parte nel Donating di Rete
          ,rec.recipientRete
          ,rec.msIsdn
          ,rec.idRichiesta
          ,'ESPLETA'
          ,rec.nomeFileFinale
          ,rec.ackFinale
          ,sysdate
      );
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
      BEGIN
        -- lettura dati preesistenti per gestione ack multipli sull'attivazione
        SELECT FILE_ACK
        INTO   ackFinaleLetto
        FROM   MNP_DW_SLA_MVNO_OUT
        WHERE  MESE = rec.meseCompFinale
          AND  ID_RICHIESTA   = rec.idRichiesta
          AND  TIPO_FILE = 'ESPLETA'
          AND  DON_OSPITATO = rec.donorEffettivo
          AND  REC_OSPITATO   = rec.recipientEffettivo 
          AND  DON_RETE = rec.terzaParte;

        -- se data dell'ack della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
        IF to_date( SUBSTR( rec.ackFinale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackFinaleLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
        THEN
          UPDATE MNP_DW_SLA_MVNO_OUT
          SET 
             FILE_ACK = rec.ackFinale
          WHERE  ID_RICHIESTA   = rec.idRichiesta
            AND  MESE = rec.meseCompFinale
            AND  DON_OSPITATO = rec.donorEffettivo
            AND  REC_OSPITATO   = rec.recipientEffettivo
            AND  DON_RETE=rec.terzaParte
            AND  TIPO_FILE = 'ESPLETA';
        END IF;
      END;
    END;
  END LOOP;

  COMMIT;
  D_fine:=sysdate;
  DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);
EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
    end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLA3_RECIPIENT_VIRT ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLA3_REC_VIRT;


-- 3.0 | 4. Improve CARICAMENTO_SLAX_RECIPIENT
-- prevent ACCESS FULL TABLE MNP.MNP_XML_ACK_OUT 
-- causing [ORA-01555: snapshot too old: rollback segment too small]
-- add function-based (trunc 'MM') index on MNP.MNP_XML_ACK_OUT.data_inserimento 
procedure CARICAMENTO_SLAX_RECIPIENT(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
-- Caricamento SLA Trasferimento Credito RECIPIENT
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLAX_RECIPIENT';
ackFinaleLetto VARCHAR2(27);
D_ini DATE;
D_fine DATE;
dataFinale DATE;

CURSOR record_sla is
SELECT UNIQUE
        gr.ID_RICHIESTA  AS idRichiesta
       ,gr.CODICE_OPERATORE_DON_EFF as donorEffettivo
       ,gr.CODICE_OPERATORE_REC_EFF as recipientEffettivo
       ,gr.CODICE_OPERATORE_DONATING AS donorRete
       ,gr.CODICE_OPERATORE_RECIPIENT AS recipientRete
       ,gr.MSISDN                       AS msIsdn
       ,MIN(espAckOut.NOME_FILE) as ackIniziale
       ,MIN(trasAckOut.NOME_FILE) as ackFinale
       ,TO_CHAR ( TO_DATE( SUBSTR( MIN(trasAckOut.NOME_FILE), 5 , 14) ,'YYYYMMDDHH24MISS' ), 'MM/YYYY') AS meseCompFinale
       ,MIN(espXml.NOME_FILE)  AS nomeFileIniziale
       ,MIN(trasXml.NOME_FILE) AS nomeFileFinale
FROM     mnp.mnp_xml_ack_out@MNP trasAckOut
        , mnp.mnp_xml_ack_out@MNP espAckOut
        , mnp.mnp_xml_in@MNP trasXml
        , mnp.mnp_xml_in@MNP espXml
        , mnp.mnp_xml_richiesta_in@MNP rTrasIn
        , mnp.mnp_xml_richiesta_in@MNP rEspIn
        , mnp.mnp_gestione_richiesta_rec@MNP gr
       WHERE trasAckOut.risultato = 'OK'
         AND espXml.MITTENTE =  gr.codice_operatore_donating
         AND trasAckOut.nome_file_riferito = trasXml.nome_file
         AND trasXml.nome_file = rTrasIn.nome_file
         AND rTrasin.id_richiesta = gr.id_richiesta
         AND trasXml.tipo_file = 10
         AND espAckOut.nome_file_riferito = espXml.nome_file
         AND espXml.nome_file =rEspIn.nome_file
         AND rEspIn.id_richiesta = gr.id_richiesta
         AND espXml.tipo_file = 6
		-- 3.0 | 4. Improve CARICAMENTO_SLAX_RECIPIENT
		-- add function-based (trunc 'MM') index on MNP.MNP_XML_ACK_OUT.data_inserimento 
         AND TRUNC(trasAckOut.data_inserimento, 'MM') = TRUNC(ADD_MONTHS( dataRif, -1 ), 'MM')
         --AND trasAckOut.data_inserimento BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1))
         GROUP BY gr.id_richiesta
            , gr.codice_operatore_donating
            , gr.codice_operatore_recipient
            , gr.codice_operatore_don_eff
            , gr.codice_operatore_rec_eff
            , gr.msisdn;

BEGIN
 D_ini:=sysdate;
 DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));


  cod_errore := 0;
  FOR rec IN record_sla LOOP
    n_rec := n_rec +1;
    BEGIN
      -- TRASFERIMENTO CREDITO 
      INSERT INTO MNP_DW_SLA_MVNO_OUT (
        UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
        FILE_XML, FILE_ACK, DATA_AGG)
      VALUES (
        seq_DW_SLA_MVNO_OUT.nextval
        ,rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'TRASFER'
        ,rec.nomeFileFinale
        ,rec.ackFinale
        ,sysdate
      );
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
      BEGIN
        -- lettura dati preesistenti per gestione ack multipli sull'attivazione
        SELECT FILE_ACK
        INTO   ackFinaleLetto
        FROM   MNP_DW_SLA_MVNO_OUT
        WHERE  MESE = rec.meseCompFinale
          AND  ID_RICHIESTA   = rec.idRichiesta
          AND  TIPO_FILE = 'TRASFER'
          AND  DON_OSPITATO = rec.donorEffettivo
          AND  REC_OSPITATO   = rec.recipientEffettivo 
          AND  DON_RETE = rec.donorRete;

        -- se data dell'ack della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
        IF to_date( SUBSTR( rec.ackFinale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackFinaleLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
        THEN
          UPDATE MNP_DW_SLA_MVNO_OUT
          SET 
             FILE_ACK = rec.ackFinale
          WHERE  ID_RICHIESTA   = rec.idRichiesta
            AND  MESE = rec.meseCompFinale
            AND  DON_OSPITATO = rec.donorEffettivo
            AND  REC_OSPITATO   = rec.recipientEffettivo
            AND  DON_RETE=rec.donorRete
            AND  TIPO_FILE = 'TRASFER';
        END IF;
      END;
    END;
  END LOOP;

COMMIT;

D_finE:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);

EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
      end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLAX_RECIPIENT ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLAX_RECIPIENT;



-- 3.0 | 5. Improve CARICAMENTO_SLAY_RECIPIENT
-- prevent ACCESS FULL TABLE MNP.MNP_XML_ACK_OUT 
-- causing [ORA-01555: snapshot too old: rollback segment too small]
-- add function-based (trunc 'MM') index on MNP.MNP_XML_ACK_OUT.data_inserimento 
procedure CARICAMENTO_SLAY_RECIPIENT(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
-- Caricamento SLA Sblocco credito RECIPIENT
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLAY_RECIPIENT';
ackFinaleLetto VARCHAR2(27);
D_ini DATE;
D_fine DATE;
dataFinale DATE;

CURSOR record_sla is
SELECT UNIQUE
        gr.ID_RICHIESTA  AS idRichiesta
       ,gr.CODICE_OPERATORE_DON_EFF as donorEffettivo
       ,gr.CODICE_OPERATORE_REC_EFF as recipientEffettivo
       ,gr.CODICE_OPERATORE_DONATING AS donorRete
       ,gr.CODICE_OPERATORE_RECIPIENT AS recipientRete
       ,gr.MSISDN                       AS msIsdn
       ,MIN(trasAckOut.nome_file) as ackIniziale
       ,MIN(sblCrAckOut.nome_file) as ackFinale
       ,TO_CHAR ( TO_DATE( SUBSTR( MIN(sblCrAckOut.NOME_FILE), 5 , 14) ,'YYYYMMDDHH24MISS' ), 'MM/YYYY') AS meseCompFinale
       ,MIN(trasXml.nome_file)  AS nomeFileIniziale
       ,MIN(sblCrXml.nome_file) AS nomeFileFinale
FROM     mnp.mnp_xml_ack_out@MNP trasAckOut
        , mnp.mnp_xml_ack_out@MNP sblCrAckOut
        , mnp.mnp_xml_in@MNP trasXml
        , mnp.mnp_xml_in@MNP sblCrXml
        , mnp.mnp_xml_richiesta_in@MNP rTrasIn
        , mnp.mnp_xml_richiesta_in@MNP rSblCrIn
        , mnp.mnp_gestione_richiesta_rec@MNP gr
       WHERE trasAckOut.risultato = 'OK'
         AND trasAckOut.nome_file_riferito = trasXml.nome_file
         AND trasXml.nome_file = rTrasIn.nome_file
         AND rTrasin.id_richiesta = gr.id_richiesta
         AND trasXml.tipo_file = 10
         AND sblCrAckOut.nome_file_riferito = sblCrXml.nome_file
         AND sblCrXml.nome_file =rSblCrIn.nome_file
         AND rSblCrIn.id_richiesta = gr.id_richiesta
         and sblCrXml.tipo_file = 11
         -- 3.0 | 5. Improve CARICAMENTO_SLAY_RECIPIENT
		-- add function-based (trunc 'MM') index on MNP.MNP_XML_ACK_OUT.data_inserimento 
         AND TRUNC(sblCrAckOut.data_inserimento, 'MM') = TRUNC(ADD_MONTHS( dataRif, -1 ), 'MM')
         --AND sblCrAckOut.data_inserimento BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1))
         GROUP BY gr.id_richiesta
            , gr.codice_operatore_donating
            , gr.codice_operatore_recipient
            , gr.codice_operatore_don_eff
            , GR.CODICE_OPERATORE_REC_EFF
            , gr.msisdn;

BEGIN
  D_ini:=sysdate;
  DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));
  cod_errore := 0;
  
  FOR rec IN record_sla LOOP
    BEGIN
      n_rec := n_rec +1;
     
     -- SBLOCCO CREDITO 
      INSERT INTO MNP_DW_SLA_MVNO_OUT (
        UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
        FILE_XML, FILE_ACK, DATA_AGG)
      VALUES (
        seq_DW_SLA_MVNO_OUT.nextval
        ,rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'SBLOCCC'
        ,rec.nomeFileFinale
        ,rec.ackFinale
        ,sysdate
      );

    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
      BEGIN
        -- lettura dati preesistenti per gestione ack multipli sull'attivazione
        SELECT FILE_ACK
        INTO   ackFinaleLetto
        FROM   MNP_DW_SLA_MVNO_OUT
        WHERE  MESE = rec.meseCompFinale
          AND  ID_RICHIESTA   = rec.idRichiesta
          AND  TIPO_FILE = 'SBLOCCC'
          AND  DON_OSPITATO = rec.donorEffettivo
          AND  REC_OSPITATO   = rec.recipientEffettivo 
          AND  DON_RETE = rec.donorRete;

        -- se data dell'ack della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
        IF to_date( SUBSTR( rec.ackFinale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackFinaleLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
        THEN
          UPDATE MNP_DW_SLA_MVNO_OUT
          SET 
             FILE_ACK = rec.ackFinale
          WHERE  ID_RICHIESTA   = rec.idRichiesta
            AND  MESE = rec.meseCompFinale
            AND  DON_OSPITATO = rec.donorEffettivo
            AND  REC_OSPITATO   = rec.recipientEffettivo
            AND  DON_RETE=rec.donorRete
            AND  TIPO_FILE = 'SBLOCCC';
        END IF;
      END;
    END;
  
  END LOOP;

COMMIT;

D_finE:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);

EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
      end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLAY_RECIPIENT ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLAY_RECIPIENT;

----------------------------------------------------
-- 3.0 | 6. Improve CARICAMENTO_SLAZ_RECIPIENT
-- prevent ACCESS FULL TABLE MNP.MNP_XML_ACK_OUT 
-- causing [ORA-01555: snapshot too old: rollback segment too small]
-- add function-based (trunc 'MM') index on MNP.MNP_XML_ACK_OUT.data_inserimento 
procedure CARICAMENTO_SLAZ_RECIPIENT(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
-- Caricamento SLA Sblocco Importo RECIPIENT
n_rec integer := 0;
ackFinaleLetto VARCHAR2(27);
proc_name constant varchar2(30) := 'CARICAMENTO_SLAZ_RECIPIENT';
D_ini DATE;
D_fine DATE;
dataFinale DATE;

CURSOR record_sla is
SELECT UNIQUE
        gr.ID_RICHIESTA  AS idRichiesta
       ,gr.CODICE_OPERATORE_DON_EFF as donorEffettivo
       ,gr.CODICE_OPERATORE_REC_EFF as recipientEffettivo
       ,gr.CODICE_OPERATORE_DONATING AS donorRete
       ,gr.CODICE_OPERATORE_RECIPIENT AS recipientRete
       ,gr.MSISDN                       AS msIsdn
       ,MIN(trasAckOut.nome_file) as ackIniziale
       ,MIN(sblImAckOut.nome_file) as ackFinale
       ,TO_CHAR ( TO_DATE( SUBSTR( MIN(sblImAckOut.NOME_FILE), 5 , 14) ,'YYYYMMDDHH24MISS' ), 'MM/YYYY') AS meseCompFinale
       ,MIN(trasXml.nome_file)  AS nomeFileIniziale
       ,MIN(sblImXml.nome_file) AS nomeFileFinale
FROM    mnp.mnp_xml_ack_out@MNP trasAckOut
       , mnp.mnp_xml_ack_out@MNP sblImAckOut
       , mnp.mnp_xml_in@MNP trasXml
       , mnp.mnp_xml_in@MNP sblImXml
       , mnp.mnp_xml_richiesta_in@MNP rTrasIn
       , mnp.mnp_xml_richiesta_in@MNP rSblImIn
       , mnp.mnp_gestione_richiesta_rec@MNP gr
WHERE trasAckOut.risultato = 'OK'
      AND trasAckOut.nome_file_riferito = trasXml.nome_file
      AND trasXml.nome_file = rTrasIn.nome_file
      AND rTrasin.id_richiesta = gr.id_richiesta
      AND trasXml.tipo_file = 10
      AND sblImAckOut.nome_file_riferito = sblImXml.nome_file
      AND sblImXml.nome_file =rSblImIn.nome_file
      AND rSblImIn.id_richiesta = gr.id_richiesta
      AND sblImXml.tipo_file = 12
      -- 3.0 | 6. Improve CARICAMENTO_SLAZ_RECIPIENT
	  -- add function-based (trunc 'MM') index on MNP.MNP_XML_ACK_OUT.data_inserimento 
	  AND TRUNC(sblImAckOut.data_inserimento, 'MM') = TRUNC(ADD_MONTHS( dataRif, -1 ), 'MM')
	  --AND sblImAckOut.data_inserimento BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1))
    GROUP BY gr.id_richiesta
       , gr.codice_operatore_donating
       , gr.codice_operatore_recipient
       , gr.codice_operatore_don_eff
       , GR.CODICE_OPERATORE_REC_EFF
       , gr.msisdn;
BEGIN
  D_ini:=sysdate;
  DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));
  cod_errore := 0;
  FOR rec IN record_sla LOOP
    BEGIN
      n_rec := n_rec +1;
     
     -- SBLOCCO IMPORTO 
      INSERT INTO MNP_DW_SLA_MVNO_OUT (
        UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
        FILE_XML, FILE_ACK, DATA_AGG)
      VALUES (
        seq_DW_SLA_MVNO_OUT.nextval
        ,rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'SBLOCCI'
        ,rec.nomeFileFinale
        ,rec.ackFinale
        ,sysdate
        );
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
      BEGIN
        -- lettura dati preesistenti per gestione ack multipli sull'attivazione
        SELECT FILE_ACK
        INTO   ackFinaleLetto
        FROM   MNP_DW_SLA_MVNO_OUT
        WHERE  MESE = rec.meseCompFinale
          AND  ID_RICHIESTA   = rec.idRichiesta
          AND  TIPO_FILE = 'SBLOCCI'
          AND  DON_OSPITATO = rec.donorEffettivo
          AND  REC_OSPITATO   = rec.recipientEffettivo 
          AND  DON_RETE = rec.donorRete;

        -- se data dell'ack della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
        IF to_date( SUBSTR( rec.ackFinale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackFinaleLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
        THEN
          UPDATE MNP_DW_SLA_MVNO_OUT
          SET 
             FILE_ACK = rec.ackFinale
          WHERE  ID_RICHIESTA   = rec.idRichiesta
            AND  MESE = rec.meseCompFinale
            AND  DON_OSPITATO = rec.donorEffettivo
            AND  REC_OSPITATO   = rec.recipientEffettivo
            AND  DON_RETE=rec.donorRete
            AND  TIPO_FILE = 'SBLOCCI';
        END IF;
      END;
    END;
  END LOOP;

COMMIT;

D_finE:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);

EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
      end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLAZ_RECIPIENT ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLAZ_RECIPIENT;



procedure CARICAMENTO_SLAX_REC_VIRT(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
-- Caricamento SLA Trasferimento Credito RECIPIENT VIRTUALE
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLAX_REC_VIRT';
ackFinaleLetto VARCHAR2(27);
D_ini DATE;
D_fine DATE;
dataFinale DATE;

CURSOR record_sla is
SELECT UNIQUE
        gr.ID_RICHIESTA  AS idRichiesta
       ,gr.CODICE_OPERATORE_DONATING as donorEffettivo
       ,gr.CODICE_OPERATORE_RECIPIENT as recipientEffettivo
       ,'TIMG' AS donorRete
       ,'TIMG' AS recipientRete
       ,gr.MSISDN                       AS msIsdn
       ,gr.data_cut_over_eff as ackIniziale
       ,MIN (tcin.data_ricezione) as ackFinale
       ,TO_CHAR(MIN(tcin.data_ricezione),'MM/YYYY') AS meseCompFinale
       ,gr.data_cut_over_eff  AS nomeFileIniziale
       ,MIN (tcin.data_ricezione) AS nomeFileFinale
FROM   mnp.mnp_msp_tc_in@MNP tcin
       , mnp.mnp_gest_rich_rec_virt@MNP gr
  WHERE tcin.id_richiesta_dbc = gr.id_richiesta
         AND SUBSTR(tcin.id_richiesta_dbc,0,2)='RV'
         AND tcin.tipo_evento = '01'
	       --AND gr.flag_esp = 0
         AND tcin.data_ricezione BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1))
       GROUP BY gr.id_richiesta
              ,gr.data_cut_over_eff
	            ,gr.codice_operatore_donating
              ,gr.codice_operatore_recipient
              ,gr.msisdn;

BEGIN
  D_ini:=sysdate;
  DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));

  cod_errore := 0;
  FOR rec IN record_sla LOOP
    BEGIN
      n_rec := n_rec +1;
     
      -- TRASFERIMENTO CREDITO 
      INSERT INTO MNP_DW_SLA_MVNO_OUT (
        UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
        FILE_XML, FILE_ACK, DATA_AGG)
      VALUES (
        seq_DW_SLA_MVNO_OUT.nextval
        ,rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'TRASFER'
        ,TO_CHAR(rec.nomeFileFinale,'dd/mm/yyyy')
        ,TO_CHAR(rec.ackFinale,'dd/mm/yyyy')
        ,sysdate
      );
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
      BEGIN
        -- lettura dati preesistenti per gestione ack multipli sull'attivazione
        SELECT FILE_ACK
        INTO   ackFinaleLetto
        FROM   MNP_DW_SLA_MVNO_OUT
        WHERE  MESE = rec.meseCompFinale
          AND  ID_RICHIESTA   = rec.idRichiesta
          AND  TIPO_FILE = 'TRASFER'
          AND  DON_OSPITATO = rec.donorEffettivo
          AND  REC_OSPITATO   = rec.recipientEffettivo 
          AND  DON_RETE = rec.donorRete;

        -- se data dell'ack della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
        IF to_date( SUBSTR( rec.ackFinale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackFinaleLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
        THEN
          UPDATE MNP_DW_SLA_MVNO_OUT
          SET 
             FILE_ACK = rec.ackFinale
          WHERE  ID_RICHIESTA   = rec.idRichiesta
            AND  MESE = rec.meseCompFinale
            AND  DON_OSPITATO = rec.donorEffettivo
            AND  REC_OSPITATO   = rec.recipientEffettivo
            AND  DON_RETE=rec.donorRete
            AND  TIPO_FILE = 'TRASFER';
        END IF;
      END;
    END;
  END LOOP;

  COMMIT;

  D_finE:=sysdate;
  DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);

EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
      end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLAX_REC_VIRT ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLAX_REC_VIRT;



----------------------------------------------------------------------
procedure CARICAMENTO_SLAZ_REC_VIRT(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
-- Caricamento SLA Sblocco Importo RECIPIENT VIRTUALE
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLAZ_REC_VIRT';
ackFinaleLetto VARCHAR2(27);
D_ini DATE;
D_fine DATE;
dataFinale DATE;

CURSOR record_sla is
SELECT UNIQUE
        gr.ID_RICHIESTA  AS idRichiesta
       ,gr.CODICE_OPERATORE_DONATING as donorEffettivo
       ,gr.CODICE_OPERATORE_RECIPIENT as recipientEffettivo
       ,'TIMG' AS donorRete
       ,'TIMG' AS recipientRete
       ,gr.MSISDN                       AS msIsdn
       ,MIN (tcinNtCr.data_ricezione) as ackIniziale
       ,MIN (tcinSblIm.data_ricezione) as ackFinale
       ,TO_CHAR(MIN(tcinSblIm.data_ricezione),'MM/YYYY') AS meseCompFinale
       ,MIN (tcinNtCr.data_ricezione)  AS nomeFileIniziale
       ,MIN (tcinSblIm.data_ricezione) AS nomeFileFinale
FROM   mnp.mnp_msp_tc_in@MNP tcinSblIm
	     , mnp.mnp_msp_tc_in@MNP tcinNtCr
       , mnp.mnp_gest_rich_rec_virt@MNP gr
 WHERE tcinNtCr.id_richiesta_dbc = gr.id_richiesta
         AND tcinSblIm.id_richiesta_dbc = gr.id_richiesta
         AND SUBSTR(tcinNtCr.id_richiesta_dbc,0,2)='RV'
         AND tcinNtCr.tipo_evento = '01'
         AND SUBSTR(tcinSblIm.id_richiesta_dbc,0,2)='RV'
         AND tcinSblIm.tipo_evento = '03'	
	       --AND gr.flag_esp = 0
         AND tcinSblIm.data_ricezione BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1))
       GROUP BY gr.id_richiesta
      	      ,gr.codice_operatore_donating
              ,gr.codice_operatore_recipient
              ,gr.msisdn; 
BEGIN
 D_ini:=sysdate;
 DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));


  cod_errore := 0;
  FOR rec IN record_sla LOOP
    BEGIN
      n_rec := n_rec +1;
     
     -- SBLOCCO IMPORTO 
      INSERT INTO MNP_DW_SLA_MVNO_OUT (
        UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
        FILE_XML, FILE_ACK, DATA_AGG)
      VALUES (
        seq_DW_SLA_MVNO_OUT.nextval
        ,rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'SBLOCCI'
        ,TO_CHAR(rec.nomeFileFinale, 'dd/mm/yyyy')
        ,TO_CHAR(rec.ackFinale, 'dd/mm/yyyy')
        ,sysdate
      );
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
      BEGIN
        -- lettura dati preesistenti per gestione ack multipli sull'attivazione
        SELECT FILE_ACK
        INTO   ackFinaleLetto
        FROM   MNP_DW_SLA_MVNO_OUT
        WHERE  MESE = rec.meseCompFinale
          AND  ID_RICHIESTA   = rec.idRichiesta
          AND  TIPO_FILE = 'SBLOCCI'
          AND  DON_OSPITATO = rec.donorEffettivo
          AND  REC_OSPITATO   = rec.recipientEffettivo 
          AND  DON_RETE = rec.donorRete;

        -- se data dell'ack della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
        IF to_date( SUBSTR( rec.ackFinale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackFinaleLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
        THEN
          UPDATE MNP_DW_SLA_MVNO_OUT
          SET 
             FILE_ACK = rec.ackFinale
          WHERE  ID_RICHIESTA   = rec.idRichiesta
            AND  MESE = rec.meseCompFinale
            AND  DON_OSPITATO = rec.donorEffettivo
            AND  REC_OSPITATO   = rec.recipientEffettivo
            AND  DON_RETE=rec.donorRete
            AND  TIPO_FILE = 'SBLOCCI';
        END IF;
      END;
    END;
  
  END LOOP;

  COMMIT;

  D_finE:=sysdate;
  DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);

EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
      end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLAZ_REC_VIRT ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLAZ_REC_VIRT;

----------------------------------------------------------------------

procedure CARICAMENTO_SLAX_M2M(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
-- Caricamento SLA Trasferimento Credito RECIPIENT M2M
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLAX_M2M';
ackFinaleLetto VARCHAR2(27);
D_ini DATE;
D_fine DATE;
dataFinale DATE;

CURSOR record_sla is
SELECT UNIQUE
        gr.ID_RICHIESTA  AS idRichiesta
       ,gr.CODICE_OPERATORE_DONATING as donorEffettivo
       ,gr.CODICE_OPERATORE_RECIPIENT as recipientEffettivo
       ,'TIMG' AS donorRete
       ,'TIMG' AS recipientRete
       ,gr.MSISDN                       AS msIsdn
       ,gr.data_cut_over_eff as ackIniziale
       ,MIN (tcin.data_ricezione) as ackFinale
       ,TO_CHAR(MIN(tcin.data_ricezione),'MM/YYYY') AS meseCompFinale
       ,gr.data_cut_over_eff  AS nomeFileIniziale
       ,MIN (tcin.data_ricezione) AS nomeFileFinale
FROM   mnp.mnp_mvno_tc_in@MNP tcin
       , mnp.mnp_gest_rich_rec_virt@MNP gr
  WHERE tcin.id_richiesta_dbc = gr.id_richiesta
         AND SUBSTR(tcin.id_richiesta_dbc,0,2)='RV'
         AND tcin.tipo_evento = '01'
	       --AND gr.flag_esp = 0
         AND tcin.data_ricezione BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1))
       GROUP BY gr.id_richiesta
              ,gr.data_cut_over_eff
	            ,gr.codice_operatore_donating
              ,gr.codice_operatore_recipient
              ,gr.msisdn;

BEGIN
  D_ini:=sysdate;
  DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));


  cod_errore := 0;
  FOR rec IN record_sla LOOP
    BEGIN
      n_rec := n_rec +1;

      -- TRASFERIMENTO CREDITO 
      INSERT INTO MNP_DW_SLA_MVNO_OUT (
        UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
        FILE_XML, FILE_ACK, DATA_AGG)
      VALUES (
        seq_DW_SLA_MVNO_OUT.nextval
        ,rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'TRASFER'
        ,TO_CHAR(rec.nomeFileFinale,'dd/mm/yyyy')
        ,TO_CHAR(rec.ackFinale,'dd/mm/yyyy')
        ,sysdate
      );
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
      BEGIN
        -- lettura dati preesistenti per gestione ack multipli sull'attivazione
        SELECT FILE_ACK
        INTO   ackFinaleLetto
        FROM   MNP_DW_SLA_MVNO_OUT
        WHERE  MESE = rec.meseCompFinale
          AND  ID_RICHIESTA   = rec.idRichiesta
          AND  TIPO_FILE = 'TRASFER'
          AND  DON_OSPITATO = rec.donorEffettivo
          AND  REC_OSPITATO   = rec.recipientEffettivo 
          AND  DON_RETE = rec.donorRete;

        -- se data dell'ack della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
        IF to_date( SUBSTR( rec.ackFinale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackFinaleLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
        THEN
          UPDATE MNP_DW_SLA_MVNO_OUT
          SET 
             FILE_ACK = rec.ackFinale
          WHERE  ID_RICHIESTA   = rec.idRichiesta
            AND  MESE = rec.meseCompFinale
            AND  DON_OSPITATO = rec.donorEffettivo
            AND  REC_OSPITATO   = rec.recipientEffettivo
            AND  DON_RETE=rec.donorRete
            AND  TIPO_FILE = 'TRASFER';
        END IF;
      END;
    END;
  END LOOP;

  COMMIT;

  D_finE:=sysdate;
  DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);

EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
      end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLAX_M2M ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLAX_M2M;

---------------------------------------------
procedure CARICAMENTO_SLAZ_M2M(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
-- Caricamento SLA Sblocco Importo RECIPIENT M2M
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLAZ_M2M';
ackFinaleLetto VARCHAR2(27);
D_ini DATE;
D_fine DATE;
dataFinale DATE;

CURSOR record_sla is
SELECT UNIQUE
        gr.ID_RICHIESTA  AS idRichiesta
       ,gr.CODICE_OPERATORE_DONATING as donorEffettivo
       ,gr.CODICE_OPERATORE_RECIPIENT as recipientEffettivo
       ,'TIMG' AS donorRete
       ,'TIMG' AS recipientRete
       ,gr.MSISDN                       AS msIsdn
       ,MIN (tcinNtCr.data_ricezione) as ackIniziale
       ,MIN (tcinSblIm.data_ricezione) as ackFinale
       ,TO_CHAR(MIN(tcinSblIm.data_ricezione),'MM/YYYY') AS meseCompFinale
       ,MIN (tcinNtCr.data_ricezione)  AS nomeFileIniziale
       ,MIN (tcinSblIm.data_ricezione) AS nomeFileFinale
FROM   mnp.mnp_mvno_tc_in@MNP tcinSblIm
	     , mnp.mnp_mvno_tc_in@MNP tcinNtCr
       , mnp.mnp_gest_rich_rec_virt@MNP gr
 WHERE tcinNtCr.id_richiesta_dbc = gr.id_richiesta
         AND tcinSblIm.id_richiesta_dbc = gr.id_richiesta
         AND SUBSTR(tcinNtCr.id_richiesta_dbc,0,2)='RV'
         AND tcinNtCr.tipo_evento = '01'
         AND SUBSTR(tcinSblIm.id_richiesta_dbc,0,2)='RV'
         AND tcinSblIm.tipo_evento = '03'	
	       --AND gr.flag_esp = 0
         AND tcinSblIm.data_ricezione BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1))
       GROUP BY gr.id_richiesta
      	      ,gr.codice_operatore_donating
              ,gr.codice_operatore_recipient
              ,gr.msisdn; 
BEGIN
  D_ini:=sysdate;
  DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));


  cod_errore := 0;
  FOR rec IN record_sla LOOP
    BEGIN
      n_rec := n_rec +1;

      -- SBLOCCO IMPORTO 
      INSERT INTO MNP_DW_SLA_MVNO_OUT (
        UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
        FILE_XML, FILE_ACK, DATA_AGG)
      VALUES (
        seq_DW_SLA_MVNO_OUT.nextval
        ,rec.meseCompFinale
        ,rec.donorEffettivo
        ,rec.recipientEffettivo
        ,rec.donorRete
        ,rec.recipientRete
        ,rec.msIsdn
        ,rec.idRichiesta
        ,'SBLOCCI'
        ,TO_CHAR(rec.nomeFileFinale, 'dd/mm/yyyy')
        ,TO_CHAR(rec.ackFinale, 'dd/mm/yyyy')
        ,sysdate
      );
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
      BEGIN
        -- lettura dati preesistenti per gestione ack multipli sull'attivazione
        SELECT FILE_ACK
        INTO   ackFinaleLetto
        FROM   MNP_DW_SLA_MVNO_OUT
        WHERE  MESE = rec.meseCompFinale
          AND  ID_RICHIESTA   = rec.idRichiesta
          AND  TIPO_FILE = 'SBLOCCI'
          AND  DON_OSPITATO = rec.donorEffettivo
          AND  REC_OSPITATO   = rec.recipientEffettivo 
          AND  DON_RETE = rec.donorRete;

        -- se data dell'ack della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
        IF to_date( SUBSTR( rec.ackFinale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackFinaleLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
        THEN
          UPDATE MNP_DW_SLA_MVNO_OUT
          SET 
             FILE_ACK = rec.ackFinale
          WHERE  ID_RICHIESTA   = rec.idRichiesta
            AND  MESE = rec.meseCompFinale
            AND  DON_OSPITATO = rec.donorEffettivo
            AND  REC_OSPITATO   = rec.recipientEffettivo
            AND  DON_RETE=rec.donorRete
            AND  TIPO_FILE = 'SBLOCCI';
        END IF;
      END;
    END;  
END LOOP;

COMMIT;

D_finE:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);

EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
      end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLAZ_M2M ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLAZ_M2M;


---------------------------------------------


procedure CARICAMENTO_SLAY_M2M(dataRif IN DATE,cod_errore   OUT      NUMBER) IS
-- Caricamento SLA Sblocco Credito RECIPIENT M2M)
n_rec integer := 0;
proc_name constant varchar2(30) := 'CARICAMENTO_SLAY_M2M';
ackFinaleLetto VARCHAR2(27);
D_ini DATE;
D_fine DATE;
dataFinale DATE;

CURSOR record_sla is
SELECT UNIQUE
        gr.ID_RICHIESTA  AS idRichiesta
       ,gr.CODICE_OPERATORE_DONATING as donorEffettivo
       ,gr.CODICE_OPERATORE_RECIPIENT as recipientEffettivo
       ,'TIMG' AS donorRete
       ,'TIMG' AS recipientRete
       ,gr.MSISDN                       AS msIsdn
       ,MIN (tcinNtCr.data_ricezione) as ackIniziale
       ,MIN (tcinSblCr.data_ricezione) as ackFinale
       ,TO_CHAR(MIN(tcinSblCr.data_ricezione),'MM/YYYY') AS meseCompFinale
       ,MIN (tcinNtCr.data_ricezione)  AS nomeFileIniziale
       ,MIN (tcinSblCr.data_ricezione) AS nomeFileFinale
FROM    mnp.mnp_mvno_tc_in@MNP tcinNtCr
	      , mnp.mnp_mvno_tc_in@MNP tcinSblCr
        , mnp.mnp_gest_rich_rec_virt@MNP gr
      WHERE tcinNtCr.id_richiesta_dbc = gr.id_richiesta
         AND tcinSblCr.id_richiesta_dbc = gr.id_richiesta
         AND SUBSTR(tcinNtCr.id_richiesta_dbc,0,2)='RV'
         AND tcinNtCr.tipo_evento = '01'	
         AND SUBSTR(tcinSblCr.id_richiesta_dbc,0,2)='RV'
         AND tcinSblCr.tipo_evento = '02'
         AND tcinSblCr.data_ricezione BETWEEN Last_Day(ADD_MONTHS(dataRif,-2))+1 AND    Last_Day(ADD_MONTHS( dataRif,-1))
       GROUP BY gr.id_richiesta
              , gr.codice_operatore_donating
              , gr.codice_operatore_recipient
      	      , gr.msisdn;
      	      
BEGIN
 D_ini:=sysdate;
 DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));


  cod_errore := 0;
  FOR rec IN record_sla LOOP
    BEGIN
      n_rec := n_rec +1;

      -- SBLOCCO CREDITO 
      INSERT INTO MNP_DW_SLA_MVNO_OUT (
      UNIQUE_ID,MESE,DON_OSPITATO, REC_OSPITATO, DON_RETE, REC_RETE, MSISDN, ID_RICHIESTA, TIPO_FILE,
      FILE_XML, FILE_ACK, DATA_AGG)
      VALUES (
      seq_DW_SLA_MVNO_OUT.nextval
      ,rec.meseCompFinale
      ,rec.donorEffettivo
      ,rec.recipientEffettivo
      ,rec.donorRete
      ,rec.recipientRete
      ,rec.msIsdn
      ,rec.idRichiesta
      ,'SBLOCCC'
      ,TO_CHAR(rec.nomeFileFinale,'dd/mm/yyyy')
      ,TO_CHAR(rec.ackFinale,'dd/mm/yyyy')
      ,sysdate
      );
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
      BEGIN
        -- lettura dati preesistenti per gestione ack multipli sull'attivazione
        SELECT FILE_ACK
        INTO   ackFinaleLetto
        FROM   MNP_DW_SLA_MVNO_OUT
        WHERE  MESE = rec.meseCompFinale
          AND  ID_RICHIESTA   = rec.idRichiesta
          AND  TIPO_FILE = 'SBLOCCC'
          AND  DON_OSPITATO = rec.donorEffettivo
          AND  REC_OSPITATO   = rec.recipientEffettivo 
          AND  DON_RETE = rec.donorRete;

        -- se data dell'ack della nuova riga < data ack preesistente aggiorna i dati altrimenti scarta
        IF to_date( SUBSTR( rec.ackFinale, 5 , 14) ,'YYYYMMDDHH24MISS' ) < to_date( SUBSTR(ackFinaleLetto, 5 , 14) ,'YYYYMMDDHH24MISS' )
        THEN
          UPDATE MNP_DW_SLA_MVNO_OUT
          SET 
             FILE_ACK = rec.ackFinale
          WHERE  ID_RICHIESTA   = rec.idRichiesta
            AND  MESE = rec.meseCompFinale
            AND  DON_OSPITATO = rec.donorEffettivo
            AND  REC_OSPITATO   = rec.recipientEffettivo
            AND  DON_RETE=rec.donorRete
            AND  TIPO_FILE = 'SBLOCCC';
        END IF;
      END;
    END;  
  
  END LOOP;

  COMMIT;

  D_finE:=sysdate;
  DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCEDURA '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440)||' - RECORDS TRATTATI: '||N_REC);

EXCEPTION
   WHEN OTHERS
   THEN
    if record_sla%ISOPEN then CLOSE record_sla;
      end if;
      cod_errore := 1;
      DBMS_OUTPUT.put_line ('Errore in CARICAMENTO_SLAY_M2M ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
      RETURN;
END CARICAMENTO_SLAY_M2M;

----------------------------------------------------------------------

-- 4.0 | 7. Improve CALCOLO_SLA_MVNO prevent GoldenGate (to DBCBIESE) error
-- "Discarding record on action DISCARD on error 1400 - Mapping problem 
-- with delete record (target format)"
-- Add COMMIT after delete of earlier records from month under processing									   
procedure CALCOLO_SLA_MVNO(dataRif IN Date) IS

  cod_errore  NUMBER (1);

  cod_errore_sla0_rec  NUMBER (1):=0;
  cod_errore_sla1_rec  NUMBER (1):=0;
  cod_errore_sla2_rec  NUMBER (1):=0;
  cod_errore_sla3_rec  NUMBER (1):=0;
  cod_errore_slaX_rec  NUMBER (1):=0;
  cod_errore_slaY_rec  NUMBER (1):=0;
  cod_errore_slaZ_rec  NUMBER (1):=0;

  cod_errore_sla1_rec_virt  NUMBER (1):=0;
  cod_errore_sla2_rec_virt  NUMBER (1):=0;
  cod_errore_sla3_rec_virt  NUMBER (1):=0;
  cod_errore_slaX_rec_virt  NUMBER (1):=0;
  cod_errore_slaZ_rec_virt  NUMBER (1):=0;
  cod_errore_slaX_M2M  NUMBER (1):=0;
  cod_errore_slaY_M2M  NUMBER (1):=0;
  cod_errore_slaZ_M2M  NUMBER (1):=0;


  n_rec integer := 0;
proc_name constant varchar2(30) := 'CALCOLO_SLA_MVNO';
D_ini DATE;
D_fine DATE;



BEGIN
dbms_output.enable(9999999);
D_ini:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO: INIZIO PROCESSO '||PROC_NAME||' - '||TO_CHAR(D_INI,'YYYY-MM-DD HH24:MI:SS'));
  
   -----------------------------------------------------
   -- DELETE PREVENTIVA DELLE TABELLA PER IL REPORTING MVNO
   -----------------------------------------------------
   DELETE MNP_DW_SLA_MVNO_OUT WHERE MESE=TO_CHAR(ADD_MONTHS(dataRif,-1),'mm/yyyy'); 
   -- 4.0 | 7. Improve CALCOLO_SLA_MVNO prevent GoldenGate (to DBCBIESE) error
   -- Add COMMIT after delete of earlier records from month under processing		
   -- ATTENTION: NO code allowed between the COMMIT above and the IF below (only comments) 
   IF 0 < SQL%ROWCOUNT THEN
     COMMIT;
   END IF;
   
  cod_errore := 0;



-- caricamento dati per il processo recipient nella tabella MNP_DW_SLA_MVNO_OUT
  caricamento_sla0_recipient(dataRif,cod_errore_sla0_rec);
  caricamento_sla1_recipient(dataRif,cod_errore_sla1_rec);
  caricamento_sla2_recipient(dataRif,cod_errore_sla2_rec);
  caricamento_sla3_recipient(dataRif,cod_errore_sla3_rec);
  caricamento_slaX_recipient(dataRif,cod_errore_slaX_rec);
  caricamento_slaY_recipient(dataRif,cod_errore_slaY_rec);
  caricamento_slaZ_recipient(dataRif,cod_errore_slaZ_rec);

-- caricamento dati per il processo recipient virtuale nella tabella MNP_DW_SLA_MVNO_OUT
  caricamento_sla1_rec_virt(dataRif,cod_errore_sla1_rec_virt);
  caricamento_sla2_rec_virt(dataRif,cod_errore_sla2_rec_virt);
  caricamento_sla3_rec_virt(dataRif,cod_errore_sla3_rec_virt);
  caricamento_slaX_rec_virt(dataRif,cod_errore_slaX_rec_virt);
  caricamento_slaZ_rec_virt(dataRif,cod_errore_slaZ_rec_virt);  
  caricamento_slaX_M2M(dataRif,cod_errore_slaX_M2M);
  caricamento_slaY_M2M(dataRif,cod_errore_slaY_M2M);
  caricamento_slaZ_M2M(dataRif,cod_errore_slaZ_M2M);
  



  cod_errore := cod_errore_sla0_rec + cod_errore_sla1_rec + cod_errore_sla2_rec + cod_errore_sla3_rec +
                cod_errore_sla1_rec_virt + cod_errore_sla2_rec_virt + cod_errore_sla3_rec_virt 
                + cod_errore_slaX_rec + cod_errore_slaY_rec + cod_errore_slaZ_rec +
                cod_errore_slaX_rec_virt +  cod_errore_slaZ_rec_virt +
                cod_errore_slaX_M2M + cod_errore_slaY_M2M +  cod_errore_slaZ_M2M;



  IF cod_errore = 0
   THEN
    -- OK
    DBMS_OUTPUT.put_line ('Caricamento dati SLA avvenuto.');
    ELSE
    -- KO
    DBMS_OUTPUT.put_line ('CARICAMENTO DATI E CALCOLO SLA PARZIALE: PROCESSO TERMINATO CON ERRORI VERIFICARE LOG!');
   END IF;

  COMMIT;
  D_fine:=sysdate;
DBMS_OUTPUT.put_line ('PKG_CALCOLO_SLA_MVNO:  FINE  PROCESSO '||PROC_NAME||' - '||TO_CHAR(D_FINE,'YYYY-MM-DD HH24:MI:SS')||' - DURATA IN MINUTI:'||TRUNC((D_fine-D_ini)*1440));


EXCEPTION
WHEN OTHERS THEN
  cod_errore := 1;
  DBMS_OUTPUT.put_line ('Errore nel caricamento dati Sla ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
  RETURN;
END CALCOLO_SLA_MVNO;


END PKG_CALCOLO_SLA_MVNO;
/
