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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB204" is

 function pk2String(aLiqIva liquidazione_iva%rowtype) return varchar2 is
 begin
  return aLiqIva.tipo_liquidazione||'-'||aLiqIva.cd_cds||'-'||aLiqIva.esercizio||'-'||aLiqIva.cd_unita_organizzativa||'-'||to_char(aLiqIva.dt_inizio,'YYYYMMDD')||'-'||to_char(aLiqIva.dt_fine,'YYYYMMDD');
 end;

 function isEsercizioPartenza(aEs number) return boolean is
 begin
  if aEs = CNRCTB008.ESERCIZIO_PARTENZA then
   return true;
  else
   return false;
  end if;
 end;

 function getEsercizio(aTS date) return number is
 begin
  return to_number(to_char(aTS,'YYYY'));
 end;

 function checkIsCogeDifferita(aDocTst V_DOC_AMM_COGE_TSTA%rowtype) return boolean is
 begin
  return false;
 end;

 function getDescDocumento(aBS buono_carico_scarico_dett%rowtype) return varchar2 is
  aStringa varchar2(1000);
 begin
  aStringa:='';
  aStringa:=aStringa||' Pg Invent:'||aBS.pg_inventario;
  aStringa:=aStringa||' Tipo:'||aBS.ti_documento;
  aStringa:=aStringa||' Es:'||aBS.ESERCIZIO;
  aStringa:=aStringa||' Pg Buono C/S:'||aBS.pg_buono_c_s;
  aStringa:=aStringa||' Nr. invent.:'||aBS.nr_inventario;
  aStringa:=aStringa||' Progr.:'||aBS.progressivo;
  return aStringa;
 end;

 function getDescDocumento(aDocTst V_DOC_AMM_COGE_TSTA%rowtype) return varchar2 is
  aStringa varchar2(1000);
 begin
--  aStringa:='P/U: P';
  aStringa:='';
  aStringa:=aStringa||' Cds:'||aDocTst.CD_CDS;
  aStringa:=aStringa||' Uo:'||aDocTst.CD_UNITA_ORGANIZZATIVA;
  aStringa:=aStringa||' Es:'||aDocTst.ESERCIZIO;
  aStringa:=aStringa||' Tipo:'||aDocTst.CD_TIPO_DOCUMENTO;
  aStringa:=aStringa||' Dt_reg:'||aDocTst.DT_REGISTRAZIONE;
  aStringa:=aStringa||' Pg_doc:'||aDocTst.PG_NUMERO_DOCUMENTO;
  aStringa:=aStringa||' Stipo:'||aDocTst.TI_FATTURA;
  return aStringa;
 end;

 function getDescDocumento(aDocTst V_DOC_ULT_COGE_TSTA%rowtype) return varchar2 IS
  aStringa varchar2(1000);
 begin
--  aStringa:='P/U: U';
  aStringa:='';
  aStringa:=aStringa||' Cds:'||aDocTst.CD_CDS;
  aStringa:=aStringa||' Uo:'||aDocTst.CD_UNITA_ORGANIZZATIVA;
  aStringa:=aStringa||' Es:'||aDocTst.ESERCIZIO;
  aStringa:=aStringa||' Man/Rev.:'||aDocTst.CD_TIPO_DOCUMENTO_CONT;
  aStringa:=aStringa||' Tipo:'||aDocTst.TI_MAN_REV;
  aStringa:=aStringa||' Dt_reg:'||aDocTst.DT_EMISSIONE_DOCUMENTO_CONT;
  aStringa:=aStringa||' Dt_esi:'||aDocTst.DT_ESITO_DOCUMENTO_CONT;
  aStringa:=aStringa||' Pg_doc:'||aDocTst.PG_DOCUMENTO_CONT;
  return aStringa;
 end;

 function getCompetenzaFuoriEsercizio(aDocTst V_DOC_AMM_COGE_TSTA%rowtype) return boolean is
  isCompetenzaFuoriEsercizio boolean;
  aEsercizioComp number(4);
 begin
  isCompetenzaFuoriEsercizio:=false;
  aEsercizioComp:=getEsercizio(aDocTst.dt_a_competenza_coge);
  if aEsercizioComp = aDocTst.esercizio - 1 then
   isCompetenzaFuoriEsercizio:=true;
  end if;
  if aEsercizioComp < aDocTst.esercizio - 1 then
   IBMERR001.RAISE_ERR_GENERICO('La competenza economica (data fine periodo) del documento è errata:'||aDocTst.dt_a_competenza_coge||' per esercizio:'||aDocTst.esercizio);
  end if;
  return isCompetenzaFuoriEsercizio;
 end;

Function getCompetenzaacavalloconEsPrec(aDocTst V_DOC_AMM_COGE_TSTA%rowtype) return Boolean Is
  isCompetenzaacavallo boolean;
  Esercizio_daComp number(4);
  Esercizio_aComp  number(4);
 begin
  isCompetenzaacavallo := false;
  Esercizio_daComp := getEsercizio(aDocTst.dt_da_competenza_coge);
  Esercizio_aComp  := getEsercizio(aDocTst.dt_a_competenza_coge);

  if aDocTst.esercizio = Esercizio_aComp And
        Esercizio_daComp = Esercizio_aComp - 1 Then
   isCompetenzaacavallo := true;
  end if;

  if aDocTst.esercizio = Esercizio_aComp And
        Esercizio_daComp < Esercizio_aComp - 1 Then
   IBMERR001.RAISE_ERR_GENERICO('La competenza economica (data fine periodo) del documento è errata:'||aDocTst.dt_a_competenza_coge||' per esercizio:'||aDocTst.esercizio);
  end if;

  return isCompetenzaacavallo;
End;

 function getAnticipo(
  aCdTipoDoc varchar2,
  aEsDoc number,
  aCdCds varchar2,
  aCdUo varchar2,
  aPgDoc number
 ) return anticipo%rowtype is
  aMissione missione%rowtype;
  aCompenso compenso%rowtype;
  aAnticipo anticipo%rowtype;
 Begin
 Dbms_Output.put_line ('inizio ricerca anticipo da '||aCdTipoDoc);
  -- Solo MISSIONI e COMPENSI hanno anticipo
  if aCdTipoDoc not in (CNRCTB100.TI_COMPENSO, CNRCTB100.TI_MISSIONE) Then

   return aAnticipo;
  end if;
  if aCdTipoDoc = CNRCTB100.TI_COMPENSO then
   begin
    select * into aCompenso from compenso where
         esercizio = aEsDoc
	 and cd_cds = aCdCds
	 and cd_unita_organizzativa = aCdUo
     and pg_compenso = aPgDoc
    for update nowait;
   exception when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Documento amministrativo di tipo compenso non trovato');
   end;
   -- Se il compenso non è associato a missione
   if aCompenso.pg_missione is null Then

    return aAnticipo;
   end if;
   begin
    select * into aMissione from missione where
         cd_cds = aCompenso.cd_cds_missione
 	 and cd_unita_organizzativa = aCompenso.cd_uo_missione
	 and esercizio = aCompenso.esercizio_missione
	 and pg_missione = aCompenso.pg_missione
	 for update nowait;
   exception when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Missione associata a compenso non trovata');
   end;
  else
   -- Si tratta di missione
   begin
    select * into aMissione from missione where
         cd_cds = aCdCds
	 and cd_unita_organizzativa = aCdUo
	 and esercizio = aEsDoc
	 and pg_missione = aPgDoc
	for update nowait;
   exception when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Documento amministrativo di tipo missione non trovato');
   end;
  end if;
  begin
   -- Se la missione non è associata ad anticipo
   if aMissione.pg_anticipo is null Then

    return aAnticipo;
   end if;
   select * into aAnticipo from anticipo where
          cd_cds = aMissione.cd_cds_anticipo
	  and cd_unita_organizzativa = aMissione.cd_uo_anticipo
  	  and esercizio = aMissione.esercizio_anticipo
	  and pg_anticipo = aMissione.pg_anticipo
	  for update nowait;

   return aAnticipo;
  exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Documento amministrativo di tipo anticipo collegato a missione non trovato');
  end;
  return aAnticipo;
 end;

 function getAnticipo(aDocTst V_DOC_ULT_COGE_RIGA%rowtype) return anticipo%rowtype is
 begin
  return getAnticipo(
    aDocTst.cd_tipo_doc,
    aDocTst.esercizio_doc,
    aDocTst.cd_cds_doc,
    aDocTst.cd_uo_doc,
    aDocTst.pg_numero_doc);
 end;

 function getAnticipo(aDocTst V_DOC_AMM_COGE_TSTA%rowtype) return anticipo%rowtype is
 begin
  return getAnticipo(
    aDocTst.cd_tipo_documento,
    aDocTst.esercizio,
    aDocTst.cd_cds,
    aDocTst.cd_unita_organizzativa,
    aDocTst.pg_numero_documento);
 end;

 -- Ritorna 'Y' se il compenso deriva da missione con anticipo
 -- e l'anticipo è maggiore del netto percipiente

 function isCompConAntMaggNetto(aEs number,aCdCds varchar2, aCdUo varchar2, aPgComp number)  return char is
  aCompenso compenso%rowtype;
  aAnticipo anticipo%rowtype;
 begin
  begin
   select * into aCompenso from compenso where
         esercizio = aEs
	 and cd_cds = aCdCds
	 and cd_unita_organizzativa = aCdUo
     and pg_compenso = aPgComp
    for update nowait;
  exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Documento amministrativo di tipo compenso non trovato');
  end;
  aAnticipo:=getAnticipo(CNRCTB100.TI_COMPENSO,aEs,aCdCds,aCdUo,aPgComp);
  if
 	              aAnticipo.pg_anticipo is not null
	          and aAnticipo.im_anticipo > aCompenso.im_netto_percipiente
  then
   return 'Y';
  else
   return 'N';
  end if;
 end;

 function isCompConAntMaggNetto(aDocTst v_doc_amm_coge_tsta%rowtype) return char is
 begin
  if aDocTst.cd_tipo_documento <> CNRCTB100.TI_COMPENSO then
   IBMERR001.RAISE_ERR_GENERICO('Tipo di documento non compatibile: il documento deve essere un compenso');
  end if;
  return isCompConAntMaggNetto(aDocTst.esercizio,aDocTst.cd_cds, aDocTst.cd_unita_organizzativa, aDocTst.pg_numero_documento);
 end;

 function isCompConAntMaggNetto(aDocTst v_doc_ult_coge_riga%rowtype) return char is
 begin
  if aDocTst.cd_tipo_doc <> CNRCTB100.TI_COMPENSO then
   IBMERR001.RAISE_ERR_GENERICO('Tipo di documento non compatibile: il documento deve essere un compenso');
  end if;
  return isCompConAntMaggNetto(aDocTst.esercizio_doc,aDocTst.cd_cds_doc, aDocTst.cd_uo_doc, aDocTst.pg_numero_doc);
 end;

 procedure getScritturePEPLock(aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aListaScritture OUT CNRCTB200.scrittureList) is
  i NUMBER;
 begin
  i:=1;
  for aScr in (
   select * from scrittura_partita_doppia where
	    cd_cds_documento = aDocTst.cd_cds
    and esercizio_documento_amm = aDocTst.esercizio
	and cd_uo_documento = aDocTst.cd_unita_organizzativa
	and pg_numero_documento = aDocTst.pg_numero_documento
	and cd_tipo_documento = aDocTst.cd_tipo_documento
	and origine_scrittura = CNRCTB200.ORIGINE_DOCUMENTO_AMM
	and ti_scrittura = CNRCTB200.TI_SCRITTURA_PRIMA
	and cd_causale_coge is null
	and attiva = 'Y'
   for update nowait
  ) loop
   aListaScritture(i):=aScr;
   i:=i+1;
  end loop;
 end;

 procedure getScrittureAmmortamentoLock(aEs number, aCdCds varchar2, aListaScritture OUT CNRCTB200.scrittureList) is
  i NUMBER;
 begin
  i:=1;
  for aScr in (
   select * from scrittura_partita_doppia where
	    cd_cds = aCdCds
    and esercizio = aEs
	and origine_scrittura = CNRCTB200.ORIGINE_CHIUSURA
	and cd_causale_coge = CNRCTB200.CAU_AMMORTAMENTO
	and ti_scrittura = CNRCTB200.TI_SCRITTURA_SINGOLA
	and attiva = 'Y'
   for update nowait
  ) loop
   aListaScritture(i):=aScr;
   i:=i+1;
  end loop;
 end;

 procedure getScrittureLock(aEs number, aCdCds varchar2, aCdCausaleCoge varchar2, aOrigine varchar2, aListaScritture OUT CNRCTB200.scrittureList) is
  i NUMBER;
 begin
  i:=1;
  for aScr in (
   select * from scrittura_partita_doppia where
	    cd_cds = nvl(aCdCds,cd_cds)
    and esercizio = nvl(aEs,esercizio)
	and cd_causale_coge = aCdCausaleCoge
	and origine_scrittura = aOrigine
	and attiva = 'Y'
   for update nowait
  ) loop
   aListaScritture(i):=aScr;
   i:=i+1;
  end loop;
 end;

