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

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

There is a newer version: 6.5.103
Show newest version
--------------------------------------------------------
--  DDL for Package Body CNRMIG080
--------------------------------------------------------

create or replace PACKAGE BODY "CNRMIG080" is

 procedure IMPOSTA_DATA_CESSAZIONE (aAnnoRif Number, aMeseRif Number, aUtente varchar2) is
 	dt_cessazione date;
 	aAnnoRif_prec number;
 	aMeseRif_prec number;
 Begin
 --Dbms_Output.put_line('IMPOSTA_DATA_CESSAZIONE');
 	if aMeseRif = 1 then
 		aMeseRif_prec := 12;
 		aAnnoRif_prec := aAnnoRif-1;
 	else
 		aMeseRif_prec := aMeseRif-1;
 		aAnnoRif_prec := aAnnoRif;
 	end if;

 	--dt_cessazione := last_day(to_date(''||aMeseRif_prec||'/'||aAnnoRif||'', 'MM/YYYY'));
 	dt_cessazione := trunc(sysdate);
 	gPgLog := ibmutl200.LOGSTART('Migrazione Anagarfica dipendenti' , aUtente, 1, 1);
 	ibmutl200.logInf(gPgLog ,'Chiusura Rapporto e Inquadramento per i dipendenti non pervenuti','','');
 	for aAna in (select distinct matricola_dipendente, cd_anag
			from rapporto
		       where matricola_dipendente in (select matricola from cnr_anadip
							where anno_rif = aAnnoRif_prec
							and   mese_rif = aMeseRif_prec
							and data_cessazione is null
			  			      minus
			  				select matricola from cnr_anadip
							where anno_rif = aAnnoRif
							and   mese_rif = aMeseRif
							and (uo_tit is null or uo_tit!='900300')
							)) loop
		update rapporto
		set dt_fin_validita = dt_cessazione,
			duva = trunc(sysdate),
			utuv = 'CED'
		where matricola_dipendente = aAna.matricola_dipendente
		and cd_tipo_rapporto='DIP'
		--and dt_fin_validita = to_date('31/12/2200','dd/mm/yyyy')
		and dt_fin_validita > trunc(sysdate);

		update inquadramento
		set dt_fin_validita = dt_cessazione,
			duva = trunc(sysdate),
			utuv = 'CED',
			pg_ver_rec=pg_ver_rec+1
		where cd_anag = aAna.cd_anag
		and cd_tipo_rapporto='DIP'
		--and dt_fin_validita = to_date('31/12/2200','dd/mm/yyyy')
		and dt_fin_validita > trunc(sysdate);

	end loop;

	caricaAnagDipendenti(aAnnoRif,aMeseRif,aUtente);

end;

procedure caricaAnagDipendenti(aAnnoRif Number, aMeseRif Number, aUtente varchar2) is
 lData date;
 lAnagraficoOld anagrafico%rowtype;
 cod_fis_mod NUMBER :=0;
 Begin
 --Dbms_Output.put_line('caricaAnagDipendenti');

 	  -- La tabella CNR_ANADIP in questa fase deve essere già caricata con i dati
	  -- relativi alla migrazione.
	  -- La tabella in esame risulta caricata con i dati dei dipendenti
	  -- provenienti dal sistema SCI.
 	  -- Per ogni dipendente presente nella tabella di lavoro CNR_ANADIP
	  -- si devono controllare e valorizzare dei campi.
	  lData := TRUNC(sysdate);

	  LOCK TABLE cnr_anadip IN EXCLUSIVE MODE NOWAIT;

	  for aAnaDip in (select *
	  	  		  	  from cnr_anadip
					  where anno_rif = aAnnoRif
					  and   mese_rif = aMeseRif
					  and (uo_tit is null or uo_tit!='900300')
					  ORDER BY MATRICOLA) loop
	  	  begin

	  	  	  	ibmutl200.logInf(gPgLog ,'Processando matricola' || aAnaDip.matricola , '' , '');
			    if chkPresenzaAnag(aAnaDip, lAnagraficoOld) then
			   	   MODIFICAANAGRAFICO(aAnaDip, lAnagraficoOld, lData, aUtente);
			    Else
			      Select Count(0) Into cod_fis_mod
			      From rapporto ,anagrafico
			      Where
			        anagrafico.cd_anag = rapporto.cd_anag And
			        dt_fine_rapporto Is Null And
			        (matricola_dipendente =aAnaDip.matricola or
			        (partita_iva is not null and
			        anagrafico.codice_fiscale = aAnaDip.DIP_COD_FIS));

			       If(cod_fis_mod=0) Then
			   	        CREAANAGRAFICO(aAnaDip,lData, aUtente);
			   	   Else
			   	      --RP 24/04/2009
			   	      -- Scommentare dopo un periodo di test con il messaggio bloccante
			   	    update anagrafico set dt_fine_rapporto = trunc(sysdate) ,
			   	                           causale_fine_rapporto='Codice fiscale dip. modificato o con partita iva',
			   	                           duva =sysdate,
			   	                           utuv=aUtente
			   	                           where (cd_anag in(select cd_anag from rapporto where  matricola_dipendente =aAnaDip.matricola) or
			   	                                  codice_fiscale = aAnaDip.dip_cod_fis);
			   	     update terzo set dt_fine_rapporto = trunc(sysdate) ,
			   	                           note='Codice fiscale dip. modificato o con partita iva',
			   	                           duva =sysdate,
			   	                           utuv=aUtente
			   	                           where (cd_anag in(select cd_anag from rapporto where  matricola_dipendente =aAnaDip.matricola) or
			   	                                  cd_anag in(select cd_anag from anagrafico where codice_fiscale = aAnaDip.dip_cod_fis));

			   	      CREAANAGRAFICO(aAnaDip,lData, aUtente);
			   	      Dbms_Output.PUT_LINE('Errore bloccante Codice fiscale modificato o presenza partita iva matricola dipendente '||aAnaDip.matricola);
			   	      IBMUTL200.logErr(gPgLog, DBMS_UTILITY.FORMAT_ERROR_STACK,'Codice fiscale modificato  o presenza partita iva matricola dipendente '||aAnaDip.matricola,null);

			   	  End If;
			    end if;
	  	  end;
-- Flavia -- modifica: ALLINEA_MONTANTE era fuori dal loop, è stata spostata perchè sono cambiati i parametri di input
	  	  --ALLINEA_MONTANTE(lData, aUtente, aAnnoRif, aMeseRif, aAnaDip);
  	  end loop;
end;

procedure CREAANAGRAFICO(aAnaDip cnr_anadip%rowtype, aData Date, aUtente VARCHAR2) is
 lAnagrafico anagrafico%rowtype;
 aRapporto rapporto%rowtype;
 aRapportoPrec rapporto%rowtype;
 lPgAnagrafico number;

 lItaliano CHAR(1);
 lPgComuneNascita number;
 lPgComuneFiscale number;

 lPgNazioneFiscale number;
 lPgNazioneNascita number;
 lPgNazionalita number;

 begin
--Dbms_Output.put_line('CREAANAGRAFICO '||' matricola '||aAnaDip.matricola);
 	  ibmutl200.logInf(gPgLog ,'Creazione anagrafico nuovo matricola' || aAnaDip.matricola , '' , '');
 	  -- recuperiamo il progressivo da attribuire alla'angrafico
 	  begin
		  select cd_corrente + 1
		  into lPgAnagrafico
		  from numerazione_base
		  where tabella ='ANAGRAFICO' for update nowait;
	  exception when no_data_found then
	  			ibmerr001.RAISE_ERR_GENERICO('Manca la configurazione della tabella ANAGRAFICO');
	  end;

      if substr(aAnaDip.cod_comune,1,1)= 'Z' then
	  	 lItaliano := 'E';
	  else
	  	 lItaliano := 'I';
	  end if;

	  lPgComuneNascita  := getComuneNascita(aAnaDip,  lAnagrafico,lPgNazioneNascita);
	  lPgComuneFiscale  := getComuneFiscale(aAnaDip,  lAnagrafico,lPgNazioneFiscale);

	  begin
		  select pg_nazione
		  into lPgNazionalita
		  from nazione
		  where cd_nazione = aAnaDip.naz_nas
		  and 	rownum=1;
	  exception when no_data_found then
	  			lPgNazionalita := 0;
			  	ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Impostata Nazionalita Default (0) in creAnagrafico'|| ' la nazionane '|| aAnaDip.naz_nas || ' non risulta nella tabella Nazione' , '');
	  end;

 	  lAnagrafico.CD_ANAG                    	 := lPgAnagrafico;
	  lAnagrafico.CD_CLASSIFIC_ANAG 		 := NULL;
	  lAnagrafico.TI_ENTITA 			 := 'F';
	  lAnagrafico.TI_ENTITA_FISICA 			 := 'A';
	  lAnagrafico.TI_ENTITA_GIURIDICA 		 := NULL;
	  lAnagrafico.FL_SOGGETTO_IVA 			 := 'N';
	  lAnagrafico.CODICE_FISCALE 			 := aAnaDip.DIP_COD_FIS;
	  lAnagrafico.PARTITA_IVA 			 := NULL;
	  lAnagrafico.ID_FISCALE_ESTERO 		 := NULL;
	  lAnagrafico.RAGIONE_SOCIALE 			 := NULL;
	  lAnagrafico.NOME 				 := SUBSTR(aAnaDip.NOMINATIVO, (aAnaDip.NCAR_COGN + 1), (LENGTH(aAnaDip.NOMINATIVO) - aAnaDip.NCAR_COGN + 1));
	  lAnagrafico.COGNOME 				 := SUBSTR(aAnaDip.NOMINATIVO,1,(aAnaDip.NCAR_COGN - 1));
	  lAnagrafico.TI_SESSO 				 := aAnaDip.sesso;
	  lAnagrafico.DT_NASCITA 			 := aAnaDip.data_nascita;
	  lAnagrafico.PG_COMUNE_NASCITA 		 := lPgComuneNascita;
	  lAnagrafico.VIA_FISCALE 			 := aAnaDip.ind_resid;
	  --lAnagrafico.NUM_CIVICO_FISCALE 		 := NULL;
	  lAnagrafico.PG_COMUNE_FISCALE 		 := lPgComuneFiscale;
	  lAnagrafico.CAP_COMUNE_FISCALE 		 := aAnaDip.cap_resid ;
	  lAnagrafico.FRAZIONE_FISCALE 			 := NULL;
	  lAnagrafico.PG_NAZIONE_FISCALE 		 := lPgNazioneFiscale;
	  lAnagrafico.PG_NAZIONE_NAZIONALITA 	         := lPgNazionalita;
	  lAnagrafico.FL_FATTURAZIONE_DIFFERITA          := 'N';
	  lAnagrafico.FL_OCCASIONALE 			 := 'N';
	  lAnagrafico.TI_ITALIANO_ESTERO 		 := lItaliano;
 	  lAnagrafico.CD_ATTIVITA_INPS 			 := NULL;
 	  lAnagrafico.ALTRA_ASS_PREVID_INPS 	         := NULL;
 	  lAnagrafico.ALIQUOTA_FISCALE 			 := NULL;
 	  lAnagrafico.CODICE_FISCALE_CAF 		 := NULL;
 	  lAnagrafico.DENOMINAZIONE_CAF 		 := NULL;
 	  lAnagrafico.SEDE_INAIL 			 := NULL;
 	  lAnagrafico.MATRICOLA_INAIL 			 := NULL;
 	  lAnagrafico.CONTO_NUMERARIO_CREDITO 	         := NULL; -- Non Usare
 	  lAnagrafico.CONTO_NUMERARIO_DEBITO 		 := NULL; -- Non Usare
 	  lAnagrafico.NUM_ISCRIZ_CCIAA 			 := NULL;
 	  lAnagrafico.NUM_ISCRIZ_ALBO 			 := NULL;
-- 	  lAnagrafico.DT_FINE_RAPPORTO 			 := aAnaDip.data_cessazione;
-- 	  lAnagrafico.CAUSALE_FINE_RAPPORTO 	         := aAnaDip.desc_causa_Cess;
 	  lAnagrafico.DT_CANC 				 := NULL;
 	  lAnagrafico.DT_ANTIMAFIA 			 := NULL;
 	  lAnagrafico.CD_ENTE_APPARTENENZA 		 := NULL;
 	  lAnagrafico.NOTE 				 := NULL;
 	  lAnagrafico.DACR 				 := aData;
 	  lAnagrafico.UTCR 				 := aUtente;
 	  lAnagrafico.DUVA 				 := aData;
 	  lAnagrafico.UTUV 				 := aUtente;
 	  lAnagrafico.PG_VER_REC 			 := 1;

	  INS_ANAGRAFICO(lAnagrafico);

	  -- Aggiornamento del numeratore dell'anagrafico
	  update numerazione_base set cd_corrente = cd_corrente +1  where tabella ='ANAGRAFICO';

	  -- Creazione del rapporto
	  CREARAPPORTO (aAnaDip,lAnagrafico, aRapporto, aRapportoPrec, aData, aUtente);

	  -- Creazione Inquadramento
	  CREAINQUADRAMENTO (aAnaDip,lAnagrafico, aRapporto, aRapportoPrec, aData, aUtente);

	  -- creazione terzo associato all'anagrafico
	  CREATERZO(aAnaDip, lAnagrafico, aData, aUtente );

	  -- creazione del montante
	  CREAMONTANTE(aAnaDip, lAnagrafico , aData , aUtente );
 end;



 procedure CREATERZO(aAnaDip cnr_anadip%rowtype,aAnagrafico anagrafico%rowtype, aData Date, aUtente VARCHAR2) is
 lTerzo terzo%rowtype;
 lPgTerzo Number;
 Begin
 --Dbms_Output.put_line('CREATERZO'||' matricola '||aAnaDip.matricola);
 	  -- Recuperiamo il progressivo per il terzo
 	  begin
		  select cd_corrente + 1
		  into lPgTerzo
		  from numerazione_base
		  where tabella ='TERZO'
		  for update nowait;
	  exception when no_data_found then
	  			ibmerr001.RAISE_ERR_GENERICO('Manca la configurazione della tabella TERZO');
	  end;


	  lTerzo.CD_TERZO                 := lPgTerzo;
	  lTerzo.FRAZIONE_SEDE  		  := NULL;
	  lTerzo.CD_ANAG 	   			  := aAnagrafico.cd_anag;
	  lTerzo.DT_FINE_RAPPORTO   	  := aAnagrafico.dt_fine_rapporto;
	  lTerzo.TI_TERZO		    	  := 'E';
	  lTerzo.CD_PRECEDENTE	    	  := aAnaDip.matricola;
	  lTerzo.DENOMINAZIONE_SEDE 	  := aAnaDip.nominativo;
	  lTerzo.VIA_SEDE				  := aAnaDip.ind_resid;
	  --lTerzo.NUMERO_CIVICO_SEDE 	  := NULL;
	  lTerzo.PG_COMUNE_SEDE     	  := aAnagrafico.pg_comune_fiscale;
	  lTerzo.CAP_COMUNE_SEDE 		  := aAnagrafico.cap_comune_fiscale;
	  lTerzo.PG_RAPP_LEGALE			  := NULL;
	  lTerzo.CD_UNITA_ORGANIZZATIVA   := NULL;
	  lTerzo.NOME_UNITA_ORGANIZZATIVA := NULL;
	  lTerzo.NOTE 					  := NULL;
	  lTerzo.DT_CANC 				  := NULL;
	  lTerzo.DACR 					  := aData;
	  lTerzo.UTCR 					  := aUtente;
	  lTerzo.DUVA 					  := aData;
	  lTerzo.UTUV 					  := aUtente;
	  lTerzo.PG_VER_REC 			  := 1;

	  INS_TERZO(lTerzo);

	  update numerazione_base set cd_Corrente = cd_Corrente +1 where tabella ='TERZO';

	  -- Creazione della banca
	  CREABANCA(aAnaDip ,aAnagrafico ,lTerzo , aData , aUtente );

	  -- creazione della modalita pagamento
	  CREAMODPAG(aAnaDip, lTerzo, aData , aUtente);
 end;

