CREATE OR REPLACE PROCEDURE P_REPORT_KPI(P_DATA_DA DATE, P_DATA_A DATE) IS

  v_mese_comp varchar2(10);
  v_rich_attese_controllo number;
  v_rich_attese_contrattuali number;
  v_rich_inviate_controllo number;
  v_perc_controllo number;
  v_rich_ricevute_contrattuali number;
  v_perc_contrattuali number;

BEGIN
  
  BEGIN
    -- ESTRAZIONE DELLE INFORMAZIONI PER I KPI DI CONTROLLO
    SELECT A.MESE_COMP,ATTESE,OK_ALLE_12, ROUND((OK_ALLE_12/ATTESE)*100,2) AS PERC 
    INTO v_mese_comp, v_rich_attese_controllo, v_rich_inviate_controllo, v_perc_controllo
    FROM 
      ( SELECT  TO_CHAR(DATA_CUT_OVER_CALC,'MM/YYYY') AS MESE_COMP,COUNT(*) AS OK_ALLE_12
        FROM MNP.MNP_GESTIONE_RICHIESTA GR, MNP.MNP_XML_RICHIESTA_OUT MTI, MNP.MNP_XML_OUT XO
        WHERE GR.DATA_CUT_OVER_CALC BETWEEN P_DATA_DA AND P_DATA_A
          AND GR.ID_RICHIESTA =MTI.ID_RICHIESTA
          AND MTI.NOME_FILE= XO.NOME_FILE
          AND XO.TIPO_FILE =6
          AND XO.DESTINATARIO <> 'NPTS'
          AND XO.DATA_INVIO <= TO_DATE(TO_CHAR(DATA_CUT_OVER_CALC,'DD_MM_YYYY')||' 12:00','DD_MM_YYYY HH24:MI')
          AND GR.ABBONATO_PREPAGATO = 'PREPAGATO'
          AND GR.CODICE_CONTROLLO_VALIDAZIONE= 0
        GROUP BY TO_CHAR(DATA_CUT_OVER_CALC,'MM/YYYY')
      ) A,
      ( SELECT  TO_CHAR(DATA_CUT_OVER_CALC,'MM/YYYY') AS MESE_COMP,COUNT(*) AS ATTESE
        FROM MNP_GESTIONE_RICHIESTA GR
        WHERE GR.DATA_CUT_OVER_CALC BETWEEN P_DATA_DA AND P_DATA_A
          AND GR.ABBONATO_PREPAGATO = 'PREPAGATO'
          AND GR.CODICE_CONTROLLO_VALIDAZIONE= 0
        GROUP BY TO_CHAR(DATA_CUT_OVER_CALC,'MM/YYYY')
      )B
    WHERE A.MESE_COMP = B.MESE_COMP;
  EXCEPTION WHEN OTHERS THEN
    v_mese_comp := TO_CHAR(P_DATA_DA,'MM/YYYY');
    v_rich_attese_controllo := 0;
    v_rich_inviate_controllo := 0;
    v_perc_controllo := 0;
  END;
  --
  
  BEGIN
    -- ESTRAZIONE DELLE INFORMAZIONI PER I KPI CONTRATTUALI
    SELECT A.MESE_COMP,ATTESE,OK_ALLE_12, ROUND((OK_ALLE_12/ATTESE)*100,2) AS PERC 
    INTO v_mese_comp, v_rich_attese_contrattuali, v_rich_ricevute_contrattuali, v_perc_contrattuali
    FROM 
      ( SELECT  TO_CHAR(DATA_CUT_OVER_CALC,'MM/YYYY') AS MESE_COMP,COUNT(*) AS OK_ALLE_12
        FROM MNP_GESTIONE_RICHIESTA GR, 
          ( select t.id_richiesta, min(t.data_ricezione) data_ricezione
            from mnp_mss_cessazione_in t
            group by id_richiesta) MTI
        WHERE GR.DATA_CUT_OVER_CALC BETWEEN  P_DATA_DA AND P_DATA_A
          AND GR.ID_RICHIESTA =MTI.ID_RICHIESTA(+)
          AND GR.STATO IN (15, 16)
          AND MTI.DATA_RICEZIONE <= TO_DATE(TO_CHAR(DATA_CUT_OVER_CALC,'DD_MM_YYYY')||' 12:00','DD_MM_YYYY HH24:MI')
          AND GR.ABBONATO_PREPAGATO = 'PREPAGATO'
        GROUP BY TO_CHAR(DATA_CUT_OVER_CALC,'MM/YYYY')
      ) A,
      ( SELECT  TO_CHAR(DATA_CUT_OVER_CALC,'MM/YYYY') AS MESE_COMP,COUNT(*) AS ATTESE
        FROM MNP_GESTIONE_RICHIESTA GR
        WHERE GR.DATA_CUT_OVER_CALC BETWEEN  P_DATA_DA AND P_DATA_A
          AND GR.ABBONATO_PREPAGATO = 'PREPAGATO'
          AND GR.CODICE_CONTROLLO_VALIDAZIONE= 0
        GROUP BY TO_CHAR(DATA_CUT_OVER_CALC,'MM/YYYY')
      )B
    WHERE A.MESE_COMP = B.MESE_COMP;
  EXCEPTION WHEN OTHERS THEN
    v_mese_comp := TO_CHAR(P_DATA_DA,'MM/YYYY');
    v_rich_attese_contrattuali := 0;
    v_rich_ricevute_contrattuali := 0;
    v_perc_contrattuali := 0;
  END;
  
  
  -- INSERIMENTO DATI IN TABELLA
  INSERT INTO MNP_DW_REPORT_KPI (MESE_COMP, NUM_RICH_ATTESE_CONTROLLO, NUM_RICH_ATTESE_CONTRATTUALI, NUM_RICH_OK12_CONTROLLO,
    NUM_RICH_OK12_CONTRATTUALI, PERC_CONTROLLO, PERC_CONTRATTUALI, DATA_ESECUZIONE)
  VALUES (v_mese_comp, v_rich_attese_controllo, v_rich_attese_contrattuali, v_rich_inviate_controllo, v_rich_ricevute_contrattuali, 
    v_perc_controllo, v_perc_contrattuali, SYSDATE);
  
  COMMIT;

END P_REPORT_KPI;
/