Function ISREVERSALESUPGIRO (aDocRiga In V_DOC_ULT_COGE_RIGA%Rowtype) Return Boolean Is
pgiro_sn CHAR(1);
Begin
Select Distinct(fl_pgiro)
Into   pgiro_sn
From   reversale_riga
Where  CD_CDS                      = aDocRiga.CD_CDS And
       ESERCIZIO                   = aDocRiga.ESERCIZIO And
       PG_REVERSALE                = aDocRiga.PG_DOCUMENTO_CONT And
       CD_CDS_DOC_AMM              = aDocRiga.CD_CDS_DOC And
       CD_UO_DOC_AMM               = aDocRiga.CD_UO_DOC And
       ESERCIZIO_DOC_AMM           = aDocRiga.ESERCIZIO_DOC And
       CD_TIPO_DOCUMENTO_AMM       = aDocRiga.CD_TIPO_DOC And
       PG_DOC_AMM                  = aDocRiga.PG_NUMERO_DOC;

If pgiro_sn = 'Y' Then
  Return True;
Elsif pgiro_sn = 'N' Then
  Return False;
End If;
Exception
When Too_Many_Rows Then
  Return False;
End;

Function ISMANDATOCOLLSUPGIRO (aDocRiga In V_DOC_ULT_COGE_RIGA%Rowtype) Return Boolean Is
pgiro_sn        CHAR(1);
MANDCOLL        MANDATO%Rowtype;
Begin

If aDocRiga.CD_TIPO_DOCUMENTO_CONT = 'REV' Then

Select  M.*
Into    MANDCOLL
From    MANDATO M, ASS_MANDATO_REVERSALE A
Where   A.CD_CDS_REVERSALE       = aDocRiga.CD_CDS AND
        A.ESERCIZIO_REVERSALE    = aDocRiga.ESERCIZIO AND
        A.PG_REVERSALE           = aDocRiga.PG_DOCUMENTO_CONT And
        A.CD_CDS_MANDATO         = M.CD_CDS And
        A.ESERCIZIO_MANDATO      = M.ESERCIZIO And
        A.PG_MANDATO             = M.PG_MANDATO;

Select Distinct(fl_pgiro)
Into   pgiro_sn
From   MANDATO_RIGA
Where  CD_CDS                      = MANDCOLL.CD_CDS And
       ESERCIZIO                   = MANDCOLL.ESERCIZIO And
       PG_MANDATO                  = MANDCOLL.PG_MANDATO;

If pgiro_sn = 'Y' Then
  Return True;
Elsif pgiro_sn = 'N' Then
  Return False;
End If;

Else
   IBMERR001.RAISE_ERR_GENERICO('Si sta cercando di determinare il Mandato collegato ad una Reversale ma il documento contabile non è una Reversale.');
End If;

Exception
When Too_Many_Rows Then
  Return False;
End;

 Function ISVOCECOLLCATEGORIA (INES NUMBER, INGEST CHAR, INAPP CHAR, INELVOCE VARCHAR2) Return Boolean Is
 VOCE_ASS_CAT NUMBER;
 Begin
--Dbms_Output.PUT_LINE ('ENTRO FUNZIONE '||INES||' '||INGEST||' '||INAPP||' '||INELVOCE);
   If INES Is Null Or INGEST Is Null Or INAPP Is Null Or INELVOCE  Is Null Then
     IBMERR001.RAISE_ERR_GENERICO('Impossibile determinare se l''elemento voce è associato a categoria, i dati forniti sono incompleti.');
   End If;

   Select  Count(*)
   Into    VOCE_ASS_CAT
   From    CATEGORIA_GRUPPO_VOCE
   Where   ESERCIZIO        = INES And
           TI_APPARTENENZA  = INAPP And
           TI_GESTIONE      = INGEST And
           CD_ELEMENTO_VOCE = INELVOCE;

   --Dbms_Output.PUT_LINE ('VOCE_ASS_CAT '||VOCE_ASS_CAT);

   If VOCE_ASS_CAT > 0 Then
--Dbms_Output.PUT_LINE ('RITORNO TRUE');
      Return True;
   Else
