CREATE OR REPLACE PROCEDURE "CALCOLO_SIM_PRJHOC" (dataRif IN DATE )

AS
-- PURPOSE: Aggiorna la tabella MNP_DW_SLA_3GG_OUT
--          valorizzando il numero delle SIM per i progetti ad HOC.
--          Elabora i record che hanno  come mese di competenza 
--          il mese precedente a dataRif.
--
--
-- MODIFICATION HISTORY
-- Person      Date         Comments
-- Letizia MOnosilio 04/11/2010   Creazione script
---------------------------------------
  num_sim         NUMBER :=0;
  memo_richiesta  VARCHAR2(23);
  memo_gruppo     VARCHAR2(12);
  n_rec           INTEGER := 0;

   
   CURSOR record_sim_rec
   IS
    SELECT ric.codice_gruppo codiceGruppo, sla.ID_RICHIESTA idRichiesta
    FROM dwh.mnp_dw_sla_3gg_out sla, mnp.mnp_gestione_richiesta_rec ric
    WHERE sla.id_richiesta=ric.id_richiesta AND
      sla.mese_comp_finale = TO_CHAR ( Last_Day(ADD_MONTHS(dataRif,-2))+1, 'MM/YYYY') AND
      sla.processo ='R' AND
      sla.flag_calcolo_numsim = 1
      ORDER BY ric.codice_gruppo, sla.ID_RICHIESTA;

 CURSOR record_sim_don
   IS
    SELECT ric.codice_gruppo codiceGruppo, sla.ID_RICHIESTA idRichiesta
    FROM dwh.mnp_dw_sla_3gg_out sla, mnp.mnp_gestione_richiesta ric
    WHERE sla.id_richiesta=ric.id_richiesta AND
      sla.mese_comp_finale = TO_CHAR ( Last_Day(ADD_MONTHS(dataRif,-2))+1, 'MM/YYYY') AND
      sla.processo ='D' AND
      sla.flag_calcolo_numsim = 1
      ORDER BY ric.codice_gruppo, sla.ID_RICHIESTA;

BEGIN


 DBMS_OUTPUT.put_line ('CALCOLO_SIM_PRJHOC: INIZIO PROCEDURA calcolo SIM Recipient- '||TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'));
 DBMS_OUTPUT.put_line('Periodo di competenza = '|| TO_CHAR ( Last_Day(ADD_MONTHS(dataRif,-2))+1, 'MM/YYYY'));
 
memo_richiesta:=null;
memo_gruppo := null;

FOR rec IN record_sim_rec LOOP
   n_rec := n_rec +1;
  BEGIN
  
  IF (memo_richiesta is null) OR (memo_richiesta <> rec.idRichiesta)
    THEN
      BEGIN
        memo_richiesta:= rec.idRichiesta;
        IF (memo_gruppo is null) OR (memo_gruppo <> rec.codiceGruppo)
        THEN
          BEGIN
            memo_gruppo:= rec.codiceGruppo;
            SELECT COUNT(*)
                  INTO   num_sim
                  FROM   mnp.mnp_gestione_richiesta_rec ric
                  WHERE   ric.CODICE_GRUPPO=rec.codiceGruppo;
          END;
        END IF;
      
        UPDATE dwh.mnp_dw_sla_3gg_out
        SET numero_sim = num_sim
        WHERE
          mese_comp_finale = TO_CHAR ( Last_Day(ADD_MONTHS(dataRif,-2))+1, 'MM/YYYY') AND
          id_richiesta = rec.idRichiesta;
      END;    
    END IF;
  END;
  END LOOP;
DBMS_OUTPUT.put_line ('CALCOLO_SIM_PRJHOC: terminato calcolo SIM Recipient');
 
FOR rec IN record_sim_don LOOP
   n_rec := n_rec +1;
  BEGIN
  
  IF (memo_richiesta is null) OR (memo_richiesta <> rec.idRichiesta)
    THEN
      BEGIN
        memo_richiesta:= rec.idRichiesta;
        IF (memo_gruppo is null) OR (memo_gruppo <> rec.codiceGruppo)
        THEN
          BEGIN
            memo_gruppo:= rec.codiceGruppo;
            SELECT COUNT(*)
                  INTO   num_sim
                  FROM   mnp.mnp_gestione_richiesta ric
                  WHERE  ric.CODICE_GRUPPO=rec.codiceGruppo;
          END;
        END IF;
      
        UPDATE dwh.mnp_dw_sla_3gg_out
        SET numero_sim = num_sim
        WHERE
          mese_comp_finale = TO_CHAR ( Last_Day(ADD_MONTHS(dataRif,-2))+1, 'MM/YYYY') AND
          id_richiesta = rec.idRichiesta;
      END;    
    END IF;
  END;
  END LOOP;
DBMS_OUTPUT.put_line ('CALCOLO_SIM_PRJHOC: terminato calcolo SIM Donor');

COMMIT;

DBMS_OUTPUT.put_line ('PCALCOLO_SIM_PRJHOC:  FINE  PROCEDURA - '||TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS')||' - RECORDS TRATTATI: '||N_REC);

EXCEPTION
   WHEN OTHERS
   THEN
     if record_sim_rec%ISOPEN then CLOSE record_sim_rec;
      end if;
      if record_sim_don%ISOPEN then CLOSE record_sim_don;
      end if;
      DBMS_OUTPUT.put_line ('Errore in CALCOLO_SIM_PRJHOC ' || SQLERRM||' - '||to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'));
    RETURN;
END calcolo_sim_prjhoc;
/