procedure CREABANCA(aAnaDip cnr_anadip%rowtype,aAnagrafico anagrafico%rowtype,aTerzo terzo%rowtype, aData Date, aUtente VARCHAR2) is
 lNumBanche number;
 lInsBanca boolean;
 lBanca banca%rowtype;
 lRifPagamento rif_modalita_pagamento%rowtype;
 lCdModPagamento rif_modalita_pagamento.CD_MODALITA_PAG%type;

 begin
--Dbms_Output.put_line('CREABANCA'||' matricola '||aAnaDip.matricola);
 	  -- verifichiamo che abi e cab della tabella cnr anadip siano validi
 	  select count(*)
	  into lNumBanche
	  from abicab
	  where abi = aAnaDip.abi_pag
	  and   cab = aAnaDip.cab_pag;

	  -- decodifichiamo la modalita di pagamento
	  begin
		 select cd_modalita_pag_cir
		 into lCdModPagamento
		 from cnr_cir_rif_mod_pag
		 where cd_modalita_pag_cnr = Rtrim(aAnaDip.mod_pag)
		 for update nowait;

	  exception when no_data_found then
		 ibmutl200.logInf(gPgLog ,'Il terzo con cd_precedente = ' || aAnaDip.matricola , ' Risulta non avere una decodifica per la modalita di pagamento. In CNR_CIR_RIF_MOD_PAG non esiste cd_modalita_pag = ' || aAnaDip.mod_pag , '');

		 select cd_modalita_pag_cir
		 into lCdModPagamento
		 from cnr_cir_rif_mod_pag
		 where cd_modalita_pag_cnr = Nvl(Rtrim(aAnaDip.mod_pag),1)
		 for update nowait;
	  end;

  	  -- recuperiamo la modalita pagamento
	  select *
	  into lRifPagamento
	  from rif_modalita_pagamento
	  where cd_modalita_pag = lCdModPagamento;

  	  -- recuperiamo il progreassivo della banca
  	  select nvl(max(pg_banca),0) + 1
	  into lBanca.pg_banca
	  from banca
	  where cd_terzo = aTerzo.cd_terzo;

	  -- lNumBanche >0 implica che abi e cab sono validi e che quindi la banca deve
	  -- essere inserita
	  if lNumBanche > 0 then
	  	 lInsBanca := true;
	  else
	  	 lInsBanca := false;
	  end if;

	  if lInsBanca then
		 lBanca.CD_TERZO  		:= aTerzo.cd_terzo;
		 lBanca.CAB				:= aAnaDip.cab_pag;
		 lBanca.ABI				:= aAnaDip.abi_pag;
		 lBanca.TI_PAGAMENTO	:= lRifPagamento.ti_pagamento;
		 lBanca.INTESTAZIONE	:= aAnaDip.NOMINATIVO;
		 lBanca.QUIETANZA		:= NULL;
		 -- 23/03/2016
		 if(aAnaDip.IBAN_PAG is not null and aAnaDip.IBAN_PAG like 'IT'||'%') then
		 		lBanca.NUMERO_CONTO	:= substr(aAnaDip.IBAN_PAG,16,12);
		 else
		 	  lBanca.NUMERO_CONTO	:= lpad(aAnaDip.NRC_PAG,12,'0');
		 end if;
		 lBanca.CODICE_IBAN		:= aAnaDip.IBAN_PAG;
		 lBanca.CODICE_SWIFT	:= NUll;
		 lBanca.DACR			:= aData;
		 lBanca.UTCR			:= aUtente;
		 lBanca.DUVA			:= aData;
		 lBanca.UTUV			:= aUtente;
		 lBanca.PG_VER_REC		:= 1;
		 lBanca.FL_CANCELLATO	:= 'N';
		 lBanca.CD_TERZO_DELEGATO := NULL;
		 lBanca.PG_BANCA_DELEGATO := NULL;
		 lBanca.ORIGINE := 'S';
		 lBanca.FL_CC_CDS := 'N';
		 lBanca.CIN :=aAnaDip.CIN_PAG;
		 -- inseriamo la banca
		 INS_BANCA(lBanca);
	  else
	  	 -- nel caso in cui l'abi e il cab non risultano validi
		 -- controlliamo se la modalita di pagamento risulta essere di tipo ALTRO = 'A'
		 -- e che abi e cab siano null, in questo caso la banca deve essere inserita
		 if lRifPagamento.ti_pagamento ='A'
		 and aAnaDip.abi_pag is null
		 and aAnaDip.cab_pag is null
		 then
			 lBanca.CD_TERZO  		:= aTerzo.cd_terzo;
			 lBanca.CAB				:= null;
			 lBanca.ABI				:= null;
			 lBanca.TI_PAGAMENTO	:= lRifPagamento.ti_pagamento;
			 lBanca.INTESTAZIONE	:= aAnaDip.NOMINATIVO;
			 lBanca.QUIETANZA		:= NULL;
			 lBanca.NUMERO_CONTO	:= null;-- ?? Chiedere
			 lBanca.CODICE_IBAN		:= NULL;
			 lBanca.CODICE_SWIFT	:= NUll;
			 lBanca.DACR			:= aData;
			 lBanca.UTCR			:= aUtente;
			 lBanca.DUVA			:= aData;
			 lBanca.UTUV			:= aUtente;
			 lBanca.PG_VER_REC		:= 1;
			 lBanca.FL_CANCELLATO	:= 'N';
			 lBanca.CD_TERZO_DELEGATO := NULL;
			 lBanca.PG_BANCA_DELEGATO := NULL;
			 lBanca.ORIGINE := 'S';
			 lBanca.FL_CC_CDS := 'N';
			 lBanca.CIN := null;
			 -- inseriamo la banca
			 INS_BANCA(lBanca);
		 else
		  	 ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , ' Abi Cab non validi', '');
		 end if;

	  end if;

 end;

 procedure CREAMODPAG(aAnaDip cnr_anadip%rowtype, aTerzo terzo%rowtype, aData date , aUtente varchar2) is
 lRifPagamento rif_modalita_pagamento%rowtype;
 lInsPagamento boolean := true;
 lCdModPagamento rif_modalita_pagamento.CD_MODALITA_PAG%type;
 lModPagamento modalita_pagamento%rowtype;
 begin
--Dbms_Output.put_line('CREAMODPAG'||' matricola '||aAnaDip.matricola);
	  -- decodifichiamo la modalita di pagamento
	  begin
		 select cd_modalita_pag_cir
		 into lCdModPagamento
		 from cnr_cir_rif_mod_pag
		 where cd_modalita_pag_cnr = Rtrim(aAnaDip.mod_pag)
		 for update nowait;

	  exception when no_data_found then
		 ibmutl200.logInf(gPgLog ,'Il terzo con matricola = ' || aAnaDip.matricola , ' Risulta non avere una decodifica per la modalita di pagamento. In CNR_CIR_RIF_MOD_PAG non esiste cd_modalita_pag = ' || aAnaDip.mod_pag , '');
		 select cd_modalita_pag_cir
		 into lCdModPagamento
		 from cnr_cir_rif_mod_pag
		 where cd_modalita_pag_cnr = Nvl(Rtrim(aAnaDip.mod_pag),1)
		 for update nowait;
	  end;
 	  begin
		  -- recuperiamo la rifPagamento
		  select *
		  into lRifPagamento
		  from rif_modalita_pagamento
		  where cd_modalita_pag= lCdModPagamento;
 	  exception when no_data_found then
		  lInsPagamento := false;
		  ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , ' non trovato in RIF_MODALITA_PAGAMENTO il cd_modalita_pag '||aAnaDip.mod_pag, '');
 	  end;
	  if lInsPagamento then
	  	 lModPagamento.CD_TERZO := aTerzo.cd_terzo;
	  	 lModPagamento.CD_MODALITA_PAG := lRifPagamento.cd_modalita_pag;
	  	 lModPagamento.CD_TERZO_DELEGATO := null;
	  	 lModPagamento.DACR := aData;
	  	 lModPagamento.UTCR := aUtente;
	  	 lModPagamento.DUVA := aData;
	  	 lModPagamento.UTUV := aUtente;
	  	 lModPagamento.PG_VER_REC := 1;
		 INS_MOD_PAGAMENTO(lModPagamento, aAnadip);
	  else
		  ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , ' non trovato in RIF_MODALITA_PAGAMENTO il cd_modalita_pag '||aAnaDip.mod_pag, '');
	  end if;
 end;


 procedure CREAINQUADRAMENTO (aAnaDip cnr_Anadip%rowtype
 		   					 ,aAnagrafico anagrafico%rowtype
							 ,aRapporto  rapporto%rowtype
							 ,aRapportoPrec rapporto%rowtype
							 ,aData date
							 ,aUtente varchar2) is
 lCdTipoRapporto rapporto.cd_tipo_rapporto%type;
 lPgRifInquadramento number;
 lPgRifInquadramentoOld number;
 lContinuaEsecuzione boolean := true;
 lInquadPrec boolean := true;
 lDataInizioInqPrec date;
 lInquadramento inquadramento%rowtype;
 lInquadramentoPrec inquadramento%rowtype;
 begin
--Dbms_Output.put_line('CREAINQUADRAMENTO'||' matricola '||aAnaDip.matricola);
	  lCdTipoRapporto := cTIPO_RAPPORTO;

	  begin
	 	  select pg_rif_inquadramento
		  into lPgRifInquadramento
	 	  from rif_inquadramento
	 	  where CD_PROFILO =  aAnaDip.livello_1
		  and   CD_PROGRESSIONE = aAnaDip.livello_2
		  and   cd_livello is null;
	  exception when no_data_found then
	  			lContinuaEsecuzione := false;
			  	ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Non Inserito Inquadramento', '');
	  end;

	  if lContinuaEsecuzione then
	  	 -- questo caso lContinuaEsecuzione = true implica che l'inquadramento attuale
		 -- è valido
	 	 lInquadramento.CD_TIPO_RAPPORTO         := lCdTipoRapporto;
		 lInquadramento.CD_ANAG                  := aAnagrafico.cd_anag;
		 lInquadramento.DT_INI_VALIDITA_RAPPORTO := aRapporto.dt_ini_validita;
		 lInquadramento.PG_RIF_INQUADRAMENTO     := lPgRifInquadramento;
		 lInquadramento.DT_INI_VALIDITA	  		 := aAnadip.giu_dec_inizio;
		 lInquadramento.DT_FIN_VALIDITA	   		 := nvl(aAnaDip.data_cessazione,to_date('31122200','ddmmyyyy'));
		 lInquadramento.DACR			  		 := aData;
		 lInquadramento.UTCR			  		 := aUtente;
		 lInquadramento.DUVA			  		 := aData;
		 lInquadramento.UTUV			  		 := aUtente;
		 lInquadramento.PG_VER_REC		  		 := 1;
		 -- Inseriamo inquadramento attuale

		 INS_INQUADRAMENTO(lInquadramento);
		 if ( trunc(aAnadip.data_assunzione) > trunc(aAnadip.profilo_prec_fine) ) then
					 ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'La data di assunzione è maggiore della data fine profilo precedente', '');
		 end if;


	  end if; --lContinuaEsecuzione

 end;

procedure CREARAPPORTO (aAnaDip cnr_Anadip%rowtype
 		   				 ,aAnagrafico anagrafico%rowtype
						 ,aRapporto in out rapporto%rowtype
						 ,aRapportoPrec in out rapporto%rowtype
						 ,aData date
						 ,aUtente varchar2) is
 lCdTipoRapporto rapporto.cd_tipo_rapporto%type;
 begin
--Dbms_Output.put_line('CREARAPPORTO'||' matricola '||aAnaDip.matricola);
	  lCdTipoRapporto := cTIPO_RAPPORTO;

		  aRapporto.CD_TIPO_RAPPORTO      :=  lCdTipoRapporto;
		  aRapporto.CD_ANAG  		 	  := aAnagrafico.cd_anag;
		  aRapporto.DT_INI_VALIDITA  	  := aAnaDip.data_assunzione;
		  aRapporto.MATRICOLA_DIPENDENTE  := aAnadip.matricola;
		  aRapporto.CAUSALE_FINE_RAPPORTO := aAnaDip.desc_causa_cess;
		  aRapporto.DT_FIN_VALIDITA		  := nvl(aAnaDip.data_cessazione,to_date('31122200','ddmmyyyy'));
		  aRapporto.DACR				  := aData;
		  aRapporto.UTCR				  := aUtente;
		  aRapporto.DUVA				  := aData;
		  aRapporto.UTUV				  := aUtente;
		  aRapporto.PG_VER_REC			  := 1;
		  aRapporto.CD_ENTE_PREV_STI := aAnaDip.ente_prev;	-- flavia
                  aRapporto.CD_RAPP_IMPIEGO_STI  := aAnaDip.RAPP_IMPIEGO;
		  INS_RAPPORTO (aRapporto);
 End;

 procedure CREAMONTANTE(aAnaDip cnr_Anadip%rowtype, aAnagrafico anagrafico%rowtype, aData date, aUtente varchar2 ) as
 lMontante montanti%rowtype;
 lImpFiscaleNetto number(16,3);
 lImpFiscaleLordo number(16,3);
 lImpPrevidenziale number(16,3);


 lMeseRiferimento number(2);
 lEsisteMontante boolean;
 lEntePrevValido boolean;
-- lVMontStip v_stipendi_montanti%rowtype;
 lAggiornaMontante boolean;
 lMesiAssenza number(2):=0;

 begin
 	--Dbms_Output.put_line('CREAMONTANTE---------------------------');
--Dbms_Output.put_line('CREAMONTANTE'||' matricola '||aAnaDip.matricola||'- cd_anag '||aAnagrafico.cd_anag);
 	  lImpFiscaleNetto := nvl(aAnaDip.IMP_FISC,0);
	  lImpFiscaleLordo := nvl(aAnaDip.IMP_IMPO1,0);
	  lMeseRiferimento := nvl(aAnaDip.mese_rif,0);
	  lImpPrevidenziale := nvl(aAnaDip.IMP_PREV,0);

		begin
			select count(*) into lMesiAssenza
			from cnr_anadip
			where matricola = aAnaDip.matricola
			and assenza is not null
			and nvl(effetto,0) = 0
			and mese_rif != 0
			and anno_rif = aAnaDip.anno_rif;

		exception when no_data_found then
			lMesiAssenza := 0;
		end;

	  if lMeseRiferimento <= 0 or lMeseRiferimento > 12 then
	  	 ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Impossibile definire il montante il mese di riferimento risulta ' || to_char(aAnaDip.mese_rif), '');
	  else
	  	  begin
		  	   -- verifichiamo che l'informazione dell'ente previdenziale su cnr_anadip sia corretta
						  if (aAnaDip.ENTE_PREV <> cINPS
						  	  and aAnaDip.ENTE_PREV <> cINPGI
						  	  and aAnaDip.ENTE_PREV <> cFONDOFS
						  	  and aAnaDip.ENTE_PREV <> cCPDEL
						  	  and aAnaDip.ENTE_PREV <> cENPDEP
						  	  and aAnaDip.ENTE_PREV <> cCPS)
						  then
							  ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Impossibile definire il montante, ente previdenziale non valido' || aAnaDip.ENTE_PREV, '');
							  lEntePrevValido := false;
						  else
						  	  lEntePrevValido := true;

						  end if;

		  	 end;

		  if lEntePrevValido then
		 	 	  -- Verifichiamo che esista il montante per l'anagrafico in esame

-- Per la Lordizzazione delle missioni prendiamo solo i dipendente che hanno lo stipendio.
-- Non prendiamo quelli che hanno stipendio a zero.

							if( aAnaDip.assenza is not null and nvl(aAnaDip.effetto,0) = 0)
								then
									lAggiornaMontante := false;
								else
									lAggiornaMontante := true;
							end if;

							if lAggiornaMontante then

					begin

						  select *
						  into lMontante
						  from montanti
						  where esercizio = aAnaDip.anno_rif
						  and  cd_anag = aAnagrafico.cd_anag
						  for update nowait;


					  -- Esiste il Montante
					  	lEsisteMontante := true;
			 	  		exception when no_data_found then
				  			-- non esiste il montante
					  		lEsisteMontante := false;
		 	     end;
		  	  -- siccome gli importi di Dicembre(12) arrivano cumulati (stipendio + tredicesima)
			  -- allora per avere una distribuzione scalare INPS, IRPEF più precisa divideremo
			  -- gli impori per 13 piuttosto che per 12
		  	  if lMeseRiferimento = 12 then
			  	 lMeseRiferimento := 13;
			  	end if;

			  if not lEsisteMontante then

			 	  -- Costruiamo la struttura del montante
				  lMontante.ESERCIZIO	 	 		   := aAnaDip.anno_rif;
				  lMontante.CD_ANAG					   := aAnagrafico.cd_anag;
			  	  lMontante.IRPEF_DIPENDENTI :=  (lImpFiscaleNetto * 13 / (lMeseRiferimento-lMesiAssenza));
				  lMontante.IRPEF_ALTRI := 0;
				  lMontante.INPS_DIPENDENTI := 0;
				  lMontante.INPS_TESORO_DIPENDENTI := 0;
				  lMontante.INPS_ALTRI := 0;
				  lMontante.FONDO_FS_DIPENDENTI := 0;


				  if (aAnaDip.ENTE_PREV = cINPS)
				  	 or (aAnaDip.ENTE_PREV = cINPGI) then
				  	 lMontante.INPS_DIPENDENTI := (lImpPrevidenziale * 13 /(lMeseRiferimento-lMesiAssenza));
				  end if;
				  if aAnaDip.ENTE_PREV = cFONDOFS  then
					 lMontante.FONDO_FS_DIPENDENTI := (lImpPrevidenziale * 13 /(lMeseRiferimento-lMesiAssenza));
				  end if;
				  if (aAnaDip.ENTE_PREV = cCPDEL)
				  	 or (aAnaDip.ENTE_PREV = cENPDEP)
				  	 or (aAnaDip.ENTE_PREV = cCPS) then
					 lMontante.INPS_TESORO_DIPENDENTI := (lImpPrevidenziale * 13 /(lMeseRiferimento-lMesiAssenza));
				  end if;

				  if aAnadip.IMP_IMPO1 > 0 then
				  	 lMontante.IRPEF_LORDO_DIPENDENTI	   := (lImpFiscaleLordo * 13 / (lMeseRiferimento-lMesiAssenza));
				  else
				  	 lMontante.IRPEF_LORDO_DIPENDENTI	   := (lImpFiscaleNetto * 13 / (lMeseRiferimento-lMesiAssenza));
				  end if;
				  lMontante.IRPEF_LORDO_ALTRI		   := 0;
				  lMontante.DEDUZIONE_IRPEF_DIPENDENTI := lMontante.IRPEF_LORDO_DIPENDENTI - lMontante.IRPEF_DIPENDENTI;
				  lMontante.DEDUZIONE_IRPEF_ALTRI	   := 0;
				  lMontante.RIDUZ_DIPENDENTI		   := 0;
				  lMontante.RIDUZ_ALTRI			   := 0;
				  lMontante.INAIL_ALTRI			   := 0;
				  lMontante.INPS_OCCASIONALI		   := 0;
				  lMontante.DEDUZIONE_FAMILY_ALTRI	   := 0;
                  lMontante.INPGI_ALTRI	   := 0;
				  lMontante.DACR			   := aData;
				  lMontante.UTCR			   := aUtente;
				  lMontante.DUVA			   := aData;
				  lMontante.UTUV			   := aUtente;
				  lMontante.PG_VER_REC			   := 1;
 					lMontante.ENPAPI_ALTRI	   := 0;

				  INS_MONTANTE(lMontante);
			  else

			 	  -- Costruiamo la struttura del montante
	 			  -- lMontante.ESERCIZIO	 	 		   := aAnaDip.anno_rif;
	 			  -- lMontante.CD_ANAG					   := aAnagrafico.cd_anag;

				  lMontante.IRPEF_DIPENDENTI :=  (lImpFiscaleNetto * 13 / (lMeseRiferimento-lMesiAssenza)) ;

				  if (aAnaDip.ENTE_PREV = cINPS)
				  	 or (aAnaDip.ENTE_PREV = cINPGI) then
				  	 lMontante.INPS_DIPENDENTI := (aAnaDip.IMP_PREV * 13 /(lMeseRiferimento-lMesiAssenza)) ;
				  end if;
				  if aAnaDip.ENTE_PREV = cFONDOFS  then
					 lMontante.FONDO_FS_DIPENDENTI := (aAnaDip.IMP_PREV * 13 /(lMeseRiferimento-lMesiAssenza)) ;
				  end if;
				  if (aAnaDip.ENTE_PREV = cCPDEL)
				  	 or (aAnaDip.ENTE_PREV = cENPDEP)
				  	 or (aAnaDip.ENTE_PREV = cCPS) then
					 lMontante.INPS_TESORO_DIPENDENTI := (aAnaDip.IMP_PREV * 13 /(lMeseRiferimento-lMesiAssenza)) ;
				  end if;
				  if aAnaDip.IMP_IMPO1 > 0 then
				  	 lMontante.IRPEF_LORDO_DIPENDENTI	   := (aAnaDip.IMP_IMPO1 * 13 / (lMeseRiferimento-lMesiAssenza)) ;
				  else
				  	 lMontante.IRPEF_LORDO_DIPENDENTI	   := (aAnaDip.IMP_FISC * 13 / (lMeseRiferimento-lMesiAssenza)) ;
				  end if;
				  lMontante.DEDUZIONE_IRPEF_DIPENDENTI := lMontante.IRPEF_LORDO_DIPENDENTI - lMontante.IRPEF_DIPENDENTI;
				  lMontante.DUVA					   := aData;
				  lMontante.UTUV					   := aUtente;
				  lMontante.PG_VER_REC				   := lMontante.PG_VER_REC + 1;


				  UPD_MONTANTE(lMontante);
			  end if; -- lEsisteMontante
		  end if; -- lEntePrevValido
		  		end if; -- lAggiornaMontante
	  end if; -- lMeseRiferimento <= 0 or lMeseRiferimento > 12
 end;


procedure ALLINEA_INQUADRAMENTO(aAnaDip cnr_anadip%rowtype,
 		   					aAnagrafico anagrafico%rowtype,
							aData date,
							aUtente varchar2) is
 lRapporto rapporto%rowtype;
 lInquadramento inquadramento%rowtype;
 lInquadramentoNew inquadramento%rowtype;
 lInquadramentoOld inquadramento%rowtype;
 lDtIniziInquadramento date;
 lPgRifInquadramento number(10);
 lPgRifInquadramentoOld number(10);
 lEsisteRapporto boolean;
 aMeseRif_prec number(2);
 aAnnoRif_prec number(4);
 v_contratto_old varchar2(7);
 v_livprec_1 	varchar2(3);
 v_livprec_2	varchar2(3);



 begin


 	  -- Selezioniamo l'ultimo rapporto in ordine cronologico
	  -- che intendiamo essere il rapporto attualmente in corso
	  begin
	 	  select * into lRapporto
		  from rapporto
		  where CD_TIPO_RAPPORTO = cTIPO_RAPPORTO
		  and 	CD_ANAG 		 = aAnagrafico.cd_anag
		  and 	DT_INI_VALIDITA  = (SELECT max(DT_INI_VALIDITA) from rapporto
		  						    	where CD_TIPO_RAPPORTO = cTIPO_RAPPORTO
	  						   		and   CD_ANAG 	       = aAnagrafico.cd_anag);

	   	  lEsisteRapporto := True;

	  exception
	  when no_data_found then
	  	   ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola,'Impossibile allineare rapporto, Non esiste nessun rapporto per l''anagrafico ' || aAnagrafico.cd_anag, '');
		   lEsisteRapporto := False;

	  end;

--29/05/2006 un rapporto viene allineato solo quando la data cessazione della tabella cnr_anadip è valorizzata
	-- altrimenti se è valorizzata solo profilo_prec_fine deve essere allineato solo l'inquadramento


	  if lEsisteRapporto  then

		  begin

 	if aAnaDip.mese_rif = 1 then
 		aMeseRif_prec := 12;
 		aAnnoRif_prec := aAnaDip.anno_rif-1;
 	else
 		aMeseRif_prec := aAnaDip.mese_rif-1;
 		aAnnoRif_prec := aAnaDip.anno_rif;
 	end if;


 	begin
			select livello_1, livello_2 into v_livprec_1, v_livprec_2
			from cnr_anadip
			where anno_rif  = aAnnoRif_prec
			and mese_rif = aMeseRif_prec
			and matricola = aAnaDip.matricola;
	exception
		when no_data_found then
			if aAnaDip.livprec_1 is not null and  aAnaDip.livprec_2 is not null then

				select livprec_1, livprec_2 into v_livprec_1, v_livprec_2
				from cnr_anadip
				where anno_rif  = aAnaDip.anno_rif
				and mese_rif = aAnaDip.mese_rif
				and matricola = aAnaDip.matricola;
			else
				ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola,'Impossibile allineare l''inquadramento, non esiste l''inquadramento precedente per l''anagrafico ' || aAnagrafico.cd_anag, '');
				--dbms_output.put_line('Impossibile allineare l''inquadramento, non esiste l''inquadramento precedente per l''anagrafico ' || aAnagrafico.cd_anag);
			end if;

	end;

        If v_livprec_1 Is Not Null And v_livprec_2  Is Not Null Then
		  	  select pg_rif_inquadramento
			  into lPgRifInquadramentoOld
		 	  from rif_inquadramento
		 	  where CD_PROFILO =  v_livprec_1
			  and   CD_PROGRESSIONE = v_livprec_2
			  and   cd_livello is null;
        End If;

			  select pg_rif_inquadramento
			  into lPgRifInquadramento
		 	  from rif_inquadramento
		 	  where CD_PROFILO =  aAnaDip.livello_1
			  and   CD_PROGRESSIONE = aAnaDip.livello_2
			  and   cd_livello is null;


			  -- Se esiste il rapporto ma è cambiato il pg_rif_inquadramento deve essere inserito un nuovo record
			  -- con il pg_rif_inquadramento nuovo e chiuso il precedente
			  if lPgRifInquadramentoOld != lPgRifInquadramento and lPgRifInquadramentoOld is not null then

			  	select * into lInquadramentoOld
			  	from inquadramento
			  	where pg_rif_inquadramento = lPgRifInquadramentoOld
			  	and cd_anag = aAnagrafico.cd_anag
			  	and dt_fin_validita = (SELECT max(DT_FIN_VALIDITA) from inquadramento
		  						    	where CD_TIPO_RAPPORTO = cTIPO_RAPPORTO
	  						   		and   CD_ANAG 	       = aAnagrafico.cd_anag
	  						   		and pg_rif_inquadramento = lPgRifInquadramentoOld
	  						   		and dt_ini_validita_rapporto = lRapporto.DT_INI_VALIDITA);

			  	update inquadramento
				set dt_fin_validita = aAnadip.giu_dec_inizio-1,
				 	utuv	  = aUtente,
				 	duva 	  = aData,
				  	pg_ver_rec = pg_ver_rec + 1
			      	  where CD_TIPO_RAPPORTO = cTIPO_RAPPORTO
			  	  and 	CD_ANAG 		 = lInquadramentoOld.cd_anag
			  	  and 	DT_INI_VALIDITA  = lInquadramentoOld.dt_ini_validita
			  	  and   dt_ini_validita_rapporto = lInquadramentoOld.dt_ini_validita_rapporto
				  and   PG_RIF_INQUADRAMENTO = lPgRifInquadramentoOld;

			  	lInquadramentoNew.CD_TIPO_RAPPORTO         := cTIPO_RAPPORTO;
				lInquadramentoNew.CD_ANAG                  := aAnagrafico.cd_anag;
				lInquadramentoNew.DT_INI_VALIDITA_RAPPORTO := lRapporto.dt_ini_validita;
				lInquadramentoNew.PG_RIF_INQUADRAMENTO     := lPgRifInquadramento;
				lInquadramentoNew.DT_INI_VALIDITA	   := aAnadip.giu_dec_inizio;
				lInquadramentoNew.DT_FIN_VALIDITA	   := nvl(aAnadip.data_cessazione,to_date('31/12/2200','dd/mm/yyyy'));
				lInquadramentoNew.DACR			   := aData;
				lInquadramentoNew.UTCR			   := aUtente;
				lInquadramentoNew.DUVA			   := aData;
				lInquadramentoNew.UTUV			   := aUtente;
				lInquadramentoNew.PG_VER_REC		   := 1;

				INS_INQUADRAMENTO(lInquadramentoNew);

			  end if;


				-- Selezionaniamo l'ultimo inquadramento valido che corrisponde al rapporto esistente
			 begin
				select * into lInquadramento
		  		from inquadramento
		  		where cd_anag = aAnagrafico.cd_anag
		  		and cd_tipo_rapporto = cTIPO_RAPPORTO
		  		and pg_rif_inquadramento = lPgRifInquadramento
		  		and dt_ini_validita_rapporto = lRapporto.DT_INI_VALIDITA
		  		and dt_ini_validita = (SELECT max(DT_INI_VALIDITA) from inquadramento
		  						    	where CD_TIPO_RAPPORTO = cTIPO_RAPPORTO
	  						   		and   CD_ANAG 	       = aAnagrafico.cd_anag
	  						   		and pg_rif_inquadramento = lPgRifInquadramento
	  						   		and dt_ini_validita_rapporto = lRapporto.DT_INI_VALIDITA);


			  	-- Se la data di fine validita del rapporto è diversa dalla data di fine validita
			  	-- deve essere aggiornata la data dell'inquadramento
			  	if  lRapporto.DT_FIN_VALIDITA != lInquadramento.DT_FIN_VALIDITA
			  	and lRapporto.DT_INI_VALIDITA = lInquadramento.dt_ini_validita_rapporto then


		  		update inquadramento
				  set 	 dt_fin_validita = lRapporto.DT_FIN_VALIDITA,
				  		 utuv			  = aUtente,
				  		 duva 			  = aData,
				  		 pg_ver_rec 	  = pg_ver_rec + 1
			      	  where CD_TIPO_RAPPORTO = cTIPO_RAPPORTO
			  	  and 	CD_ANAG 		 = lInquadramento.cd_anag
			  	  and 	DT_INI_VALIDITA  = lInquadramento.dt_ini_validita
			  	  and   dt_ini_validita_rapporto = lInquadramento.dt_ini_validita_rapporto
				  and   PG_RIF_INQUADRAMENTO = lPgRifInquadramento;

				end if;
                 Exception When No_Data_Found Then
                       Null;
                 End;
/*	if aAnaDip.mese_rif = 1 then
 		aMeseRif_prec := 12;
 		aAnnoRif_prec := aAnaDip.anno_rif-1;
 	else
 		aMeseRif_prec := aAnaDip.mese_rif-1;
 		aAnnoRif_prec := aAnaDip.anno_rif;
 	end if;
 		begin
 			select contratto into v_contratto_old
			from cnr_anadip
			where anno_rif  = aAnnoRif_prec
			and mese_rif = aMeseRif_prec
			and matricola = aAnaDip.matricola;
		exception
		when no_data_found then
			if aAnaDip.contratto_prec is not null then
				select contratto_prec into v_contratto_old
				from cnr_anadip
				where anno_rif  = aAnaDip.anno_rif
				and mese_rif = aAnaDip.mese_rif
				and matricola = aAnaDip.matricola;
			else
				ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola,'Impossibile allineare l''inquadramento, non esiste il contratto precedente per l''anagrafico ' || aAnagrafico.cd_anag, '');
				--dbms_output.put_line('Impossibile allineare l''inquadramento, non esiste il contratto precedente per l''anagrafico ' || aAnagrafico.cd_anag);
			end if;
		end;
			if aAnaDip.contratto != v_contratto_old And (lPgRifInquadramentoOld = lPgRifInquadramento And lPgRifInquadramentoOld Is Not Null) then
				update inquadramento
				  set 	 dt_fin_validita = aAnaDip.profilo_prec_fine,
				  		 utuv			  = aUtente,
				  		 duva 			  = aData,
				  		 pg_ver_rec 	  = pg_ver_rec + 1
			      	  where CD_TIPO_RAPPORTO = cTIPO_RAPPORTO
			  	  and 	CD_ANAG 		 = lInquadramento.cd_anag
			  	  and 	DT_INI_VALIDITA  = lInquadramento.dt_ini_validita
			  	  and   dt_ini_validita_rapporto = lRapporto.DT_INI_VALIDITA
				  and   PG_RIF_INQUADRAMENTO = lPgRifInquadramento;



				lInquadramentoNew.CD_TIPO_RAPPORTO         := cTIPO_RAPPORTO;
				lInquadramentoNew.CD_ANAG                  := aAnagrafico.cd_anag;
				lInquadramentoNew.DT_INI_VALIDITA_RAPPORTO := lRapporto.dt_ini_validita;
				lInquadramentoNew.PG_RIF_INQUADRAMENTO     := lPgRifInquadramento;
				lInquadramentoNew.DT_INI_VALIDITA	  	  := aAnadip.giu_dec_inizio;
				lInquadramentoNew.DT_FIN_VALIDITA	   	  := lRapporto.DT_FIN_VALIDITA;
				lInquadramentoNew.DACR			  		  := aData;
				lInquadramentoNew.UTCR			  		  := aUtente;
				lInquadramentoNew.DUVA			  		  := aData;
				lInquadramentoNew.UTUV			  		  := aUtente;
				lInquadramentoNew.PG_VER_REC		  		  := 1;

				INS_INQUADRAMENTO(lInquadramentoNew);
		     end If;
		      end if;
*/
		end;

	end if;
	exception
	           When Others Then
	                dbms_output.put_line('errore '||Sqlerrm||' per l''anagrafico '||aAnagrafico.cd_anag);
End;


procedure MODIFICAANAGRAFICO(aAnaDip cnr_anadip%rowtype,lAnagraficoOld in out anagrafico%rowtype, aData Date, aUtente VARCHAR2) is
 lAnagrafico anagrafico%rowtype;
 aRapporto rapporto%rowtype;
 aRapportoPrec rapporto%rowtype;
 lPgAnagrafico number;

 lItaliano CHAR(1);
 lPgComuneNascita number;
 lPgComuneFiscale number;

 lPgNazioneFiscale number;
 lPgNazioneNascita number;
 lPgNazionalita number;

 begin
--Dbms_Output.put_line('MODIFICAANAGRAFICO'||' matricola '||aAnaDip.matricola);

 	  ibmutl200.logInf(gPgLog ,'Modifica anagrafico matricola' || aAnaDip.matricola , '' , '');
      if substr(aAnaDip.cod_comune,1,1)= 'Z' then
	  	 lItaliano := 'E';
	  else
	  	 lItaliano := 'I';
	  end if;

	  lPgComuneNascita  := getComuneNascita(aAnaDip,  lAnagrafico,lPgNazioneNascita);
	  lPgComuneFiscale  := getComuneFiscale(aAnaDip,  lAnagrafico,lPgNazioneFiscale);

	  begin
		  select pg_nazione
		  into lPgNazionalita
		  from nazione
		  where (cd_nazione = aAnaDip.naz_nas
		  Or  cd_iso = aAnaDip.naz_nas)
		  and rownum=1;
	  exception when no_data_found then
	  			lPgNazionalita := 0;
			  	ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Impostata Nazionalita Default (0) in MODIFICAANAGRAFICO' || ' la nazionane '|| aAnaDip.naz_nas || ' non risulta nella tabella Nazione', '');
	  end;

-- 	  lAnagrafico.CD_ANAG                    := lPgAnagrafico;
-- 	  lAnagraficoOld.CD_CLASSIFIC_ANAG 		 	 := NULL; -- ?? Chiedere
-- 	  lAnagraficoOld.TI_ENTITA 				 	 := 'F';
-- 	  lAnagraficoOld.TI_ENTITA_FISICA 			 := 'A';
-- 	  lAnagraficoOld.TI_ENTITA_GIURIDICA 		 := NULL;
-- 	  lAnagraficoOld.FL_SOGGETTO_IVA 			 := 'N';
	  lAnagraficoOld.CODICE_FISCALE 			 := aAnaDip.DIP_COD_FIS;
-- 	  lAnagraficoOld.PARTITA_IVA 				 := NULL;
-- 	  lAnagraficoOld.ID_FISCALE_ESTERO 		 	 := NULL;
-- 	  lAnagraficoOld.RAGIONE_SOCIALE 			 := NULL;
	  lAnagraficoOld.NOME 						 := SUBSTR(aAnaDip.NOMINATIVO, (aAnaDip.NCAR_COGN + 1), (LENGTH(aAnaDip.NOMINATIVO) - aAnaDip.NCAR_COGN + 1));
	  lAnagraficoOld.COGNOME 					 := SUBSTR(aAnaDip.NOMINATIVO,1,(aAnaDip.NCAR_COGN - 1));
	  lAnagraficoOld.TI_SESSO 					 := aAnaDip.sesso;
	  lAnagraficoOld.DT_NASCITA 				 := aAnaDip.data_nascita;
	  lAnagraficoOld.PG_COMUNE_NASCITA 		 	 := lPgComuneNascita;
	  lAnagraficoOld.VIA_FISCALE 				 := aAnaDip.ind_resid;
	  --lAnagraficoOld.NUM_CIVICO_FISCALE 		 := NULL;
	  lAnagraficoOld.PG_COMUNE_FISCALE 		 	 := lPgComuneFiscale;
	  lAnagraficoOld.CAP_COMUNE_FISCALE 		 := aAnaDip.cap_resid ;
--	  lAnagraficoOld.FRAZIONE_FISCALE 			 := NULL; -- ?? Chiedere
	  lAnagraficoOld.PG_NAZIONE_FISCALE 		 := lPgNazioneFiscale;
	  lAnagraficoOld.PG_NAZIONE_NAZIONALITA 	 := lPgNazionalita;
-- 	  lAnagraficoOld.FL_FATTURAZIONE_DIFFERITA   := 'N';
-- 	  lAnagraficoOld.FL_OCCASIONALE 			 := 'N';
	  lAnagraficoOld.TI_ITALIANO_ESTERO 		 := lItaliano;
--  	  lAnagraficoOld.CD_ATTIVITA_INPS 			 := NULL;
--  	  lAnagraficoOld.ALTRA_ASS_PREVID_INPS 	 	 := NULL;
--  	  lAnagraficoOld.ALIQUOTA_FISCALE 			 := NULL;
--  	  lAnagraficoOld.CODICE_FISCALE_CAF 		 := NULL; -- ?? Chiedere
--  	  lAnagraficoOld.DENOMINAZIONE_CAF 		 	 := NULL; -- ?? Chiedere
--  	  lAnagraficoOld.SEDE_INAIL 				 := NULL; -- ?? Chiedere
--  	  lAnagraficoOld.MATRICOLA_INAIL 			 := NULL; -- ?? Chiedere
--  	  lAnagraficoOld.CONTO_NUMERARIO_CREDITO 	 := NULL; -- Non Usare
--  	  lAnagraficoOld.CONTO_NUMERARIO_DEBITO 	 := NULL; -- Non Usare
--  	  lAnagraficoOld.NUM_ISCRIZ_CCIAA 			 := NULL;
--  	  lAnagraficoOld.NUM_ISCRIZ_ALBO 			 := NULL;
-- 	  	  lAnagraficoOld.DT_FINE_RAPPORTO 		     := aAnaDip.data_cessazione;
-- 	  	  lAnagraficoOld.CAUSALE_FINE_RAPPORTO 	 	 := aAnaDip.desc_causa_Cess;
--  	  lAnagraficoOld.DT_CANC 					 := NULL;
--  	  lAnagraficoOld.DT_ANTIMAFIA 				 := NULL;
--  	  lAnagraficoOld.CD_ENTE_APPARTENENZA 		 := NULL;
--  	  lAnagraficoOld.NOTE 						 := NULL;
 	  lAnagraficoOld.DUVA 						 := aData;
 	  lAnagraficoOld.UTUV 						 := aUtente;
 	  lAnagraficoOld.PG_VER_REC 				 := lAnagraficoOld.PG_VER_REC + 1;


	  UPD_ANAGRAFICO(lAnagraficoOld);

	  if aAnaDip.fl_gestione_manuale ='Y' then
	  	ALLINEA_INQUADRAMENTO(aAnaDip,lAnagraficoOld, aData, aUtente);
	  end if;
	  UPD_RAPPORTO (aAnaDip,lAnagraficoOld, aRapporto, aRapportoPrec, aData, aUtente );

	  UPD_INQUADRAMENTO (aAnaDip,lAnagraficoOld, aRapporto, aRapportoPrec, aData, aUtente );

	  MODIFICATERZO(aAnaDip, lAnagraficoOld, aData, aUtente );

	  CREAMONTANTE(aAnaDip, lAnagraficoOld, aData , aUtente );
 end;


procedure MODIFICATERZO(aAnaDip cnr_anadip%rowtype,aAnagrafico anagrafico%rowtype, aData Date, aUtente VARCHAR2) is
 lTerzo terzo%rowtype;

 begin
--Dbms_Output.put_line('MODIFICATERZO'||' matricola '||aAnaDip.matricola);
 	  -- Recuperiamo il terzo da modificare
 	  begin
		  select *
		  into lTerzo
		  from terzo
		  where cd_terzo = (select min(cd_terzo) from terzo where cd_anag = aAnagrafico.cd_anag and dt_fine_rapporto is null)
		  for update nowait;
	  exception when no_data_found then
			  	ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Manca il TERZO associato', '');
	  			ibmerr001.RAISE_ERR_GENERICO('Manca il TERZO associato');
	  end;

--	  lTerzo.CD_TERZO                 := lPgTerzo;
--	  lTerzo.FRAZIONE_SEDE  		  := NULL;
--	  lTerzo.CD_ANAG 	   			  := aAnagrafico.cd_anag;
--	  lTerzo.DT_FINE_RAPPORTO   	  := aAnagrafico.dt_fine_rapporto;
--	  lTerzo.TI_TERZO		    	  := 'E';
	  lTerzo.CD_PRECEDENTE	    	  := aAnaDip.matricola;
	  lTerzo.DENOMINAZIONE_SEDE 	  := aAnaDip.nominativo;
	  lTerzo.VIA_SEDE				  := aAnaDip.ind_resid;
	 -- lTerzo.NUMERO_CIVICO_SEDE 	  := NULL;
	  lTerzo.PG_COMUNE_SEDE     	  := aAnagrafico.pg_comune_fiscale;
	  lTerzo.CAP_COMUNE_SEDE 		  := aAnagrafico.cap_comune_fiscale;
-- 	  lTerzo.PG_RAPP_LEGALE			  := NULL;
-- 	  lTerzo.CD_UNITA_ORGANIZZATIVA   := NULL;
-- 	  lTerzo.NOME_UNITA_ORGANIZZATIVA := NULL;
-- 	  lTerzo.NOTE 					  := NULL;
-- 	  lTerzo.DT_CANC 				  := NULL;
	  lTerzo.DUVA 					  := aData;
	  lTerzo.UTUV 					  := aUtente;
	  lTerzo.PG_VER_REC 			  := lTerzo.PG_VER_REC + 1 ;

	  -- Modifica terzo
	  UPD_TERZO(lTerzo);

	  -- Modifica banca
	  MODIFICABANCA(aAnaDip ,aAnagrafico ,lTerzo , aData , aUtente );

	  -- Modifica modalita pagamento
  	  CREAMODPAG(aAnaDip, lTerzo, aData , aUtente);

 end;

procedure MODIFICABANCA(aAnaDip cnr_anadip%rowtype,aAnagrafico anagrafico%rowtype,aTerzo terzo%rowtype, aData Date, aUtente VARCHAR2) is
 lNumBanche number;
 lNumBancheValide number;
 lInsBanca boolean;
 lBanca banca%rowtype;
 lRifPagamento rif_modalita_pagamento%rowtype;
 lCdModPagamento rif_modalita_pagamento.CD_MODALITA_PAG%type;
 num_conti number;
 num_conti_agg number;
 pgbanca_prec number;
 pgbanca_canc number;
 Fl_Da_Cancellare boolean;
 Fl_Da_Cancellare_agg boolean;
 Numrighe number;
 pg_esistente number;
 flag BANCA.FL_CANCELLATO%type;
 isBonificoEstero boolean := false;

 begin
--Dbms_Output.put_line('MODIFICABANCA'||' matricola '||aAnaDip.matricola);
 		  -- decodifichiamo la modalita di pagamento
				    begin
						 select cd_modalita_pag_cir
						 into lCdModPagamento
						 from cnr_cir_rif_mod_pag
						 where cd_modalita_pag_cnr = Rtrim(aAnaDip.mod_pag)
						 for update nowait;

				    exception when no_data_found then
						 ibmutl200.logInf(gPgLog ,'Il terzo con cd_precedente = ' || aAnaDip.matricola , ' Risulta non avere una decodifica per la modalita di pagamento. In CNR_CIR_RIF_MOD_PAG non esiste cd_modalita_pag = ' || aAnaDip.mod_pag , '');

						 select cd_modalita_pag_cir
						 into lCdModPagamento
						 from cnr_cir_rif_mod_pag
						 where cd_modalita_pag_cnr = Nvl(Rtrim(aAnaDip.mod_pag),1)
						 for update nowait;
					end;

                    --verifico se è una modalità di pagamento di tipo estera
                    If lCdModPagamento='BO' and substr(aAnaDip.iban_pag,1,2) not in ('00','IT') Then
                       isBonificoEstero := true;
                    End If;

					  	  -- recuperiamo la modalita pagamento
						  select *
						  into lRifPagamento
						  from rif_modalita_pagamento
						  where cd_modalita_pag = lCdModPagamento;

					  	  -- recuperiamo il progreassivo della banca
					  	  select nvl(max(pg_banca),0) + 1
						  into lBanca.pg_banca
						  from banca
						  where cd_terzo = aTerzo.cd_terzo;

						  -- controlliamo se la banca risulta modificata
					 	  select count(*)
						  into lNumBanche
						  from banca
						  where cd_terzo = aTerzo.cd_terzo
						  --and nvl(abi,'0') = nvl(aAnaDip.abi_pag,'0')
						  --and nvl(cab,'0') = nvl(aAnaDip.cab_pag,'0')
						  --and   nvl(numero_conto,'0') = nvl(aAnaDip.nrc_pag,'0')
						  and   ti_pagamento = lRifPagamento.ti_pagamento
						  --and   Nvl(cin,'0') = Nvl(aAnaDip.cin_pag,'0')
						  and   Nvl(codice_iban,'0') = Nvl(aAnaDip.iban_pag,'0');

	  if lNumBanche > 0 then

	  	 -- la banca esiste
		 lInsBanca := false;

         -- controlliamo se la banca che esiste ha il fl_cancellato = Y, se si deve essere aggiornata
         -- altrimenti se è impostato a N  non bisogna fare niente.
         -- inizio
            select count(*) into Numrighe
				    from(
						select max(pg_banca), fl_cancellato
						from banca
						where cd_terzo = aTerzo.cd_terzo
						and   ti_pagamento =lRifPagamento.ti_pagamento
						-- 23/03/2016 non aggiorniamo i conti disabilitati se da ripristinare bisogna verificare aAnaDip.nrc_pag
						-- con substr(IBAN_PAG,16,12)
						--and   fl_cancellato= 'N'
						and   Nvl(codice_iban,'0') = Nvl(aAnaDip.iban_pag,'0')
						group by fl_cancellato);

				if Numrighe = 1 then

                    select max(pg_banca), fl_cancellato into pg_esistente, flag
										from banca
										where cd_terzo = aTerzo.cd_terzo
										and   ti_pagamento =lRifPagamento.ti_pagamento
										and   Nvl(codice_iban,'0') = Nvl(aAnaDip.iban_pag,'0')
										group by fl_cancellato;

							if pg_esistente is not null and flag = 'Y' and Nvl(aAnaDip.iban_pag,'0')!='0' then
                                begin
							         if not isBonificoEstero then
                                        update banca
										set fl_cancellato = 'N',
											duva = sysdate,
											utuv = 'CED',
											origine = 'S',
											intestazione = aAnaDip.nominativo,
											numero_conto = lpad(aAnaDip.nrc_pag,12,'0'),
											abi = aAnaDip.abi_pag,
											cab = aAnaDip.cab_pag,
											cin = aAnaDip.cin_pag
										where pg_banca = pg_esistente
										and cd_terzo = aTerzo.cd_terzo
										and ti_pagamento = lRifPagamento.ti_pagamento
										and fl_cancellato = 'Y';
                                    else
                                        update banca
										set fl_cancellato = 'N',
											duva = sysdate,
											utuv = 'CED',
											origine = 'S',
											intestazione = aAnaDip.nominativo,
											numero_conto = lpad(aAnaDip.nrc_pag,12,'0'),
											cin = aAnaDip.cin_pag
										where pg_banca = pg_esistente
										and cd_terzo = aTerzo.cd_terzo
										and ti_pagamento = lRifPagamento.ti_pagamento
										and fl_cancellato = 'Y';
                                    end if;

                                    If sql%rowcount > 0 Then
                                       ibmutl200.logInf(gPgLog,'Matricola ' || aAnaDip.matricola, 'Riattivazione coordinate bancarie.', '');
                                    End If;

										    begin
													select count(*) into num_conti_agg
												  	from banca
												  	where cd_terzo = aTerzo.cd_terzo
												  	and origine = 'S'
												  	and fl_cancellato = 'N'
												  	and ti_pagamento =lRifPagamento.ti_pagamento
												  	group by cd_terzo,origine,fl_cancellato;

												  	if num_conti_agg > 1 then
													--dbms_output.put_line('DA AGG - cd_terzo ='|| aTerzo.cd_terzo||' ha più di un conto');

												  			select min(pg_banca) into pgbanca_canc
													  		from banca
													  		where cd_terzo = aTerzo.cd_terzo
													  		and origine = 'S'
													  		and fl_cancellato = 'N'
												        and Nvl(codice_iban,'0') != Nvl(aAnaDip.iban_pag,'0')
												        and ti_pagamento =  lRifPagamento.ti_pagamento;

												       		    Fl_Da_Cancellare_agg := true;
											--dbms_output.put_line('DA AGG - cd_terzo ='|| aTerzo.cd_terzo||' pg');
												     else
													  		      Fl_Da_Cancellare_agg := false;
													end if;

										 	exception
	  												when no_data_found then
	  														Fl_Da_Cancellare_agg := false;
	  									    end;

                                  if Fl_Da_Cancellare_agg then
                                    --dbms_output.put_line('DA AGG - numero c/c, cd_terzo ='|| aTerzo.cd_terzo||' progressivo banca' ||pgbanca_prec);
                                    update banca
                                    set fl_cancellato = 'Y',
                                        utuv = 'CED',
                                        duva = sysdate
                                    where cd_terzo = aTerzo.cd_terzo
                                    and origine = 'S'
                                    and fl_cancellato = 'N'
                                    and ti_pagamento = lRifPagamento.ti_pagamento
                                    and pg_banca = pgbanca_canc;
                                  end if;

								exception
									when others then
                                      ibmutl200.logErr(gPgLog,'Matricola ' || aAnaDip.matricola, 'Errore nell''aggiornamento delle coordinate bancarie','');
								end;
					    end if; --pg_esistente is not null...
				end if;	--Numrighe = 1

         -- fine la banca esiste ed è stata aggiornata!

	  else -- lNumBanche>0
	  	  -- la banca non esiste
          --se estera la creo
          if isBonificoEstero then
            lInsBanca := true;
          Else
    		  -- controlliamo se abi e cab sono validi
              select count(*)
                  into lNumBancheValide
                  from abicab
                  where abi = aAnaDip.abi_pag
                  and   cab = aAnaDip.cab_pag;

              if lNumBancheValide > 0 then
                 lInsBanca := true;
              else
                 lInsBanca := false;
                 if aAnaDip.abi_pag is not null and aAnaDip.cab_pag is not null then
                            ibmutl200.logErr(gPgLog ,'Matricola ' || aAnaDip.matricola , ' Banca non recuperata - ABI, CAB non presenti nella tabella ABICAB ', '');
                 end if;  --aAnaDip.abi_pag is not null ...
             end if; --lNumBancheValide > 0
         End If;
	  end if;-- lNumBanche>0

	  if lInsBanca then
	  	 -- Creo questa banca se e solo se non esiste banca e abi e cab sono validi
		 lBanca.CD_TERZO  		:= aTerzo.cd_terzo;

         if not isBonificoEstero then
		   lBanca.CAB				:= aAnaDip.cab_pag;
		   lBanca.ABI				:= aAnaDip.abi_pag;
         End If;

         lBanca.TI_PAGAMENTO	:= lRifPagamento.ti_pagamento;
		 lBanca.INTESTAZIONE	:= aAnaDip.NOMINATIVO;
		 lBanca.QUIETANZA		:= NULL;
		 -- 23/03/2016
		 if(aAnaDip.IBAN_PAG is not null and aAnaDip.IBAN_PAG like 'IT'||'%') then
		 		lBanca.NUMERO_CONTO	:= substr(aAnaDip.IBAN_PAG,16,12);
		 else
		 	  lBanca.NUMERO_CONTO	:= lpad(aAnaDip.NRC_PAG,12,'0');
		 end if;
		 lBanca.CODICE_IBAN		:= aAnaDip.IBAN_PAG;
		 lBanca.CODICE_SWIFT	:= NUll;
		 lBanca.DACR			:= aData;
		 lBanca.UTCR			:= aUtente;
		 lBanca.DUVA			:= aData;
		 lBanca.UTUV			:= aUtente;
		 lBanca.PG_VER_REC		:= 1;
		 lBanca.FL_CANCELLATO	:= 'N';
		 lBanca.CD_TERZO_DELEGATO := NULL;
		 lBanca.PG_BANCA_DELEGATO := NULL;
		 lBanca.ORIGINE := 'S';
		 lBanca.FL_CC_CDS := 'N';
		 lBanca.CIN		:= aAnaDip.CIN_PAG;

		 -- inseriamo la banca
		 INS_BANCA(lBanca);

         ibmutl200.logInf(gPgLog,'Matricola ' || aAnaDip.matricola, 'Inserite nuove coordinate bancarie.', '');

--	  else -- lInsBanca

	  	  -- in questo caso posso arrivarci in due modi
		  -- 1) la banca esiste lNumBanche > 1
		  -- 2) la banca NON esiste lNumBanche = 0 e abi e cab NON sono validi
		  --    in questo caso creamo la banca se e solo se abi = cab = NULL
		  --    and ti_pagamento ='A'

	/*	 if  lRifPagamento.ti_pagamento ='A'
		 			and aAnaDip.abi_pag is null
		 			and aAnaDip.cab_pag is null
		 			and lNumBanche = 0
		 then
		 dbms_output.put_line('terzo con lNumBanche=0 '||aTerzo.cd_terzo);
			 lBanca.CD_TERZO  		:= aTerzo.cd_terzo;
			 lBanca.CAB				:= null;
			 lBanca.ABI				:= null;
			 lBanca.TI_PAGAMENTO	:= lRifPagamento.ti_pagamento;
			 lBanca.INTESTAZIONE	:= aAnaDip.NOMINATIVO;
			 lBanca.QUIETANZA		:= NULL;
			 lBanca.NUMERO_CONTO	:= null;
			 lBanca.CODICE_IBAN		:= NULL;
			 lBanca.CODICE_SWIFT	:= NUll;
			 lBanca.DACR			:= aData;
			 lBanca.UTCR			:= aUtente;
			 lBanca.DUVA			:= aData;
			 lBanca.UTUV			:= aUtente;
			 lBanca.PG_VER_REC		:= 1;
			 lBanca.FL_CANCELLATO	:= 'N';
			 lBanca.CD_TERZO_DELEGATO := NULL;
			 lBanca.PG_BANCA_DELEGATO := NULL;
			 lBanca.ORIGINE := 'S';
			 lBanca.FL_CC_CDS := 'N';
			 lBanca.CIN := null;
			 -- inseriamo la banca
			 INS_BANCA(lBanca);
		 end if; -- lRifPagamento.ti_pagamento ='A'...
	*/
		 -- Nel primo caso, in cui la banca esiste
		 -- controlliamo che abbia il campo ORIGINE ='S''
		 -- se non è così allora inseriamo la banca, altrimenti NO

/*		 if lRifPagamento.ti_pagamento ='A'
				 and aAnaDip.abi_pag is null
				 and aAnaDip.cab_pag is null
				 and lNumBanche > 0
		 then

		dbms_output.put_line('terzo con lNumBanche > 0 '||aTerzo.cd_terzo);
		 	 select count(*)
			 into lNumBanche
			 from banca
			 where cd_terzo = aTerzo.cd_terzo
			 --and   nvl(abi,'0') = nvl(aAnaDip.abi_pag,'0')
			 --and   nvl(cab,'0') = nvl(aAnaDip.cab_pag,'0')
			 --and   nvl(numero_conto,'0') = nvl(aAnaDip.nrc_pag,'0')
			 and   ti_pagamento = lRifPagamento.ti_pagamento
			 and   origine ='S'
			 --and   Nvl(cin,'0') = Nvl(aAnaDip.cin_pag,'0')
	     and   Nvl(codice_iban,'0') = Nvl(aAnaDip.iban_pag,'0');
*/
			/* if lNumBanche = 0 then
				 lBanca.CD_TERZO  		:= aTerzo.cd_terzo;
				 lBanca.CAB				:= null;
				 lBanca.ABI				:= null;
				 lBanca.TI_PAGAMENTO	:= lRifPagamento.ti_pagamento;
				 lBanca.INTESTAZIONE	:= aAnaDip.NOMINATIVO;
				 lBanca.QUIETANZA		:= NULL;
				 lBanca.NUMERO_CONTO	:= null;
				 lBanca.CODICE_IBAN		:= NULL;
				 lBanca.CODICE_SWIFT	:= NUll;
				 lBanca.DACR			:= aData;
				 lBanca.UTCR			:= aUtente;
				 lBanca.DUVA			:= aData;
				 lBanca.UTUV			:= aUtente;
				 lBanca.PG_VER_REC		:= 1;
				 lBanca.FL_CANCELLATO	:= 'N';
				 lBanca.CD_TERZO_DELEGATO := NULL;
				 lBanca.PG_BANCA_DELEGATO := NULL;
				 lBanca.ORIGINE := 'S';
				 lBanca.FL_CC_CDS := 'N';
				 lBanca.CIN := null;
				 -- inseriamo la banca
				 INS_BANCA(lBanca);
			 else
		 	 	 ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , ' Banca non recuperata', '');
			 end if;*/

	--	 end if;-- lRifPagamento.ti_pagamento ='A' ... and lNumBanche > 0


--FLAVIA--
		-- recuperiamo il record precedente. se è cambiato il numero di conto e il precedente non è stato reso inutilizzabile
		-- è necessario impostare il fl_cancellato = 'Y'

	  begin

	  	select count(*) into num_conti
	  	from banca
	  	where cd_terzo = aTerzo.cd_terzo
	  	and origine = 'S'
	  	and fl_cancellato = 'N'
	  	and ti_pagamento =lRifPagamento.ti_pagamento
	  	group by cd_terzo,origine,fl_cancellato;

	  	if num_conti>1 then
	  		--dbms_output.put_line('numero c/c, cd_terzo ='|| aTerzo.cd_terzo);
	  		select min(pg_banca) into pgbanca_prec
	  		from banca
	  		where cd_terzo = aTerzo.cd_terzo
	  		and origine = 'S'
	  		and fl_cancellato = 'N';

	  		Fl_Da_Cancellare := true;
	  	else
	  		Fl_Da_Cancellare := false;
	  	end if;

	  exception
	  	when no_data_found then
	  		Fl_Da_Cancellare := false;
	  end;

	  if Fl_Da_Cancellare then
	  	--dbms_output.put_line('DA INS - numero c/c, cd_terzo ='|| aTerzo.cd_terzo||' progressivo banca' ||pgbanca_prec);
	  	update banca
	  	set fl_cancellato = 'Y',
	  		utuv = 'CED',
	  		duva = trunc(sysdate)
	  	where cd_terzo = aTerzo.cd_terzo
	  	and origine = 'S'
	  	and fl_cancellato = 'N'
	  	and pg_banca = pgbanca_prec;
	  end if;
	end if;	-- lInsBanca
end;


function chkPresenzaAnag(aAnaDip cnr_anadip%rowtype, aAnagrafico in out anagrafico%rowtype) return boolean is
 lNum NUMBER;
 lGiaPresente boolean;
 begin
--Dbms_Output.put_line('chkPresenzaAnag'||' matricola '||aAnaDip.matricola);
 	-- il controllo sul codice fiscale viene eseguito anche per i tipi rapporto non dipendenti
	-- non serve la join con la tabella rapporto
	-- è stata aggiunta la condizione che la dt_fine_rapporto sia null a causa delle duplicazioni
	--  dt_fine_rapporto is null indica che l'anagrafico è valido
 	  select a.*
	  into aAnagrafico
	  from anagrafico a --, rapporto r
	  where a.CODICE_FISCALE = aAnaDip.DIP_COD_FIS
	  and dt_fine_rapporto is null
	  and partita_iva is null
	  --and r.cd_anag = a.cd_anag
	 -- and r.cd_tipo_rapporto = 'DIP'
	 -- and rownum <2
	  for update nowait;

          lGiaPresente := true;
	  return lGiaPresente;

 exception when no_data_found Then
      	 lGiaPresente := false;
   	 return lGiaPresente;
 end chkPresenzaAnag;

 function getComuneNascita(aAnaDip cnr_anadip%rowtype,  aAnagrafico IN OUT anagrafico%rowtype, aPgNazioneNascita in out number) return number is
 lItaliano char(1);
 lNumNazioni number;
 lPgComuneNascita number;
 begin
--Dbms_Output.put_line('getComuneNascita'||' matricola '||aAnaDip.matricola);

	  -- Controlliamo se l'anagrafico in esame risuta nato in Italia o No
      if substr(aAnaDip.tab_cod_comnas,1,1)= 'Z' then
	  	 lItaliano := 'E';
	  else
	  	 lItaliano := 'I';
	  end if;
	  -- Se italiamo
	  	 -- recuperiamo il primo comune tramite il codice catastale
	  -- Altrimenti
	  	 -- recuperiamo prima la nazione tramite il codice catastale
	  if lItaliano='I' then
	      -- Recuperiamo il codice e cap del comune di nascita
 		  begin
		  	   SELECT pg_comune, pg_nazione
			   into  lPgComuneNascita, aPgNazioneNascita
	           FROM   Comune
	           WHERE  cd_catastale    = aAnaDip.tab_cod_comnas
			   and rownum=1;
		  exception when no_data_found then
		  			-- Comune non definito
					lPgComuneNascita := 0;
					aPgNazioneNascita :=0;
				  	ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Associato con Comune Nascita di default' || ' il codice catastale ' || aAnaDip.tab_cod_comnas || ' non risulta nella tabella comune', '');
		  end;
	  end if;

	  if lItaliano <> 'I' then
	  	 begin
		 	 -- Contiamo le nazioni a parita di cd_catastale
	  	     SELECT count(*)
		   	 into   lNumNazioni
           	 FROM   Nazione
           	 WHERE  cd_catastale    = aAnaDip.tab_cod_comnas;

			 -- Non Esiste Nazione
			 if lNumNazioni = 0 then
	  			 -- Nazione non definita
				 aPgNazioneNascita:=0;
				 ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Associato con Nazione Nascita di default' || ' il codice catastale ' || aAnaDip.tab_cod_comnas ||' non risulta nella tabella nazione' , '');
				 -- Comune non definito
				 lPgComuneNascita:=0;
				 ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Associato con Comune Nascita di default' || ' il comune ' || aAnaDip.comune_nasc ||' non risulta nella tabella comune', '');
			 end if;

			 -- Esiste solo una Nazione
			 if lNumNazioni = 1 then
			     -- Recuperiamo il codice della Nazione di nascita
				 SELECT pg_Nazione
				 into   aPgNazioneNascita
			     FROM   Nazione
			     WHERE  cd_catastale    = aAnaDip.tab_cod_comnas;

				 begin
					 SELECT pg_comune
					 into   lPgComuneNascita
				     FROM   Comune
				     WHERE  pg_nazione   = aPgNazioneNascita
					 and    ds_comune    = aAnaDip.comune_nasc
					 and rownum=1;
				 exception when no_data_found then
				  			-- Comune non definito
							-- Si potrebbwe pensare di mettere la nazione
							lPgComuneNascita:=0;
					  		ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Associato con Comune Nascita di default' || ' il comune ' || aAnaDip.comune_nasc ||' non risulta nella tabella comune', '');
				 end;
			 end if;

			 -- Esiste piu di una Nazione
			 if lNumNazioni > 1 then
			     -- Recuperiamo il codice della Nazione di nascita
				 begin
				  	   SELECT pg_Nazione
					   into   aPgNazioneNascita
			           FROM   Nazione
			           WHERE  cd_catastale      = aAnaDip.tab_cod_comnas
					   and    ds_nazione  		= aAnaDip.comune_nasc;
				 exception when no_data_found then
				  			-- Nazione non definita
							aPgNazioneNascita:=0;
					  		ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Associato con Nazione Nascita di default' || ' il codice catastale ' || aAnaDip.tab_cod_comnas ||' non risulta nella tabella nazione' , '');
				 end;
				 begin
				  	   SELECT pg_comune
					   into   lPgComuneNascita
			           FROM   Comune
			           WHERE  pg_nazione   = aPgNazioneNascita
					   and    ds_comune    = aAnaDip.comune_nasc
					   and rownum=1;
				 exception when no_data_found then
				  			-- Comune non definito
							-- Si potrebbwe pensare di mettere la nazione
							lPgComuneNascita:=0;
					  		ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Associato con Comune Nascita di default' || ' il comune ' || aAnaDip.comune_nasc ||' non risulta nella tabella comune', '');
				 end;
			 end if;
	  	 end;
	  end if;
      return lPgComuneNascita;

 end;

 function getComuneFiscale(aAnaDip cnr_anadip%rowtype,  aAnagrafico IN OUT anagrafico%rowtype, aPgNazioneFiscale in out number) return number is
 lItaliano char(1);
 lNumNazioni number;
 lPgComuneFiscale number;
 begin
--Dbms_Output.put_line('getComuneFiscale'||' matricola '||aAnaDip.matricola);
	  -- Controlliamo se l'anagrafico in esame risuta nato in Italia o No
      if substr(aAnaDip.cod_comune,1,1)= 'Z' then
	  	 lItaliano := 'E';
	  else
	  	 lItaliano := 'I';
	  end if;
	  -- Se italiamo
	  	 -- recuperiamo il primo comune tramite il codice catastale
	  -- Altrimenti
	  	 -- recuperiamo prima la nazione tramite il codice catastale
	  if lItaliano='I' then
	      -- Recuperiamo il codice e cap del comune di nascita
 		  begin
		  	   SELECT pg_comune, pg_nazione
			   into  lPgComuneFiscale,aPgNazioneFiscale
	           FROM   Comune
	           WHERE  cd_catastale    = aAnaDip.cod_comune
			   and rownum=1; --codice comune residenza ??
		  exception when no_data_found then
		  			-- Comune non definito
					lPgComuneFiscale := 0;
					aPgNazioneFiscale := 0;
				  	ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Associato con Comune Fiscale di default' || ' il codice catastale ' || aAnaDip.cod_comune ||' non risulta nella tabella comune', '');
		  end;
	  end if;

	  if lItaliano <> 'I' then

	  	 begin
		 	 -- Contiamo le nazioni a parita di cd_catastale
	  	     SELECT count(*)
		   	 into   lNumNazioni
           	 FROM   Nazione
           	 WHERE  cd_catastale    = aAnaDip.cod_comune;

			 -- Non Esiste Nazione
			 if lNumNazioni = 0 then
	  			 -- Nazione non definita
				 aPgNazioneFiscale:=0;
				 ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Associato con Nazione Fiscale di default' || ' il codice catastale ' || aAnaDip.cod_comune ||' non risulta nella tabella nazione' , '');
				 -- Comune non definito
				 lPgComuneFiscale:=0;
				 ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Associato con Comune Fiscale di default' || ' il comune ' || aAnaDip.com_resid ||' non risulta nella tabella comune', '');
			 end if;

			 -- Esiste solo una Nazione
			 if lNumNazioni = 1 then
			     -- Recuperiamo il codice della Nazione di nascita
				 SELECT pg_Nazione
				 into   aPgNazioneFiscale
			     FROM   Nazione
			     WHERE  cd_catastale    = aAnaDip.cod_comune;

				 begin
					 SELECT pg_comune
					 into   lPgComuneFiscale
				     FROM   Comune
				     WHERE  pg_nazione   = aPgNazioneFiscale
					 and    ds_comune    = aAnaDip.com_resid
					 and rownum=1;
				 exception when no_data_found then
				  			-- Comune non definito
							-- Si potrebbwe pensare di mettere la nazione
							lPgComuneFiscale:=0;
					  		ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Associato con Comune Fiscale di default' || ' il comune ' || aAnaDip.com_resid ||' non risulta nella tabella comune', '');
				 end;
			 end if;

			 -- Esiste piu di una Nazione
			 if lNumNazioni > 1 then
			     -- Recuperiamo il codice della Nazione di nascita
				 begin
				  	   SELECT pg_Nazione
					   into   aPgNazioneFiscale
			           FROM   Nazione
			           WHERE  cd_catastale      = aAnaDip.cod_comune
					   and    ds_nazione  		= aAnaDip.com_resid;
				 exception when no_data_found then
				  			-- Nazione non definita
							aPgNazioneFiscale:=0;
					  		ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Associato con Nazione Fiscale di default' || ' il codice catastale ' || aAnaDip.cod_comune ||' non risulta nella tabella nazione' , '');
				 end;
				 begin
				  	   SELECT pg_comune
					   into   lPgComuneFiscale
			           FROM   Comune
			           WHERE  pg_nazione   = aPgNazioneFiscale
					   and    ds_comune    = aAnaDip.com_resid
					   and rownum=1;
				 exception when no_data_found then
				  			-- Comune non definito
							-- Si potrebbwe pensare di mettere la nazione
							lPgComuneFiscale:=0;
					  		ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Associato con Comune Fiscale di default' || ' il comune ' || aAnaDip.com_resid ||' non risulta nella tabella comune', '');
				 end;
			 end if;
	  	 end;

 	  end if;
 	  return lPgComuneFiscale;
 end;


 procedure INS_ANAGRAFICO(aAnagrafico anagrafico%rowtype) is
 begin
--Dbms_Output.put_line('INS_ANAGRAFICO'||' anag '||aAnagrafico.cd_anag);
	 insert into anagrafico(
			CD_ANAG,
			CD_CLASSIFIC_ANAG,
			TI_ENTITA,
			TI_ENTITA_FISICA,
			TI_ENTITA_GIURIDICA,
			FL_SOGGETTO_IVA,
			CODICE_FISCALE,
			PARTITA_IVA,
			ID_FISCALE_ESTERO,
			RAGIONE_SOCIALE,
			NOME,
			COGNOME,
			TI_SESSO,
			DT_NASCITA ,
			PG_COMUNE_NASCITA,
			VIA_FISCALE,
			NUM_CIVICO_FISCALE,
			PG_COMUNE_FISCALE ,
			CAP_COMUNE_FISCALE ,
			FRAZIONE_FISCALE,
			PG_NAZIONE_FISCALE,
			PG_NAZIONE_NAZIONALITA,
			FL_FATTURAZIONE_DIFFERITA,
			FL_OCCASIONALE,
			TI_ITALIANO_ESTERO,
			CD_ATTIVITA_INPS,
			ALTRA_ASS_PREVID_INPS,
			ALIQUOTA_FISCALE,
			CODICE_FISCALE_CAF,
			DENOMINAZIONE_CAF,
			SEDE_INAIL,
			MATRICOLA_INAIL,
			CONTO_NUMERARIO_CREDITO,
			CONTO_NUMERARIO_DEBITO,
			NUM_ISCRIZ_CCIAA,
			NUM_ISCRIZ_ALBO,
			DT_FINE_RAPPORTO,
			CAUSALE_FINE_RAPPORTO,
			DT_CANC,
			DT_ANTIMAFIA,
			CD_ENTE_APPARTENENZA,
			NOTE,
			DACR ,
			UTCR,
			DUVA,
			UTUV,
			PG_VER_REC)
	 values(
 	  aAnagrafico.CD_ANAG,
	  aAnagrafico.CD_CLASSIFIC_ANAG,
	  aAnagrafico.TI_ENTITA,
	  aAnagrafico.TI_ENTITA_FISICA,
	  aAnagrafico.TI_ENTITA_GIURIDICA,
	  aAnagrafico.FL_SOGGETTO_IVA,
	  aAnagrafico.CODICE_FISCALE,
	  aAnagrafico.PARTITA_IVA,
	  aAnagrafico.ID_FISCALE_ESTERO,
	  aAnagrafico.RAGIONE_SOCIALE,
	  aAnagrafico.NOME,
	  aAnagrafico.COGNOME,
	  aAnagrafico.TI_SESSO,
	  aAnagrafico.DT_NASCITA,
	  aAnagrafico.PG_COMUNE_NASCITA,
	  aAnagrafico.VIA_FISCALE,
	  aAnagrafico.NUM_CIVICO_FISCALE,
	  aAnagrafico.PG_COMUNE_FISCALE,
	  aAnagrafico.CAP_COMUNE_FISCALE,
	  aAnagrafico.FRAZIONE_FISCALE,
	  aAnagrafico.PG_NAZIONE_FISCALE,
	  aAnagrafico.PG_NAZIONE_NAZIONALITA,
	  aAnagrafico.FL_FATTURAZIONE_DIFFERITA,
	  aAnagrafico.FL_OCCASIONALE,
	  aAnagrafico.TI_ITALIANO_ESTERO,
 	  aAnagrafico.CD_ATTIVITA_INPS,
 	  aAnagrafico.ALTRA_ASS_PREVID_INPS,
 	  aAnagrafico.ALIQUOTA_FISCALE,
 	  aAnagrafico.CODICE_FISCALE_CAF,
 	  aAnagrafico.DENOMINAZIONE_CAF,
 	  aAnagrafico.SEDE_INAIL,
 	  aAnagrafico.MATRICOLA_INAIL,
 	  aAnagrafico.CONTO_NUMERARIO_CREDITO,
 	  aAnagrafico.CONTO_NUMERARIO_DEBITO,
 	  aAnagrafico.NUM_ISCRIZ_CCIAA,
 	  aAnagrafico.NUM_ISCRIZ_ALBO,
 	  aAnagrafico.DT_FINE_RAPPORTO,
 	  aAnagrafico.CAUSALE_FINE_RAPPORTO,
 	  aAnagrafico.DT_CANC,
 	  aAnagrafico.DT_ANTIMAFIA,
 	  aAnagrafico.CD_ENTE_APPARTENENZA,
 	  aAnagrafico.NOTE,
 	  aAnagrafico.DACR,
 	  aAnagrafico.UTCR,
 	  aAnagrafico.DUVA,
 	  aAnagrafico.UTUV,
 	  aAnagrafico.PG_VER_REC
	 );
	 exception
	 		  when others then
			  	   dbms_output.put_line('Errore '||substr(sqlerrm,1,200)||' per l'' anagrafico: '||aAnagrafico.CD_ANAG);
 end;

 procedure INS_TERZO(aTerzo Terzo%rowtype) is
 begin
 --Dbms_Output.put_line('INS_TERZO'||' anag '||aTerzo.cd_anag);
 	  insert into terzo (
	  		 CD_TERZO,
			 FRAZIONE_SEDE,
			 CD_ANAG,
			 DT_FINE_RAPPORTO,
			 TI_TERZO,
			 CD_PRECEDENTE,
			 DENOMINAZIONE_SEDE,
			 VIA_SEDE,
			 NUMERO_CIVICO_SEDE,
			 PG_COMUNE_SEDE,
			 CAP_COMUNE_SEDE,
			 PG_RAPP_LEGALE,
			 CD_UNITA_ORGANIZZATIVA,
			 NOME_UNITA_ORGANIZZATIVA,
			 NOTE,
			 DT_CANC,
			 DACR,
			 UTCR,
			 DUVA,
			 UTUV,
			 PG_VER_REC)
 	  values (
	  		 aTerzo.CD_TERZO,
			 aTerzo.FRAZIONE_SEDE,
			 aTerzo.CD_ANAG,
			 aTerzo.DT_FINE_RAPPORTO,
			 aTerzo.TI_TERZO,
			 aTerzo.CD_PRECEDENTE,
			 aTerzo.DENOMINAZIONE_SEDE,
			 aTerzo.VIA_SEDE,
			 aTerzo.NUMERO_CIVICO_SEDE,
			 aTerzo.PG_COMUNE_SEDE,
			 aTerzo.CAP_COMUNE_SEDE,
			 aTerzo.PG_RAPP_LEGALE,
			 aTerzo.CD_UNITA_ORGANIZZATIVA,
			 aTerzo.NOME_UNITA_ORGANIZZATIVA,
			 aTerzo.NOTE,
			 aTerzo.DT_CANC,
			 aTerzo.DACR,
			 aTerzo.UTCR,
			 aTerzo.DUVA,
			 aTerzo.UTUV,
			 aTerzo.PG_VER_REC
	  		 );
	exception
	 when others then
			dbms_output.put_line('Errore '||substr(sqlerrm,1,200)||' per il terzo: '||aTerzo.CD_TERZO);

 end;

 procedure INS_BANCA(aBanca banca%rowtype) is
 begin
 --Dbms_Output.put_line('INS_BANCA'||' terzo '||aBanca.cd_terzo);
 	  insert into banca (
				 		 CD_TERZO,
						 PG_BANCA,
						 CAB, ABI,
						 INTESTAZIONE,
						 QUIETANZA,
						 NUMERO_CONTO,
						 TI_PAGAMENTO,
						 CODICE_IBAN,
						 CODICE_SWIFT,
						 DACR,
						 UTCR,
						 DUVA,
						 UTUV,
						 PG_VER_REC,
						 FL_CANCELLATO,
						 CD_TERZO_DELEGATO,
		 				 PG_BANCA_DELEGATO,
		 				 ORIGINE,
		 				 FL_CC_CDS,
		 				 CIN
						 )
 	  values(
						 aBanca.CD_TERZO,
						 aBanca.PG_BANCA,
						 aBanca.CAB,
						 aBanca.ABI,
						 aBanca.INTESTAZIONE,
						 aBanca.QUIETANZA,
						 aBanca.NUMERO_CONTO,
						 aBanca.TI_PAGAMENTO,
						 aBanca.CODICE_IBAN,
						 aBanca.CODICE_SWIFT,
						 aBanca.DACR,
						 aBanca.UTCR,
						 aBanca.DUVA,
						 aBanca.UTUV,
						 aBanca.PG_VER_REC,
						 aBanca.FL_CANCELLATO,
		 				 aBanca.CD_TERZO_DELEGATO,
		 				 aBanca.PG_BANCA_DELEGATO,
		 				 aBanca.ORIGINE,
		 				 aBanca.FL_CC_CDS,
		 				 aBanca.CIN
		);
 end;

 procedure INS_MOD_PAGAMENTO (aModPagamento modalita_pagamento%rowtype,aAnaDip cnr_anadip%rowtype ) is
 begin
 --Dbms_Output.put_line('INS_MOD_PAGAMENTO'||' matricola '||aAnaDip.matricola);
 	  INSERT INTO MODALITA_PAGAMENTO
					(CD_TERZO,
					CD_MODALITA_PAG,
					CD_TERZO_DELEGATO,
					DACR,
					UTCR,
					DUVA,
					UTUV,
					PG_VER_REC)
			  VALUES (aModPagamento.CD_TERZO,
					aModPagamento.CD_MODALITA_PAG,
					aModPagamento.CD_TERZO_DELEGATO,
					aModPagamento.DACR,
					aModPagamento.UTCR,
					aModPagamento.DUVA,
					aModPagamento.UTUV,
					aModPagamento.PG_VER_REC);
 exception
 when dup_val_on_index then
 	  ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , ' risulta già inserita la modalita di pagamento ' || aModPagamento.CD_MODALITA_PAG, '');
 end;

 procedure INS_RAPPORTO (aRapporto rapporto%rowtype) is
 begin
--Dbms_Output.put_line('INS_RAPPORTO'||' matricola '||aRapporto.matricola_dipendente);
	  insert into rapporto (
	  CD_TIPO_RAPPORTO
	  ,CD_ANAG
	  ,DT_INI_VALIDITA
	  ,MATRICOLA_DIPENDENTE
	  ,CAUSALE_FINE_RAPPORTO
	  ,DT_FIN_VALIDITA
	  ,DACR
	  ,UTCR
	  ,DUVA
	  ,UTUV
	  ,PG_VER_REC
	  ,CD_ENTE_PREV_STI
	  ,CD_RAPP_IMPIEGO_STI)   --flavia
	  values(
	  aRapporto.CD_TIPO_RAPPORTO
	  ,aRapporto.CD_ANAG
	  ,aRapporto.DT_INI_VALIDITA
	  ,aRapporto.MATRICOLA_DIPENDENTE
	  ,aRapporto.CAUSALE_FINE_RAPPORTO
	  ,aRapporto.DT_FIN_VALIDITA
	  ,aRapporto.DACR
	  ,aRapporto.UTCR
	  ,aRapporto.DUVA
	  ,aRapporto.UTUV
	  ,aRapporto.PG_VER_REC
	  ,aRapporto.CD_ENTE_PREV_STI
	  ,aRapporto.CD_RAPP_IMPIEGO_STI); --flavia

 exception
 when others then
		dbms_output.put_line('Errore '||substr(sqlerrm,1,200)||' per l''anagrafico: '||aRapporto.CD_ANAG||' - '||
		aRapporto.CD_TIPO_RAPPORTO||' - '||aRapporto.DT_INI_VALIDITA||' - '||
		aRapporto.DT_FIN_VALIDITA);
 end;


 procedure INS_INQUADRAMENTO (aInquadramento inquadramento%rowtype) as
 begin
 --Dbms_Output.put_line('INS_INQUADRAMENTO'||' anag '||aInquadramento.cd_anag);
 	  insert into inquadramento (
	  		 CD_TIPO_RAPPORTO,
			 CD_ANAG,
			 DT_INI_VALIDITA_RAPPORTO,
			 PG_RIF_INQUADRAMENTO,
			 DT_INI_VALIDITA,
			 DT_FIN_VALIDITA,
			 DACR,
			 UTCR,
			 DUVA,
			 UTUV,
			 PG_VER_REC)
	  values (
	  		 aInquadramento.CD_TIPO_RAPPORTO,
			 aInquadramento.CD_ANAG,
			 aInquadramento.DT_INI_VALIDITA_RAPPORTO,
			 aInquadramento.PG_RIF_INQUADRAMENTO,
			 aInquadramento.DT_INI_VALIDITA,
			 aInquadramento.DT_FIN_VALIDITA,
			 aInquadramento.DACR,
			 aInquadramento.UTCR,
			 aInquadramento.DUVA,
			 aInquadramento.UTUV,
			 aInquadramento.PG_VER_REC);

Exception
       /*When Dup_Val_On_Index Then
                Null;*/
	when Others Then
		dbms_output.put_line('Errore '||substr(sqlerrm,1,200)||' per l''anagrafico: '||aInquadramento.CD_ANAG||' - '||
		aInquadramento.CD_TIPO_RAPPORTO||' - '||aInquadramento.DT_INI_VALIDITA_RAPPORTO||' - '||
		aInquadramento.PG_RIF_INQUADRAMENTO||' - '||aInquadramento.DT_INI_VALIDITA);
 end;


 procedure INS_MONTANTE(aMontante montanti%rowtype) as
 begin
 --Dbms_Output.put_line('INS_MONTANTE anag '||aMontante.cd_anag);
 	  insert into montanti
		  (ESERCIZIO,
		   CD_ANAG,
		   IRPEF_DIPENDENTI,
		   INPS_DIPENDENTI,
		   INPS_TESORO_DIPENDENTI,
		   RIDUZ_DIPENDENTI,
		   FONDO_FS_DIPENDENTI,
		   IRPEF_ALTRI,
		   INPS_ALTRI,
		   INAIL_ALTRI,
		   RIDUZ_ALTRI,
		   DACR,
		   UTCR,
		   DUVA,
		   UTUV,
		   PG_VER_REC,
		   IRPEF_LORDO_DIPENDENTI,
		   IRPEF_LORDO_ALTRI,
		   DEDUZIONE_IRPEF_DIPENDENTI,
		   DEDUZIONE_IRPEF_ALTRI,
		   INPS_OCCASIONALI,
		   DEDUZIONE_FAMILY_ALTRI,
           INPGI_ALTRI,
           ENPAPI_ALTRI)
 	  values
	  		 (aMontante.ESERCIZIO,
		      	  aMontante.CD_ANAG,
		   	  aMontante.IRPEF_DIPENDENTI,
		   	  aMontante.INPS_DIPENDENTI,
		   	  aMontante.INPS_TESORO_DIPENDENTI,
		   	  aMontante.RIDUZ_DIPENDENTI,
		   	  aMontante.FONDO_FS_DIPENDENTI,
		   	  aMontante.IRPEF_ALTRI,
		   	  aMontante.INPS_ALTRI,
		   	  aMontante.INAIL_ALTRI,
		   	  aMontante.RIDUZ_ALTRI,
		   	  aMontante.DACR,
		   	  aMontante.UTCR,
		   	  aMontante.DUVA,
		   	  aMontante.UTUV,
		   	  aMontante.PG_VER_REC,
		   	  aMontante.IRPEF_LORDO_DIPENDENTI,
		   	  aMontante.IRPEF_LORDO_ALTRI,
		   	  aMontante.DEDUZIONE_IRPEF_DIPENDENTI,
		   	  aMontante.DEDUZIONE_IRPEF_ALTRI,
		   	  aMontante.INPS_OCCASIONALI,
		   	  aMontante.DEDUZIONE_FAMILY_ALTRI,
          aMontante.INPGI_ALTRI,
          aMontante.ENPAPI_ALTRI);
 end;

 procedure UPD_ANAGRAFICO(aAnagrafico anagrafico%rowtype) is
 begin
 --Dbms_Output.put_line('UPD_ANAGRAFICO'||' anag '||aAnagrafico.cd_anag);
	 update anagrafico
	 set
-- 	  CD_ANAG                    := lPgAnagrafico
-- 	  CD_CLASSIFIC_ANAG 		 := NULL -- ?? Chiedere
-- 	  TI_ENTITA 				 := 'F'
-- 	  TI_ENTITA_FISICA 			 := 'A'
-- 	  TI_ENTITA_GIURIDICA 		 := NULL
-- 	  FL_SOGGETTO_IVA 			 := 'N'
	  CODICE_FISCALE 			 = aAnagrafico.CODICE_FISCALE,
-- 	  PARTITA_IVA 				 = NULL
-- 	  ID_FISCALE_ESTERO 		 = NULL
-- 	  RAGIONE_SOCIALE 			 = NULL
	  NOME 						 = aAnagrafico.NOME,
	  COGNOME 					 = aAnagrafico.COGNOME,
	  TI_SESSO 					 = aAnagrafico.TI_SESSO,
	  DT_NASCITA 				 = aAnagrafico.DT_NASCITA,
	  PG_COMUNE_NASCITA 		 = aAnagrafico.PG_COMUNE_NASCITA,
	  VIA_FISCALE 				 = aAnagrafico.VIA_FISCALE,
	  NUM_CIVICO_FISCALE 		 = aAnagrafico.NUM_CIVICO_FISCALE,
	  PG_COMUNE_FISCALE 		 = aAnagrafico.PG_COMUNE_FISCALE,
	  CAP_COMUNE_FISCALE 		 = aAnagrafico.CAP_COMUNE_FISCALE,
--	  FRAZIONE_FISCALE 			 = NULL -- ?? Chiedere
	  PG_NAZIONE_FISCALE 		 = aAnagrafico.PG_NAZIONE_FISCALE,
	  PG_NAZIONE_NAZIONALITA 	 = aAnagrafico.PG_NAZIONE_NAZIONALITA,
-- 	  FL_FATTURAZIONE_DIFFERITA  = 'N',
-- 	  FL_OCCASIONALE 			 = 'N',
	  TI_ITALIANO_ESTERO 		 = aAnagrafico.TI_ITALIANO_ESTERO,
--    CD_ATTIVITA_INPS 			 = NULL,
--    ALTRA_ASS_PREVID_INPS 	 = NULL,
--    ALIQUOTA_FISCALE 			 = NULL,
--    CODICE_FISCALE_CAF 		 = NULL, -- ?? Chiedere
--    DENOMINAZIONE_CAF 		 = NULL, -- ?? Chiedere
--    SEDE_INAIL 				 = NULL, -- ?? Chiedere
--    MATRICOLA_INAIL 			 = NULL, -- ?? Chiedere
--    CONTO_NUMERARIO_CREDITO 	 = NULL, -- Non Usare
--    CONTO_NUMERARIO_DEBITO 	 = NULL, -- Non Usare
--    NUM_ISCRIZ_CCIAA 			 = NULL,
--    NUM_ISCRIZ_ALBO 			 = NULL,
-- 	  DT_FINE_RAPPORTO 		     = aAnaDip.data_cessazione,
-- 	  CAUSALE_FINE_RAPPORTO 	 = aAnaDip.desc_causa_Cess,
--    DT_CANC 					 = NULL,
--    DT_ANTIMAFIA 				 = NULL,
--    CD_ENTE_APPARTENENZA 		 = NULL,
--    NOTE 						 = NULL,
 	  DUVA 						 = aAnagrafico.DUVA,
 	  UTUV 						 = aAnagrafico.UTUV,
 	  PG_VER_REC 				 = aAnagrafico.PG_VER_REC
	 where cd_anag = aAnagrafico.cd_anag;
 end;

 procedure UPD_TERZO(aTerzo Terzo%rowtype) is
 begin
 --Dbms_Output.put_line('UPD_TERZO'||' anag '||aTerzo.cd_anag);
 	  update terzo
	  set
--	  CD_TERZO                = lPgTerzo;
--	  FRAZIONE_SEDE  		  = NULL;
--	  CD_ANAG 	   			  = aAnagrafico.cd_anag;
--	  DT_FINE_RAPPORTO   	  = aAnagrafico.dt_fine_rapporto;
--	  TI_TERZO		    	  = 'E';
	  CD_PRECEDENTE	    	  = aTerzo.CD_PRECEDENTE,
	  DENOMINAZIONE_SEDE 	  = aTerzo.DENOMINAZIONE_SEDE,
	  VIA_SEDE				  = aTerzo.VIA_SEDE,
	  NUMERO_CIVICO_SEDE 	  = aTerzo.NUMERO_CIVICO_SEDE,
	  PG_COMUNE_SEDE     	  = aTerzo.PG_COMUNE_SEDE,
	  CAP_COMUNE_SEDE 		  = aTerzo.CAP_COMUNE_SEDE,
-- 	  PG_RAPP_LEGALE		  = NULL,
-- 	  CD_UNITA_ORGANIZZATIVA  = NULL,
-- 	  NOME_UNITA_ORGANIZZATIVA= NULL,
-- 	  NOTE 					  = NULL,
-- 	  DT_CANC 				  = NULL,
	  DUVA 					  = aTerzo.DUVA,
	  UTUV 					  = aTerzo.UTUV,
	  PG_VER_REC 			  = aTerzo.PG_VER_REC
	  where cd_terzo = aTerzo.cd_terzo;

 end;

 procedure UPD_RAPPORTO (aAnaDip cnr_Anadip%rowtype,aAnagrafico anagrafico%rowtype,
 		   				aRapporto in out rapporto%rowtype, aRapportoPrec in out rapporto%rowtype,
						aData date, aUtente varchar2) is
 lCdTipoRap tipo_rapporto.cd_tipo_rapporto%type;
 lEseguiControllo boolean:=true;
 begin
 --Dbms_Output.put_line('UPD_RAPPORTO'||' matricola '||aAnaDip.matricola);
	  lCdTipoRap := cTIPO_RAPPORTO;

	  Begin

	  	  -- Carichiamo il rapporto attuale
		  select *
		  into aRapporto
		  from rapporto
		  where cd_tipo_rapporto       = lCdTipoRap
		  and   cd_anag 	       = aAnagrafico.cd_anag
		  and   trunc(dt_ini_validita) = trunc(aAnadip.data_assunzione) for update nowait;

                /* Dbms_Output.put_line('rapporto ' ||' tipo_rapporto '||lCdTipoRap||
                'anagrafico '||aAnagrafico.cd_anag||' data assunzione '||trunc(aAnadip.data_assunzione)||
                ' data ini val rapporto '||aRapporto.dt_ini_validita);*/

      if (aRapporto.CD_ENTE_PREV_STI is null or (aRapporto.CD_ENTE_PREV_STI!= aAnaDip.ente_prev)) then
      	update rapporto
				  set  cd_ente_prev_sti =  aAnaDip.ente_prev
				  	  ,DUVA		     = aData
				  	  ,UTUV		     = aUtente
				  	  ,PG_VER_REC        = PG_VER_REC +1
				  where cd_tipo_rapporto = lCdTipoRap
				  and   cd_anag 	 = aAnagrafico.cd_anag
				  and   dt_ini_validita  = aRapporto.dt_ini_validita;

      end if;
		  -- Se esiste un rapporto e risulta data_cessazione is not null e > sysdate
		  if trim(aAnaDip.data_cessazione) is not null then

		  --if trunc(aAnaDip.data_cessazione) > trunc(sysdate) then
			  	  aRapporto.CAUSALE_FINE_RAPPORTO := aAnaDip.desc_causa_cess;
			  	  aRapporto.DT_FIN_VALIDITA       := aAnaDip.data_cessazione;--nvl(aAnaDip.data_cessazione,to_date('31122200','ddmmyyyy'));


				  update rapporto
				  set  CAUSALE_FINE_RAPPORTO = aAnaDip.desc_causa_cess
				  	  ,DT_FIN_VALIDITA   = aAnaDip.data_cessazione--nvl(aAnaDip.data_cessazione,to_date('31122200','ddmmyyyy'))
				  	  ,DUVA		     = aData
				  	  ,UTUV		     = aUtente
				  	  ,PG_VER_REC        = PG_VER_REC +1
				  where cd_tipo_rapporto = lCdTipoRap
				  and   cd_anag 	 = aAnagrafico.cd_anag
				  and   dt_ini_validita  = aRapporto.dt_ini_validita;
		  	  ---end if;

		  end if;

/* da testare  nuovo aggiornamento per i rapporti chiusi che vengono ripristinati! */
		  -- se un rapporto era stato chiuso ma il dipendente è rientrato in servizio
		  -- viene aggiornata la data di fine validità del rapporto.

		  if trim(aAnaDip.data_cessazione) is null and trunc(aRapporto.dt_fin_validita) is not null
		  	 and trunc(aRapporto.dt_fin_validita) trunc(aAnadip.data_assunzione)) then
				   -- in questo caso i periodi si sovrappongono
				--ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Non Inserito Rapporto precedente > data inizio rapporto attuale ', '');
                                --Dbms_Output.put_line('Data fine validita rapporto '|| aRapporto.dt_fin_validita||' - data_assunzione '||aAnadip.data_assunzione);
                                ---FLAVIA---  Chiusura del rapporto precedente ed inserimento del nuovo

				update rapporto
				  set  DT_FIN_VALIDITA 		 = nvl(trunc(aAnaDip.data_assunzione)-1,trunc(aRapporto.dt_ini_validita)-1)
				  	  ,DUVA					 = aData
				  	  ,UTUV					 = aUtente
				  	  ,PG_VER_REC			 = PG_VER_REC +1
				  where cd_tipo_rapporto = lCdTipoRap
				  and   cd_anag 		 = aAnagrafico.cd_anag
				  and   dt_fin_validita  = aRapporto.dt_fin_validita;

				 	aRapporto.CD_TIPO_RAPPORTO      :=  cTIPO_RAPPORTO;
				 	aRapporto.CAUSALE_FINE_RAPPORTO := aAnaDip.desc_causa_cess;
				  	aRapporto.CD_ANAG  	    := aAnagrafico.cd_anag;
				  	aRapporto.DT_INI_VALIDITA  	:= aAnaDip.data_assunzione;
				  	aRapporto.MATRICOLA_DIPENDENTE  := aAnadip.matricola;
				  	aRapporto.DT_FIN_VALIDITA	:= nvl(aAnaDip.data_cessazione,to_date('31122200','ddmmyyyy'));
				  	aRapporto.DACR			:= aData;
				  	aRapporto.UTCR			:= aUtente;
				  	aRapporto.DUVA			:= aData;
				  	aRapporto.UTUV			:= aUtente;
				  	aRapporto.PG_VER_REC		:= aRapporto.PG_VER_REC+1;
					aRapporto.CD_ENTE_PREV_STI      := aAnaDip.ente_prev;--- flavia
                                        aRapporto.CD_RAPP_IMPIEGO_STI   := aAnaDip.RAPP_IMPIEGO;
	  				INS_RAPPORTO(aRapporto);

			     else

				    aRapporto.CD_TIPO_RAPPORTO      :=  cTIPO_RAPPORTO;
				  	aRapporto.CD_ANAG  		:= aAnagrafico.cd_anag;
				  	aRapporto.DT_INI_VALIDITA  	:= aAnaDip.data_assunzione;
				  	aRapporto.MATRICOLA_DIPENDENTE  := aAnadip.matricola;
				  	aRapporto.CAUSALE_FINE_RAPPORTO := aAnaDip.desc_causa_cess;
				  	aRapporto.DT_FIN_VALIDITA	:= nvl(aAnaDip.data_cessazione,to_date('31122200','ddmmyyyy'));
				  	aRapporto.DACR			:= aData;
				  	aRapporto.UTCR			:= aUtente;
				  	aRapporto.DUVA			:= aData;
				  	aRapporto.UTUV			:= aUtente;
				  	aRapporto.PG_VER_REC		:= 1;
					  aRapporto.CD_ENTE_PREV_STI      := aAnaDip.ente_prev;  --- flavia
					  aRapporto.CD_RAPP_IMPIEGO_STI   := aAnaDip.RAPP_IMPIEGO;

					  update rapporto
					     set  DT_FIN_VALIDITA 		 = nvl(trunc(aAnaDip.data_assunzione)-1,trunc(aRapporto.dt_ini_validita)-1)
				  	  ,DUVA					 = aData
				  	  ,UTUV					 = aUtente
				  	  ,PG_VER_REC			 = PG_VER_REC +1
				 			 where cd_tipo_rapporto = lCdTipoRap
							  and   cd_anag 		 = aAnagrafico.cd_anag
				 				and   dt_fin_validita  >= nvl(trunc(aAnaDip.data_assunzione)-1,trunc(aRapporto.dt_ini_validita)-1);

	  				INS_RAPPORTO(aRapporto);

				end if;
				--ALLINEA_INQUADRAMENTO(aAnaDip ,aAnagrafico ,aData ,aUtente );
	  end;
 end;



procedure UPD_INQUADRAMENTO (aAnaDip cnr_Anadip%rowtype
 		   					 ,aAnagrafico anagrafico%rowtype
							 ,aRapporto rapporto%rowtype
							 ,aRapportoPrec rapporto%rowtype
							 ,aData date
							 ,aUtente varchar2) is
 lCdTipoRapporto rapporto.cd_tipo_rapporto%type;
 lPgRifInquadramento number;
 lPgRifInquadramentoOld number;
 lDtInizioValiInqPrec date;
 lContinuaEsecuzione boolean := true;
 lInquadrPrec boolean := true;
 lInquadramento inquadramento%rowtype;
 lInquadramentoPrec inquadramento%rowtype;
 lNumInqAperti number;
 conta_inq number;
 dt_up date;
 v_pg_ver_rec number;
 begin
 --Dbms_Output.put_line('UPD_INQUADRAMENTO'||' matricola '||aAnaDip.matricola);
	  lCdTipoRapporto := cTIPO_RAPPORTO;
	  -- Controllo se gli inqudramenti sono validi
	  begin
	 	  select pg_rif_inquadramento
		  into   lPgRifInquadramento
	 	  from rif_inquadramento
	 	  where CD_PROFILO =  aAnaDip.livello_1
		  and   CD_PROGRESSIONE = aAnaDip.livello_2
		  and   cd_livello is null;

 		  lContinuaEsecuzione := true;

	  exception when no_data_found then
				lContinuaEsecuzione := false;
			  	ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Manca il riferimento per inquadramento ', '');
	  end;
	  begin
	 	  select pg_rif_inquadramento
		  into lPgRifInquadramentoOld
	 	  from rif_inquadramento
	 	  where CD_PROFILO =  aAnaDip.livprec_1
		  and   CD_PROGRESSIONE = aAnaDip.livprec_2
		  and   cd_livello is null;

		   lInquadrPrec := true;

	  exception when no_data_found then
				lInquadrPrec := false;
				if aAnaDip.livprec_1 is not null or aAnaDip.livprec_2 is not null then
			  	   ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Manca il riferimento per inquadramento periodo precedente, livprec_1 = '|| nvl(aAnaDip.livprec_1,'NULL') || ', livprec_2 = ' || nvl(aAnaDip.livprec_2,'NULL'), '');
				end if;
	  end;


	  -- Inseriamo o modifichiamo l'inquadramento attuale
	  if  lContinuaEsecuzione then

		  begin

		  	 select count(*)
			   into lNumInqAperti
			   from inquadramento
			   where CD_TIPO_RAPPORTO         = lCdTipoRapporto
			   and 	 CD_ANAG                  = aAnagrafico.cd_anag
			   and   trunc(DT_INI_VALIDITA_RAPPORTO) = trunc(aRapporto.dt_ini_validita)
			   and   PG_RIF_INQUADRAMENTO  	  = lPgRifInquadramento
			   and   trunc(DT_INI_VALIDITA) >=  trunc(aAnadip.giu_dec_inizio);


			if    lNumInqAperti = 0 then

				if trunc(aAnadip.data_cessazione) > trunc(sysdate) or trunc(aAnadip.data_cessazione) is null then

				 	  lInquadramento.CD_TIPO_RAPPORTO         := lCdTipoRapporto;
				 	  lInquadramento.CD_ANAG                  := aAnagrafico.cd_anag;
				 	  lInquadramento.DT_INI_VALIDITA_RAPPORTO := aRapporto.dt_ini_validita;
				 	  lInquadramento.PG_RIF_INQUADRAMENTO     := lPgRifInquadramento;
				 	  lInquadramento.DT_INI_VALIDITA	  	  := aAnadip.giu_dec_inizio;
				 	  lInquadramento.DT_FIN_VALIDITA	   	  := nvl(aAnadip.data_cessazione,to_date('31/12/2200','dd/mm/yyyy'));
				 	  lInquadramento.DACR			  		  := aData;
				 	  lInquadramento.UTCR			  		  := aUtente;
				 	  lInquadramento.DUVA			  		  := aData;
				 	  lInquadramento.UTUV			  		  := aUtente;
				 	  lInquadramento.PG_VER_REC		  		  := 1;

				 	    update Inquadramento
					     set  DT_FIN_VALIDITA 		 = nvl(trunc(aAnaDip.data_assunzione)-1,trunc(aRapporto.dt_ini_validita)-1)
				  	  ,DUVA					 = aData
				  	  ,UTUV					 = aUtente
				  	  ,PG_VER_REC			 = PG_VER_REC +1
				 			 where cd_tipo_rapporto = lCdTipoRapporto
							  and   cd_anag 		 = aAnagrafico.cd_anag
							  and   dt_ini_validita  <= nvl(trunc(aAnaDip.data_assunzione)-1,trunc(aRapporto.dt_ini_validita)-1)
				 				and   dt_fin_validita  >= nvl(trunc(aAnaDip.data_assunzione)-1,trunc(aRapporto.dt_ini_validita)-1);

			 	   INS_INQUADRAMENTO(lInquadramento);
			 	end if;
			 end if;

		  exception
		  when no_data_found then
		  --	dbms_output.put_line('no_data_found per l''anagrafico: '||aAnagrafico.cd_anag);
		  ibmutl200.logInf(gPgLog ,'Matricola ' || aAnaDip.matricola , 'Impossibile inserire l''inquadramento la data di inizio rapporto non è valida', '');
		  end;
	  end if;

 end;

 procedure UPD_MONTANTE (aMontante montanti%rowtype) as
 begin
  --Dbms_Output.put_line('UPD_MONTANTE anag '||aMontante.cd_anag);
 	  update montanti
	  set IRPEF_DIPENDENTI            = aMontante.IRPEF_DIPENDENTI,
		  IRPEF_LORDO_DIPENDENTI	  = aMontante.IRPEF_LORDO_DIPENDENTI,
		  INPS_DIPENDENTI	          = aMontante.INPS_DIPENDENTI,
		  INPS_TESORO_DIPENDENTI  	  = aMontante.INPS_TESORO_DIPENDENTI,
		  --la riduzione erariale viene gestita ed aggiornata in SIGLA quindi non deve essere sovrascritta
		  --RIDUZ_DIPENDENTI     = aMontante.RIDUZ_DIPENDENTI,
		  FONDO_FS_DIPENDENTI	      = aMontante.FONDO_FS_DIPENDENTI,
		  DEDUZIONE_IRPEF_DIPENDENTI  = aMontante.DEDUZIONE_IRPEF_DIPENDENTI,
		  DUVA  			   		  = aMontante.duva,
		  UTUV						  = aMontante.utuv,
		  PG_VER_REC				  = pg_ver_rec + 1
	  where esercizio = aMontante.esercizio
	  and   cd_anag   = aMontante.cd_anag;
 end;

 procedure JOB_AGGIORNA_COORD_BANCARIE(job number, pg_exec number, next_date date, nrGiorniBack number) as
    aTSNow date;
    aUser varchar2(20);
 begin
    aTSNow:=sysdate;
    aUser:=IBMUTL200.getUserFromLog(pg_exec);
    gPgLog := pg_exec;

    -- Aggiorna le info di testata del log
    IBMUTL210.logStartExecutionUpd(gPgLog, TIPO_LOG_JOB_NSIP, job, 'Batch di aggiornamento coordinate bancarie dipendenti. Start:'||to_char(aTSNow,'YYYY/MM/DD HH-MI-SS'));

    for recCoordinate in (select * from pea_coordinate
                          where coo_iban is not null
                          and coo_data_op > sysdate-nvl(nrGiorniBack,3)) loop
      declare
        recAnag ANAGRAFICO%ROWTYPE;
        recTerzo TERZO%ROWTYPE;
        recAnadip CNR_ANADIP%ROWTYPE;
      begin
          --recupero il rapporto attivo legato alla matricola
          begin
          	  Select distinct anagrafico.* INTO recAnag
			  From rapporto, anagrafico
			  Where anagrafico.cd_anag = rapporto.cd_anag
              And   dt_fine_rapporto Is Null
              And   matricola_dipendente = Rtrim(recCoordinate.dip_id);

              begin
                 select * into recTerzo
                 from terzo
                 where cd_terzo = (select min(cd_terzo) from terzo where cd_anag = recAnag.cd_anag and dt_fine_rapporto is null);

                 recAnadip.matricola := Rtrim(recCoordinate.DIP_ID);
                 recAnadip.nominativo := Rtrim(recTerzo.DENOMINAZIONE_SEDE);
                 recAnadip.mod_pag := Rtrim(recCoordinate.COO_MOD_PAG);
                 recAnadip.iban_pag := Rtrim(recCoordinate.COO_IBAN);
                 recAnadip.abi_pag := Rtrim(recCoordinate.COO_ABI);
                 recAnadip.cab_pag := Rtrim(recCoordinate.COO_CAB);
                 recAnadip.nrc_pag := Rtrim(recCoordinate.COO_NUM_CONTO);
                 recAnadip.cin_pag := Rtrim(recCoordinate.COO_CIN);

                 IBMUTL015.setRbsBig;

                 MODIFICABANCA(recAnadip, recAnag, recTerzo, aTSNow, aUser);

                 IBMUTL015.commitRbsBig;
              exception when no_data_found then
                 ibmutl200.logErr(gPgLog,'Matricola ' || recCoordinate.dip_id, 'Manca il TERZO associato al record ANAGRAFICO con codice '||recAnag.cd_anag, '');
              end;
          exception
              when no_data_found then
                ibmutl200.logInf(gPgLog,'Matricola ' || recCoordinate.dip_id, 'Dipendente non registrato in SIGLA', '');
              when too_many_rows then
                ibmutl200.logErr(gPgLog,'Matricola ' || recCoordinate.dip_id, 'Troppe anagrafiche attive presenti', '');
            null;
          end;
      end;
    end loop;
    ibmutl200.logInf(gPgLog,'Batch di aggiornamento coordinate bancarie dipendenti.', 'End:'||to_char(sysdate,'YYYY/MM/DD HH-MI-SS'), '');
 end;
end;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy