DECLARE

  V_DATA_CURR DATE;
  V_DATA_MAX date;
  V_RECIPIENT_NEW varchar2(10);

BEGIN
  -- INTEGRAZIONE CON I DONOR E I REC_VIRT TRA OTTOBRE ED APRILE
  FOR R_INTEGRAZIONE_VAR IN
  ( SELECT 'V' TIPO_RECORDO, SUBSTR(R.MSISDN, 3) MSISDN, R.DATA_CUT_OVER_EFF, R.CODICE_OPERATORE_REC_EFF RECIPIENT_NEW
    FROM MNP_GESTIONE_RICHIESTA R
    WHERE (R.MSISDN, R.DATA_CUT_OVER_EFF) IN
    ( SELECT R1.MSISDN, MAX(R1.DATA_CUT_OVER_EFF)
      FROM MNP_GESTIONE_RICHIESTA R1
      WHERE R1.DATA_CUT_OVER_EFF BETWEEN TO_DATE('01102012','DDMMYYYY') AND TO_DATE('12042013','DDMMYYYY')
        AND R1.STATO NOT IN (22,12,10,4)
        AND R1.TIPO_CLIENTE = 'CO'
      GROUP BY R1.MSISDN
     )
    UNION
    SELECT 'V' TIPO_RECORDO, SUBSTR(RV.MSISDN, 3) MSISDN, RV.DATA_CUT_OVER_EFF, RV.CODICE_OPERATORE_RECIPIENT RECIPIENT_NEW
    FROM MNP_GEST_RICH_REC_VIRT RV
    WHERE (RV.MSISDN, RV.DATA_CUT_OVER_EFF) IN
    ( SELECT RV1.MSISDN, MAX(RV1.DATA_CUT_OVER_EFF)
      FROM MNP_GEST_RICH_REC_VIRT RV1
      WHERE RV1.DATA_CUT_OVER_EFF BETWEEN TO_DATE('01102012','DDMMYYYY') AND TO_DATE('12042013','DDMMYYYY')
        AND RV1.STATO NOT IN (7,9)
        AND RV1.TIPO_CLIENTE = 'CO'
      GROUP BY RV1.MSISDN
    )
  )
  LOOP
    -- INSERIMENTO IN TABELLA
    BEGIN
      
      INSERT INTO MNP_DBC_VARIAZIONE_OLO (tipo_record, num_tel, data, recipient_new)
      VALUES
      (R_INTEGRAZIONE_VAR.TIPO_RECORDO, R_INTEGRAZIONE_VAR.MSISDN, 
        R_INTEGRAZIONE_VAR.DATA_CUT_OVER_EFF,R_INTEGRAZIONE_VAR.RECIPIENT_NEW);
    
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
    
      SELECT DATA
      INTO V_DATA_CURR
      FROM MNP_DBC_VARIAZIONE_OLO
      WHERE NUM_TEL = R_INTEGRAZIONE_VAR.MSISDN;
      
      IF V_DATA_CURR < R_INTEGRAZIONE_VAR.DATA_CUT_OVER_EFF THEN
        
        UPDATE MNP_DBC_VARIAZIONE_OLO
        SET DATA = R_INTEGRAZIONE_VAR.DATA_CUT_OVER_EFF,
            RECIPIENT_NEW = R_INTEGRAZIONE_VAR.RECIPIENT_NEW
        WHERE NUM_TEL = R_INTEGRAZIONE_VAR.MSISDN;
      
      END IF;
      
    END;
    
    COMMIT;
    
  END LOOP;
  --
  
  -- AGGIORNAMENTO DEI CAMPI DATA E RECIPIENT_NEW VERIFICANDO LA PRESENZA DI PORTING TERZE PARTI O RECIPIENT TIM
  FOR R_VAR_MSISDN IN
  ( SELECT * FROM MNP_DBC_VARIAZIONE_OLO WHERE LAVORATO IS NULL )
  LOOP
    
    BEGIN
      SELECT *
      INTO V_DATA_MAX, V_RECIPIENT_NEW
      FROM
      ( SELECT q.*
        FROM
          ( SELECT P.DATA_CUT_OVER DATA, P.CODICE_OPERATORE_RECIPIENT REC_NEW
            FROM MNP_GESTIONE_RICHIESTA_PORTING P
            WHERE (P.MSISDN, P.DATA_CUT_OVER) IN
              ( SELECT MSISDN, MAX(P1.DATA_CUT_OVER)
                FROM MNP_GESTIONE_RICHIESTA_PORTING P1
                WHERE P1.STATO = 6
                  AND P1.DATA_CUT_OVER BETWEEN TO_DATE('01102012','DDMMYYYY') AND TO_DATE('12042013','DDMMYYYY')
                  AND P1.MSISDN = '39'||R_VAR_MSISDN.NUM_TEL
                GROUP BY P1.MSISDN
              )
            UNION
            SELECT R.DATA_CUT_OVER_EFF DATA, R.CODICE_OPERATORE_REC_EFF REC_NEW
            FROM MNP_GESTIONE_RICHIESTA_REC R
            WHERE (R.MSISDN, R.DATA_CUT_OVER_EFF) IN
              ( SELECT R1.MSISDN, MAX(R1.DATA_CUT_OVER_EFF)
                FROM MNP_GESTIONE_RICHIESTA_REC R1
                WHERE R1.DATA_CUT_OVER_EFF BETWEEN TO_DATE('01102012','DDMMYYYY') AND TO_DATE('12042013','DDMMYYYY')
                  AND R1.STATO = 12
                  AND R1.TIPO_CLIENTE = 'CO'
                  AND R1.MSISDN = '39'||R_VAR_MSISDN.NUM_TEL
                GROUP BY R1.MSISDN
               )
            UNION
            SELECT DV.DATA_CUT_OVER_EFF DATA, DV.CODICE_OPERATORE_RECIPIENT REC_NEW
            FROM MNP_GEST_RICH_DONOR_VIRT DV
            WHERE (DV.MSISDN, DV.DATA_CUT_OVER_EFF) IN
              ( SELECT DV1.MSISDN, MAX(DV1.DATA_CUT_OVER_EFF)
                FROM MNP_GEST_RICH_DONOR_VIRT DV1
                WHERE DV1.DATA_CUT_OVER_EFF BETWEEN TO_DATE('01102012','DDMMYYYY') AND TO_DATE('12042013','DDMMYYYY')
                  AND DV1.STATO = 11
                  AND DV1.TIPO_CLIENTE = 'CO'
                  AND DV1.MSISDN = '39'||R_VAR_MSISDN.NUM_TEL
                GROUP BY DV1.MSISDN
               )
          ) q   
          ORDER BY q.data desc)
        WHERE rownum <2;
        
        UPDATE MNP_DBC_VARIAZIONE_OLO
        SET DATA = V_DATA_MAX,
            RECIPIENT_NEW = V_RECIPIENT_NEW,
            LAVORATO = 1
        WHERE NUM_TEL = R_VAR_MSISDN.NUM_TEL;
        
        COMMIT;
        
    EXCEPTION WHEN NO_DATA_FOUND THEN
      V_DATA_MAX        := NULL;
      V_RECIPIENT_NEW   := NULL;
      --
      UPDATE MNP_DBC_VARIAZIONE_OLO
      SET LAVORATO = 1
      WHERE NUM_TEL = R_VAR_MSISDN.NUM_TEL;
      
      COMMIT;
    END;
    
  END LOOP;
END;
/

TRUNCATE TABLE MNP_DBC_CESSAZIONE_OLO;

INSERT INTO MNP_DBC_CESSAZIONE_OLO
SELECT 'C', SUBSTR(CP.MSISDN, 3), CP.DATA_CUT_OVER
FROM MNP_GESTIONE_RICH_CESS_PORT CP, MNP_STORICO_CESS_PORTING SCP
WHERE CP.ID_RICHIESTA = SCP.ID_RICHIESTA
  AND SCP.STATO_A = 2
  AND SCP.DATA_LAVORAZIONE BETWEEN TO_DATE('01102012', 'DDMMYYYY') AND TO_DATE('12042013', 'DDMMYYYY')
UNION
SELECT 'C', SUBSTR(C.MSISDN, 3), C.DATA_CUT_OVER
FROM MNP_GESTIONE_RICHIESTA_CESS C, MNP_STORICO_CESS SC
WHERE C.ID_RICHIESTA = SC.ID_RICHIESTA
  AND SC.STATO_A = 3
  AND SC.DATA_LAVORAZIONE BETWEEN TO_DATE('01102012', 'DDMMYYYY') AND TO_DATE('12042013', 'DDMMYYYY');

COMMIT;

DELETE MNP_DBC_VARIAZIONE_OLO
WHERE NUM_TEL IN
( SELECT NUM_TEL
  FROM MNP_DBC_CESSAZIONE_OLO
);

COMMIT;