--Dbms_Output.PUT_LINE ('RITORNO FALSE');
      Return False;
   End If;
 End;


 Procedure getScritturePEPLock(aEs number, aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aCdCausaleCoge varchar2, aListaScritture OUT CNRCTB200.scrittureList) is
  i NUMBER;
 begin
  i:=1;
  for aScr in (
   select * from scrittura_partita_doppia where
	    cd_cds_documento = aDocTst.cd_cds
    and esercizio = nvl(aEs,esercizio)
    and esercizio_documento_amm = aDocTst.esercizio
	and cd_uo_documento = aDocTst.cd_unita_organizzativa
	and pg_numero_documento = aDocTst.pg_numero_documento
	and cd_tipo_documento = aDocTst.cd_tipo_documento
	and cd_causale_coge = aCdCausaleCoge
	and origine_scrittura = CNRCTB200.ORIGINE_DOCUMENTO_AMM
	and attiva = 'Y'
   for update nowait
  ) loop
   aListaScritture(i):=aScr;
   i:=i+1;
  end loop;
 end;

 procedure getScritturePEPLock(aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aCdCausaleCoge varchar2, aListaScritture OUT CNRCTB200.scrittureList) is
 begin
  getScritturePEPLock(aDocTst.esercizio, aDocTst, aCdCausaleCoge,aListaScritture);
 end;

 procedure getScrittureUEPLock(aDocTst V_DOC_ULT_COGE_TSTA%rowtype, aListaScritture OUT CNRCTB200.scrittureList) is
 begin
  aListaScritture.delete;
  for aScr in (
   select * from scrittura_partita_doppia where
	    cd_cds_documento = aDocTst.cd_cds
    and esercizio = aDocTst.esercizio
	and cd_uo_documento = aDocTst.cd_unita_organizzativa
	and pg_numero_documento = aDocTst.pg_documento_cont
	and cd_tipo_documento = aDocTst.cd_tipo_documento_cont
	and origine_scrittura = CNRCTB200.ORIGINE_DOCUMENTO_CONT
	and ti_scrittura in (CNRCTB200.TI_SCRITTURA_ULTIMA,CNRCTB200.TI_SCRITTURA_SINGOLA)
	and attiva = 'Y'
   for update nowait
  ) loop
   aListaScritture(aListaScritture.count+1):=aScr;
  end loop;
 end;

 function getSezione(aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aDoc V_DOC_AMM_COGE_RIGA%rowtype) return char is
  aSezione char(1);
 begin
  aSezione:=CNRCTB100.getSezioneEconomica(aDocTst.cd_tipo_documento);
  if
         aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_PASSIVA
	 and aDocTst.ti_fattura = CNRCTB100.TI_FATT_NOTA_C
	 or
         aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_ATTIVA
	 and aDocTst.ti_fattura = CNRCTB100.TI_FATT_NOTA_C
  then
   aSezione:=CNRCTB200.getSezioneOpposta(aSezione);
  end if;
  return aSezione;
 end;

 function getSezione(aDocTst V_DOC_ULT_COGE_TSTA%rowtype) return char is
  aSezione char(1);
 begin
	  if    aDocTst.cd_tipo_documento_cont = CNRCTB018.TI_DOC_MAN then
	   aSezione:=CNRCTB200.IS_DARE;
	  elsif aDocTst.cd_tipo_documento_cont = CNRCTB018.TI_DOC_REV then
	   aSezione:=CNRCTB200.IS_AVERE;
      end if;
  return aSezione;
 end;

 function getContoEpPgiro(aDocTst v_doc_amm_coge_tsta%rowtype,aDoc v_doc_amm_coge_riga%rowtype) return voce_ep%rowtype is
  aContoEPPGiro voce_ep%rowtype;
  aAccBase accertamento%rowtype;
  aObbBase obbligazione%rowtype;
  aAssPgiro ass_obb_acr_pgiro%rowtype;
 begin

  -- Modifica del 25/08/2003 -> se la competenza è in esercizio precedente e l'esercizio attuale è il primo dell'applicazione
  -- Il conto di costo/ricavo è SP Iniziale o Fatture da emettere
  if CNRCTB204.getCompetenzaFuoriEsercizio(aDocTst) and aDocTst.esercizio = CNRCTB008.ESERCIZIO_PARTENZA then
   -- Solo per la fattura attiva si usa il conto speciale delle fatture da emettere
   -- Modifica del 19/02/2004 -> allargata alle fatture passive e notedi credito/debito la gestione fatta per le fatture attive
   if aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_ATTIVA then -- and aDocTst.ti_fattura = CNRCTB100.TI_FATT_FATTURA then
    return CNRCTB002.GETVOCEEPFATTUREDAEMETTERE(aDocTst.esercizio);
   elsif aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_PASSIVA then -- and aDocTst.ti_fattura = CNRCTB100.TI_FATT_FATTURA then
    return CNRCTB002.GETVOCEEPFATTUREDARICEVERE(aDocTst.esercizio);
   else -- Per gli altri documenti ritorna il conto di Stato Patrimoniale Iniziale
    return CNRCTB002.GETVOCEEPSTATOPATRINIZIALE(aDocTst.esercizio);
   end if;
  end if;
  if CNRCTB204.getSezione(aDocTst,aDoc) =CNRCTB200.IS_DARE then
  		return CNRCTB002.getVoceEpDebDiversiPgiro(aDocTst.esercizio);
  else
  		return CNRCTB002.getVoceEpCredDiversiPgiro(aDocTst.esercizio);
  end if;

 end;

 -- =======================================
 --
 -- CONTABILIZZAZIONE CORI
 --
 -- =======================================

 function getAssCoriEp(
  aEs number,
  aTipoCori varchar2,
  aTipoEntePercipiente char,
  aSezione char
 ) return ass_tipo_cori_voce_ep%rowtype is
  aEffCori ass_tipo_cori_voce_ep%rowtype;
 begin
  begin
	  select * into aEffCori from ass_tipo_cori_voce_ep where
           esercizio = aEs
	   and cd_contributo_ritenuta = aTipoCori
       and ti_ente_percepiente = aTipoEntePercipiente
	   and sezione = aSezione;
  exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Associazione cori/coep non trovata per CORI:'||aTipoCori||' ente/perc:'||aTipoEntePercipiente||' sezione:'||aSezione);
  end;
  return aEffCori;
 end;

 function getAssCoriEp(aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aCori V_DOC_AMM_COGE_CORI%rowtype) return ass_tipo_cori_voce_ep%rowtype is
  aEffCori ass_tipo_cori_voce_ep%rowtype;
  aSez char(1);
 begin

-- RECUPERA LA SEZIONE STANDARD PER IL DOCUMENTO

  aSez := getSezione(aDocTst, aCori);

-- E POI LA INVERTE NEL CASO DI NOTE DI CREDITO, MA SOLO PER IL CORRETTO RECUPERO DEL CONTO (PRIMA PER LE NOTE ATTIVE
-- USAVA IVA A CREDITO ANZICHE' LA RIDUZIONE DELL'IVA A DEBITO, E VICEVERSA)

-- 06.12.2006 LA GESTIONE DELLE NOTE DI CREDITO (RIDUZIONE DEL VALORE INIZIALE) IL CONTO IVA DA USARE E' LO STESSO DELLE FATTURE:
-- SE LA FATTURA ATTIVA MOVIMENTA IVA A DEBITO LA NOTA DI CREDITO DEVE MOVIMENTARE LA RIDUZIONE DELL'IVA A DEBITO
-- SE LA FATTURA PASSIVA MOVIMENTA IVA A CREDITO LA NOTA DI CREDITO DEVE MOVIMENTARE LA RIDUZIONE DELL'IVA A CREDITO

  If aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_PASSIVA And aDocTst.ti_fattura = CNRCTB100.TI_FATT_NOTA_C or
     aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_ATTIVA And aDocTst.ti_fattura = CNRCTB100.TI_FATT_NOTA_C
  then
   aSez := CNRCTB200.getSezioneOpposta(aSez);
  end if;

  return getAssCoriEp(aCori.esercizio, aCori.cd_contributo_ritenuta,aCori.ti_ente_percepiente, aSez);
 end;

 function trovaContoEp(aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aCori V_DOC_AMM_COGE_CORI%rowtype) return voce_ep%rowtype is
  aEffCori ass_tipo_cori_voce_ep%rowtype;
  aContoEp voce_ep%rowtype;
  aSez char(1);
 Begin
Dbms_Output.PUT_LINE ('ENTRA IN trovaContoEp CORI');
    -- IBMUTL010.log(GETDESCDOCUMENTO(aDocTst),'TEST');

 -- Modifica del 25/08/2003 -> se la competenza è in esercizio precedente e l'esercizio attuale è il primo dell'applicazione
 -- Il conto di costo/ricavo è SP Iniziale
    if CNRCTB204.getCompetenzaFuoriEsercizio(aDocTst) and aDocTst.esercizio = CNRCTB008.ESERCIZIO_PARTENZA then
     -- Se non si  tratta di fattura attiva si usa il conto speciale stato patrimoniale iniziale
     -- Modifica del 19/02/2004 -> allargata a fatture passive e note di credito/debito la gestione fatta per le fatture attive
     if not (
	         aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_ATTIVA -- and aDocTst.ti_fattura = CNRCTB100.TI_FATT_FATTURA
    	  or aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_PASSIVA -- and aDocTst.ti_fattura = CNRCTB100.TI_FATT_FATTURA
		) then
      return CNRCTB002.GETVOCEEPSTATOPATRINIZIALE(aDocTst.esercizio);
     end if;
    end if;


	--  30/10/2002 Se il documento è un compenso o fattura con IVA su partita di giro il conto da utilizzare è quello del terzo diversi contropatita (debito)
    for aDoc in (select * from v_doc_amm_coge_riga where
          cd_tipo_documento = aDocTst.cd_tipo_documento
      and cd_cds = aDocTst.cd_cds
      and cd_unita_organizzativa = aDocTst.cd_unita_organizzativa
      and esercizio = aDocTst.esercizio
      and pg_numero_documento = aDocTst.pg_numero_documento
	  and fl_pgiro = 'Y') loop
         return getContoEpPgiro(aDocTst,aDoc);
    end loop;

	if aDocTst.cd_tipo_documento = CNRCTB100.TI_COMPENSO then
	 declare
      aCoriLoc contributo_ritenuta%rowtype;
	  aCompenso compenso%rowtype;
	  aCdClassificazioneCori char(2);
     begin
	  begin
	   select * into aCompenso from compenso where
	       cd_cds = aCori.cd_cds
	   and esercizio = aCori.esercizio
	   and cd_unita_organizzativa = aCori.cd_unita_organizzativa
	   and pg_compenso = aCori.pg_numero_documento;
	  exception when NO_DATA_FOUND then
	   IBMERR001.RAISE_ERR_GENERICO('Compenso non trovato:'||aCori.pg_numero_documento||' uo:'||aCori.cd_unita_organizzativa||' es:'||aCori.esercizio);
	  end;
	  begin
	   select * into aCoriLoc from contributo_ritenuta where
	       cd_cds = aCori.cd_cds
	   and esercizio = aCori.esercizio
	   and cd_unita_organizzativa = aCori.cd_unita_organizzativa
	   and pg_compenso = aCori.pg_numero_documento
	   and cd_contributo_ritenuta = aCori.cd_contributo_ritenuta
	   and ti_ente_percipiente = aCori.ti_ente_percepiente;
      exception when NO_DATA_FOUND then
	   IBMERR001.RAISE_ERR_GENERICO('Contributo ritenuta non trovato:'||aCori.cd_contributo_ritenuta);
      end;
	  -- Se la tipologia di contributo ritenuta è IVA o RIVALSA il conto ritornato è quello di costo principale del compenso
      aCdClassificazioneCori:=CNRCTB545.getTipoCoriDaRigaCompenso(aCoriLoc);
      IF (   aCdClassificazioneCori = CNRCTB545.isCoriIva AND aCompenso.TI_ISTITUZ_COMMERC = CNRCTB100.TI_ISTITUZIONALE
	      OR aCdClassificazioneCori = CNRCTB545.isCoriRivalsa
		 ) THEN
       for aDoc in (select * from v_doc_amm_coge_riga where
            cd_tipo_documento = aDocTst.cd_tipo_documento
        and cd_cds = aDocTst.cd_cds
        and cd_unita_organizzativa = aDocTst.cd_unita_organizzativa
        and esercizio = aDocTst.esercizio
        and pg_numero_documento = aDocTst.pg_numero_documento) loop
         return trovaContoEp(aDocTst,aDoc);
       end loop;
	  END IF;
	 end;
	end if;

Dbms_Output.PUT_LINE ('PASSA aEffCori:=getAssCoriEp(aDocTst,aCori)');
    aEffCori:=getAssCoriEp(aDocTst,aCori);
    begin
	 aContoEp:=CNRCTB002.getVoceEp(aEffCori.esercizio, aEffCori.cd_voce_ep);
Dbms_Output.PUT_LINE ('E RECUPERA '||aContoEp.CD_VOCE_EP);
	exception when OTHERS then
     IBMERR001.RAISE_ERR_GENERICO('Conto economico: '||aEffCori.cd_voce_ep||' associato a CORI:'||aCori.cd_contributo_ritenuta||'non trovato');
	end;
  return aContoEp;
 end;
 function trovaContoContrEp(aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aCori V_DOC_AMM_COGE_CORI%rowtype) return voce_ep%rowtype is
  aEffCori ass_tipo_cori_voce_ep%rowtype;
  aContoEp voce_ep%rowtype;
  aSez char(1);
 begin
    aEffCori:=getAssCoriEp(aDocTst,aCori);
    begin
	 aContoEp:=CNRCTB002.getVoceEp(aEffCori.esercizio, aEffCori.cd_voce_ep_contr);
	exception when OTHERS then
     IBMERR001.RAISE_ERR_GENERICO('Conto economico di contr.: '||aEffCori.cd_voce_ep_contr||' associato a CORI:'||aCori.cd_contributo_ritenuta||'non trovato');
	end;
  return aContoEp;
 end;
 function getSezioneCoriComp(aCori contributo_ritenuta%rowtype) return char is
  aSezione char(1);
 begin
  aSezione:=CNRCTB100.getSezioneEconomicaCori(CNRCTB100.TI_COMPENSO);
  if aCori.ammontare < 0 then
   aSezione:=CNRCTB200.getSezioneOpposta(aSezione);
  end if;
  return aSezione;
 end;

 function getSezione(aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aCori V_DOC_AMM_COGE_CORI%rowtype) return char is
  aSezione char(1);
 begin
  aSezione:=CNRCTB100.getSezioneEconomicaCori(aDocTst.cd_tipo_documento);

  -- gestione particolare per nota di creadito

  If aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_PASSIVA And aDocTst.ti_fattura = CNRCTB100.TI_FATT_NOTA_C or
     aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_ATTIVA And aDocTst.ti_fattura = CNRCTB100.TI_FATT_NOTA_C
  then
   aSezione:=CNRCTB200.getSezioneOpposta(aSezione);
  end if;

  if aCori.ammontare < 0 then
   aSezione:=CNRCTB200.getSezioneOpposta(aSezione);
  end if;

  return aSezione;
 end;

 -- =======================================
 --
 -- CONTABILIZZAZIONE PARTE PRINCIPALE
 --
 -- =======================================

 procedure buildMovPrinc(
  aCdCds varchar2,
  aEs number,
  aCdUo varchar2,
  aContoEp voce_ep%rowtype,
  aImporto number,
  aSezione char,
  aDaCompCoge date,
  aACompCoge date,
  aCdTerzo number,
  aListaMovimenti IN OUT CNRCTB200.movimentiList,
  aUser varchar2,
  aTSnow date
 ) is
 begin
  buildMovPrinc(
   aCdCds,
   aEs,
   aCdUo,
   aContoEp,
   aImporto,
   aSezione,
   aDaCompCoge,
   aACompCoge,
   aCdTerzo,
   CNRCTB100.TI_ISTITUZIONALE,
   aListaMovimenti,
   aUser,
   aTSnow);
 end;

 function getSezioneChiusuraScr(aListaMovimenti IN CNRCTB200.movimentiList) return char is
  aTotDare number(15,2):=0;
  aTotAvere number(15,2):=0;
 begin
      for i in 1 .. aListaMovimenti.count loop
       if aListaMovimenti(i).sezione = CNRCTB200.IS_DARE then
        aTotDare:=aTotDare+aListaMovimenti(i).im_movimento;
	   else
        aTotAvere:=aTotAvere+aListaMovimenti(i).im_movimento;
	   end if;
	  end loop;
	  if aTotDare-aTotAvere > 0 then
       return CNRCTB200.IS_AVERE;
      elsif aTotDare-aTotAvere < 0 then
       return CNRCTB200.IS_DARE;
	  else
       return null;
	  end if;
 end;

 procedure buildChiusuraScrittura(
  aCdCds varchar2,
  aEs number,
  aCdUo varchar2,
  aContoEp voce_ep%rowtype,
  aDaCompCoge date,
  aACompCoge date,
  aCdTerzo number,
  aTiIstituzCommerc char,
  aListaMovimenti IN OUT CNRCTB200.movimentiList,
  aUser varchar2,
  aTSnow date
 ) is
  aTotDare number(15,2):=0;
  aTotAvere number(15,2):=0;

  aTotDare_I number(15,2):=0;
  aTotAvere_I number(15,2):=0;

  aTotDare_C number(15,2):=0;
  aTotAvere_C number(15,2):=0;

  aMovimento movimento_coge%rowtype;

Begin

Dbms_Output.PUT_LINE ('entro con '||aTiIstituzCommerc||' count '||aListaMovimenti.count||' voce '||acontoEp.cd_voce_ep);

If aTiIstituzCommerc In ('C', 'I') Then

   -- Generazione movimento di default
   aMovimento := null;
Dbms_Output.PUT_LINE ('inizio loop ');
   For i in 1 .. aListaMovimenti.count loop

Dbms_Output.PUT_LINE ('riga loop '||i);

--Dbms_Output.PUT_LINE ('sez '||aListaMovimenti(i).sezione);

       if aListaMovimenti(i).sezione = CNRCTB200.IS_DARE Then
Dbms_Output.PUT_LINE ('somma dare');
        aTotDare:=aTotDare+aListaMovimenti(i).im_movimento;
      else
        aTotAvere:=aTotAvere+aListaMovimenti(i).im_movimento;
      end if;
   End loop;

   if aTotDare-aTotAvere > 0 then
Dbms_Output.PUT_LINE ('B1 '||aContoEp.CD_VOCE_EP);
       buildMovPrinc(aCdCds,aEs,aCdUo,aContoEp,aTotDare-aTotAvere,CNRCTB200.IS_AVERE,aDaCompCoge,aACompCoge,aCdTerzo,aTiIstituzCommerc,aListaMovimenti,aUser,aTSnow);
   elsif aTotdare-aTotAvere < 0 then
Dbms_Output.PUT_LINE ('B2 '||aContoEp.CD_VOCE_EP);
       buildMovPrinc(aCdCds,aEs,aCdUo,aContoEp,aTotAvere-aTotDare,CNRCTB200.IS_DARE,aDaCompCoge,aACompCoge,aCdTerzo,aTiIstituzCommerc,aListaMovimenti,aUser,aTSnow);
   else
       return;
   end if;

 Elsif aTiIstituzCommerc = 'P' Then   -- PROMISCUO

   -- Generazione movimento di default
   aMovimento := Null;
   for i in 1 .. aListaMovimenti.count loop

     If aListaMovimenti(i).sezione = CNRCTB200.IS_DARE Then
       If aListaMovimenti(i).TI_ISTITUZ_COMMERC = 'I' Then
         aTotDare_I := Nvl(aTotDare_I, 0) + aListaMovimenti(i).im_movimento;
       Elsif aListaMovimenti(i).TI_ISTITUZ_COMMERC = 'C' Then
         aTotDare_C := Nvl(aTotDare_C, 0) + aListaMovimenti(i).im_movimento;
       End If;
     else
       If aListaMovimenti(i).TI_ISTITUZ_COMMERC = 'I' Then
        aTotAvere_I := Nvl(aTotAvere_I, 0) + aListaMovimenti(i).im_movimento;
       Elsif aListaMovimenti(i).TI_ISTITUZ_COMMERC = 'C' Then
        aTotAvere_C := Nvl(aTotAvere_C, 0) + aListaMovimenti(i).im_movimento;
       End If;
     End if;

   end loop;

   if aTotDare_I - aTotAvere_I > 0 then
      buildMovPrinc(aCdCds,aEs,aCdUo,aContoEp,aTotDare_I-aTotAvere_I,CNRCTB200.IS_AVERE,aDaCompCoge,aACompCoge,aCdTerzo,CNRCTB100.TI_ISTITUZIONALE,aListaMovimenti,aUser,aTSnow);
   elsif aTotdare_I - aTotAvere_I < 0 then
      buildMovPrinc(aCdCds,aEs,aCdUo,aContoEp,aTotAvere_I-aTotDare_I,CNRCTB200.IS_DARE,aDaCompCoge,aACompCoge,aCdTerzo,CNRCTB100.TI_ISTITUZIONALE,aListaMovimenti,aUser,aTSnow);
   end if;

   if aTotDare_C - aTotAvere_C > 0 then
      buildMovPrinc(aCdCds,aEs,aCdUo,aContoEp,aTotDare_C-aTotAvere_C,CNRCTB200.IS_AVERE,aDaCompCoge,aACompCoge,aCdTerzo,CNRCTB100.TI_COMMERCIALE,aListaMovimenti,aUser,aTSnow);
   elsif aTotdare_C - aTotAvere_C < 0 then
      buildMovPrinc(aCdCds,aEs,aCdUo,aContoEp,aTotAvere_C-aTotDare_C,CNRCTB200.IS_DARE,aDaCompCoge,aACompCoge,aCdTerzo,CNRCTB100.TI_COMMERCIALE,aListaMovimenti,aUser,aTSnow);
   end if;

 End If;  -- DEL CASO PROMISCUO

 end;

 procedure buildMovPrinc(
  aCdCds varchar2,
  aEs number,
  aCdUo varchar2,
  aContoEp voce_ep%rowtype,
  aImporto number,
  aSezione char,
  aDaCompCoge date,
  aACompCoge date,
  aCdTerzo number,
  aTiIstituzCommerc char,
  aListaMovimenti IN OUT CNRCTB200.movimentiList,
  aUser varchar2,
  aTSnow date
 ) is
  aMovimento movimento_coge%rowtype;
 begin
      -- Generazione movimento di default
	  -- Condizione di comressione dei movimenti: il tipo istituz/commerciale non
	  -- deve essere diverso
      aMovimento:=null;
      for i in 1 .. aListaMovimenti.count loop
       if (
	            aListaMovimenti(i).cd_voce_ep = aContoEp.cd_voce_ep
	        and aListaMovimenti(i).sezione = aSezione
	        and aListaMovimenti(i).dt_da_competenza_coge = aDaCompCoge
	        and aListaMovimenti(i).dt_a_competenza_coge = aACompCoge
	        and aListaMovimenti(i).ti_istituz_commerc = aTiIstituzCommerc
		  ) then
		aListaMovimenti(i).im_movimento:=aListaMovimenti(i).im_movimento + aImporto;
		return;
	   end if;
	  end loop;
      aMovimento.CD_CDS:=aCdCds;
      aMovimento.ESERCIZIO:=aEs;
      aMovimento.CD_UNITA_ORGANIZZATIVA:=aCdUo;
      aMovimento.PG_SCRITTURA:=null;
      aMovimento.PG_MOVIMENTO:=null;

      aMovimento.CD_VOCE_EP:=aContoEp.cd_voce_ep;
      aMovimento.SEZIONE:=aSezione;
      aMovimento.IM_MOVIMENTO:=aImporto;

      aMovimento.TI_ISTITUZ_COMMERC:=aTiIstituzCommerc;

      aMovimento.CD_TERZO:=aCdTerzo;
      aMovimento.DT_DA_COMPETENZA_COGE:=aDaCompCoge;
      aMovimento.DT_A_COMPETENZA_COGE:=aACompCoge;
      aMovimento.STATO:=CNRCTB200.STATO_DEFINITIVO;
      dbms_output.put_line('mov '||aContoEp.cd_voce_ep);
      aListaMovimenti(aListaMovimenti.COUNT+1):=aMovimento;
 end;

Function trovaContoEp(aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aDoc V_DOC_AMM_COGE_RIGA%rowtype) return voce_ep%rowtype is
  aAss ass_ev_voceep%rowtype;
  aVoceEp voce_ep%rowtype;
  aVoceSA varchar2(45);
Begin

-- Modifica del 25/08/2003 -> se la competenza è in esercizio precedente e l'esercizio attuale è il primo dell'applicazione
-- Il conto di costo/ricavo è SP Iniziale o Fatture da emettere
If CNRCTB204.getCompetenzaFuoriEsercizio(aDocTst) And aDocTst.esercizio = CNRCTB008.ESERCIZIO_PARTENZA Then
   -- Aggiunta gestione per fatture passive il 19/02/2004
   -- Solo per la fattura attiva (e passiva) si usa il conto speciale delle fatture da emettere (ricevere)
     If aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_ATTIVA then -- and aDocTst.ti_fattura = CNRCTB100.TI_FATT_FATTURA then
      Return CNRCTB002.GETVOCEEPFATTUREDAEMETTERE(aDocTst.esercizio);
     Elsif aDocTst.cd_tipo_documento = CNRCTB100.TI_FATTURA_PASSIVA then -- and aDocTst.ti_fattura = CNRCTB100.TI_FATT_FATTURA then
      Return CNRCTB002.GETVOCEEPFATTUREDARICEVERE(aDocTst.esercizio);
     Else -- Per gli altri documenti ritorna il conto di Stato Patrimoniale Iniziale
      Return CNRCTB002.GETVOCEEPSTATOPATRINIZIALE(aDocTst.esercizio);
     End if;
End if;

If aDoc.cd_tipo_documento in (CNRCTB100.TI_ANTICIPO, CNRCTB100.TI_RIMBORSO) then
   aVoceEp:= CNRCTB002.GETVOCEEPANTICIPOMISSIONE(aDocTst.esercizio);

   if aVoceEp.cd_voce_ep is  null then
    -- Recupero conto associato di default
			Begin
			   select * into aAss from ass_ev_voceep where
			        esercizio = aDoc.esercizio
			    and ti_appartenenza = aDoc.ti_appartenenza_ev
			    and ti_gestione = aDoc.ti_gestione_ev
			    and cd_elemento_voce = aDoc.cd_elemento_voce_ev;
			Exception when NO_DATA_FOUND then
			   IBMERR001.RAISE_ERR_GENERICO('Associazione tra voce del piano finanziaria (gest.'||aDoc.ti_gestione_ev||' app.'||aDoc.ti_appartenenza_ev||' n.:'||aDoc.cd_elemento_voce_ev||') ed economica non trovata');
			end;
  		return CNRCTB002.GETVOCEEP(aDoc.esercizio,aAss.cd_voce_ep);
	else
   return aVoceEp;
	End if;
end if;
-- se contabilizzo una nota di credito allora:
--  1. se la voce finanziaria è patrimoniale movimento sempre il conto di attivo ad essa legato
--  2. altrimenti, se la competenza economica del costo/ricavo della fattura a cui è legata
--     cade in un esercizio precedente chiuso allora anzichè movimentare il costo/ricavo in rettifica deve movimentare
--     le insussistenze passive/attive

If aDocTst.TI_FATTURA = 'C' Then -- se è una nota

----------------------- VERIFICO SE LA VOCE E' PATRIMONIALE (associata a categoria) --------------------------

   Declare
      ese       elemento_voce.esercizio%Type;
      gest      elemento_voce.ti_gestione%Type;
      app       elemento_voce.ti_appartenenza%Type;
      elvoce    elemento_voce.cd_elemento_voce%Type;

   Begin
     Select Distinct ESERCIZIO_EV, TI_APPARTENENZA_EV, TI_GESTIONE_EV, CD_ELEMENTO_VOCE_EV
     Into   ese, app, gest, elvoce
     From   V_DOC_AMM_COGE_RIGA
     Where  CD_TIPO_DOCUMENTO      = aDocTst.CD_TIPO_DOCUMENTO       And
            CD_CDS                 = aDocTst.CD_CDS                  And
            CD_UNITA_ORGANIZZATIVA = aDocTst.CD_UNITA_ORGANIZZATIVA  And
            ESERCIZIO              = aDocTst.ESERCIZIO               And
            PG_NUMERO_DOCUMENTO    = aDocTst.PG_NUMERO_DOCUMENTO;

     If ISVOCECOLLCATEGORIA (ese, gest, app, elvoce) Then
------ nel caso CERCO IL CONTO ASSOCIATO ALLA VOCE (E LO PASSO ALLA SCRITTURA AL POSTO DI UTILE O PERDITA SU CAMBIO)
            Select VOCE_EP.*
            Into   aVoceEp
            From   ass_ev_voceep, VOCE_EP
            Where  ass_ev_voceep.esercizio = ese And
                   ass_ev_voceep.ti_appartenenza = app And
                   ass_ev_voceep.ti_gestione = gest  And
                   ass_ev_voceep.cd_elemento_voce = elvoce And
                   ass_ev_voceep.ESERCIZIO  = VOCE_EP.ESERCIZIO And
                   ass_ev_voceep.CD_VOCE_EP = VOCE_EP.CD_VOCE_EP;
            Return aVoceEp;
     End If;
   Exception
     When Others Then Null;
   End;


   If isCompFattEsPreChiusoADTREG (aDocTst, aDoc) Then  -- e la fattura a cui è legata ha competenza in un esercizio chiuso
      If aDoc.cd_tipo_documento = CNRCTB100.TI_FATTURA_PASSIVA Then
        Return CNRCTB002.getVoceEpInsussPassive(aDocTst.esercizio);
      Elsif aDoc.cd_tipo_documento = CNRCTB100.TI_FATTURA_ATTIVA Then
        Return CNRCTB002.getVoceEpInsussAttive(aDocTst.esercizio);
      End If;
   End If;
End If;  -- altrimenti si comporta come prima

-- Gestione sconto/abbuono su fattura passiva
-- se il documento reca l'indicazione di codice bene servizio
If aDoc.cd_bene_servizio is not null then

   -- sconto / abbuono ricavo
   If CNRCTB100.isBeneServScontoAbbuono(aDoc.cd_bene_servizio) and (aDoc.im_imponibile < 0) then
    aVoceEp:= CNRCTB002.getVoceEpScontoAbbRicavo(aDocTst.esercizio);
   End if;

   -- sconto / abbuono costo
   If CNRCTB100.isBeneServScontoAbbuono(aDoc.cd_bene_servizio) and (aDoc.im_imponibile > 0) then
    aVoceEp:= CNRCTB002.getVoceEpScontoAbbCosto(aDocTst.esercizio);
   End if;

End if;
 IF AVOCEEP.CD_VOCE_EP IS NULL THEN

-- Recupero conto associato di default
Begin
   select * into aAss from ass_ev_voceep where
        esercizio = aDoc.esercizio
    and ti_appartenenza = aDoc.ti_appartenenza_ev
    and ti_gestione = aDoc.ti_gestione_ev
    and cd_elemento_voce = aDoc.cd_elemento_voce_ev;
Exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Associazione tra voce del piano finanziaria (gest.'||aDoc.ti_gestione_ev||' app.'||aDoc.ti_appartenenza_ev||' n.:'||aDoc.cd_elemento_voce_ev||') ed economica non trovata');
  end;
  return CNRCTB002.GETVOCEEP(aDoc.esercizio,aAss.cd_voce_ep);
  END IF;
End;

 function trovaContoContrEp(aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aCdTerzo number,ACdElementoVoce varchar2) return voce_ep%rowtype is
  aAnag v_anagrafico_terzo%rowtype;
  aAssDaUsare ass_anag_voce_ep%rowtype;
  aVoceEp voce_ep%rowtype;
  aDescTerzo varchar2(1000);
 begin
  return trovaContoAnag(aDocTst.esercizio, aCdTerzo, aDocTst.cd_tipo_documento, aDocTst.ti_fattura,ACdElementoVoce );
 end;

 function trovaContoAnag(aEs number, aCdTerzo number, aTipoDoc varchar2, aTiFattura char,ACdElementoVoce varchar2) return voce_ep%rowtype is
  aAnag v_anagrafico_terzo%rowtype;
  aAssDaUsare ass_anag_voce_ep%rowtype;
  aVoceEp voce_ep%rowtype;
  aDescTerzo varchar2(1000);
  aTipoTerzo char(1);
 	recParametriCNR PARAMETRI_CNR%Rowtype;
  ass ass_ev_voceep%rowtype;
  aContoEp voce_ep%rowtype;
begin
  recParametriCNR := CNRUTL001.getRecParametriCnr(aEs);
  -- Trovo l'entita anagrafica completa
  begin
   select * into aAnag from v_anagrafico_terzo where
    cd_terzo = aCdTerzo;
  exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Terzo non trovato: '||aCdTerzo);
  end;
  -- Determino il tipo terzo da utilizzare in tabella di associazione anagrafica-conto
  if aTipoDoc is not null then
   -- La sezione economica
   if CNRCTB100.GETSEZIONEECONOMICA(aTipoDoc) = CNRCTB200.IS_AVERE then
		 aTipoTerzo:='D'; -- Documenti attivi il terzo è un debitore
	 else
     aTipoTerzo:='C'; -- Documenti passivi il terzo è un creditore
   end if;
  else
   IBMERR001.RAISE_ERR_GENERICO('Errore di recupero conto numerario debito/credito: sezione principale del documento amministrativo non specificata');
  end if;

if(recParametriCNR.fl_nuovo_pdg ='Y' and ACdElementoVoce is not null) then
ass:=null;
dbms_output.put_line ('Voce in :'||aEs||'/'||ACdElementoVoce||' '||aTipoTerzo||' '||aTipoDoc);
   begin
    select * into ass
    from ass_ev_voceep
    where
    	  esercizio = aEs
       	and ((ti_gestione = 'E' and (aTipoTerzo='D' or (aTiFattura is not null and aTiFattura='C' ))) or
       		   (ti_gestione = 'S' and (aTipoTerzo='C' or (aTiFattura is not null and aTiFattura='C' ))))
       	and CD_ELEMENTO_VOCE = ACdElementoVoce;

  exception when NO_DATA_FOUND then
   	IBMERR001.RAISE_ERR_GENERICO('Associazione ev/coep non trovata per voce:'||aEs||'/'||ACdElementoVoce);
   					when too_many_rows then
   	IBMERR001.RAISE_ERR_GENERICO('Errore di recupero associazione multipla ev/coep  per :'||aEs||'/'||ACdElementoVoce||' '||aTipoTerzo||' '||aTipoDoc||' '||ass.CD_VOCE_EP_CONTR);
  end;
  if (ass.CD_VOCE_EP_CONTR is null) then
 			IBMERR001.RAISE_ERR_GENERICO('Contropartita mancante in Associazione ev/coep:'||aEs||'/'||ACdElementoVoce);
 	else
  		aContoEp:=CNRCTB002.getVoceEp(ass.esercizio, ass.CD_VOCE_EP_CONTR);
  end if;
  return aContoEp;
  elsif (recParametriCNR.fl_nuovo_pdg ='Y' and ACdElementoVoce is null) then
  	dbms_output.put_line ('Attenzione voce null - nuova gestione');
else
  -- Con l'entita anagrafica cerco in ass_anag_voce_ep
  for aAssAnagVoce in (select * from ass_anag_voce_ep where
        esercizio = aEs
    and (ti_terzo = aTipoTerzo)
    and (italiano_estero = aAnag.ti_italiano_estero or italiano_estero = '*')
    and (ti_entita = aAnag.ti_entita or ti_entita = '*')
    and (
	        aAnag.ti_entita != TI_ANAG_ENT_GIU
	     or aAnag.ti_entita = TI_ANAG_ENT_GIU and ente_altro = aAnag.ti_entita_giuridica
	     or ente_altro = '*'
		)
    and (cd_classific_anag = aAnag.cd_classific_anag or cd_classific_anag = '*')
	order by
	  ti_terzo desc,
	  italiano_estero desc,
	  ti_entita desc,
	  ente_altro desc,
	  cd_classific_anag desc
   ) loop
    -- Piglio la prima ricorrenza valida ed esco dal loop
    aAssDaUsare:=aAssAnagVoce;
	goto nextStep;
  end loop;
  <>
  if aAssDaUsare.cd_voce_ep is null then
   aDescTerzo:=
        ' Tipo terzo: '||nvl(aTipoTerzo,'*')
	 || ' Italiano estero: '||nvl(aAnag.ti_italiano_estero,'*')
	 || ' Tipo entita: '||nvl(aAnag.ti_entita,'*')
	 || ' Ente/Altro: '||nvl(aAnag.ti_entita_giuridica,'*')
	 || ' Cass. anagrafica: '||nvl(aAnag.cd_classific_anag,'*');
   IBMERR001.RAISE_ERR_GENERICO('Conto di contropartita non trovato per terzo: '||aDescTerzo);
  end if;
  return CNRCTB002.getVoceEp(aEs, aAssDaUsare.cd_voce_ep);
  end if;
 end;

 function trovaContoAnag(aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aCdTerzo number,ACdElementoVoce varchar2) return voce_ep%rowtype is
 begin
  return trovaContoAnag(aDocTst.esercizio, aCdTerzo, aDocTst.cd_tipo_documento, aDocTst.ti_fattura,ACdElementoVoce);
 end;

 function trovaContoAnag(aDocUltRiga V_DOC_ULT_COGE_RIGA%rowtype, aCdTerzo number,ACdElementoVoce varchar2) return voce_ep%rowtype is
  aDocAmm V_DOC_AMM_COGE_TSTA%rowtype;
 begin
  if aDocUltRiga.cd_tipo_doc in (CNRCTB100.TI_FATTURA_ATTIVA,CNRCTB100.TI_FATTURA_PASSIVA) then
   begin
    select * into aDocAmm from V_DOC_AMM_COGE_TSTA where
                     cd_cds = aDocUltRiga.cd_cds_doc
  			    and esercizio = aDocUltRiga.esercizio_doc
  				and cd_tipo_documento = aDocUltRiga.cd_tipo_doc
 				and cd_unita_organizzativa = aDocUltRiga.cd_uo_doc
 				and pg_numero_documento = aDocUltRiga.pg_numero_doc;
   exception when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Documento amministrativo non trovato');
   end;
   return trovaContoAnag(aDocUltRiga.esercizio, aCdTerzo, aDocUltRiga.cd_tipo_doc, aDocAmm.ti_fattura,ACdElementoVoce);
  else
   return trovaContoAnag(aDocUltRiga.esercizio, aCdTerzo, aDocUltRiga.cd_tipo_doc, null,ACdElementoVoce);
  end if;
 end;

 -- =======================================
 --
 -- CONTABILIZZAZIONE ULTIMA
 --
 -- =======================================

-- Componenti scrittura ultima o singola

 function trovaContoContrEp(aDocTst V_DOC_ULT_COGE_TSTA%rowtype, aDoc V_DOC_ULT_COGE_RIGA%rowtype) return voce_ep%rowtype is
 begin
  if aDocTst.cd_tipo_documento_cont = CNRCTB018.TI_DOC_REV and aDocTst.ti_man_rev = CNRCTB038.TI_REV_REG Then
-- 25.05.2006 FRANCA CAMPANALE (MODIFICA AD UNA PRECEDENTE RICHIESTA): PER CONTABILIZZARE UNA REVERSALE DI REGOLARIZZAZIORE
-- DEVO ANDARE A VEDERE IL MANDATO COLLEGATO: SE E' SU PDIGIRO DEVO USARE I DEBITI, SE E' SU VOCI ORDINARIE
-- DEVO USARE LE INSUSSISTENZE

/*
    If ISMANDATOCOLLSUPGIRO (aDoc) Then
        return CNRCTB002.getVoceCONTR_REV_REG_PGIRO(aDocTst.esercizio);
    Else
        return CNRCTB002.getVoceEpInsussistenzeCredito(aDocTst.esercizio);
    End If;
*/

-- 29.05.2006 (FRANCA E PIERO) NON E' PIU' COSI'. LA CONTABILIZZAZIONE DELLE REVERSALI DI REGOLARIZZAZIONE DEVE MOVIMENTARE SEMPRE
--            I DEBITI VERSO FORNITORI.

--    If ISMANDATOCOLLSUPGIRO (aDoc) Then

			if (aDoc.esercizio_doc < aDoc.esercizio) then
        	return CNRCTB002.getVoceCONTR_REV_REG_PGIRO(aDocTst.esercizio);
       else
       declare
 					ass ass_ev_voceep%rowtype;
         begin
          select * into ass
    			from ass_ev_voceep
    			where
    	  	esercizio = aDocTst.esercizio
	   			and TI_APPARTENENZA = nvl(null,TI_APPARTENENZA)
       		and ti_gestione = 'E'
       		and CD_ELEMENTO_VOCE = aDoc.CD_ELEMENTO_VOCE;
       			return CNRCTB002.getVoceEp(ass.esercizio, ass.CD_VOCE_EP);
  			exception when NO_DATA_FOUND then
   				IBMERR001.RAISE_ERR_GENERICO('Associazione ev/coep non trovata per voce:'||aDocTst.esercizio||'/'||' E '||'/'|| aDoc.CD_ELEMENTO_VOCE);
  			end;
    end if;
--    Else
--        return CNRCTB002.getVoceEpInsussistenzeCredito(aDocTst.esercizio);
--    End If;
    dbms_output.put_line('ci arrivo con '||aDoc.CD_ELEMENTO_VOCE);
    if (aDoc.CD_ELEMENTO_VOCE is not null) then
      RETURN trovaContoContrEp(aDocTst.esercizio,NULL,'E',aDoc.cd_elemento_voce,null);
    end if;

  end if;
  dbms_output.put_line('ci passo '||aDoc.CD_ELEMENTO_VOCE);

  if aDoc.stato_pagamento_fondo_eco in (CNRCTB100.STATO_ASS_PFONDOECO, CNRCTB100.STATO_REG_PFONDOECO) then
   return CNRCTB002.getVoceEpCassa(aDocTst.esercizio);
  end if;
   if aDocTst.cd_tipo_documento_cont = CNRCTB018.TI_DOC_MAN and aDocTst.ti_man_rev = CNRCTB038.TI_MAN_REG Then
    if (aDoc.CD_ELEMENTO_VOCE is not null) then 
      RETURN trovaContoContrEp(aDocTst.esercizio,NULL,'S',aDoc.cd_elemento_voce,null);
    end if;
  end if;
  if aDocTst.ti_appartenenza = CNRCTB001.APPARTENENZA_CNR then
   return CNRCTB002.getVoceEpBanca(aDocTst.esercizio);
  else
   return CNRCTB002.getVoceEpBancaCds(aDocTst.esercizio);
  end if;

 end;

 function getTipoScrittura(aDoc V_DOC_ULT_COGE_RIGA%rowtype) return char is
 begin
  if aDoc.cd_tipo_doc = CNRCTB100.TI_GEN_REINTEGRO_FONDO then
   return CNRCTB200.TI_SCRITTURA_SINGOLA;
  end if;
  return CNRCTB200.TI_SCRITTURA_ULTIMA;
 end;

 function buildScrPEP(aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aCdTerzo number, aUser varchar2, aTSnow date) return scrittura_partita_doppia%rowtype is
  aScrittura scrittura_partita_doppia%rowtype;
 begin
   aScrittura:=null;
   aScrittura.CD_CDS:=aDocTst.cd_cds_origine;
   aScrittura.ESERCIZIO:=aDocTst.esercizio;
   aScrittura.CD_UNITA_ORGANIZZATIVA:=aDocTst.cd_uo_origine;
   aScrittura.PG_SCRITTURA:=null;
   aScrittura.ORIGINE_SCRITTURA:=CNRCTB200.ORIGINE_DOCUMENTO_AMM;
   aScrittura.CD_TIPO_DOCUMENTO:=aDocTst.cd_tipo_documento;
   aScrittura.CD_CDS_DOCUMENTO:=aDocTst.cd_cds;
   aScrittura.CD_UO_DOCUMENTO:=aDocTst.cd_unita_organizzativa;
   aScrittura.PG_NUMERO_DOCUMENTO:=aDocTst.pg_numero_documento;
   aScrittura.IM_SCRITTURA:=null; -- Impostato come totale di sezione in realizzazione della scrittura

-- SF 26.09.2007
-- ANOMALIA: TALVOLTA LA DATA DELLA SCRITTURA IN PARTITA DOPPIA E' ESTERNA ALL'ESERCIZIO A CUI SI RIFERISCE
-- SOLUZIONE: ANCHE SE IL DOC. AMMINISTRATIVO SI RICONTABILIZZA A SEGUITO DI UNA MODIFICA INTERVENUTA SUCCESSIVAMENTE
--            ALLA REGISTRAZIONE DEL DOCUMENTO LA SCRITTURA PORTA SEMPRE LA DATA DI REGISTRAZIONE DEL DOCUMENTO,
--            CHE NON PUO' ESSERE MAI ESTERNA ALL'ESERCIZIO

--   If aDocTst.stato_coge = CNRCTB100.STATO_COEP_DA_RIP Then
--    aScrittura.DT_CONTABILIZZAZIONE := trunc(aDocTst.duva);
--   else
    aScrittura.DT_CONTABILIZZAZIONE := trunc(aDocTst.dt_registrazione);
--   end if;

   aScrittura.DT_PAGAMENTO:=null;
   aScrittura.DT_CANCELLAZIONE:=null;
   aScrittura.TI_SCRITTURA:=CNRCTB200.TI_SCRITTURA_PRIMA; -- Si tratta del tipo di scrittura prima o ultima
   aScrittura.CD_TERZO:=aCdTerzo;
   aScrittura.STATO:=CNRCTB200.STATO_DEFINITIVO;
   aScrittura.CD_DIVISA:=aDocTst.cd_divisa;
   aScrittura.COSTO_PLURIENNALE:=null; -- chi lo valorizza e come non è chiaro
   aScrittura.PG_ENTE:=null; -- serve a rinumerare le scritture  livello di ENTE
   aScrittura.DS_SCRITTURA := 'Contabilizzazione '||aDocTst.CD_TIPO_DOCUMENTO||': '||aDocTst.CD_CDS||'/'||
                              aDocTst.CD_UNITA_ORGANIZZATIVA||'/'||aDocTst.ESERCIZIO||'/'||
                              aDocTst.PG_NUMERO_DOCUMENTO;    --null; -- chi lo valorizza e come non è chiaro
   aScrittura.PG_SCRITTURA_ANNULLATA:=null; -- codice della scrittura annullata in effettuazione storno
   aScrittura.ATTIVA:='Y';
   aScrittura.ESERCIZIO_DOCUMENTO_AMM:=aDocTst.esercizio;
   aScrittura.DACR:=aTSNow;
   aScrittura.UTCR:=aUser;
   return aScrittura;
 end;

 function buildScrPEPAnnull(aEs number, aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aCdTerzo number, aUser varchar2, aTSnow date) return scrittura_partita_doppia%rowtype is
  aScrittura scrittura_partita_doppia%rowtype;
 begin
   aScrittura:=null;
   aScrittura.CD_CDS:=aDocTst.cd_cds_origine;
   aScrittura.ESERCIZIO:=aEs;
   aScrittura.cd_causale_coge:=CNRCTB200.CAU_ANNULL_ES_CHIUSO;
   aScrittura.CD_UNITA_ORGANIZZATIVA:=aDocTst.cd_uo_origine;
   aScrittura.PG_SCRITTURA:=null;
   aScrittura.ORIGINE_SCRITTURA:=CNRCTB200.ORIGINE_DOCUMENTO_AMM;
   aScrittura.CD_TIPO_DOCUMENTO:=aDocTst.cd_tipo_documento;
   aScrittura.CD_CDS_DOCUMENTO:=aDocTst.cd_cds;
   aScrittura.CD_UO_DOCUMENTO:=aDocTst.cd_unita_organizzativa;
   aScrittura.PG_NUMERO_DOCUMENTO:=aDocTst.pg_numero_documento;
   aScrittura.IM_SCRITTURA:=null; -- Impostato come totale di sezione in realizzazione della scrittura
   aScrittura.DT_CONTABILIZZAZIONE:=to_date('0101'||(aEs),'DDMMYYYY');
   aScrittura.DT_PAGAMENTO:=null;
   aScrittura.DT_CANCELLAZIONE:=null;
   aScrittura.TI_SCRITTURA:=CNRCTB200.TI_SCRITTURA_PRIMA; -- Si tratta del tipo di scrittura prima o ultima
   aScrittura.CD_TERZO:=aCdTerzo;
   aScrittura.STATO:=CNRCTB200.STATO_DEFINITIVO;
   aScrittura.CD_DIVISA:=aDocTst.cd_divisa;
   aScrittura.COSTO_PLURIENNALE:=null; -- chi lo valorizza e come non è chiaro
   aScrittura.PG_ENTE:=null; -- serve a rinumerare le scritture  livello di ENTE
   aScrittura.DS_SCRITTURA := 'Annullamento '||aDocTst.CD_TIPO_DOCUMENTO||': '||aDocTst.CD_CDS||'/'||
                              aDocTst.CD_UNITA_ORGANIZZATIVA||'/'||aDocTst.ESERCIZIO||'/'||
                              aDocTst.PG_NUMERO_DOCUMENTO;    --null; -- chi lo valorizza e come non è chiaro
   aScrittura.PG_SCRITTURA_ANNULLATA:=null; -- codice della scrittura annullata in effettuazione storno
   aScrittura.ATTIVA:='Y';
   aScrittura.ESERCIZIO_DOCUMENTO_AMM:=aDocTst.esercizio;
   aScrittura.DACR:=aTSNow;
   aScrittura.UTCR:=aUser;
   return aScrittura;
 end;

 function buildScrUEP(aDocTst V_DOC_ULT_COGE_TSTA%rowtype, aCdTerzo number, aTipoScrittura char, aCdCausale varchar2, aUser varchar2, aTSnow date) return scrittura_partita_doppia%rowtype is
  aScrittura scrittura_partita_doppia%rowtype;
 begin
   aScrittura:=null;
   aScrittura.CD_CDS:=aDocTst.cd_cds_origine;
   aScrittura.ESERCIZIO:=aDocTst.esercizio;
   aScrittura.CD_UNITA_ORGANIZZATIVA:=aDocTst.cd_uo_origine;
   aScrittura.PG_SCRITTURA:=null;
   aScrittura.ORIGINE_SCRITTURA:=CNRCTB200.ORIGINE_DOCUMENTO_CONT;
   aScrittura.CD_CAUSALE_COGE:=aCdCausale;
   aScrittura.CD_CDS_DOCUMENTO:=aDocTst.cd_cds;
   aScrittura.CD_UO_DOCUMENTO:=aDocTst.cd_unita_organizzativa;
   aScrittura.CD_TIPO_DOCUMENTO:=aDocTst.cd_tipo_documento_cont;
   aScrittura.PG_NUMERO_DOCUMENTO:=aDocTst.pg_documento_cont;
   aScrittura.IM_SCRITTURA:=null; -- Impostato a quadratura dei movimenti in realizzazione della scrittura
-- 09.08.2006 data della scrittura = data emissione mandato/reversale
   aScrittura.DT_CONTABILIZZAZIONE := Nvl(aDocTst.DT_EMISSIONE_DOCUMENTO_CONT, Trunc(aTSNow));
   aScrittura.DT_PAGAMENTO:=aDocTst.dt_esito_documento_cont;
   aScrittura.DT_CANCELLAZIONE:=null;
   aScrittura.TI_SCRITTURA:=aTipoScrittura;
   aScrittura.CD_TERZO:=aCdTerzo;
   aScrittura.STATO:=CNRCTB200.STATO_DEFINITIVO;
   aScrittura.CD_DIVISA:=null;
   aScrittura.COSTO_PLURIENNALE:=null;
   aScrittura.PG_ENTE:=null; -- serve a rinumerare le scritture  livello di ENTE
   aScrittura.DS_SCRITTURA := 'Contabilizzazione '||aDocTst.CD_TIPO_DOCUMENTO_CONT||': '||aDocTst.CD_CDS||'/'||
                              aDocTst.CD_UNITA_ORGANIZZATIVA||'/'||aDocTst.ESERCIZIO||'/'||
                              aDocTst.PG_DOCUMENTO_CONT;    --null; -- chi lo valorizza e come non è chiaro
   aScrittura.PG_SCRITTURA_ANNULLATA:=null; -- codice della scrittura annullata in effettuazione storno
   aScrittura.ATTIVA:='Y';
   aScrittura.ESERCIZIO_DOCUMENTO_AMM:=null;
   aScrittura.DACR:=aTSNow;
   aScrittura.UTCR:=aUser;
   return aScrittura;
 end;

 function buildScrUEP(aDocTst V_DOC_ULT_COGE_TSTA%rowtype, aCdTerzo number, aTipoScrittura char, aUser varchar2, aTSnow date) return scrittura_partita_doppia%rowtype is
 begin
  return buildScrUEP(aDocTst, aCdTerzo, aTipoScrittura, null, aUser, aTSnow);
 end;

-- RILEVA SE, PER UNA NOTA CREDITO, LA COMPETENZA ECONOMICA DELLA FATTURA E' IN ESERCIZIO (PRECEDENTE) CHIUSO
 Function isCompFattEsPreChiusoADTREG (aDocTst V_DOC_AMM_COGE_TSTA%rowtype, aDoc V_DOC_AMM_COGE_RIGA%rowtype) return Boolean Is
 max_comp_coge_fatt  DATE;
 aChiusura           CHIUSURA_COEP%Rowtype;
 Begin
   If aDocTst.ti_fattura != 'C' Then
        IBMERR001.RAISE_ERR_GENERICO('Impossibile rilevare la competenza economica della Fattura collegata, il documento non '||
                'è una Nota di Credito.');
   End If;

   If aDocTst.CD_TIPO_DOCUMENTO = CNRCTB100.TI_FATTURA_PASSIVA Then
Dbms_Output.PUT_LINE ('FATT PASS '||aDoc.CD_CDS||' '||aDoc.CD_UNITA_ORGANIZZATIVA||' '||aDoc.ESERCIZIO||' '||aDoc.PG_NUMERO_DOCUMENTO||' '||aDoc.PG_RIGA);
     Select Max(dt_a_competenza_coge)
     Into   max_comp_coge_fatt
     From   fattura_passiva_riga
     Where  CD_CDS                  = aDoc.CD_CDS And
            CD_UNITA_ORGANIZZATIVA  = aDoc.CD_UNITA_ORGANIZZATIVA And
            ESERCIZIO               = aDoc.ESERCIZIO And
            PG_FATTURA_PASSIVA      = aDoc.PG_NUMERO_DOCUMENTO;
   Elsif aDocTst.CD_TIPO_DOCUMENTO = CNRCTB100.TI_FATTURA_ATTIVA Then
Dbms_Output.PUT_LINE ('FATT ATT '||aDoc.CD_CDS||' '||aDoc.CD_UNITA_ORGANIZZATIVA||' '||aDoc.ESERCIZIO||' '||aDoc.PG_NUMERO_DOCUMENTO||' '||aDoc.PG_RIGA);
     Select Max(dt_a_competenza_coge)
     Into   max_comp_coge_fatt
     From   fattura_attiva_riga
     Where  CD_CDS                  = aDoc.CD_CDS And
            CD_UNITA_ORGANIZZATIVA  = aDoc.CD_UNITA_ORGANIZZATIVA And
            ESERCIZIO               = aDoc.ESERCIZIO And
            PG_FATTURA_ATTIVA      = aDoc.PG_NUMERO_DOCUMENTO;
   End If;

   aChiusura := CNRCTB200.getChiusuraCoep(To_Char(max_comp_coge_fatt, 'yyyy'), aDocTst.cd_cds);

   If Nvl(aChiusura.stato, 'A') = 'C' And Trunc(aDocTst.DT_REGISTRAZIONE) >= Trunc(aChiusura.DUVA) Then
--          IBMERR001.RAISE_ERR_GENERICO('Messaggio di prova: Esercizio competenza fattura chiuso.');
          Return True;
   Else
          Return False;
   End If;
End;

 procedure checkChiusuraEsercizio(aEs number, aCdCds varchar2) is
 begin
  if not CNRCTB008.ISESERCIZIOAPERTOOCHIUSO(aEs, aCdCds) then
    IBMERR001.RAISE_ERR_GENERICO('L''esercizio ('||aEs||') non è ancora aperto per il cds :'||aCdCds);
  end if;
  if (CNRCTB200.ISCHIUSURACOEPDEF(aEs, aCdCds)='Y') then
   IBMERR001.RAISE_ERR_GENERICO('L''esercizio economico è chiuso definitivamente o in fase di chiusura per il cds: '||aCdCds);
  end if;
 end;

 function trovaContoContrEp(aEs number,aTiAppartenza char,aTiGestione Char, aEV varchar2,aVocein varchar2) return voce_ep%rowtype is
  ass ass_ev_voceep%rowtype;
  aContoEp voce_ep%rowtype;
 begin
  begin
  if (aEV is not null) then
    select * into ass
    from ass_ev_voceep
    where
    	  esercizio = aEs
	   		and TI_APPARTENENZA = nvl(aTiAppartenza,TI_APPARTENENZA)
       	and ti_gestione = nvl(aTiGestione,ti_gestione)
       	and CD_ELEMENTO_VOCE = aEV;
  elsif (aVocein is not null) then
  	select * into ass
    from ass_ev_voceep
    where
    	  esercizio = aEs
	     	and CD_VOCe_EP = aVocein and
	     	rownum =1;
  end if;

  exception when NO_DATA_FOUND then
   	IBMERR001.RAISE_ERR_GENERICO('Associazione ev/coep non trovata per voce:'||aEs||'/'||aTiGestione||'/'||aEV||' o VoceIn /'||aVocein);
  end;
  if (ass.CD_VOCE_EP_CONTR is null) then
 			IBMERR001.RAISE_ERR_GENERICO('Contropartita mancante in Associazione ev/coep:'||aEs||'/'||aTiGestione||'/'||aEV||' o VoceIn /'||aVocein);
 	else
  		aContoEp:=CNRCTB002.getVoceEp(ass.esercizio, ass.CD_VOCE_EP_CONTR);
  end if;
  return aContoEp;
 end;
end;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy