All Downloads are FREE. Search and download functionalities are using the official Maven repository.

expsigladb.Package.CNRCTB060_BODY.sql Maven / Gradle / Ivy

There is a newer version: 6.6.11
Show newest version
--------------------------------------------------------
--  DDL for Package Body CNRCTB060
--------------------------------------------------------

  CREATE OR REPLACE PACKAGE BODY "CNRCTB060" is

 -- Imposta gli importi sul dettaglio di PDG da creare

 procedure setImporto(aASSCDPLA V_CDP_SPACCATO_CDR_LA_VOCE%rowtype,
                      aDestS in out pdg_preventivo_spe_det%rowtype) is
--  isTempoDeterminato boolean;
 begin

/*
  isTempoDeterminato:=false;

  if aASSCDPLA.ti_rapporto = CDP_TI_RAPP_DETERMINATO then
   isTempoDeterminato:=true;
  end if;

  -- Se si tratta di tempo determinato, gli importi vanno su una sola colonna nel primo anno
  if isTempoDeterminato then
   aDestS.IM_RO_CSS_ALTRI_COSTI:=aASSCDPLA.im_a1;
   return;
  end if;
*/

  if aDestS.categoria_dettaglio=CNRCTB050.DETTAGLIO_SCARICO then
   aDestS.IM_RL_CCS_SPESE_OGC_ALTRA_UO:=aASSCDPLA.im_a1;
  else
   aDestS.IM_RK_CCS_SPESE_OGC:=aASSCDPLA.im_a1;
  end if;
  aDestS.IM_RH_CCS_COSTI:=aASSCDPLA.im_a1;

  if aDestS.categoria_dettaglio=CNRCTB050.DETTAGLIO_SCARICO then
   aDestS.IM_RAF_A2_SPESE_OGC_ALTRA_UO:=aASSCDPLA.im_a2;
  else
   aDestS.IM_RAE_A2_SPESE_OGC:=aASSCDPLA.im_a2;
  end if;
  aDestS.IM_RAA_A2_COSTI_FINALI:=aASSCDPLA.im_a2;

  if aDestS.categoria_dettaglio=CNRCTB050.DETTAGLIO_SCARICO then
   aDestS.IM_RAO_A3_SPESE_OGC_ALTRA_UO:=aASSCDPLA.im_a3;
  else
   aDestS.IM_RAN_A3_SPESE_OGC:=aASSCDPLA.im_a3;
  end if;
  aDestS.IM_RAH_A3_COSTI_FINALI:=aASSCDPLA.im_a3;
 end;

 procedure setImportoDettaglioCollegato(aDestSColl in out pdg_preventivo_spe_det%rowtype, aDestS pdg_preventivo_spe_det%rowtype) is
 begin
   aDestSColl.IM_RU_SPESE_COSTI_ALTRUI:=aDestS.IM_RL_CCS_SPESE_OGC_ALTRA_UO;
   aDestSColl.IM_RAG_A2_SPESE_COSTI_ALTRUI:=aDestS.IM_RAF_A2_SPESE_OGC_ALTRA_UO;
   aDestSColl.IM_RAP_A3_SPESE_COSTI_ALTRUI:=aDestS.IM_RAO_A3_SPESE_OGC_ALTRA_UO;
 end;

 procedure setImportoTFR(aASSCDPLA V_CDP_SPACCATO_CDR_LA_VOCE%rowtype, aDestS in out pdg_preventivo_spe_det%rowtype) is
 begin
  aDestS.IM_RO_CSS_ALTRI_COSTI:=aASSCDPLA.im_a1;
  aDestS.IM_RAA_A2_COSTI_FINALI:=aASSCDPLA.im_a2;
  aDestS.IM_RAH_A3_COSTI_FINALI:=aASSCDPLA.im_a3;
 end;

-- Funzione di accantonamento dei rotti di scarico

 procedure fill_round_table(aASSCDPLA V_CDP_SPACCATO_CDR_LA_VOCE%rowtype, aTSNow date, aUser varchar2) is
  aAssCdpRnd ASS_CDP_ROUND%rowtype;
 begin
    if
	     aASSCDPLA.IM_RND_A1 = 0
	 and aASSCDPLA.IM_RND_A2 = 0
	 and aASSCDPLA.IM_RND_A3 = 0
	then
     return;
	end if;
	aAssCdpRnd:=null;
    aAssCdpRnd.ESERCIZIO:=aASSCDPLA.ESERCIZIO;
    aAssCdpRnd.CD_CDR_ROOT:=aASSCDPLA.CD_CDR_ROOT;
    aAssCdpRnd.TI_APPARTENENZA:=aASSCDPLA.TI_APPARTENENZA;
    aAssCdpRnd.TI_GESTIONE:=aASSCDPLA.TI_GESTIONE;
    aAssCdpRnd.CD_ELEMENTO_VOCE:=aASSCDPLA.CD_ELEMENTO_VOCE;
    aAssCdpRnd.TI_RAPPORTO:=aASSCDPLA.TI_RAPPORTO;
    begin
	 select * into aAssCdpRnd from ass_cdp_round where
	      ESERCIZIO=aAssCdpRnd.esercizio
      and CD_CDR_ROOT=aAssCdpRnd.cd_cdr_root
      and TI_APPARTENENZA=aAssCdpRnd.ti_appartenenza
      and TI_GESTIONE=aAssCdpRnd.ti_gestione
      and CD_ELEMENTO_VOCE=aAssCdpRnd.cd_elemento_voce
      and TI_RAPPORTO=aAssCdpRnd.ti_rapporto
	  for update nowait;
     update ass_cdp_round set
      IM_ARR_A1=IM_ARR_A1+aASSCDPLA.im_rnd_a1,
      IM_ARR_A2=IM_ARR_A2+aASSCDPLA.im_rnd_a2,
      IM_ARR_A3=IM_ARR_A3+aASSCDPLA.im_rnd_a3
	 where
	      ESERCIZIO=aAssCdpRnd.esercizio
      and CD_CDR_ROOT=aAssCdpRnd.cd_cdr_root
      and TI_APPARTENENZA=aAssCdpRnd.ti_appartenenza
      and TI_GESTIONE=aAssCdpRnd.ti_gestione
      and CD_ELEMENTO_VOCE=aAssCdpRnd.cd_elemento_voce
      and TI_RAPPORTO=aAssCdpRnd.ti_rapporto;
	exception when NO_DATA_FOUND then
     aAssCdpRnd.IM_ARR_A1:=aASSCDPLA.im_rnd_a1;
     aAssCdpRnd.IM_ARR_A2:=aASSCDPLA.im_rnd_a2;
     aAssCdpRnd.IM_ARR_A3:=aASSCDPLA.im_rnd_a3;
     aAssCdpRnd.IM_ARR_A1_NON_DISTR:=0;
     aAssCdpRnd.IM_ARR_A2_NON_DISTR:=0;
     aAssCdpRnd.IM_ARR_A3_NON_DISTR:=0;
     aAssCdpRnd.DACR:=aTSNow;
     aAssCdpRnd.UTUV:=aUser;
     aAssCdpRnd.UTCR:=aUser;
     aAssCdpRnd.DUVA:=aTSNow;
     aAssCdpRnd.PG_VER_REC:=1;
     ins_ASS_CDP_ROUND(aAssCdpRnd);
	end;
 end;

 procedure scaricaCDPSuPdg(aEsercizio number, aCdCdr varchar2, aUser varchar2) is
  aCDRRUO cdr%rowtype;
  aUOAfferenza unita_organizzativa%rowtype;
  aPgDettaglio number(10);
  aPgDettaglioColl number(10);
  aDestS pdg_preventivo_spe_det%rowtype;
  aDestSColl pdg_preventivo_spe_det%rowtype;
  aTSNow date;
  aAss ass_cdp_pdg%rowtype;
  aCDRPersonale cdr%rowtype;
  isCDRInUOPersonale boolean;
  aLASAUOP linea_attivita%rowtype;
  aNum number(8);
  aVoceTFR elemento_voce%rowtype;
  aVoceONERICNR elemento_voce%rowtype;
--  isTempoDeterminato boolean;
  aLATmp linea_attivita%rowtype;
  isDettRedistrRottiFound boolean;
  isProcessato boolean;
  matricola_err         VARCHAR2(3000);
 begin
  aTSNow:=sysdate;

  -- Leggo il CDR

  aCDRRUO:=CNRCTB020.GETCDRVALIDO(aEsercizio, aCdCdr);

  if to_number(aCDRRUO.cd_proprio_cdr) != 0 then
   IBMERR001.RAISE_ERR_GENERICO('Operazione permessa solo su cdr di tipo RUO!');
  end if;

  -- Lock del PDG del CDR in processo

  CNRCTB050.LOCKPDG(aEsercizio, aCdCdr);

  -- Leggo il CDR del personale e lock del PDG

  aCDRPersonale:=CNRCTB020.GETCDRPERSONALE(aEsercizio);
  CNRCTB050.LOCKPDG(aEsercizio, aCDRPersonale.cd_centro_responsabilita);

  -- Verifico che l'aggregato del CDR del personale NON sia chiuso in stato B

  if CNRCTB050.checkStatoAggregato(aEsercizio,
                                   aCDRPersonale.cd_centro_responsabilita,
								   CNRCTB050.STATO_AGGREGATO_FINALE) = 'Y'
  then
   IBMERR001.RAISE_ERR_GENERICO('L''agregato del CDR del personale risulta chiuso. Non è possibile effettuare lo scarico dei costi del personale');
  end if;

  if aCdCdr = aCDRPersonale.cd_centro_responsabilita then
   select count(*) into aNum from ass_cdp_pdg a, pdg_preventivo_spe_det b where
         a.esercizio = aEsercizio
	and  b.esercizio = a.esercizio
	and  b.cd_centro_responsabilita = a.cd_centro_responsabilita
	and  b.cd_linea_attivita = a.cd_linea_attivita
	and  b.ti_appartenenza = a.ti_appartenenza
	and  b.ti_gestione = a.ti_gestione
	and  b.cd_elemento_voce = a.cd_elemento_voce
	and  b.pg_spesa = a.pg_spesa
    and  b.origine=CNRCTB050.ORIGINE_STIPENDI
    and  b.categoria_dettaglio in (CNRCTB050.DETTAGLIO_SINGOLO,CNRCTB050.DETTAGLIO_SCARICO)
    and  a.cd_centro_responsabilita in (select cd_centro_responsabilita from V_PDG_CDR_RUO_NRUO where
		        esercizio = aEsercizio
		    and cd_cdr_root =  aCdCdr
		   );
  else
   select count(*) into aNum from ass_cdp_pdg where
        esercizio = aEsercizio
    and  cd_centro_responsabilita in (select cd_centro_responsabilita from V_PDG_CDR_RUO_NRUO where
		        esercizio = aEsercizio
		    and cd_cdr_root =  aCdCdr
		   );
  end if;

  if aNum > 0 then
   IBMERR001.RAISE_ERR_GENERICO('Operazione gia effettuata su cdr '||aCdCdr);
  end if;

  -- Stabilisco se il CDR ricevente e dell'UO Personale o no
  isCDRInUOPersonale:=false;
  if aCDRPersonale.cd_unita_organizzativa = aCDRRUO.cd_unita_organizzativa then
   isCDRInUOPersonale:=true;
  end if;

  aUOAfferenza:=CNRCTB020.getUOAfferenza(aCDRRUO);

  if not (CNRCTB050.GETSTATO(aEsercizio,aCDRPersonale.cd_centro_responsabilita) in (
	  CNRCTB050.STATO_PDG_INIZIALE,
	  CNRCTB050.STATO_PDG_PRE_CHIUSURA,
	  CNRCTB050.STATO_PDG_RC,
	  CNRCTB050.STATO_PDG_RC_PRE_CHIUSURA
	 )) then
   IBMERR001.RAISE_ERR_GENERICO('Il piano di gestione del CDR del personale '||aCDRPersonale.cd_centro_responsabilita||' non e in stato iniziale o di pre-chiusura!');
  end if;

  for aPDG in PDG_CON_CONFIG_SCR(aEsercizio, aCDRRUO.cd_centro_responsabilita) loop
   CNRCTB050.LOCKPDG(aEsercizio, aCDRRUO.cd_centro_responsabilita);
   if not (aPDG.stato in (
	   CNRCTB050.STATO_PDG_INIZIALE,
	   CNRCTB050.STATO_PDG_PRE_CHIUSURA,
	   CNRCTB050.STATO_PDG_RC,
	   CNRCTB050.STATO_PDG_RC_PRE_CHIUSURA
	  )) then
    IBMERR001.RAISE_ERR_GENERICO('Il piano di gestione del CDR NRUO '||aPDG.cd_centro_responsabilita||' non e in stato iniziale o di pre-chiusura!');
   end if;
  end loop;

  -- Il totale di scarico configurato dei dipendenti dell'UO e 100%  (comprendento le quote verso altre UO accettate)

  select count(*) into aNum from V_CDP_TOT_PRC where
         esercizio = aEsercizio
     and mese = 0
	 and cd_unita_organizzativa = aCDRRUO.cd_unita_organizzativa
	 and (
	         prc_a1 < 100
		  or prc_a2 < 100
		  or prc_a3 < 100
		 );

  if aNum > 0 Then

    For rec_err In     (Select Distinct id_matricola
                       From V_CDP_TOT_PRC where
                          esercizio = aEsercizio And
                          mese = 0 And
                          cd_unita_organizzativa = aCDRRUO.cd_unita_organizzativa
	                  and (prc_a1 < 100 Or
	                       prc_a2 < 100 Or
	                       prc_a3 < 100)) Loop

        matricola_err := matricola_err||' - '||rec_err.id_matricola;

    End Loop;

   IBMERR001.RAISE_ERR_GENERICO('La configurazione di scarico dei dipendenti dell''UO '||aCDRRUO.cd_unita_organizzativa||' non e'' completa per n. '||anum||' matricola/e ('||matricola_err||')');
  end if;

  -- Carico le voci del piano TFR e ONERICNR

  aVoceONERICNR:=CNRCTB000.GETVOCEONERICNR(aEsercizio);
  aVoceTFR:=CNRCTB000.GETVOCETFR(aEsercizio);

  -- Start dello scarico su PDG dei costi del personale

  for aASSCDPLA in (
      select * from V_CDP_SPACCATO_CDR_LA_VOCE where
	          esercizio = aEsercizio
		  and mese = 0
		  and cd_cdr_root = aCDRRUO.cd_centro_responsabilita order by cd_cdr) loop  -- Cicla sulle configurazioni di scarico

	-- Accantonamento degli arrotondamenti dovuti allo scarico corrente (per elemento voce e tipo rapporto)
    fill_round_table(aASSCDPLA, aTSNow, aUser);

    -- Determina il tipo di rapporto dalla tabella COSTO_DEL_DIPENDENTE

/* stani
    isTempoDeterminato:=false;
    if aASSCDPLA.ti_rapporto = CDP_TI_RAPP_DETERMINATO then
     isTempoDeterminato:=true;
    end if;
*/

    aDestS:=null;
	 -- CREO IL DETTAGLIO LA PRIMA VOLTA
    aDestS:=null;
    aPgDettaglio:=0;
	select NVL(max(pg_spesa),0) into aPgDettaglio from PDG_PREVENTIVO_SPE_DET where
            ESERCIZIO=aEsercizio
        and CD_CENTRO_RESPONSABILITA=aASSCDPLA.cd_cdr
        and CD_LINEA_ATTIVITA=aASSCDPLA.cd_linea_attivita
        and TI_APPARTENENZA=aASSCDPLA.ti_appartenenza
        and TI_GESTIONE=aASSCDPLA.ti_gestione
        and CD_ELEMENTO_VOCE=aASSCDPLA.cd_elemento_voce;

 	aPgDettaglio:=aPgDettaglio + 1;

 	 -- Leggo la linea di attivita per aggiornare il dettaglio del PDG con funzione e natura
 	select * into aLATmp from linea_attivita where
 	       cd_linea_attivita = aASSCDPLA.cd_linea_attivita
 	   and cd_centro_responsabilita = aASSCDPLA.cd_cdr;

    if
	       aUOAfferenza.cd_area_ricerca is null
       and aLaTmp.cd_natura = '5'
	then
	  IBMERR001.RAISE_ERR_GENERICO('Esiste una configurazione di scarico con LA di natura 5 su CDR collegato ad UO non collegata ad Area di Ricerca');
	end if;

    aDestS.ESERCIZIO:=aEsercizio;
    aDestS.CD_CENTRO_RESPONSABILITA:=aASSCDPLA.cd_cdr;
    aDestS.CD_LINEA_ATTIVITA:=aASSCDPLA.cd_linea_attivita;
    aDestS.CD_FUNZIONE:=aLATmp.cd_funzione;
    aDestS.CD_NATURA:=aLATmp.cd_natura;
    aDestS.TI_APPARTENENZA:=aASSCDPLA.ti_appartenenza;
    aDestS.TI_GESTIONE:=aASSCDPLA.ti_gestione;
    aDestS.CD_ELEMENTO_VOCE:=aASSCDPLA.cd_elemento_voce;
    aDestS.PG_SPESA:=aPgDettaglio;
    aDestS.DT_REGISTRAZIONE:=aTSNow;

    if aASSCDPLA.cd_elemento_voce = aVoceONERICNR.cd_elemento_voce then
       aDestS.DESCRIZIONE:=DESC_DETT_ONERI_CNR||' '||aASSCDPLA.ti_rapporto;
 	elsif aASSCDPLA.cd_elemento_voce = aVoceTFR.cd_elemento_voce then
       aDestS.DESCRIZIONE:=DESC_DETT_TFR||' '||aASSCDPLA.ti_rapporto;
    else
       aDestS.DESCRIZIONE:=DESC_DETT||' '||aASSCDPLA.ti_rapporto;
 	end if;

    aDestS.STATO:='Y';
    aDestS.ORIGINE:=CNRCTB050.ORIGINE_STIPENDI;
-- stani
    if isCDRInUOPersonale /*or isTempoDeterminato*/ Or
        (aASSCDPLA.cd_elemento_voce = aVoceTFR.cd_elemento_voce) then
        aDestS.CATEGORIA_DETTAGLIO:=CNRCTB050.DETTAGLIO_SINGOLO;
    else
        aDestS.CATEGORIA_DETTAGLIO:=CNRCTB050.DETTAGLIO_SCARICO;
    end if;

 	aDestS.FL_SOLA_LETTURA:='Y'; -- I DETTAGLI STIPENDIALI NON SONO TOCCABILI!!!

  	CNRCTB050.resetCampiImporto(aDestS);

 	if aASSCDPLA.cd_elemento_voce = aVoceTFR.cd_elemento_voce then
     setImportoTFR(aASSCDPLA, aDestS);
    else
     setImporto(aASSCDPLA, aDestS);
    end if;

    aDestS.DACR:=aTSNow;
    aDestS.UTCR:=aUser;
    aDestS.DUVA:=aTSNow;
    aDestS.UTUV:=aUser;
    aDestS.PG_VER_REC:=1;
    CNRCTB050.ins_PDG_PREVENTIVO_SPE_DET (aDestS);

    aAss.ESERCIZIO:=aDestS.esercizio;
    aAss.TI_PREV_CONS:=aASSCDPLA.ti_prev_cons;
    aAss.ID_MATRICOLA:=aASSCDPLA.ti_rapporto;
    aAss.CD_CENTRO_RESPONSABILITA:=aDestS.cd_centro_responsabilita;
    aAss.CD_LINEA_ATTIVITA:=aDestS.cd_linea_attivita;
    aAss.TI_APPARTENENZA:=aDestS.ti_appartenenza;
    aAss.TI_GESTIONE:=aDestS.ti_gestione;
    aAss.CD_ELEMENTO_VOCE:=aDestS.cd_elemento_voce;
    aAss.PG_SPESA:=aDestS.pg_spesa;
    aAss.DACR:=aTSNow;
    aAss.UTCR:=aUser;
    aAss.DUVA:=aTSNow;
    aAss.UTUV:=aUser;
    aAss.PG_VER_REC:=1;
    INS_ASS_CDP_PDG(aAss);
      -- Se il CDR d'origine non appartiene all'UO Personale e la matricola non e a tempo determinato,
      -- creo il dettaglio collegato nel CDR responsabile dell'UO del Personale
-- stani
    if not (isCDRInUoPersonale /*or isTempoDeterminato*/ Or
            (aASSCDPLA.cd_elemento_voce = aVoceTFR.cd_elemento_voce)) then

       -- Estraggo la linea di attivita di tipo SAUOP per il CDR in questione
       begin
 	    aLASAUOP:=CNRCTB010.getLASAUOP(aEsercizio, aCDRPersonale.cd_centro_responsabilita);
 	   exception when NO_DATA_FOUND then
 	    aLASAUOP:=CNRCTB010.creaLASAUOP(aEsercizio,aCDRPersonale.cd_centro_responsabilita,aUser);
 	   end;

       aPgDettaglioColl:=0;
 	   select NVL(max(pg_spesa),0) into aPgDettaglioColl from PDG_PREVENTIVO_SPE_DET where
            ESERCIZIO=aEsercizio
        and CD_CENTRO_RESPONSABILITA=aCDRPersonale.cd_centro_responsabilita
        and CD_LINEA_ATTIVITA=aLASAUOP.cd_linea_attivita
        and TI_APPARTENENZA=aASSCDPLA.ti_appartenenza
        and TI_GESTIONE=aASSCDPLA.ti_gestione
        and CD_ELEMENTO_VOCE=aASSCDPLA.cd_elemento_voce;

 	   aPgDettaglioColl:=aPgDettaglioColl + 1;

 	   aDestSColl:=null;
       aDestSColl.ESERCIZIO:=aEsercizio;
       aDestSColl.CD_CENTRO_RESPONSABILITA:=aCDRPersonale.cd_centro_responsabilita;
       aDestSColl.CD_LINEA_ATTIVITA:=aLASAUOP.cd_linea_attivita;
       aDestSColl.CD_FUNZIONE:=aLASAUOP.cd_funzione;
       aDestSColl.CD_NATURA:=aLASAUOP.cd_natura;
       aDestSColl.TI_APPARTENENZA:=aASSCDPLA.ti_appartenenza;
       aDestSColl.TI_GESTIONE:=aASSCDPLA.ti_gestione;
       aDestSColl.CD_ELEMENTO_VOCE:=aASSCDPLA.cd_elemento_voce;
       aDestSColl.PG_SPESA:=aPgDettaglioColl;
       aDestSColl.DT_REGISTRAZIONE:=aTSNow;

 	   if aASSCDPLA.cd_elemento_voce = aVoceONERICNR.cd_elemento_voce then
        aDestSColl.DESCRIZIONE:=DESC_DETT_ONERI_CNR||' '||aASSCDPLA.ti_rapporto;
       else
        aDestSColl.DESCRIZIONE:=DESC_DETT||' '||aASSCDPLA.ti_rapporto;
       end if;

       aDestSColl.STATO:='Y';
       aDestSColl.ORIGINE:=CNRCTB050.ORIGINE_STIPENDI;
       aDestSColl.CATEGORIA_DETTAGLIO:=CNRCTB050.DETTAGLIO_CARICO;

       -- Richiesta 137R

       aDestSColl.FL_SOLA_LETTURA:='N';

 	   aDestSColl.PG_SPESA_CLGS:=aDestS.PG_SPESA;
       aDestSColl.CD_CENTRO_RESPONSABILITA_CLGS:=aDestS.CD_CENTRO_RESPONSABILITA;
       aDestSColl.CD_LINEA_ATTIVITA_CLGS:=aDestS.CD_LINEA_ATTIVITA;
       aDestSColl.TI_APPARTENENZA_CLGS:=aDestS.TI_APPARTENENZA;
       aDestSColl.TI_GESTIONE_CLGS:=aDestS.TI_GESTIONE;
       aDestSColl.CD_ELEMENTO_VOCE_CLGS:=aDestS.CD_ELEMENTO_VOCE;

 	   CNRCTB050.resetCampiImporto(aDestSColl);
 	   setImportoDettaglioCollegato(aDestSColl, aDestS);

       aDestSColl.DACR:=aTSNow;
       aDestSColl.UTCR:=aUser;
       aDestSColl.DUVA:=aTSNow;
       aDestSColl.UTUV:=aUser;
       aDestSColl.PG_VER_REC:=1;
       CNRCTB050.ins_PDG_PREVENTIVO_SPE_DET (aDestSColl);

 	  -- Aggiorno il dettaglio originale con i dati del dettaglio collegato

 	   update PDG_PREVENTIVO_SPE_DET set
 	   PG_SPESA_CLGS = aPgDettaglioColl,
        CD_CENTRO_RESPONSABILITA_CLGS=aDestSColl.cd_centro_responsabilita,
        CD_LINEA_ATTIVITA_CLGS=aDestSColl.cd_linea_attivita,
        TI_APPARTENENZA_CLGS=aDestSColl.ti_appartenenza,
        TI_GESTIONE_CLGS=aDestSColl.ti_gestione,
        CD_ELEMENTO_VOCE_CLGS=aDestSColl.cd_elemento_voce
 	   where
            ESERCIZIO=aDestS.esercizio
        and CD_CENTRO_RESPONSABILITA=aDestS.cd_centro_responsabilita
        and CD_LINEA_ATTIVITA=aDestS.cd_linea_attivita
        and TI_APPARTENENZA=aDestS.ti_appartenenza
        and TI_GESTIONE=aDestS.ti_gestione
        and CD_ELEMENTO_VOCE=aDestS.cd_elemento_voce
 	    and PG_SPESA=aDestS.pg_spesa;

 	  -- Inserisce il collegamento tra CDP e dettaglio di CARICO su UO Personale
       aAss.ESERCIZIO:=aDestSColl.esercizio;
       aAss.TI_PREV_CONS:=aASSCDPLA.ti_prev_cons;
       aAss.ID_MATRICOLA:=aASSCDPLA.ti_rapporto;
	   aAss.CD_CENTRO_RESPONSABILITA:=aDestSColl.cd_centro_responsabilita;
       aAss.CD_LINEA_ATTIVITA:=aDestSColl.cd_linea_attivita;
       aAss.TI_APPARTENENZA:=aDestSColl.ti_appartenenza;
       aAss.TI_GESTIONE:=aDestSColl.ti_gestione;
       aAss.CD_ELEMENTO_VOCE:=aDestSColl.cd_elemento_voce;
       aAss.PG_SPESA:=aDestSColl.pg_spesa;
       aAss.DACR:=aTSNow;
       aAss.UTCR:=aUser;
       aAss.DUVA:=aTSNow;
       aAss.UTUV:=aUser;
       aAss.PG_VER_REC:=1;
       INS_ASS_CDP_PDG(aAss);
 	end if;
    update ass_cdp_la set
	     stato = STATO_CDP_SCARICATO
	    ,dt_scarico = aTSNow
		,utuv=aUser
		,duva=aTSNow
		,pg_ver_rec = pg_ver_rec + 1
    where
	       esercizio = aASSCDPLA.esercizio
	   and mese = 0
	   and cd_centro_responsabilita = aASSCDPLA.cd_cdr
	   and cd_linea_attivita = aASSCDPLA.cd_linea_attivita
	   and stato = STATO_CDP_NON_SCARICATO;
  end loop;

  -- Distribuzione dei rotti su dettagli creati

  for aAssCdpRnd in (select * from ass_cdp_round where
	          esercizio = aEsercizio
		  and cd_cdr_root = aCDRRUO.cd_centro_responsabilita
		  for update nowait) loop  -- Cicla sulle configurazioni dei ROTTI
   isDettRedistrRottiFound:=false;
   for aModSpeDet in (select p.* from pdg_preventivo_spe_det p, V_PDG_CDR_RUO_NRUO c where
                p.esercizio=aAssCdpRnd.esercizio
			and c.cd_cdr_root = aAssCdpRnd.cd_cdr_root
			and c.esercizio=p.esercizio
            and p.cd_centro_responsabilita=c.cd_centro_responsabilita
			and p.origine=CNRCTB050.ORIGINE_STIPENDI
			and p.ti_appartenenza = aAssCdpRnd.ti_appartenenza
			and p.ti_gestione = aAssCdpRnd.ti_gestione
			and p.cd_elemento_voce = aAssCdpRnd.cd_elemento_voce
			and p.categoria_dettaglio in (CNRCTB050.DETTAGLIO_SINGOLO,CNRCTB050.DETTAGLIO_SCARICO)
			and exists (select 1 from ass_cdp_pdg where
			           ESERCIZIO=p.esercizio
                   and CD_CENTRO_RESPONSABILITA=p.cd_centro_responsabilita
                   and CD_LINEA_ATTIVITA=p.cd_linea_attivita
                   and TI_APPARTENENZA=p.ti_appartenenza
                   and TI_GESTIONE=p.ti_gestione
                   and CD_ELEMENTO_VOCE=p.cd_elemento_voce
                   and PG_SPESA=p.pg_spesa
				   and ti_prev_cons=TIPO_PREVENTIVO
				   and id_matricola=aAssCdpRnd.ti_rapporto
			)
   ) loop
    isProcessato:=false;
/* stani     if
	      not isProcessato
	  and     aAssCdpRnd.ti_rapporto=CDP_TI_RAPP_DETERMINATO
	  and not aAssCdpRnd.cd_elemento_voce = aVoceTFR.cd_elemento_voce
	  and aModSpeDet.CATEGORIA_DETTAGLIO=CNRCTB050.DETTAGLIO_SINGOLO
	then
     if
                 (aModSpeDet.IM_RO_CSS_ALTRI_COSTI = 0 and aAssCdpRnd.im_arr_a1 <> 0)
			  or aModSpeDet.IM_RO_CSS_ALTRI_COSTI+aAssCdpRnd.im_arr_a1 < 0
     then
      null;
     else
      update pdg_preventivo_spe_det set
       IM_RO_CSS_ALTRI_COSTI=IM_RO_CSS_ALTRI_COSTI+aAssCdpRnd.im_arr_a1
	  where
            ESERCIZIO=aModSpeDet.esercizio
        and CD_CENTRO_RESPONSABILITA=aModSpeDet.cd_centro_responsabilita
        and CD_LINEA_ATTIVITA=aModSpeDet.cd_linea_attivita
        and TI_APPARTENENZA=aModSpeDet.ti_appartenenza
        and TI_GESTIONE=aModSpeDet.ti_gestione
        and CD_ELEMENTO_VOCE=aModSpeDet.cd_elemento_voce
 	    and PG_SPESA=aModSpeDet.pg_spesa;
      isProcessato:=true;
     end if;
	end if;
*/
	if
	        not isProcessato
	    and aAssCdpRnd.cd_elemento_voce = aVoceTFR.cd_elemento_voce
	    and aModSpeDet.CATEGORIA_DETTAGLIO=CNRCTB050.DETTAGLIO_SINGOLO
	then
     if
              (aModSpeDet.IM_RO_CSS_ALTRI_COSTI=0 and aAssCdpRnd.im_arr_a1 <> 0)
           or (aModSpeDet.IM_RAA_A2_COSTI_FINALI=0 and aAssCdpRnd.im_arr_a2 <> 0)
           or (aModSpeDet.IM_RAH_A3_COSTI_FINALI=0 and aAssCdpRnd.im_arr_a3 <> 0)
           or aModSpeDet.IM_RO_CSS_ALTRI_COSTI+aAssCdpRnd.im_arr_a1 < 0
           or aModSpeDet.IM_RAA_A2_COSTI_FINALI+aAssCdpRnd.im_arr_a2 < 0
           or aModSpeDet.IM_RAH_A3_COSTI_FINALI+aAssCdpRnd.im_arr_a3 < 0
     then
      null;
     else
      update pdg_preventivo_spe_det set
       IM_RO_CSS_ALTRI_COSTI=IM_RO_CSS_ALTRI_COSTI+aAssCdpRnd.im_arr_a1
      ,IM_RAA_A2_COSTI_FINALI=IM_RAA_A2_COSTI_FINALI+aAssCdpRnd.im_arr_a2
      ,IM_RAH_A3_COSTI_FINALI=IM_RAH_A3_COSTI_FINALI+aAssCdpRnd.im_arr_a3
	  where
            ESERCIZIO=aModSpeDet.esercizio
        and CD_CENTRO_RESPONSABILITA=aModSpeDet.cd_centro_responsabilita
        and CD_LINEA_ATTIVITA=aModSpeDet.cd_linea_attivita
        and TI_APPARTENENZA=aModSpeDet.ti_appartenenza
        and TI_GESTIONE=aModSpeDet.ti_gestione
        and CD_ELEMENTO_VOCE=aModSpeDet.cd_elemento_voce
 	    and PG_SPESA=aModSpeDet.pg_spesa;
      isProcessato:=true;
     end if;
    end if;

	if
	      not isProcessato
	  and not (
	      aAssCdpRnd.cd_elemento_voce = aVoceTFR.cd_elemento_voce
	 -- stani  or aAssCdpRnd.ti_rapporto=CDP_TI_RAPP_DETERMINATO
	  ) and aModSpeDet.CATEGORIA_DETTAGLIO=CNRCTB050.DETTAGLIO_SINGOLO
	then
     if
              (aModSpeDet.IM_RK_CCS_SPESE_OGC = 0 and aAssCdpRnd.im_arr_a1 <> 0)
           or (aModSpeDet.IM_RAE_A2_SPESE_OGC = 0 and aAssCdpRnd.im_arr_a2 <> 0)
           or (aModSpeDet.IM_RAN_A3_SPESE_OGC = 0 and aAssCdpRnd.im_arr_a3 <> 0)
           or aModSpeDet.IM_RK_CCS_SPESE_OGC+aAssCdpRnd.im_arr_a1 < 0
           or aModSpeDet.IM_RAE_A2_SPESE_OGC+aAssCdpRnd.im_arr_a2 < 0
           or aModSpeDet.IM_RAN_A3_SPESE_OGC+aAssCdpRnd.im_arr_a3 < 0
     then
      null;
     else
      update pdg_preventivo_spe_det set
       IM_RK_CCS_SPESE_OGC=IM_RK_CCS_SPESE_OGC+aAssCdpRnd.im_arr_a1
      ,IM_RH_CCS_COSTI=IM_RH_CCS_COSTI+aAssCdpRnd.im_arr_a1
      ,IM_RAE_A2_SPESE_OGC=IM_RAE_A2_SPESE_OGC+aAssCdpRnd.im_arr_a2
      ,IM_RAA_A2_COSTI_FINALI=IM_RAA_A2_COSTI_FINALI+aAssCdpRnd.im_arr_a2
      ,IM_RAN_A3_SPESE_OGC=IM_RAN_A3_SPESE_OGC+aAssCdpRnd.im_arr_a3
      ,IM_RAH_A3_COSTI_FINALI=IM_RAH_A3_COSTI_FINALI+aAssCdpRnd.im_arr_a3
	  where
            ESERCIZIO=aModSpeDet.esercizio
        and CD_CENTRO_RESPONSABILITA=aModSpeDet.cd_centro_responsabilita
        and CD_LINEA_ATTIVITA=aModSpeDet.cd_linea_attivita
        and TI_APPARTENENZA=aModSpeDet.ti_appartenenza
        and TI_GESTIONE=aModSpeDet.ti_gestione
        and CD_ELEMENTO_VOCE=aModSpeDet.cd_elemento_voce
 	    and PG_SPESA=aModSpeDet.pg_spesa;
      isProcessato:=true;
     end if;
    end if;
	if
          not isProcessato
	  and not (
	      aAssCdpRnd.cd_elemento_voce = aVoceTFR.cd_elemento_voce
	   -- stani or aAssCdpRnd.ti_rapporto=CDP_TI_RAPP_DETERMINATO
	  ) and
	  aModSpeDet.CATEGORIA_DETTAGLIO=CNRCTB050.DETTAGLIO_SCARICO
	then
     if
              (aModSpeDet.IM_RL_CCS_SPESE_OGC_ALTRA_UO=0 and aAssCdpRnd.im_arr_a1 <> 0)
           or (aModSpeDet.IM_RAF_A2_SPESE_OGC_ALTRA_UO=0 and aAssCdpRnd.im_arr_a2 <> 0)
           or (aModSpeDet.IM_RAO_A3_SPESE_OGC_ALTRA_UO=0 and aAssCdpRnd.im_arr_a3 <> 0)
           or aModSpeDet.IM_RL_CCS_SPESE_OGC_ALTRA_UO+aAssCdpRnd.im_arr_a1 < 0
           or aModSpeDet.IM_RAF_A2_SPESE_OGC_ALTRA_UO+aAssCdpRnd.im_arr_a2 < 0
           or aModSpeDet.IM_RAO_A3_SPESE_OGC_ALTRA_UO+aAssCdpRnd.im_arr_a3 < 0
     then
      null;
     else
      update pdg_preventivo_spe_det set
       IM_RL_CCS_SPESE_OGC_ALTRA_UO=IM_RL_CCS_SPESE_OGC_ALTRA_UO+aAssCdpRnd.im_arr_a1
      ,IM_RH_CCS_COSTI=IM_RH_CCS_COSTI+aAssCdpRnd.im_arr_a1
      ,IM_RAF_A2_SPESE_OGC_ALTRA_UO=IM_RAF_A2_SPESE_OGC_ALTRA_UO+aAssCdpRnd.im_arr_a2
      ,IM_RAA_A2_COSTI_FINALI=IM_RAA_A2_COSTI_FINALI+aAssCdpRnd.im_arr_a2
      ,IM_RAO_A3_SPESE_OGC_ALTRA_UO=IM_RAO_A3_SPESE_OGC_ALTRA_UO+aAssCdpRnd.im_arr_a3
      ,IM_RAH_A3_COSTI_FINALI=IM_RAH_A3_COSTI_FINALI+aAssCdpRnd.im_arr_a3
	  where
            ESERCIZIO=aModSpeDet.esercizio
        and CD_CENTRO_RESPONSABILITA=aModSpeDet.cd_centro_responsabilita
        and CD_LINEA_ATTIVITA=aModSpeDet.cd_linea_attivita
        and TI_APPARTENENZA=aModSpeDet.ti_appartenenza
        and TI_GESTIONE=aModSpeDet.ti_gestione
        and CD_ELEMENTO_VOCE=aModSpeDet.cd_elemento_voce
 	    and PG_SPESA=aModSpeDet.pg_spesa;
      update pdg_preventivo_spe_det set
         IM_RU_SPESE_COSTI_ALTRUI=IM_RU_SPESE_COSTI_ALTRUI+aAssCdpRnd.im_arr_a1
        ,IM_RAG_A2_SPESE_COSTI_ALTRUI=IM_RAG_A2_SPESE_COSTI_ALTRUI+aAssCdpRnd.im_arr_a2
        ,IM_RAP_A3_SPESE_COSTI_ALTRUI=IM_RAP_A3_SPESE_COSTI_ALTRUI+aAssCdpRnd.im_arr_a3
	  where
            ESERCIZIO=aModSpeDet.esercizio
        and CD_CENTRO_RESPONSABILITA=aModSpeDet.cd_centro_responsabilita_clgs
        and CD_LINEA_ATTIVITA=aModSpeDet.cd_linea_attivita_clgs
        and TI_APPARTENENZA=aModSpeDet.ti_appartenenza_clgs
        and TI_GESTIONE=aModSpeDet.ti_gestione_clgs
        and CD_ELEMENTO_VOCE=aModSpeDet.cd_elemento_voce_clgs
 	    and PG_SPESA=aModSpeDet.pg_spesa_clgs;
	   isProcessato:=true;
     end if;
    end if;
    if isProcessato then
	 update ass_cdp_round set
	     cd_centro_responsabilita = aModSpeDet.cd_centro_responsabilita
	    ,cd_linea_attivita = aModSpeDet.cd_linea_attivita
	    ,pg_spesa = aModSpeDet.pg_spesa
		,im_arr_a1_non_distr = round(aAssCdpRnd.im_arr_a1 - round(aAssCdpRnd.im_arr_a1,2),30)
		,im_arr_a2_non_distr = round(aAssCdpRnd.im_arr_a2 - round(aAssCdpRnd.im_arr_a2,2),30)
		,im_arr_a3_non_distr = round(aAssCdpRnd.im_arr_a3 - round(aAssCdpRnd.im_arr_a3,2),30)
	 where
            ESERCIZIO=aAssCdpRnd.esercizio
        and CD_CDR_ROOT=aAssCdpRnd.CD_CDR_ROOT
        and TI_APPARTENENZA=aAssCdpRnd.ti_appartenenza
        and TI_GESTIONE=aAssCdpRnd.ti_gestione
        and CD_ELEMENTO_VOCE=aAssCdpRnd.cd_elemento_voce
 	    and TI_RAPPORTO=aAssCdpRnd.ti_rapporto;
     isDettRedistrRottiFound:=true;
     exit;
    end if;
   end loop;
   if not isDettRedistrRottiFound then
    IBMERR001.RAISE_ERR_GENERICO('Impossibile redistribuire i rotti per cdr RUO:'||aAssCdpRnd.cd_cdr_root||' es:'||aAssCdpRnd.esercizio||'voce del piano:'||aAssCdpRnd.cd_elemento_voce||' tipo rapporto:'||aAssCdpRnd.ti_rapporto);
   end if;
  end loop;

 end;

 procedure annullaCDPSuPdg(aEsercizio number, aCdCdr varchar2, aUser varchar2) is
  aTSNow date;
  aCDRRUO cdr%rowtype;
  aCDRPersonale cdr%rowtype;
  aNum number(8);
 begin
  aTSNow:=sysdate;

  -- Leggo il CDR

  aCDRRUO:=CNRCTB020.GETCDRVALIDO(aEsercizio, aCdCdr);

  if to_number(aCDRRUO.cd_proprio_cdr) != 0 then
   IBMERR001.RAISE_ERR_GENERICO('Operazione permessa solo su CDR di tipo RUO!');
  end if;

  select count(*) into aNum from ass_cdp_pdg where
   esercizio = aEsercizio
   and cd_centro_responsabilita in (select cd_centro_responsabilita from V_PDG_CDR_RUO_NRUO where
		        esercizio = aEsercizio
		    and cd_cdr_root =  aCdCdr
		   );

  if aNum = 0 then
   IBMERR001.RAISE_ERR_GENERICO('Operazione di scarico non ancora effettuata per cdr '||aCdCdr);
  end if;

  -- Leggo il CDR del personale

  aCDRPersonale:=CNRCTB020.GETCDRPERSONALE(aEsercizio);

  -- Lock PDG del CDR del personale

  CNRCTB050.LOCKPDG(aEsercizio, aCDRPersonale.cd_centro_responsabilita);

  -- Verifico che l'aggregato del CDR del personale NON sia chiuso in stato B

  if CNRCTB050.checkStatoAggregato(aEsercizio,
                                   aCDRPersonale.cd_centro_responsabilita,
								   CNRCTB050.STATO_AGGREGATO_FINALE) = 'Y'
  then
   IBMERR001.RAISE_ERR_GENERICO('L''agregato del CDR del personale risulta chiuso. Non è possibile annullare lo scarico dei costi del personale');
  end if;

  -- Controllo modificabilita PDG CDR Personale

  if not (CNRCTB050.GETSTATO(aEsercizio,aCDRPersonale.cd_centro_responsabilita) in (
	                 CNRCTB050.STATO_PDG_INIZIALE,
	                 CNRCTB050.STATO_PDG_PRE_CHIUSURA,
	                 CNRCTB050.STATO_PDG_RC,
	                 CNRCTB050.STATO_PDG_RC_PRE_CHIUSURA
        )) then
   IBMERR001.RAISE_ERR_GENERICO('Il piano di gestione del CDR del personale '||aCDRPersonale.cd_centro_responsabilita||' non e attualmente modificabile!');
  end if;

  -- Controllo modificabilita PDG CDR RUO/NRUO

  for aPDG in PDG_CON_CONFIG_SCR(aEsercizio, aCDRRUO.cd_centro_responsabilita) loop
   if not (aPDG.stato in (
	            CNRCTB050.STATO_PDG_INIZIALE,
	            CNRCTB050.STATO_PDG_PRE_CHIUSURA,
	            CNRCTB050.STATO_PDG_RC,
	            CNRCTB050.STATO_PDG_RC_PRE_CHIUSURA
          )) then
    IBMERR001.RAISE_ERR_GENERICO('Il piano di gestione del CDR '||aPDG.cd_centro_responsabilita||' non e in stato iniziale o di pre-chiusura!');
   end if;
  end loop;

  -- Eliminazione dei dettagli collegati nel CDR del personale

  delete from pdg_preventivo_spe_det where
         esercizio = aEsercizio
	 and cd_centro_responsabilita = aCDRPersonale.cd_centro_responsabilita
	 and cd_centro_responsabilita_clgs in (select cd_centro_responsabilita from V_PDG_CDR_RUO_NRUO where
		       esercizio = aEsercizio
		   and cd_cdr_root =  aCdCdr
		  )
     and categoria_dettaglio in (CNRCTB050.DETTAGLIO_CARICO)
     and origine = CNRCTB050.ORIGINE_STIPENDI;

  -- Eliminazione del dettaglio principale nel CDR di origine

  delete from pdg_preventivo_spe_det where
         esercizio = aEsercizio
	 and cd_centro_responsabilita in (select cd_centro_responsabilita from V_PDG_CDR_RUO_NRUO where
		        esercizio = aEsercizio
		    and cd_cdr_root =  aCdCdr
		 )
     and categoria_dettaglio in (CNRCTB050.DETTAGLIO_SINGOLO, CNRCTB050.DETTAGLIO_SCARICO)
     and origine = CNRCTB050.ORIGINE_STIPENDI;

  update ass_cdp_la set
	     stato = STATO_CDP_NON_SCARICATO
	    ,dt_scarico = null
		,utuv = aUser
		,duva = aTSNow
		,pg_ver_rec = pg_ver_rec + 1
	where
	     esercizio = aEsercizio
     and mese = 0
	 and (
	          cd_centro_responsabilita = aCdCdr
		   or cd_centro_responsabilita in (select cd_centro_responsabilita from V_PDG_CDR_RUO_NRUO where
		        esercizio = aEsercizio
		    and cd_cdr_root =  aCdCdr
           )
         );
 end;

 -- Verifica di scarico completo dei dipendenti su di un certo CDR
 --
 -- 1. Per ogni CDR responsabile di UO verifico che:
 --   1a. non esistono pending da altra UO
 --   1b. che tutte le  percentuali di matricole
 --       di altra UO accettate dall'UO in processo siano state configurate in ripartizione nell'UO al 100%
 --
 -- 2. Per ogni CDR verifico che:
 --     2a. tutti i costi configurati sul quel CDR siano stati scaricati su PDG

 function checkScaricoCDPCompleto(aEsercizio number, aCdCdr varchar2) return char is
  aNum NUMBER(8);
  aCdr cdr%rowtype;
  aCDRPersonale cdr%rowtype;
  aPDGConScarichi pdg_preventivo%rowtype;
  aTotNonConfig number;
  aNumConfNonCompl number;
 begin


  -- Leggo il CDR del personale e lock del PDG

  aCDRPersonale:=CNRCTB020.GETCDRPERSONALE(aEsercizio);

  -- Se il cdr del personale e il CDR in processo devo applicare il controllo a tutti i CDR validi

  if aCDRPersonale.cd_centro_responsabilita = aCdCdr then
   aTotNonConfig:=0;
   -- Verifico che non esistano matricole non configurate in tutto il CNR
   select count(*) into aTotNonConfig from costo_del_dipendente a where
       a.esercizio=aEsercizio
   and a.mese = 0
   and not exists (
    select 1 from ass_cdp_la where
	     esercizio = a.esercizio
	 and id_matricola = a.id_matricola
     and mese = 0
   ) and not exists (
    select 1 from ass_cdp_uo where
     	 esercizio = a.esercizio
	 and id_matricola = a.id_matricola
     and mese = 0
	 and stato != STATO_ALTRAUO_RIFIUTATO
   );
   if aTotNonConfig > 0 then
    IBMERR001.RAISE_ERR_GENERICO('Esistono matricole non configurate in termini di CDR/LA');
   end if;

   -- locko il cdr del personale
   CNRCTB050.LOCKPDG(aEsercizio, aCDRPersonale.cd_centro_responsabilita);
   for aCdrNonPersonale in (select * from v_cdr_valido where
                                  esercizio = aEsercizio
							  and cd_centro_responsabilita != aCDRPersonale.cd_centro_responsabilita) loop
    if checkScaricoCDPCompleto(aEsercizio, aCdrNonPersonale.cd_centro_responsabilita)='N' then
	 return 'N';
	end if;
/*
	begin
	 select * into aPDGConScarichi from pdg_preventivo a where
	      a.esercizio = aEsercizio
	  and a.cd_centro_responsabilita = aCdrNonPersonale.cd_centro_responsabilita
	  and exists (select 1 from ass_cdp_la where
	       esercizio = aEsercizio
	   and cd_centro_responsabilita = a.cd_centro_responsabilita
       and mese = 0
	  );
	  if not (aPDGConScarichi.stato = CNRCTB050.STATO_PDG_CHIUSURA or aPDGConScarichi.stato = CNRCTB050.STATO_PDG_FINALE) then
	   return 'N';
	  end if;
	exception when NO_DATA_FOUND then
	 null;
	end;
*/
   end loop;
  end if;

  -- Leggo il CDR

  aCDR:=CNRCTB020.GETCDRVALIDO(aEsercizio, aCdCdr);

  -- Se si tratta di CDR RUO (non del personale) devo verificare che NON esistano matricole NON configurate appartenenti all'UO

  if aCDR.cd_centro_responsabilita != aCDRPersonale.cd_centro_responsabilita and to_number(aCDR.cd_proprio_cdr) = 0 then -- Cdr responsabile di UO
      aTotNonConfig:=0;
	  -- Verifico che non esistano matricole non configurate e appartenenti all'UO di cui aCDR e responsabile
      select count(*) into aTotNonConfig from costo_del_dipendente a where
           a.esercizio=aEsercizio
	   and a.mese=0
       and a.cd_unita_organizzativa=aCDR.cd_unita_organizzativa
	   and not exists (
          select 1 from ass_cdp_la where
   	           esercizio = a.esercizio
   	       and id_matricola = a.id_matricola
           and mese = 0
       )
	   and not exists (
          select 1 from ass_cdp_uo where
        	   esercizio = a.esercizio
   	       and id_matricola = a.id_matricola
           and mese = 0
	       and stato != STATO_ALTRAUO_RIFIUTATO
       );
      if aTotNonConfig > 0 then
       IBMERR001.RAISE_ERR_GENERICO('Esistono matricole non configurate in termini di CDR/LA');
      end if;
  end if;

  -- 1. Per ogni CDR responsabile di UO verifico che:
  --   1a. non esistono pending da altra UO
  --   1b. che tutte le  percentuali di matricole
  --       di altra UO accettate dall'UO in processo siano state configurate in ripartizione nell'UO al 100%

  if to_number(aCDR.cd_proprio_cdr) = 0 then

   -- Il totale di scarico configurato dei dipendenti dell'UO e 100%  (comprendento le quote verso altre UO accettate)

   aNumConfNonCompl:=0;
   select count(*) into aNumConfNonCompl from V_CDP_TOT_PRC where
        esercizio = aEsercizio
    and mese = 0
    and cd_unita_organizzativa = aCDR.cd_unita_organizzativa
    and (
          prc_a1 < 100
       or prc_a2 < 100
       or prc_a3 < 100
    );
   if aNumConfNonCompl > 0 then
    IBMERR001.RAISE_ERR_GENERICO('La configurazione di scarico dei dipendenti dell''UO '||aCDR.cd_unita_organizzativa||' non e completa!');
   end if;

   -- Non esistono pending da altra UO

   for aAssCDPUO in (
    select * from ASS_CDP_UO
     where
 	      esercizio = aEsercizio
      and mese = 0
	  and cd_unita_organizzativa = aCDR.cd_unita_organizzativa
	  and stato = STATO_ALTRAUO_NONDEFINITO
   ) loop
    return 'N';
   end loop;


   -- Tutto cio che e stato accettato da altra UO risulta configurato per lo scrico all'interno dell'UO al 100%

   for aAssCDPUO in (
    select * from ASS_CDP_UO
     where
 	      esercizio = aEsercizio
      and mese =0
	  and cd_unita_organizzativa = aCDR.cd_unita_organizzativa
	  and stato = STATO_ALTRAUO_ACCETTATO
   ) loop
    aNum:=0;
    select count(*) into aNum from (select id_matricola from ASS_CDP_LA where
         esercizio = aEsercizio
     and mese=0
     and id_matricola = aAssCDPUO.id_matricola
	 and fl_dip_altra_uo = 'Y'
	 and (esercizio, cd_centro_responsabilita) in (
	  select esercizio, cd_centro_responsabilita from V_PDG_CDR_RUO_NRUO where
     	   esercizio = aEsercizio
	   and cd_cdr_root = aCDR.cd_centro_responsabilita
	 )
     group by id_matricola
     having
	     sum(prc_la_a1) != 100
      or sum(prc_la_a2) != 100
	  or sum(prc_la_a3) != 100
    );
    if aNum > 0 then
     return 'N';
    end if;
   end loop;

  end if; -- Fine blocco applicato a CDR responsabile di UO

 -- 2. Per ogni CDR verifico che:
 --     2a. tutti i costi configurati sul quel CDR siano stati scaricati su PDG

  aNum:=0;
  select count(*) into aNum from ASS_CDP_LA where
        esercizio = aEsercizio
    and mese =0
    and cd_centro_responsabilita = aCdCdr
    and stato <> STATO_CDP_SCARICATO;
  if aNum > 0 then
   return 'N';
  end if;

  return 'Y';
 end;

 procedure ins_ASS_CDP_PDG (aDest ASS_CDP_PDG%rowtype) is
  begin
   insert into ASS_CDP_PDG (
     ESERCIZIO
    ,TI_PREV_CONS
    ,ID_MATRICOLA
    ,CD_CENTRO_RESPONSABILITA
    ,CD_LINEA_ATTIVITA
    ,TI_APPARTENENZA
    ,TI_GESTIONE
    ,CD_ELEMENTO_VOCE
    ,PG_SPESA
    ,DACR
    ,UTCR
    ,DUVA
    ,UTUV
    ,PG_VER_REC
   ) values (
     aDest.ESERCIZIO
    ,aDest.TI_PREV_CONS
    ,aDest.ID_MATRICOLA
    ,aDest.CD_CENTRO_RESPONSABILITA
    ,aDest.CD_LINEA_ATTIVITA
    ,aDest.TI_APPARTENENZA
    ,aDest.TI_GESTIONE
    ,aDest.CD_ELEMENTO_VOCE
    ,aDest.PG_SPESA
    ,aDest.DACR
    ,aDest.UTCR
    ,aDest.DUVA
    ,aDest.UTUV
    ,aDest.PG_VER_REC
    );
 end;

 procedure ins_COSTO_DEL_DIPENDENTE (aDest COSTO_DEL_DIPENDENTE%rowtype) is
  begin
   insert into COSTO_DEL_DIPENDENTE (
     ESERCIZIO
    ,TI_PREV_CONS
    ,ID_MATRICOLA
    ,TI_APPARTENENZA
    ,TI_GESTIONE
    ,CD_ELEMENTO_VOCE
    ,CD_UNITA_ORGANIZZATIVA
    ,TI_RAPPORTO
    ,IM_A1
    ,IM_A2
    ,IM_A3
    ,IM_ONERI_CNR_A1
    ,IM_ONERI_CNR_A2
    ,IM_ONERI_CNR_A3
    ,IM_TFR_A1
    ,IM_TFR_A2
    ,IM_TFR_A3
    ,DT_SCARICO
    ,DACR
    ,UTCR
    ,UTUV
    ,DUVA
    ,PG_VER_REC
   ) values (
     aDest.ESERCIZIO
    ,aDest.TI_PREV_CONS
    ,aDest.ID_MATRICOLA
    ,aDest.TI_APPARTENENZA
    ,aDest.TI_GESTIONE
    ,aDest.CD_ELEMENTO_VOCE
    ,aDest.CD_UNITA_ORGANIZZATIVA
    ,aDest.TI_RAPPORTO
    ,aDest.IM_A1
    ,aDest.IM_A2
    ,aDest.IM_A3
    ,aDest.IM_ONERI_CNR_A1
    ,aDest.IM_ONERI_CNR_A2
    ,aDest.IM_ONERI_CNR_A3
    ,aDest.IM_TFR_A1
    ,aDest.IM_TFR_A2
    ,aDest.IM_TFR_A3
    ,aDest.DT_SCARICO
    ,aDest.DACR
    ,aDest.UTCR
    ,aDest.UTUV
    ,aDest.DUVA
    ,aDest.PG_VER_REC
    );
 end;

 procedure ins_ASS_CDP_ROUND (aDest ASS_CDP_ROUND%rowtype) is
  begin
   insert into ASS_CDP_ROUND (
     ESERCIZIO
    ,CD_CDR_ROOT
    ,TI_APPARTENENZA
    ,TI_GESTIONE
    ,CD_ELEMENTO_VOCE
    ,TI_RAPPORTO
    ,IM_ARR_A1
    ,IM_ARR_A2
    ,IM_ARR_A3
    ,IM_ARR_A1_NON_DISTR
    ,IM_ARR_A2_NON_DISTR
    ,IM_ARR_A3_NON_DISTR
    ,CD_CENTRO_RESPONSABILITA
    ,CD_LINEA_ATTIVITA
    ,PG_SPESA
    ,DACR
    ,UTUV
    ,UTCR
    ,DUVA
    ,PG_VER_REC
   ) values (
     aDest.ESERCIZIO
    ,aDest.CD_CDR_ROOT
    ,aDest.TI_APPARTENENZA
    ,aDest.TI_GESTIONE
    ,aDest.CD_ELEMENTO_VOCE
    ,aDest.TI_RAPPORTO
    ,aDest.IM_ARR_A1
    ,aDest.IM_ARR_A2
    ,aDest.IM_ARR_A3
    ,aDest.IM_ARR_A1_NON_DISTR
    ,aDest.IM_ARR_A2_NON_DISTR
    ,aDest.IM_ARR_A3_NON_DISTR
    ,aDest.CD_CENTRO_RESPONSABILITA
    ,aDest.CD_LINEA_ATTIVITA
    ,aDest.PG_SPESA
    ,aDest.DACR
    ,aDest.UTUV
    ,aDest.UTCR
    ,aDest.DUVA
    ,aDest.PG_VER_REC
    );
 end;

end;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy