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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB400" AS

-- =================================================================================================
-- Select record di INVENTARIO_BENI
-- =================================================================================================
FUNCTION getInventarioBeni
   (inPgInventario NUMBER,
    inNrInventario NUMBER,
    inProgressivo NUMBER,
    eseguiLock CHAR
   ) RETURN INVENTARIO_BENI%ROWTYPE IS

   aRecInventarioBeni INVENTARIO_BENI%ROWTYPE;

BEGIN

   IF eseguiLock = 'N' THEN

      SELECT * INTO aRecInventarioBeni
      FROM   INVENTARIO_BENI
      WHERE  pg_inventario = inPgInventario AND
             nr_inventario = inNrInventario AND
             progressivo = inProgressivo;

   ELSE

      SELECT * INTO aRecInventarioBeni
      FROM   INVENTARIO_BENI
      WHERE  pg_inventario = inPgInventario AND
             nr_inventario = inNrInventario AND
             progressivo = inProgressivo
      FOR UPDATE NOWAIT;

   END IF;

   RETURN aRecInventarioBeni;

EXCEPTION

   WHEN others THEN
        IBMERR001.RAISE_ERR_GENERICO
           ('Errore in recupero del bene. Inventario: ' || inPgInventario || ' ' ||
            'Bene: ' || inNrInventario || '-' || inProgressivo);

END getInventarioBeni;

-- =================================================================================================

FUNCTION getInventarioBeni
   (inIdBeneOrigine VARCHAR2,
    eseguiLock CHAR
   ) RETURN INVENTARIO_BENI%ROWTYPE IS

   aRecInventarioBeni INVENTARIO_BENI%ROWTYPE;

BEGIN

   IF eseguiLock = 'N' THEN

      SELECT * INTO aRecInventarioBeni
      FROM   INVENTARIO_BENI
      WHERE  id_bene_origine = inIdBeneOrigine;

   ELSE

      SELECT * INTO aRecInventarioBeni
      FROM   INVENTARIO_BENI
      WHERE  id_bene_origine = inIdBeneOrigine
      FOR UPDATE NOWAIT;

   END IF;

   RETURN aRecInventarioBeni;

EXCEPTION

   WHEN others THEN
        IBMERR001.RAISE_ERR_GENERICO
           ('Errore in recupero del bene. Identificativo bene origine: ' || inIdBeneOrigine);

END getInventarioBeni;

-- =================================================================================================
-- Torna Y/N se esiste o meno il bene in INVENTARIO_BENI
-- =================================================================================================
FUNCTION checkEsisteBene
   (inIdBeneOrigine VARCHAR2
   ) RETURN CHAR IS

   flEsiste INTEGER;

BEGIN

   SELECT COUNT(*) INTO flEsiste
   FROM   DUAL
   WHERE  EXISTS
          (SELECT 1
           FROM   INVENTARIO_BENI
           WHERE  id_bene_origine = inIdBeneOrigine);

   IF flEsiste = 0 THEN
      RETURN 'N';
   ELSE
      RETURN 'Y';
   END IF;

   RETURN flEsiste;

END checkEsisteBene;

-- =================================================================================================
-- Ritorna il progressivo identificativo dell'inventario
-- =================================================================================================
FUNCTION getPgInventario
   (inCdCds VARCHAR2,
    inCdUo VARCHAR2
   ) RETURN NUMBER IS

   aPgInventario NUMBER(10);

BEGIN

   SELECT pg_inventario INTO aPgInventario
   FROM   ASS_INVENTARIO_UO
   WHERE  cd_cds = inCdCds AND
          cd_unita_organizzativa = inCdUo;

   RETURN aPgInventario;

EXCEPTION

   WHEN others THEN
        IBMERR001.RAISE_ERR_GENERICO
           ('Errore in recupero del progressivo identificativo dell''inventario. Cds: ' || inCdCds || ' ' ||
            'Uo: ' || inCdUo);

END getPgInventario;

-- =================================================================================================
-- Ritorna un record di CATEGORIA_GRUPPO_INVENT
-- =================================================================================================
FUNCTION getCategoriaGruppoInvent
   (inCdCategoriaGruppo VARCHAR2
   ) RETURN CATEGORIA_GRUPPO_INVENT%ROWTYPE IS

   aRecCategoriaGruppoInvent CATEGORIA_GRUPPO_INVENT%ROWTYPE;

BEGIN

   SELECT * INTO aRecCategoriaGruppoInvent
   FROM   CATEGORIA_GRUPPO_INVENT
   WHERE  cd_categoria_gruppo = inCdCategoriaGruppo;

   RETURN aRecCategoriaGruppoInvent;

EXCEPTION

   WHEN others THEN
        IBMERR001.RAISE_ERR_GENERICO
           ('Errore in recupero della categoria gruppo del bene. Codice: ' || inCdCategoriaGruppo);

END getCategoriaGruppoInvent;

-- =================================================================================================
-- Lettura ubicazione di default
-- =================================================================================================
FUNCTION getUbicazioneDefault
   (inCdCds VARCHAR2,
    inUo VARCHAR2) RETURN UBICAZIONE_BENE%ROWTYPE IS

   aRecUbicazioneBene UBICAZIONE_BENE%ROWTYPE;

BEGIN

   SELECT * INTO aRecUbicazioneBene
   FROM   UBICAZIONE_BENE
   WHERE  cd_cds = inCdCds AND
          cd_unita_organizzativa = inUo AND
          fl_ubicazione_default = 'Y';

   RETURN aRecUbicazioneBene;

EXCEPTION

   WHEN others THEN
        IBMERR001.RAISE_ERR_GENERICO
           ('Errore in recupero ubicazione di default per Cds ' || inCdCds || ' Uo ' || inUo);

END getUbicazioneDefault;

-- =================================================================================================

FUNCTION getCdUbicazioneDefault
   (inCdCds VARCHAR2,
    inUo VARCHAR2
   ) RETURN VARCHAR2 IS

   aCdUbicazione UBICAZIONE_BENE.cd_ubicazione%TYPE;

BEGIN

   SELECT cd_ubicazione INTO aCdUbicazione
   FROM   UBICAZIONE_BENE
   WHERE  cd_cds = inCdCds AND
          cd_unita_organizzativa = inUo AND
          fl_ubicazione_default = 'Y';

   RETURN aCdUbicazione;

EXCEPTION

   WHEN others THEN
        IBMERR001.RAISE_ERR_GENERICO
           ('Errore in recupero ubicazione di default per Cds ' || inCdCds || ' Uo ' || inUo);

END getCdUbicazioneDefault;

-- =================================================================================================
-- Inserisce un record in NUMERATORE_BUONO_C_S
-- =================================================================================================
PROCEDURE insNumeratoreBuonoCS
   (aRecNumeratoreBuonoCS NUMERATORE_BUONO_C_S%ROWTYPE) IS

BEGIN

   INSERT INTO NUMERATORE_BUONO_C_S
          (pg_inventario,
           ti_carico_scarico,
           esercizio,
           iniziale,
           corrente,
           dacr,
           utcr,
           duva,
           utuv,
           pg_ver_rec)
   VALUES (aRecNumeratoreBuonoCS.pg_inventario,
           aRecNumeratoreBuonoCS.ti_carico_scarico,
           aRecNumeratoreBuonoCS.esercizio,
           aRecNumeratoreBuonoCS.iniziale,
           aRecNumeratoreBuonoCS.corrente,
           aRecNumeratoreBuonoCS.dacr,
           aRecNumeratoreBuonoCS.utcr,
           aRecNumeratoreBuonoCS.duva,
           aRecNumeratoreBuonoCS.utuv,
           aRecNumeratoreBuonoCS.pg_ver_rec);

END insNumeratoreBuonoCS;

-- =================================================================================================
-- Select record di NUMERATORE_BUONO_C_S
-- =================================================================================================
FUNCTION getNumeratoreBuonoCS
   (inPgInventario NUMBER,
    inTipoCaricoScarico CHAR,
    inEsercizio NUMBER,
    inUtente VARCHAR2,
    inData DATE,
    eseguiLock CHAR
   ) RETURN NUMERATORE_BUONO_C_S%ROWTYPE IS

   aRecNumeratoreBuonoCS NUMERATORE_BUONO_C_S%ROWTYPE;

BEGIN

   IF eseguiLock = 'N' THEN

      SELECT * INTO aRecNumeratoreBuonoCS
      FROM   NUMERATORE_BUONO_C_S
      WHERE  pg_inventario = inPgInventario AND
             ti_carico_scarico = inTipoCaricoScarico AND
             esercizio = inEsercizio;

   ELSE

      SELECT * INTO aRecNumeratoreBuonoCS
      FROM   NUMERATORE_BUONO_C_S
      WHERE  pg_inventario = inPgInventario AND
             ti_carico_scarico = inTipoCaricoScarico AND
             esercizio = inEsercizio
      FOR UPDATE NOWAIT;

   END IF;

   RETURN aRecNumeratoreBuonoCS;

EXCEPTION

   WHEN no_data_found THEN

        BEGIN

           aRecNumeratoreBuonoCS.pg_inventario:=inPgInventario;
           aRecNumeratoreBuonoCS.ti_carico_scarico:=inTipoCaricoScarico;
           aRecNumeratoreBuonoCS.esercizio:=inEsercizio;
           aRecNumeratoreBuonoCS.iniziale:=0;
           aRecNumeratoreBuonoCS.corrente:=0;
           aRecNumeratoreBuonoCS.dacr:=inData;
           aRecNumeratoreBuonoCS.utcr:=inUtente;
           aRecNumeratoreBuonoCS.duva:=inData;
           aRecNumeratoreBuonoCS.utuv:=inUtente;
           aRecNumeratoreBuonoCS.pg_ver_rec:=1;

           insNumeratoreBuonoCS(aRecNumeratoreBuonoCS);

           RETURN aRecNumeratoreBuonoCS;

        EXCEPTION

           WHEN others THEN
                IBMERR001.RAISE_ERR_GENERICO
                   ('Errore in creazione numeratore buoni di carico/scarico. Inventario: ' || inPgInventario || ' ' ||
                    'Esercizio: ' || inEsercizio || ' ' || 'Tipo CaricoScarico: ' || inTipoCaricoScarico);

        END;

   WHEN others THEN
        IBMERR001.RAISE_ERR_GENERICO
           ('Errore in recupero numeratore buoni di carico/scarico. Inventario: ' || inPgInventario || ' ' ||
            'Esercizio: ' || inEsercizio || ' ' || 'Tipo CaricoScarico: ' || inTipoCaricoScarico);

END getNumeratoreBuonoCS;

-- =================================================================================================
-- Lettura del valore iniziale di numerazione beni per un dato inventario
-- =================================================================================================
FUNCTION getNrInventarioIniziale
   (inPgInventario NUMBER) RETURN NUMBER IS

   aNrInventario INVENTARIO_BENI.nr_inventario%TYPE;

BEGIN

   SELECT nr_inventario_iniziale INTO aNrInventario
   FROM   ID_INVENTARIO
   WHERE  pg_inventario = inPgInventario;

   RETURN aNrInventario;

END getNrInventarioIniziale;

-- =================================================================================================
-- Lettura del valore massimo del numeratore bene per un dato inventario
-- =================================================================================================
FUNCTION getNewNrInventario
   (inPgInventario NUMBER) RETURN NUMBER IS

   aNrInventario INVENTARIO_BENI.nr_inventario%TYPE;

BEGIN

   -- Trovo il valore massimo del bene attualmente in archivio per un dato inventario

   SELECT NVL(MAX(nr_inventario),0) INTO aNrInventario
   FROM   INVENTARIO_BENI
   WHERE  pg_inventario = inPgInventario;

   -- Se questo vale zero significa che non sono mai stati creati beni per quell'inventario, quindi recupero
   -- il progressivo iniziale da INVENTARIO_BENI.

   IF aNrInventario = 0 Or aNrInventario< getNrInventarioIniziale(inPgInventario) THEN
      aNrInventario:=getNrInventarioIniziale(inPgInventario);
   ELSE
      aNrInventario:=aNrInventario + 1;
   END IF;

   RETURN aNrInventario;

EXCEPTION

   WHEN others THEN
        IBMERR001.RAISE_ERR_GENERICO
           ('Errore in recupero progressivo bene per carico. Inventario: ' || inPgInventario);

END getNewNrInventario;

-- =================================================================================================
-- Lettura del valore massimo di progressivo bene
-- =================================================================================================
FUNCTION getNewProgressivo
   (inPgInventario NUMBER,
    inNrInventario NUMBER) RETURN NUMBER IS

   aProgressivo INVENTARIO_BENI.progressivo%TYPE;

BEGIN

   SELECT MAX(progressivo) + 1 INTO aProgressivo
   FROM   INVENTARIO_BENI
   WHERE  pg_inventario = inPgInventario AND
          nr_inventario = inNrInventario;

   RETURN aProgressivo;

END getNewProgressivo;

-- =================================================================================================
-- Aggiorna valore corrente di NUMERATORE_BUONO_C_S
-- =================================================================================================
PROCEDURE upgCorrenteNumeratoreBuonoCS
   (inPgInventario NUMBER,
    inTipoCaricoScarico CHAR,
    inEsercizio NUMBER,
    inData DATE,
    inUtente VARCHAR2) IS

BEGIN

   UPDATE NUMERATORE_BUONO_C_S
   SET    corrente = corrente + 1,
          duva = inData,
          utuv = inUtente,
          pg_ver_rec = pg_ver_rec + 1
   WHERE  pg_inventario = inPgInventario AND
          ti_carico_scarico = inTipoCaricoScarico AND
          esercizio = inEsercizio;

END upgCorrenteNumeratoreBuonoCS;

-- =================================================================================================
-- Inserisce un record in ASS_TRASFERIMENTO_BENI_INV
-- =================================================================================================
PROCEDURE insAssTrasferimentoBeniInv
   (aRecAssTrasferimentoBeniInv ASS_TRASFERIMENTO_BENI_INV%ROWTYPE) IS

BEGIN

   INSERT INTO ASS_TRASFERIMENTO_BENI_INV
          (pg_inventario_origine,
           nr_inventario_origine,
           progressivo_origine,
           pg_inventario_dest,
           nr_inventario_dest,
           progressivo_dest,
           valore_iniziale,
           variazione_piu,
           variazione_meno,
           imponibile_ammortamento,
           valore_ammortizzato,
           dacr,
           utcr,
           duva,
           utuv,
           pg_ver_rec)
   VALUES (aRecAssTrasferimentoBeniInv.pg_inventario_origine,
           aRecAssTrasferimentoBeniInv.nr_inventario_origine,
           aRecAssTrasferimentoBeniInv.progressivo_origine,
           aRecAssTrasferimentoBeniInv.pg_inventario_dest,
           aRecAssTrasferimentoBeniInv.nr_inventario_dest,
           aRecAssTrasferimentoBeniInv.progressivo_dest,
           aRecAssTrasferimentoBeniInv.valore_iniziale,
           aRecAssTrasferimentoBeniInv.variazione_piu,
           aRecAssTrasferimentoBeniInv.variazione_meno,
           aRecAssTrasferimentoBeniInv.imponibile_ammortamento,
           aRecAssTrasferimentoBeniInv.valore_ammortizzato,
           aRecAssTrasferimentoBeniInv.dacr,
           aRecAssTrasferimentoBeniInv.utcr,
           aRecAssTrasferimentoBeniInv.duva,
           aRecAssTrasferimentoBeniInv.utuv,
           aRecAssTrasferimentoBeniInv.pg_ver_rec);

END insAssTrasferimentoBeniInv;

-- =================================================================================================
-- Inserisce un record in INVENTARIO_BENI
-- =================================================================================================
PROCEDURE insInventarioBeni
   (aRecInventarioBeni INVENTARIO_BENI%Rowtype) IS

BEGIN

   INSERT INTO INVENTARIO_BENI
          (pg_inventario,
           nr_inventario,
           progressivo,
           ds_bene,
           cd_categoria_gruppo,
           ti_ammortamento,
           fl_ammortamento,
           cd_condizione_bene,
           ti_commerciale_istituzionale,
           valore_iniziale,
           valore_ammortizzato,
           variazione_piu,
           variazione_meno,
           imponibile_ammortamento,
           valore_alienazione,
           fl_totalmente_scaricato,
           collocazione,
           cd_cds,
           cd_unita_organizzativa,
           cd_ubicazione,
           cd_assegnatario,
           dt_validita_variazione,
           dacr,
           utcr,
           duva,
           utuv,
           pg_ver_rec,
           etichetta,
           esercizio_carico_bene,
           id_bene_origine,
           fl_migrato,
           cd_barre,
           targa,
           seriale)
   VALUES (aRecInventarioBeni.pg_inventario,
           aRecInventarioBeni.nr_inventario,
           aRecInventarioBeni.progressivo,
           aRecInventarioBeni.ds_bene,
           aRecInventarioBeni.cd_categoria_gruppo,
           aRecInventarioBeni.ti_ammortamento,
           aRecInventarioBeni.fl_ammortamento,
           aRecInventarioBeni.cd_condizione_bene,
           aRecInventarioBeni.ti_commerciale_istituzionale,
           aRecInventarioBeni.valore_iniziale,
           aRecInventarioBeni.valore_ammortizzato,
           aRecInventarioBeni.variazione_piu,
           aRecInventarioBeni.variazione_meno,
           aRecInventarioBeni.imponibile_ammortamento,
           aRecInventarioBeni.valore_alienazione,
           aRecInventarioBeni.fl_totalmente_scaricato,
           aRecInventarioBeni.collocazione,
           aRecInventarioBeni.cd_cds,
           aRecInventarioBeni.cd_unita_organizzativa,
           aRecInventarioBeni.cd_ubicazione,
           aRecInventarioBeni.cd_assegnatario,
           aRecInventarioBeni.dt_validita_variazione,
           aRecInventarioBeni.dacr,
           aRecInventarioBeni.utcr,
           aRecInventarioBeni.duva,
           aRecInventarioBeni.utuv,
           aRecInventarioBeni.pg_ver_rec,
           aRecInventarioBeni.etichetta,
           aRecInventarioBeni.esercizio_carico_bene,
           aRecInventarioBeni.id_bene_origine,
           --aRecInventarioBeni.fl_migrato
           'N',
           aRecInventarioBeni.cd_barre,
           aRecInventarioBeni.targa,
           aRecInventarioBeni.seriale);

END insInventarioBeni;

-- =================================================================================================
-- Cancellazione tabella appoggio INVENTARIO_BENI_APG
-- =================================================================================================
PROCEDURE cancellaInventarioBeniApg
   (
    localTransId VARCHAR2
   ) IS

BEGIN

   DELETE INVENTARIO_BENI_APG
   WHERE  local_transaction_id=localTransId and
   	 ( pg_buono_c_s <0 OR PG_BUONO_C_S IS NULL);

END cancellaInventarioBeniApg;

-- =================================================================================================
-- Funzione di inserimento su tabella BUONO_CARICO_SCARICO
-- =================================================================================================
PROCEDURE insBuonoCaricoScarico
   (
    aBuonoCaricoScarico BUONO_CARICO_SCARICO%ROWTYPE
   ) IS

BEGIN

   INSERT INTO BUONO_CARICO_SCARICO
          (PG_INVENTARIO,
           TI_DOCUMENTO,
           ESERCIZIO,
           PG_BUONO_C_S,
           DS_BUONO_CARICO_SCARICO,
           DATA_REGISTRAZIONE,
           CD_TIPO_CARICO_SCARICO,
           PROVENIENZA,
           DACR,
           UTCR,
           DUVA,
           UTUV,
           PG_VER_REC)
   VALUES (aBuonoCaricoScarico.pg_inventario,
           aBuonoCaricoScarico.ti_documento,
           aBuonoCaricoScarico.esercizio,
           aBuonoCaricoScarico.pg_buono_c_s,
           aBuonoCaricoScarico.ds_buono_carico_scarico,
           aBuonoCaricoScarico.data_registrazione,
           aBuonoCaricoScarico.cd_tipo_carico_scarico,
           aBuonoCaricoScarico.provenienza,
           aBuonoCaricoScarico.dacr,
           aBuonoCaricoScarico.utcr,
           aBuonoCaricoScarico.duva,
           aBuonoCaricoScarico.utuv,
           aBuonoCaricoScarico.pg_ver_rec);

END insBuonoCaricoScarico;

-- =================================================================================================
-- Funzione di inserimento su tabella BUONO_CARICO_SCARICO_DETT
-- =================================================================================================
PROCEDURE insBuonoCaricoScaricoDett
   (
    aBuonoCaricoScaricoDett BUONO_CARICO_SCARICO_DETT%ROWTYPE
   ) IS

BEGIN

   INSERT INTO BUONO_CARICO_SCARICO_DETT
          (PG_INVENTARIO,
           TI_DOCUMENTO,
           ESERCIZIO,
           PG_BUONO_C_S,
           NR_INVENTARIO,
           PROGRESSIVO,
           INTERVALLO,
           QUANTITA,
           VALORE_UNITARIO,
           DACR,
           UTCR,
           DUVA,
           UTUV,
           PG_VER_REC,
           STATO_COGE,
           STATO_COGE_QUOTE)
   VALUES (aBuonoCaricoScaricoDett.pg_inventario,
           aBuonoCaricoScaricoDett.ti_documento,
           aBuonoCaricoScaricoDett.esercizio,
           aBuonoCaricoScaricoDett.pg_buono_c_s,
           aBuonoCaricoScaricoDett.nr_inventario,
           aBuonoCaricoScaricoDett.progressivo,
           aBuonoCaricoScaricoDett.intervallo,
           aBuonoCaricoScaricoDett.quantita,
           aBuonoCaricoScaricoDett.valore_unitario,
           aBuonoCaricoScaricoDett.dacr,
           aBuonoCaricoScaricoDett.utcr,
           aBuonoCaricoScaricoDett.duva,
           aBuonoCaricoScaricoDett.utuv,
           aBuonoCaricoScaricoDett.pg_ver_rec,
           aBuonoCaricoScaricoDett.stato_coge,
           aBuonoCaricoScaricoDett.stato_coge_quote);

END insBuonoCaricoScaricoDett;

-- =================================================================================================
-- Funzione di inserimento su tabella ASS_INV_BENE_FATTURA
-- =================================================================================================
PROCEDURE insAssInvBeneFattura
   (
    aAssInvBeneFattura ASS_INV_BENE_FATTURA%ROWTYPE
   ) IS

BEGIN

   INSERT INTO ASS_INV_BENE_FATTURA
          (CD_CDS_FATT_ATT,
           CD_UO_FATT_ATT,
           ESERCIZIO_FATT_ATT,
           PG_FATTURA_ATTIVA,
           PROGRESSIVO_RIGA_FATT_ATT,
           CD_CDS_FATT_PASS,
           CD_UO_FATT_PASS,
           ESERCIZIO_FATT_PASS,
           PG_FATTURA_PASSIVA,
           PROGRESSIVO_RIGA_FATT_PASS,
           PG_INVENTARIO,
           NR_INVENTARIO,
           PROGRESSIVO,
           DACR,
           UTCR,
           DUVA,
           UTUV,
           PG_VER_REC,
           PG_BUONO_C_S,
           ESERCIZIO,
           TI_DOCUMENTO,
           PG_RIGA,
           CD_CDS_DOC_GEN,
           CD_UO_DOC_GEN,
           ESERCIZIO_DOC_GEN,
           PG_DOCUMENTO_GENERICO,
           CD_TIPO_DOCUMENTO_AMM,
           PROGRESSIVO_RIGA_DOC_GEN)
   VALUES (aAssInvBeneFattura.cd_cds_fatt_att,
           aAssInvBeneFattura.cd_uo_fatt_att,
           aAssInvBeneFattura.esercizio_fatt_att,
           aAssInvBeneFattura.pg_fattura_attiva,
           aAssInvBeneFattura.progressivo_riga_fatt_att,
           aAssInvBeneFattura.cd_cds_fatt_pass,
           aAssInvBeneFattura.cd_uo_fatt_pass,
           aAssInvBeneFattura.esercizio_fatt_pass,
           aAssInvBeneFattura.pg_fattura_passiva,
           aAssInvBeneFattura.progressivo_riga_fatt_pass,
           aAssInvBeneFattura.pg_inventario,
           aAssInvBeneFattura.nr_inventario,
           aAssInvBeneFattura.progressivo,
           aAssInvBeneFattura.dacr,
           aAssInvBeneFattura.utcr,
           aAssInvBeneFattura.duva,
           aAssInvBeneFattura.utuv,
           aAssInvBeneFattura.pg_ver_rec,
           aAssInvBeneFattura.pg_buono_c_s,
           aAssInvBeneFattura.esercizio,
           aAssInvBeneFattura.ti_documento,
           aAssInvBeneFattura.pg_riga,
           aAssInvBeneFattura.cd_cds_doc_gen,
           aAssInvBeneFattura.cd_uo_doc_gen,
           aAssInvBeneFattura.esercizio_doc_gen,
           aAssInvBeneFattura.pg_documento_generico,
           aAssInvBeneFattura.cd_tipo_documento_amm,
           aAssInvBeneFattura.progressivo_riga_doc_gen);

END insAssInvBeneFattura;

-- =================================================================================================
-- Controllo stato apertura chiusura dell'inventario
-- =================================================================================================
FUNCTION checkStatoInventApCh
   (inPgInventario NUMBER,
    inEsercizio NUMBER,
    inData DATE) RETURN VARCHAR2 IS

  aStato CHAR(1);
  aRecInventarioApCh INVENTARIO_AP_CH%ROWTYPE;

BEGIN

   aStato:='C';

   BEGIN

      SELECT * INTO aRecInventarioApCh
      FROM   INVENTARIO_AP_CH
      WHERE  pg_inventario = inPgInventario AND
             esercizio = inEsercizio AND
             dt_apertura <= inData AND
             dt_chiusura >= inData;

      IF aRecInventarioApCh.stato = 'A' THEN
         aStato:='A';
      END IF;

      RETURN aStato;

   EXCEPTION

      WHEN no_data_found THEN
           RETURN aStato;

   END;

   RETURN aStato;

END checkStatoInventApCh;

-- =================================================================================================
-- Funzione di inserimento su tabella AMMORTAMENTO_BENE_INV
-- =================================================================================================
Procedure ins_AMMORTAMENTO_BENE_INV
   (aDest AMMORTAMENTO_BENE_INV%rowtype) IS

BEGIN

   INSERT INTO AMMORTAMENTO_BENE_INV
          (PG_INVENTARIO,
           NR_INVENTARIO,
           PROGRESSIVO,
           ESERCIZIO,
           CD_TIPO_AMMORTAMENTO,
           TI_AMMORTAMENTO,
           CD_CATEGORIA_GRUPPO,
           ESERCIZIO_COMPETENZA,
           IMPONIBILE_AMMORTAMENTO,
           IM_MOVIMENTO_AMMORT,
           PERC_AMMORTAMENTO,
           DACR,
           UTCR,
           DUVA,
           UTUV,
           PG_VER_REC,
           NUMERO_ANNI,
           NUMERO_ANNO,
           PERC_PRIMO_ANNO,
           PERC_SUCCESSIVI,
           CD_CDS_UBICAZIONE,
           CD_UO_UBICAZIONE,
           FL_STORNO,
           PG_RIGA,
           PG_BUONO_S)
   VALUES (aDest.PG_INVENTARIO,
           aDest.NR_INVENTARIO,
           aDest.PROGRESSIVO,
           aDest.ESERCIZIO,
           aDest.CD_TIPO_AMMORTAMENTO,
           aDest.TI_AMMORTAMENTO,
           aDest.CD_CATEGORIA_GRUPPO,
           aDest.ESERCIZIO_COMPETENZA,
           aDest.IMPONIBILE_AMMORTAMENTO,
           aDest.IM_MOVIMENTO_AMMORT,
           aDest.PERC_AMMORTAMENTO,
           aDest.DACR,
           aDest.UTCR,
           aDest.DUVA,
           aDest.UTUV,
           aDest.PG_VER_REC,
           aDest.NUMERO_ANNI,
           aDest.NUMERO_ANNO,
           aDest.PERC_PRIMO_ANNO,
           aDest.PERC_SUCCESSIVI,
           aDest.CD_CDS_UBICAZIONE,
           aDest.CD_UO_UBICAZIONE,
           aDest.FL_STORNO,
           aDest.PG_RIGA,
           aDest.PG_BUONO_S);

END ins_AMMORTAMENTO_BENE_INV;
-- =================================================================================================
-- Inserimento record INVENTARIO_UTILIZZATORI_LA
-- =================================================================================================
PROCEDURE insInventarioUtilizzatoriLa
   (aRecInventarioUtilizzatoriLa INVENTARIO_UTILIZZATORI_LA%ROWTYPE) IS

BEGIN

   INSERT INTO INVENTARIO_UTILIZZATORI_LA
          (pg_inventario,
           nr_inventario,
           progressivo,
           cd_utilizzatore_cdr,
           cd_linea_attivita,
           percentuale_utilizzo_cdr,
           percentuale_utilizzo_la,
           dacr,
           utcr,
           duva,
           utuv,
           pg_ver_rec)
   VALUES (aRecInventarioUtilizzatoriLa.pg_inventario,
           aRecInventarioUtilizzatoriLa.nr_inventario,
           aRecInventarioUtilizzatoriLa.progressivo,
           aRecInventarioUtilizzatoriLa.cd_utilizzatore_cdr,
           aRecInventarioUtilizzatoriLa.cd_linea_attivita,
           aRecInventarioUtilizzatoriLa.percentuale_utilizzo_cdr,
           aRecInventarioUtilizzatoriLa.percentuale_utilizzo_la,
           aRecInventarioUtilizzatoriLa.dacr,
           aRecInventarioUtilizzatoriLa.utcr,
           aRecInventarioUtilizzatoriLa.duva,
           aRecInventarioUtilizzatoriLa.utuv,
           aRecInventarioUtilizzatoriLa.pg_ver_rec);

END insInventarioUtilizzatoriLa;

-- =================================================================================================
-- Riporto dati utilizzatori (solo per trasferimento stessa UO)
-- =================================================================================================
PROCEDURE riportaUtilizzatoriLa
   (inPgInventarioOri NUMBER,
    inNrInventarioOri NUMBER,
    inNrInventarioDest NUMBER,
    inProgressivoDest NUMBER,
    inUtente VARCHAR2,
    inData DATE
   ) IS

   aRecInventarioUtilizzatoriLa INVENTARIO_UTILIZZATORI_LA%ROWTYPE;
   gen_cur_utl GenericCurTyp;

BEGIN

   OPEN gen_cur_utl FOR

        SELECT *
        FROM   INVENTARIO_UTILIZZATORI_LA
        WHERE  pg_inventario =  inPgInventarioOri AND
               nr_inventario =  inNrInventarioOri AND
               progressivo = 0
        ORDER BY pg_inventario,
                 nr_inventario,
                 progressivo,
                 cd_utilizzatore_cdr,
                 cd_linea_attivita;

   LOOP

      FETCH gen_cur_utl INTO
            aRecInventarioUtilizzatoriLa;

      EXIT WHEN gen_cur_utl%NOTFOUND;

      aRecInventarioUtilizzatoriLa.nr_inventario:=inNrInventarioDest;
      aRecInventarioUtilizzatoriLa.progressivo:=inProgressivoDest;
      aRecInventarioUtilizzatoriLa.dacr:=inData;
      aRecInventarioUtilizzatoriLa.utcr:=inUtente;
      aRecInventarioUtilizzatoriLa.duva:=inData;
      aRecInventarioUtilizzatoriLa.utuv:=inUtente;
      aRecInventarioUtilizzatoriLa.pg_ver_rec:=1;

      insInventarioUtilizzatoriLa(aRecInventarioUtilizzatoriLa);

   END LOOP;

   CLOSE gen_cur_utl;

END riportaUtilizzatoriLa;

-- =================================================================================================
-- Crea un documento di scarico di inventario, con i relativi dettagli e le eventuali associazioni
-- con le fatture di vendita.
-- =================================================================================================
PROCEDURE UpdScaricoInventarioBeni
   (
    localTransId VARCHAR2,
    aPgInventario NUMBER,
    aEsercizio NUMBER,
    aPgBuonoCaricoScarico NUMBER,
    aDsBuonoCaricoScarico VARCHAR2,
    aCdTipoCaricoScarico VARCHAR2,
    aUtente VARCHAR2,
    isDaFattura CHAR DEFAULT 'N',
    ti_fattura CHAR,
    aDtRegistrazione DATE,
    aMessaggio IN OUT VARCHAR2
   ) IS

   pg_inv NUMBER;
   cont INTEGER;
   aStatoCoge CHAR(1);
   eseguiLock CHAR(1);
   aMessaggioBase VARCHAR2(100);
   aMessaggioBaseSegnala VARCHAR2(500);
   aMessaggioDettSegnala VARCHAR2(3900);
   DaFattura CHAR(1);
   aBuonoCaricoScarico BUONO_CARICO_SCARICO%ROWTYPE;
   aBuonoCaricoScaricoDett BUONO_CARICO_SCARICO_DETT%ROWTYPE;
   aAssInvBeneFattura ASS_INV_BENE_FATTURA%ROWTYPE;
   aRecInventarioBeni INVENTARIO_BENI%ROWTYPE;
   tot_quote_storno NUMBER(17,2):=0;
   progressivo_riga NUMBER:=0;
   PERC_AMMORTAMENTO        NUMBER(5,2):=0;
   NUMERO_ANNI              NUMBER(4):=0;
   NUMERO_ANNO              NUMBER(4):=0;
   PERC_PRIMO_ANNO          NUMBER(5,2):=0;
   PERC_SUCCESSIVI          NUMBER(5,2):=0;
   CD_TIPO		    VARCHAR2(10);
   TI_AMM 	            CHAR(1);
   conta 		    number:=0;
   fl_storno       	    CHAR(1);
   fl_vendita       	    CHAR(1);
   fl_chiude_fondo 	    CHAR(1);
   tot_carichi_anno NUMBER(17,2):=0;
   aAmmBInv AMMORTAMENTO_BENE_INV%rowtype;
BEGIN

   eseguiLock:='Y';

   -------------------------------------------------------------------------------------------------
   -- Valorizzazione messaggi da esporre in output

   aMessaggioBase:='Operazione completata con successo. ';
   aMessaggioBaseSegnala:='Attenzione, per i seguenti beni non è stato modificato automaticamente ' ||
                          'l''imponibile ammortamento in quanto non risulta allineato al suo valore assestato, ' ||
                          'procedere manualmente.';
   aMessaggioDettSegnala:=NULL;

   -------------------------------------------------------------------------------------------------
   -- Inserimento testata BUONO_CARICO_SCARICO (TIPO = scarico)

   aBuonoCaricoScarico:=NULL;

   aBuonoCaricoScarico.pg_inventario:=aPgInventario;
   aBuonoCaricoScarico.ti_documento:=BUONO_SCARICO;
   aBuonoCaricoScarico.esercizio:=aEsercizio;
   aBuonoCaricoScarico.pg_buono_c_s:=aPgBuonoCaricoScarico;
   aBuonoCaricoScarico.ds_buono_carico_scarico:=aDsBuonoCaricoScarico;
   aBuonoCaricoScarico.data_registrazione:=aDtRegistrazione;
   aBuonoCaricoScarico.cd_tipo_carico_scarico:=aCdTipoCaricoScarico;
   aBuonoCaricoScarico.dacr:=SYSDATE;
   aBuonoCaricoScarico.utcr:=aUtente;
   aBuonoCaricoScarico.duva:=SYSDATE;
   aBuonoCaricoScarico.utuv:=aUtente;
   aBuonoCaricoScarico.pg_ver_rec:=1;

   insBuonoCaricoScarico(aBuonoCaricoScarico);

   -------------------------------------------------------------------------------------------------
   -- Ciclo inserimento dettaglio BUONO_CARICO_SCARICO_DETT e ASS_INV_BENE_FATTURA

   cont :=0;

   BEGIN


      FOR riga_group_invetario_beni_apg IN
          (SELECT PG_INVENTARIO, NR_INVENTARIO, PROGRESSIVO, FL_TOTALMENTE_SCARICATO,
                  VARIAZIONE_MENO, SUM(VALORE_ALIENAZIONE) tot_alienazione
           FROM   INVENTARIO_BENI_APG
           WHERE  TRIM(LOCAL_TRANSACTION_ID) = TRIM (localTransId)
           GROUP BY PG_INVENTARIO, NR_INVENTARIO, PROGRESSIVO, FL_TOTALMENTE_SCARICATO, VARIAZIONE_MENO)

      Loop
      tot_quote_storno:=0;
       -- Lettura del bene per verificare se aggiornare o meno il campo imponibile_ammortamento
         aRecInventarioBeni:=getInventarioBeni(riga_group_invetario_beni_apg.pg_inventario,
                                                  riga_group_invetario_beni_apg.nr_inventario,
                                                  riga_group_invetario_beni_apg.progressivo,
                                                  eseguiLock);

         cont := cont+1;

         -- inserimento su tabella BUONO_CARICO_SCARICO_DETT ---------------------------------------

         Begin
          Select fl_fatturabile,fl_storno_fondo,fl_chiude_fondo,FL_VENDITA Into DaFattura,fl_storno,fl_chiude_fondo,FL_VENDITA
          From tipo_carico_scarico
          Where
            	cd_tipo_carico_scarico =aCdTipoCaricoScarico;
	  If DaFattura = 'Y' Then
	   	aStatoCoge:='X';
	  Else
            If (isDaFattura='N' AND riga_group_invetario_beni_apg.FL_TOTALMENTE_SCARICATO='Y') Then
               -- r.p. 17/02/2006 recupero stato coge dalla tabella corrispondente
            	Begin
            		Select FL_ELABORA_BUONO_COGE Into aStatoCoge
            		From tipo_carico_scarico
            		Where
            	  	cd_tipo_carico_scarico =aCdTipoCaricoScarico;
            	EXCEPTION When Others Then
               		aStatoCoge:='N';
               	end;
            Else
             	aStatoCoge:='N';
            End  If;
          End If;


            aBuonoCaricoScaricoDett:=NULL;

            aBuonoCaricoScaricoDett.pg_inventario:=aPgInventario;
            aBuonoCaricoScaricoDett.ti_documento:=BUONO_SCARICO;
            aBuonoCaricoScaricoDett.esercizio:=aEsercizio;
            aBuonoCaricoScaricoDett.pg_buono_c_s:=aPgBuonoCaricoScarico;
            aBuonoCaricoScaricoDett.nr_inventario:=riga_group_invetario_beni_apg.NR_INVENTARIO;
            aBuonoCaricoScaricoDett.progressivo:=riga_group_invetario_beni_apg.PROGRESSIVO;
            aBuonoCaricoScaricoDett.intervallo:=cont || '-' || cont;
            aBuonoCaricoScaricoDett.quantita:=1;
            aBuonoCaricoScaricoDett.valore_unitario:=riga_group_invetario_beni_apg.VARIAZIONE_MENO;
            aBuonoCaricoScaricoDett.dacr:=SYSDATE;
            aBuonoCaricoScaricoDett.utcr:=aUtente;
            aBuonoCaricoScaricoDett.duva:=SYSDATE;
            aBuonoCaricoScaricoDett.utuv:=aUtente;
            aBuonoCaricoScaricoDett.pg_ver_rec:=1;
            aBuonoCaricoScaricoDett.stato_coge:=aStatoCoge;
	    If ((fl_chiude_fondo='Y' And aRecInventarioBeni.valore_ammortizzato!=0) Or
	    (fl_chiude_fondo='N' And FL_VENDITA = 'N' And aStatoCoge='X' And riga_group_invetario_beni_apg.FL_TOTALMENTE_SCARICATO='Y' And aRecInventarioBeni.valore_ammortizzato!=0)) Then
	    	aBuonoCaricoScaricoDett.stato_coge_quote:='N';
	    Else
	    	aBuonoCaricoScaricoDett.stato_coge_quote:='X';
	    End If;
            insBuonoCaricoScaricoDett(aBuonoCaricoScaricoDett);

         END;

         -- inserimento su tabella ASS_INV_BENE_FATTURA --------------------------------------------

         BEGIN

            IF isDaFattura ='Y' And ti_fattura = 'F' THEN

               FOR riga_invetario_beni_apg IN
                    (SELECT *
                     FROM   INVENTARIO_BENI_APG
                     where  TRIM(LOCAL_TRANSACTION_ID) =TRIM(localTransId)
                        and PG_INVENTARIO = riga_group_invetario_beni_apg.PG_INVENTARIO
                        and NR_INVENTARIO = riga_group_invetario_beni_apg.NR_INVENTARIO
                        and PROGRESSIVO = riga_group_invetario_beni_apg.PROGRESSIVO)

               LOOP
		  Select NVL(Max(PG_RIGA)+1,1) into progressivo_riga
                  FROM   ass_inv_bene_fattura;


                  aAssInvBeneFattura:=NULL;

                  aAssInvBeneFattura.cd_cds_fatt_att:=riga_invetario_beni_apg.CD_CDS;
                  aAssInvBeneFattura.cd_uo_fatt_att:=riga_invetario_beni_apg.CD_UNITA_ORGANIZZATIVA;
                  aAssInvBeneFattura.esercizio_fatt_att:=riga_invetario_beni_apg.ESERCIZIO;
                  aAssInvBeneFattura.pg_fattura_attiva:=riga_invetario_beni_apg.PG_FATTURA;
                  aAssInvBeneFattura.progressivo_riga_fatt_att:=riga_invetario_beni_apg.PROGRESSIVO_RIGA;
                  aAssInvBeneFattura.pg_inventario:=riga_invetario_beni_apg.PG_INVENTARIO;
                  aAssInvBeneFattura.nr_inventario:=riga_invetario_beni_apg.NR_INVENTARIO;
                  aAssInvBeneFattura.progressivo:=riga_invetario_beni_apg.PROGRESSIVO;
                  aAssInvBeneFattura.dacr:=SYSDATE;
                  aAssInvBeneFattura.utcr:=aUtente;
                  aAssInvBeneFattura.duva:=SYSDATE;
                  aAssInvBeneFattura.utuv:=aUtente;
                  aAssInvBeneFattura.pg_ver_rec:=1;
		  aAssInvBeneFattura.pg_riga:=progressivo_riga;
		  aAssInvBeneFattura.ESERCIZIO:=riga_invetario_beni_apg.ESERCIZIO;
		  aAssInvBeneFattura.PG_BUONO_C_S:=aPgBuonoCaricoScarico;
		  aAssInvBeneFattura.TI_DOCUMENTO:=riga_invetario_beni_apg.TI_DOCUMENTO;
                  insAssInvBeneFattura(aAssInvBeneFattura);

               END LOOP;
            Elsif (isDaFattura ='Y' And ti_fattura = 'D' ) THEN

               FOR riga_invetario_beni_apg IN
                    (SELECT *
                     FROM   INVENTARIO_BENI_APG
                     where  TRIM(LOCAL_TRANSACTION_ID) =TRIM(localTransId)
                        and PG_INVENTARIO = riga_group_invetario_beni_apg.PG_INVENTARIO
                        and NR_INVENTARIO = riga_group_invetario_beni_apg.NR_INVENTARIO
                        and PROGRESSIVO = riga_group_invetario_beni_apg.PROGRESSIVO)

               LOOP
		  Select NVL(Max(PG_RIGA)+1,1) into progressivo_riga
                  FROM   ass_inv_bene_fattura;


                  aAssInvBeneFattura:=NULL;

                  aAssInvBeneFattura.cd_cds_doc_gen:=riga_invetario_beni_apg.CD_CDS;
                  aAssInvBeneFattura.cd_uo_doc_gen:=riga_invetario_beni_apg.CD_UNITA_ORGANIZZATIVA;
                  aAssInvBeneFattura.esercizio_doc_gen:=riga_invetario_beni_apg.ESERCIZIO;
                  aAssInvBeneFattura.pg_documento_generico:=riga_invetario_beni_apg.PG_FATTURA;
                  aAssInvBeneFattura.progressivo_riga_doc_gen:=riga_invetario_beni_apg.PROGRESSIVO_RIGA;
                  aAssInvBeneFattura.cd_tipo_documento_amm:=riga_invetario_beni_apg.cd_tipo_documento_amm;
                  aAssInvBeneFattura.pg_inventario:=riga_invetario_beni_apg.PG_INVENTARIO;
                  aAssInvBeneFattura.nr_inventario:=riga_invetario_beni_apg.NR_INVENTARIO;
                  aAssInvBeneFattura.progressivo:=riga_invetario_beni_apg.PROGRESSIVO;
                  aAssInvBeneFattura.dacr:=SYSDATE;
                  aAssInvBeneFattura.utcr:=aUtente;
                  aAssInvBeneFattura.duva:=SYSDATE;
                  aAssInvBeneFattura.utuv:=aUtente;
                  aAssInvBeneFattura.pg_ver_rec:=1;
		  aAssInvBeneFattura.pg_riga:=progressivo_riga;
		  aAssInvBeneFattura.ESERCIZIO:=riga_invetario_beni_apg.ESERCIZIO;
		  aAssInvBeneFattura.PG_BUONO_C_S:=aPgBuonoCaricoScarico;
		  aAssInvBeneFattura.TI_DOCUMENTO:=riga_invetario_beni_apg.TI_DOCUMENTO;
                  insAssInvBeneFattura(aAssInvBeneFattura);

               END LOOP;
	    Elsif (isDaFattura ='Y' And ti_fattura != 'F' ) THEN

               FOR riga_invetario_beni_apg IN
                    (SELECT *
                     FROM   INVENTARIO_BENI_APG
                     where  TRIM(LOCAL_TRANSACTION_ID) =TRIM(localTransId)
                        and PG_INVENTARIO = riga_group_invetario_beni_apg.PG_INVENTARIO
                        and NR_INVENTARIO = riga_group_invetario_beni_apg.NR_INVENTARIO
                        and PROGRESSIVO = riga_group_invetario_beni_apg.PROGRESSIVO)

               LOOP
		  Select NVL(Max(PG_RIGA)+1,1) into progressivo_riga
                  FROM   ass_inv_bene_fattura;


                  aAssInvBeneFattura:=NULL;

                  aAssInvBeneFattura.cd_cds_fatt_PASS:=riga_invetario_beni_apg.CD_CDS;
                  aAssInvBeneFattura.cd_uo_fatt_PASS:=riga_invetario_beni_apg.CD_UNITA_ORGANIZZATIVA;
                  aAssInvBeneFattura.esercizio_fatt_PASS:=riga_invetario_beni_apg.ESERCIZIO;
                  aAssInvBeneFattura.pg_fattura_PASSIVA:=riga_invetario_beni_apg.PG_FATTURA;
                  aAssInvBeneFattura.progressivo_riga_fatt_PASS:=riga_invetario_beni_apg.PROGRESSIVO_RIGA;
                  aAssInvBeneFattura.pg_inventario:=riga_invetario_beni_apg.PG_INVENTARIO;
                  aAssInvBeneFattura.nr_inventario:=riga_invetario_beni_apg.NR_INVENTARIO;
                  aAssInvBeneFattura.progressivo:=riga_invetario_beni_apg.PROGRESSIVO;
                  aAssInvBeneFattura.dacr:=SYSDATE;
                  aAssInvBeneFattura.utcr:=aUtente;
                  aAssInvBeneFattura.duva:=SYSDATE;
                  aAssInvBeneFattura.utuv:=aUtente;
                  aAssInvBeneFattura.pg_ver_rec:=1;
		  aAssInvBeneFattura.pg_riga:=progressivo_riga;
		  aAssInvBeneFattura.ESERCIZIO:=riga_invetario_beni_apg.ESERCIZIO;
		  aAssInvBeneFattura.PG_BUONO_C_S:=aPgBuonoCaricoScarico;
		  aAssInvBeneFattura.TI_DOCUMENTO:=riga_invetario_beni_apg.TI_DOCUMENTO;
                  insAssInvBeneFattura(aAssInvBeneFattura);

               END LOOP;
            END IF;
         END;
         -- Aggiornamento INVENTARIO_BENI ----------------------------------------------------------

         BEGIN

            -- Lettura del bene per verificare se aggiornare o meno il campo imponibile_ammortamento

            aRecInventarioBeni:=getInventarioBeni(riga_group_invetario_beni_apg.pg_inventario,
                                                  riga_group_invetario_beni_apg.nr_inventario,
                                                  riga_group_invetario_beni_apg.progressivo,
                                                  eseguiLock);

            IF (aRecInventarioBeni.imponibile_ammortamento = aRecInventarioBeni.valore_iniziale +
                                                            aRecInventarioBeni.variazione_piu -
                                                            aRecInventarioBeni.variazione_meno) Then
                 -- inserimento gestione quote di storno

		if (riga_group_invetario_beni_apg.FL_TOTALMENTE_SCARICATO!='Y' And (aRecInventarioBeni.valore_ammortizzato!=0) And (aRecInventarioBeni.valore_ammortizzato!=(aRecInventarioBeni.valore_iniziale +
                                                            aRecInventarioBeni.variazione_piu -
                                                            aRecInventarioBeni.variazione_meno -
                                                            riga_group_invetario_beni_apg.variazione_meno)) And
                                                            fl_storno ='Y' )Then
			-- controllo che i carichi dell'anno siano inferiori allo scarico che si vuole inserire
			select Nvl(Sum(Nvl(valore_unitario,0)),0) Into tot_carichi_anno
			From buono_carico_scarico_dett dett,tipo_carico_scarico tipo,buono_Carico_Scarico buono
			where
			 dett.esercizio     = aEsercizio And
			 dett.ti_documento  = 'C' And
			 dett.pg_inventario = buono.pg_inventario And
			 dett.esercizio = buono.esercizio And
			 dett.ti_documento = buono.ti_documento And
			 dett.pg_buono_c_s = buono.pg_buono_c_s And
			 tipo.cd_tipo_carico_scarico = buono.cd_tipo_carico_scarico And
			 tipo.FL_BUONO_PER_TRASFERIMENTO ='N' And
			 dett.pg_inventario = aRecInventarioBeni.pg_inventario AND
	                 dett.nr_inventario = aRecInventarioBeni.nr_inventario AND
	                 dett.progressivo   = aRecInventarioBeni.progressivo;
	                 If(tot_carichi_anno < riga_group_invetario_beni_apg.VARIAZIONE_MENO )Then
		   		tot_quote_storno:=(aRecInventarioBeni.valore_ammortizzato*(riga_group_invetario_beni_apg.variazione_meno*100/(aRecInventarioBeni.valore_iniziale +
                                                            aRecInventarioBeni.variazione_piu -
                                                            aRecInventarioBeni.variazione_meno)))/100;
		 		/*Elsif ((aRecInventarioBeni.valore_ammortizzato!=0) And (aRecInventarioBeni.valore_ammortizzato=(aRecInventarioBeni.valore_iniziale +
                                                            aRecInventarioBeni.variazione_piu -
                                                            aRecInventarioBeni.variazione_meno  -
                                                            riga_group_invetario_beni_apg.variazione_meno)))Then
				tot_quote_storno:=riga_group_invetario_beni_apg.variazione_meno;
				*/
			end If;
		 End If;
		 If (TOT_QUOTE_STORNO!=0) Then
		 	Select NVL(Max(PG_RIGA)+1,1) into progressivo_riga
                        FROM   AMMORTAMENTO_BENE_INV
                        WHERE  pg_inventario = riga_group_invetario_beni_apg.pg_inventario AND
                               nr_inventario = riga_group_invetario_beni_apg.nr_inventario AND
                               progressivo = riga_group_invetario_beni_apg.progressivo and
                               esercizio = aEsercizio;
                        Begin
       		  	Select PERC_AMMORTAMENTO,NUMERO_ANNI,NUMERO_ANNO,PERC_PRIMO_ANNO,PERC_SUCCESSIVI,CD_TIPO_AMMORTAMENTO,TI_AMMORTAMENTO
			  Into PERC_AMMORTAMENTO,NUMERO_ANNI,NUMERO_ANNO,PERC_PRIMO_ANNO,PERC_SUCCESSIVI,CD_TIPO,TI_AMM
			  From AMMORTAMENTO_BENE_INV
			  Where
			  	pg_inventario = riga_group_invetario_beni_apg.pg_inventario AND
                                nr_inventario = riga_group_invetario_beni_apg.nr_inventario AND
                                progressivo = riga_group_invetario_beni_apg.progressivo and
                                esercizio < aEsercizio    And
                                Rownum =1;
                           Exception When No_Data_Found Then
                           Begin
                          	 Select PERC_AMMORTAMENTO,NUMERO_ANNI,NUMERO_ANNO,PERC_PRIMO_ANNO,PERC_SUCCESSIVI,CD_TIPO_AMMORTAMENTO,TI_AMMORTAMENTO
			  	Into PERC_AMMORTAMENTO,NUMERO_ANNI,NUMERO_ANNO,PERC_PRIMO_ANNO,PERC_SUCCESSIVI,CD_TIPO,TI_AMM
			  	From AMMORTAMENTO_BENE_INV,ASS_TRASFERIMENTO_BENI_INV trasf
			  	Where
			  	pg_inventario_DEST = riga_group_invetario_beni_apg.pg_inventario AND
                                nr_inventario_DEST = riga_group_invetario_beni_apg.nr_inventario AND
                                progressivo_DEST   = riga_group_invetario_beni_apg.progressivo And
                                pg_inventario      = pg_inventario_origine AND
                                nr_inventario      = nr_inventario_origine AND
                                progressivo        = progressivo_origine And
                                esercizio      < aEsercizio    And
                                Rownum =1;
                                Exception When No_Data_Found Then
                                     Select PERC_PRIMO_ANNO,NUMERO_ANNI,1,PERC_PRIMO_ANNO,PERC_SUCCESSIVI,CD_TIPO_AMMORTAMENTO,TI_AMMORTAMENTO
                                     Into PERC_AMMORTAMENTO,NUMERO_ANNI,NUMERO_ANNO,PERC_PRIMO_ANNO,PERC_SUCCESSIVI,CD_TIPO,TI_AMM
                                     From tipo_ammortamento
                                     Where
                                     cd_tipo_ammortamento =Substr(aRecInventarioBeni.cd_categoria_gruppo,1,1);
                                End;
                           End;
                            -- caso per cui non sono state create le associazioni tipo ammortamento per l'anno di scarico
                            Select Count(*) Into conta
                            From ASS_TIPO_AMM_CAT_GRUP_INV
                            Where
                              cd_tipo_ammortamento = cd_tipo And
                              ti_ammortamento      = ti_amm  And
                              esercizio_competenza = aEsercizio And
                              cd_categoria_gruppo  = aRecInventarioBeni.CD_CATEGORIA_GRUPPO;
                             If  conta = 0 Then
                               INSERT INTO ASS_TIPO_AMM_CAT_GRUP_INV(CD_TIPO_AMMORTAMENTO,TI_AMMORTAMENTO,CD_CATEGORIA_GRUPPO,
						 ESERCIZIO_COMPETENZA,DT_CANCELLAZIONE,UTCR,DACR,
						 UTUV,DUVA,PG_VER_REC)
						 Values
						 (substr(aRecInventarioBeni.CD_CATEGORIA_GRUPPO,1,1),ti_amm,aRecInventarioBeni.CD_CATEGORIA_GRUPPO,
						 aEsercizio, Null,'System',Sysdate,'System',Sysdate,1);
			    End If;
                           aAmmBInv.PG_INVENTARIO:= riga_group_invetario_beni_apg.pg_inventario;
                           aAmmBInv.NR_INVENTARIO:= riga_group_invetario_beni_apg.NR_inventario;
                           aAmmBInv.PROGRESSIVO:= riga_group_invetario_beni_apg.PROGRESSIVO;
                           aAmmBInv.ESERCIZIO:=aEsercizio;
                           aAmmBInv.CD_TIPO_AMMORTAMENTO:=CD_TIPO;
                           aAmmBInv.TI_AMMORTAMENTO:=TI_AMM;
                           aAmmBInv.CD_CATEGORIA_GRUPPO:=aRecInventarioBeni.CD_CATEGORIA_GRUPPO;
                           aAmmBInv.ESERCIZIO_COMPETENZA:=aEsercizio;
                           aAmmBInv.IMPONIBILE_AMMORTAMENTO:=(aRecInventarioBeni.imponibile_ammortamento - riga_group_invetario_beni_apg.variazione_meno);
                           aAmmBInv.IM_MOVIMENTO_AMMORT:=-TOT_QUOTE_STORNO;
                           aAmmBInv.PERC_AMMORTAMENTO:=PERC_AMMORTAMENTO;
                           aAmmBInv.DACR:=Sysdate;
                           aAmmBInv.UTCR:=aUtente;
                           aAmmBInv.DUVA:=Sysdate;
                           aAmmBInv.UTUV:=aUtente;
                           aAmmBInv.PG_VER_REC:=1;
                           aAmmBInv.NUMERO_ANNI:=NUMERO_ANNI;
                           aAmmBInv.NUMERO_ANNO:=NUMERO_ANNO;
                           aAmmBInv.PERC_PRIMO_ANNO:=PERC_PRIMO_ANNO;
                           aAmmBInv.PERC_SUCCESSIVI:=PERC_SUCCESSIVI;
                           aAmmBInv.CD_CDS_UBICAZIONE:=aRecInventarioBeni.CD_CDS;
                           aAmmBInv.CD_UO_UBICAZIONE:=aRecInventarioBeni.CD_UNITA_ORGANIZZATIVA;
                           aAmmBInv.FL_STORNO:='Y';
                           aAmmBInv.PG_RIGA:=PROGRESSIVO_RIGA;
                           aAmmBInv.PG_BUONO_S:=aPgBuonoCaricoScarico;

			  ins_AMMORTAMENTO_BENE_INV(aAmmBInv);
		 End If;

               UPDATE INVENTARIO_BENI
               SET    valore_ammortizzato = valore_ammortizzato - tot_quote_storno,
               	      variazione_meno = variazione_meno + riga_group_invetario_beni_apg.variazione_meno,
                      imponibile_ammortamento = imponibile_ammortamento - riga_group_invetario_beni_apg.variazione_meno,
                      valore_alienazione = riga_group_invetario_beni_apg.tot_alienazione,
                      fl_totalmente_scaricato = riga_group_invetario_beni_apg.fl_totalmente_scaricato,
                      dt_validita_variazione = aDtRegistrazione,
                      duva = SYSDATE,
                      utuv = aUtente,
                      pg_ver_rec = pg_ver_rec + 1
               WHERE  pg_inventario= riga_group_invetario_beni_apg.pg_inventario AND
                      nr_inventario= riga_group_invetario_beni_apg.nr_inventario AND
                      progressivo = riga_group_invetario_beni_apg.progressivo;

            ELSE

               UPDATE INVENTARIO_BENI
               SET    variazione_meno = variazione_meno + riga_group_invetario_beni_apg.VARIAZIONE_MENO,
                      valore_alienazione = riga_group_invetario_beni_apg.TOT_ALIENAZIONE,
                      fl_totalmente_scaricato = riga_group_invetario_beni_apg.FL_TOTALMENTE_SCARICATO,
                      dt_validita_variazione = aDtRegistrazione,
                      duva = SYSDATE,
                      utuv = aUtente,
                      pg_ver_rec = pg_ver_rec + 1
               WHERE  pg_inventario= riga_group_invetario_beni_apg.pg_inventario AND
                      nr_inventario= riga_group_invetario_beni_apg.nr_inventario AND
                      progressivo = riga_group_invetario_beni_apg.progressivo;
                 -- r.p. 13/02/2006 da verificare per segnalare i beni per cui non è stato possibile
                 -- aggiornare l'imponibile ammortamento
                 -- r.p. 7/09/2006 che non abbiano già completato l'ammortamento
	      If  aRecInventarioBeni.fl_ammortamento = 'Y' And aRecInventarioBeni.imponibile_ammortamento!=0  Then
               IF aMessaggioDettSegnala IS NULL THEN
                  aMessaggioDettSegnala:='Bene: ' || riga_group_invetario_beni_apg.pg_inventario || '-' ||
                                         riga_group_invetario_beni_apg.nr_inventario || '-' ||
                                         riga_group_invetario_beni_apg.progressivo || CHR(10);
               ELSE
                  aMessaggioDettSegnala:=aMessaggioDettSegnala ||
                                         'Bene: ' || riga_group_invetario_beni_apg.pg_inventario || '-' ||
                                         riga_group_invetario_beni_apg.nr_inventario || '-' ||
                                         riga_group_invetario_beni_apg.progressivo || CHR(10);

               END IF;
	    End If;
            END IF;

         END;

      END LOOP;

   END;

   -- Cancellazione della tabella di appoggio

   cancellaInventarioBeniApg(localTransId);

   -- Composizione del messaggio

   IF aMessaggioDettSegnala IS NULL THEN
      aMessaggio:=aMessaggioBase;
   ELSE
      aMessaggio:=SUBSTR(aMessaggioBase || CHR(10) || aMessaggioBaseSegnala || CHR(10) || aMessaggioDettSegnala, 1, 3900);
   END IF;

END UpdScaricoInventarioBeni;

-- =================================================================================================
-- Crea un documento di carico di inventario, con i relativi dettagli e le eventuali associazioni
-- con le fatture di acquisto.
-- =================================================================================================
PROCEDURE updCaricoBeniAumentoValFtPas
   (
    localTransId VARCHAR2,
    aPgInventario NUMBER,
    aEsercizio NUMBER,
    aPgBuonoCaricoScarico NUMBER,
    aDsBuonoCaricoScarico VARCHAR2,
    aCdTipoCaricoScarico VARCHAR2,
    aPgFattura number,
    aUtente VARCHAR2,
    aDtRegistrazione DATE,
    aMessaggio IN OUT VARCHAR2
   ) IS

   pg_inv NUMBER;
   cont INTEGER;
   aStatoCoge CHAR(1);
   eseguiLock CHAR(1);
   aMessaggioBase VARCHAR2(100);
   aMessaggioBaseSegnala VARCHAR2(500);
   aMessaggioDettSegnala VARCHAR2(3900);

   aBuonoCaricoScarico BUONO_CARICO_SCARICO%ROWTYPE;
   aBuonoCaricoScaricoDett BUONO_CARICO_SCARICO_DETT%ROWTYPE;
   aAssInvBeneFattura ASS_INV_BENE_FATTURA%ROWTYPE;
   aRecInventarioBeni INVENTARIO_BENI%ROWTYPE;
   progressivo_riga number:=0;
BEGIN

   eseguiLock:='Y';

   -------------------------------------------------------------------------------------------------
   -- Valorizzazione messaggi da esporre in output

   aMessaggioBase:='Operazione completata con successo. ';
   aMessaggioBaseSegnala:='Attenzione, per i seguenti beni non è stato modificato automaticamente ' ||
                          'l''imponibile ammortamento in quanto non risulta allineato al suo valore assestato, ' ||
                          'procedere manualmente.';
   aMessaggioDettSegnala:=NULL;

   -------------------------------------------------------------------------------------------------
   -- Inserimento testata BUONO_CARICO_SCARICO (TIPO = carico)

   aBuonoCaricoScarico:=NULL;

   aBuonoCaricoScarico.pg_inventario:=aPgInventario;
   aBuonoCaricoScarico.ti_documento:=BUONO_CARICO;
   aBuonoCaricoScarico.esercizio:=aEsercizio;
   aBuonoCaricoScarico.pg_buono_c_s:=aPgBuonoCaricoScarico;
   aBuonoCaricoScarico.ds_buono_carico_scarico:=aDsBuonoCaricoScarico;
   aBuonoCaricoScarico.data_registrazione:=aDtRegistrazione;
   aBuonoCaricoScarico.cd_tipo_carico_scarico:=aCdTipoCaricoScarico;
   aBuonoCaricoScarico.dacr:=SYSDATE;
   aBuonoCaricoScarico.utcr:=aUtente;
   aBuonoCaricoScarico.duva:=SYSDATE;
   aBuonoCaricoScarico.utuv:=aUtente;
   aBuonoCaricoScarico.pg_ver_rec:=1;

   insBuonoCaricoScarico(aBuonoCaricoScarico);

   -------------------------------------------------------------------------------------------------
   -- Ciclo inserimento dettaglio BUONO_CARICO_SCARICO_DETT e ASS_INV_BENE_FATTURA

   cont :=0;

   BEGIN

      FOR riga_group_invetario_beni_apg IN
          (SELECT PG_INVENTARIO, NR_INVENTARIO, PROGRESSIVO, SUM(VARIAZIONE_PIU) variazione_piu
           FROM   INVENTARIO_BENI_APG
           WHERE  TRIM(LOCAL_TRANSACTION_ID) = TRIM (localTransId)
               and pg_buono_c_s < 0
           GROUP BY PG_INVENTARIO, NR_INVENTARIO, PROGRESSIVO)

      LOOP

         cont := cont+1;

         -- inserimento su tabella BUONO_CARICO_SCARICO_DETT ---------------------------------------

         BEGIN

            aStatoCoge:='X';

            aBuonoCaricoScaricoDett:=NULL;

            aBuonoCaricoScaricoDett.pg_inventario:=aPgInventario;
            aBuonoCaricoScaricoDett.ti_documento:=BUONO_CARICO;
            aBuonoCaricoScaricoDett.esercizio:=aEsercizio;
            aBuonoCaricoScaricoDett.pg_buono_c_s:=aPgBuonoCaricoScarico;
            aBuonoCaricoScaricoDett.nr_inventario:=riga_group_invetario_beni_apg.NR_INVENTARIO;
            aBuonoCaricoScaricoDett.progressivo:=riga_group_invetario_beni_apg.PROGRESSIVO;
            aBuonoCaricoScaricoDett.intervallo:=cont || '-' || cont;
            aBuonoCaricoScaricoDett.quantita:=1;
            aBuonoCaricoScaricoDett.valore_unitario:=riga_group_invetario_beni_apg.VARIAZIONE_PIU;
            aBuonoCaricoScaricoDett.dacr:=SYSDATE;
            aBuonoCaricoScaricoDett.utcr:=aUtente;
            aBuonoCaricoScaricoDett.duva:=SYSDATE;
            aBuonoCaricoScaricoDett.utuv:=aUtente;
            aBuonoCaricoScaricoDett.pg_ver_rec:=1;
            aBuonoCaricoScaricoDett.stato_coge:=aStatoCoge;
	    aBuonoCaricoScaricoDett.stato_coge_quote:='X';
            insBuonoCaricoScaricoDett(aBuonoCaricoScaricoDett);

         END;

         -- inserimento su tabella ASS_INV_BENE_FATTURA --------------------------------------------

         BEGIN

            FOR riga_invetario_beni_apg IN
                    (SELECT *
                     FROM   INVENTARIO_BENI_APG
                     where  TRIM(LOCAL_TRANSACTION_ID) =TRIM(localTransId)
                        and pg_buono_c_s < 0
                        and PG_INVENTARIO = riga_group_invetario_beni_apg.PG_INVENTARIO
                        and NR_INVENTARIO = riga_group_invetario_beni_apg.NR_INVENTARIO
                        and PROGRESSIVO = riga_group_invetario_beni_apg.PROGRESSIVO)

               LOOP
		Select NVL(Max(PG_RIGA)+1,1) into progressivo_riga
                FROM   ass_inv_bene_fattura;
                  aAssInvBeneFattura:=NULL;

                  aAssInvBeneFattura.cd_cds_fatt_pass:=riga_invetario_beni_apg.CD_CDS;
                  aAssInvBeneFattura.cd_uo_fatt_pass:=riga_invetario_beni_apg.CD_UNITA_ORGANIZZATIVA;
                  aAssInvBeneFattura.esercizio_fatt_pass:=riga_invetario_beni_apg.ESERCIZIO;
                  aAssInvBeneFattura.pg_fattura_passiva:=aPgFattura;
                  aAssInvBeneFattura.progressivo_riga_fatt_pass:=riga_invetario_beni_apg.PROGRESSIVO_RIGA;
                  aAssInvBeneFattura.pg_inventario:=riga_invetario_beni_apg.PG_INVENTARIO;
                  aAssInvBeneFattura.nr_inventario:=riga_invetario_beni_apg.NR_INVENTARIO;
                  aAssInvBeneFattura.progressivo:=riga_invetario_beni_apg.PROGRESSIVO;
                  aAssInvBeneFattura.dacr:=SYSDATE;
                  aAssInvBeneFattura.utcr:=aUtente;
                  aAssInvBeneFattura.duva:=SYSDATE;
                  aAssInvBeneFattura.utuv:=aUtente;
                  aAssInvBeneFattura.pg_ver_rec:=1;
		  aAssInvBeneFattura.pg_riga:=progressivo_riga;
		  aAssInvBeneFattura.ESERCIZIO:=riga_invetario_beni_apg.ESERCIZIO;
		  aAssInvBeneFattura.PG_BUONO_C_S:=aPgBuonoCaricoScarico;
		  aAssInvBeneFattura.TI_DOCUMENTO:=riga_invetario_beni_apg.TI_DOCUMENTO;

                  insAssInvBeneFattura(aAssInvBeneFattura);

               END LOOP;

         END;

         -- Aggiornamento INVENTARIO_BENI ----------------------------------------------------------

         BEGIN

            -- Lettura del bene per verificare se aggiornare o meno il campo imponibile_ammortamento

            aRecInventarioBeni:=getInventarioBeni(riga_group_invetario_beni_apg.pg_inventario,
                                                  riga_group_invetario_beni_apg.nr_inventario,
                                                  riga_group_invetario_beni_apg.progressivo,
                                                  eseguiLock);

            IF (aRecInventarioBeni.imponibile_ammortamento = aRecInventarioBeni.valore_iniziale +
                                                             aRecInventarioBeni.variazione_piu -
                                                             aRecInventarioBeni.variazione_meno) THEN

               UPDATE INVENTARIO_BENI
               SET    variazione_piu = variazione_piu + riga_group_invetario_beni_apg.variazione_piu,
                      imponibile_ammortamento = imponibile_ammortamento + riga_group_invetario_beni_apg.variazione_piu,
                      dt_validita_variazione = aDtRegistrazione,
                      duva = SYSDATE,
                      utuv = aUtente,
                      pg_ver_rec = pg_ver_rec + 1
               WHERE  pg_inventario= riga_group_invetario_beni_apg.pg_inventario AND
                      nr_inventario= riga_group_invetario_beni_apg.nr_inventario AND
                      progressivo = riga_group_invetario_beni_apg.progressivo;
            ELSE

               UPDATE INVENTARIO_BENI
               SET    variazione_piu = variazione_piu + riga_group_invetario_beni_apg.variazione_piu,
                      dt_validita_variazione = aDtRegistrazione,
                      duva = SYSDATE,
                      utuv = aUtente,
                      pg_ver_rec = pg_ver_rec + 1
               WHERE  pg_inventario= riga_group_invetario_beni_apg.pg_inventario AND
                      nr_inventario= riga_group_invetario_beni_apg.nr_inventario AND
                      progressivo = riga_group_invetario_beni_apg.progressivo;
                      -- r.p. 13/02/2006 da verificare per segnalare i beni per cui non è stato possibile
                      -- aggiornare l'ammortamento
		if aRecInventarioBeni.fl_ammortamento = 'Y' Then
               		IF aMessaggioDettSegnala IS NULL THEN
                  		aMessaggioDettSegnala:='Bene: ' || riga_group_invetario_beni_apg.pg_inventario || '-' ||
                                         riga_group_invetario_beni_apg.nr_inventario || '-' ||
                                         riga_group_invetario_beni_apg.progressivo || CHR(10);
               		ELSE
                  		aMessaggioDettSegnala:=aMessaggioDettSegnala ||
                                         'Bene: ' || riga_group_invetario_beni_apg.pg_inventario || '-' ||
                                         riga_group_invetario_beni_apg.nr_inventario || '-' ||
                                         riga_group_invetario_beni_apg.progressivo || CHR(10);
               		END IF;
		end If;
            END IF;

         END;

      END LOOP;

   END;

   -- Cancellazione della tabella di appoggio

   cancellaInventarioBeniApg(localTransId);

   -- Composizione del messaggio

   IF aMessaggioDettSegnala IS NULL THEN
      aMessaggio:=aMessaggioBase;
   ELSE
      aMessaggio:=SUBSTR(aMessaggioBase || CHR(10) || aMessaggioBaseSegnala || CHR(10) || aMessaggioDettSegnala, 1, 3900);
   END IF;

END updCaricoBeniAumentoValFtPas;

-- =================================================================================================
-- Modifica l'associazione tra la categoria di un bene e il tipo di ammortamento
-- =================================================================================================
PROCEDURE updAssTipoAmmCatGruppo
   (
    localTransId VARCHAR2,
    cdTipoAmmortamento VARCHAR2,
    flOrdinario CHAR default 'N',
    flAnticipato CHAR default 'N',
    flAltro CHAR default 'N',
    flRiassociato CHAR default 'N',
    cdTipoRiassociato VARCHAR2,
    flOrdinarioRiassociato CHAR default 'N',
    flAnticipatoRiassociato CHAR default 'N',
    flAltroRiassociato CHAR default 'N',
    aEsercizio NUMBER,
    aUtente VARCHAR2
   ) IS

   cont INTEGER;
   tiTipoAmmortamento CHAR(1);
   flagInserimento BOOLEAN;

BEGIN

   cont:=0;

   -- cancellazione preventiva dei record da aggiornare

   BEGIN

      DELETE ASS_TIPO_AMM_CAT_GRUP_INV
      WHERE  (CD_TIPO_AMMORTAMENTO, CD_CATEGORIA_GRUPPO, ESERCIZIO_COMPETENZA)
             IN (SELECT CD_TIPO_AMMORTAMENTO, CD_CATEGORIA_GRUPPO, ESERCIZIO_COMPETENZA
                 FROM   ASS_TIPO_AMM_CAT_GRUP_INV_APG
                 WHERE  TRIM(LOCAL_TRANSACTION_ID) = TRIM(localTransId));

   END;

   -- inserimento dei record aggiornati

   BEGIN

      FOR riga_ass_ti_amm_cat_grup_apg IN
          (SELECT *
           FROM   ASS_TIPO_AMM_CAT_GRUP_INV_APG
           WHERE  TRIM(LOCAL_TRANSACTION_ID) = TRIM(localTransId))

      LOOP

         FOR cont IN 1 .. 3

         LOOP

            if flOrdinario = 'Y' and cont =1 then
               tiTipoAmmortamento := 'O';
               flagInserimento := TRUE;
            end if;
            if flOrdinario = 'N' and cont =1 then
               tiTipoAmmortamento := 'O';
               flagInserimento := FALSE;
            end if;
            if flAnticipato = 'Y' and cont =2 then
               tiTipoAmmortamento := 'A';
               flagInserimento := TRUE;
            end if;
            if flAnticipato = 'N' and cont =2 then
               tiTipoAmmortamento := 'A';
               flagInserimento := FALSE;
            end if;
            if flAltro = 'Y' and cont =3 then
               tiTipoAmmortamento := 'L';
               flagInserimento := TRUE;
            end if;
            if flAltro = 'N' and cont =3 then
               tiTipoAmmortamento := 'L';
               flagInserimento := FALSE;
            end if;

            if flagInserimento then
               INSERT INTO ASS_TIPO_AMM_CAT_GRUP_INV
                      (CD_TIPO_AMMORTAMENTO, TI_AMMORTAMENTO, CD_CATEGORIA_GRUPPO,
                       ESERCIZIO_COMPETENZA, DT_CANCELLAZIONE,
                       UTCR, DACR, UTUV, DUVA, PG_VER_REC)
               VALUES (cdTipoAmmortamento, tiTipoAmmortamento, riga_ass_ti_amm_cat_grup_apg.CD_CATEGORIA_GRUPPO,
                       aEsercizio, riga_ass_ti_amm_cat_grup_apg.DT_CANCELLAZIONE,
                       aUtente, sysdate, aUtente, sysdate, 1);
            end if;

         END LOOP;

      END LOOP;

   END;

   -- inserimento dei record relativi al tipo riassociato

   BEGIN

      IF flRiassociato = 'Y' THEN

         FOR lCdCategoria IN
             (SELECT distinct CD_CATEGORIA_GRUPPO
              FROM   ASS_TIPO_AMM_CAT_GRUP_INV_APG
              WHERE  TRIM(CD_TIPO_AMMORTAMENTO) =TRIM (cdTipoAmmortamento) AND
                     TRIM(LOCAL_TRANSACTION_ID) =TRIM (localTransId))

         LOOP

            FOR cont IN 1 .. 3

            LOOP

               if flOrdinarioRiassociato = 'Y' and cont =1 then
                  tiTipoAmmortamento := 'O';
                  flagInserimento := TRUE;
               end if;
               if flOrdinarioRiassociato = 'N' and cont =1 then
                  tiTipoAmmortamento := 'O';
                  flagInserimento := FALSE;
               end if;
               if flAnticipatoRiassociato = 'Y' and cont =2 then
                  tiTipoAmmortamento := 'A';
                  flagInserimento := TRUE;
               end if;
               if flAnticipatoRiassociato = 'N' and cont =2 then
                  tiTipoAmmortamento:= 'A';
                  flagInserimento := FALSE;
               end if;
               if flAltroRiassociato = 'Y' and cont =3 then
                  tiTipoAmmortamento:= 'L';
                  flagInserimento  := TRUE;
               end if;
               if flAltroRiassociato = 'N' and cont =3 then
                  tiTipoAmmortamento := 'L';
                  flagInserimento  := FALSE;
               end if;

               IF flagInserimento THEN

                  -- cancellazione preventiva dei record da aggiornare per riassocia

                  delete ASS_TIPO_AMM_CAT_GRUP_INV
                  where  (CD_TIPO_AMMORTAMENTO = cdTipoRiassociato AND
                          TI_AMMORTAMENTO = tiTipoAmmortamento AND
                          CD_CATEGORIA_GRUPPO = lCdCategoria.cd_categoria_gruppo AND
                          ESERCIZIO_COMPETENZA = aEsercizio);

                  INSERT INTO ASS_TIPO_AMM_CAT_GRUP_INV
                         (CD_TIPO_AMMORTAMENTO, TI_AMMORTAMENTO, CD_CATEGORIA_GRUPPO,
                          ESERCIZIO_COMPETENZA, DT_CANCELLAZIONE,
                          UTCR, DACR, UTUV, DUVA, PG_VER_REC)
                  VALUES (cdTipoRiassociato, tiTipoAmmortamento, lCdCategoria.cd_categoria_gruppo,
                          aEsercizio, null, aUtente, sysdate, aUtente, sysdate, 1);

               END IF;

            END LOOP;

         END LOOP;

      END IF;

   END;

   cancellaInventarioBeniApg(localTransId);

END updAssTipoAmmCatGruppo;

-- ====================================== AMMORTAMENTO BENI ========================================

-- =================================================================================================
-- Formatta la descrizione per log errori in ammortamento
-- =================================================================================================
FUNCTION getDesc
   (lRigaAmmBeni V_AMMORTAMENTO_BENI%rowtype) RETURN VARCHAR2 IS
BEGIN
   RETURN 'AMFIN-pg inv.:'||lRigaAmmBeni.PG_INVENTARIO||' nr inv.:'||lRigaAmmBeni.NR_INVENTARIO||
          ' progr.:'||lRigaAmmBeni.PROGRESSIVO;
END getDesc;

-- =================================================================================================
-- Normalizzo il record per escludere quanto movimentato in anni successivi.
-- I beni totalizzano saldi in modo indipendente dagli esercizi mentre l'ammortamento deve operare
-- sul valore definito al 31/12 dell'esercizio di riferimento
-- Si elimina il flag totalmente scaricato se l'azione è avvenuta in esercizi successivi
-- Si assestano i saldi (imponibile ammortamento) togliendo tutto quanto è stato movimentato da buoni
-- di carico e scarico in esercizio successivo. Questa funzione è fatta solo nel caso per i beni per
-- i quali risulta verificata l'uguaglianza valore_iniziale + variazioni più - variazioni meno = imponibile ammortamento
-- =================================================================================================
PROCEDURE upgRecBenePerAmmortamento
   (
    aRecVAmmortamentoBeni IN OUT V_AMMORTAMENTO_BENI%ROWTYPE,
    aEs NUMBER
   ) IS

   aAmmontare           NUMBER(15,2);
   aStorno              NUMBER(15,2);
   aAmmontare_car       NUMBER(15,2);
   aAmmontare_scar      NUMBER(15,2);
BEGIN

   -- Totalizzazione buoni di carico e scarico fatti in esercizio successivo

   SELECT SUM(DECODE(ti_documento, 'C', valore_unitario, (valore_unitario * -1))) INTO aAmmontare
   FROM   BUONO_CARICO_SCARICO_DETT
   WHERE  pg_inventario = aRecVAmmortamentoBeni.pg_inventario AND
          nr_inventario = aRecVAmmortamentoBeni.nr_inventarIO AND
          progressivo = aRecVAmmortamentoBeni.progressivo AND
          esercizio > aEs
   GROUP BY pg_inventario, nr_inventario, progressivo;

-- stani 13.06.2005 divisione tra carichi e scarichi

   SELECT SUM(DECODE(ti_documento, 'C', valore_unitario, 0)),
          SUM(DECODE(ti_documento, 'S', valore_unitario, 0))
   INTO   aAmmontare_car, aAmmontare_scar
   FROM   BUONO_CARICO_SCARICO_DETT
   WHERE  pg_inventario = aRecVAmmortamentoBeni.pg_inventario AND
          nr_inventario = aRecVAmmortamentoBeni.nr_inventarIO AND
          progressivo = aRecVAmmortamentoBeni.progressivo AND
          esercizio > aEs
   GROUP BY pg_inventario, nr_inventario, progressivo;
 -- r.p. 04/07/2006 totalizzatore storni fatti in esercizi successivi
 begin
  SELECT SUM(nvl(im_movimento_ammort,0))
   INTO   aStorno
   FROM   ammortamento_bene_inv
   WHERE  pg_inventario = aRecVAmmortamentoBeni.pg_inventario AND
          nr_inventario = aRecVAmmortamentoBeni.nr_inventarIO AND
          progressivo = aRecVAmmortamentoBeni.progressivo AND
          fl_storno = 'Y' and
          esercizio > aEs
   GROUP BY pg_inventario, nr_inventario, progressivo;
exception when no_data_found then
  aStorno:=0;
end;
   -- Normalizza record per calcolo inventario
   -- Se trovo record in esercizio successivo forzo fl_totalmente_scaricato a NO.
   -- Se l'uguaglianza valore_iniziale + variazioni più - variazioni meno = imponibile ammortamento è
   -- vera allora tolgo a imponibile ammortamento quanto totalizzato in esercizi successivi

   aRecVAmmortamentoBeni.fl_totalmente_scaricato := 'N';

   IF (aRecVAmmortamentoBeni.valore_iniziale + aRecVAmmortamentoBeni.variazione_piu -
       aRecVAmmortamentoBeni.variazione_meno) = aRecVAmmortamentoBeni.imponibile_ammortamento THEN
      aRecVAmmortamentoBeni.imponibile_ammortamento :=
                aRecVAmmortamentoBeni.imponibile_ammortamento - aAmmontare;

-- STANI 13.06.2005 NORMALIZZAZIONE ANCHE DEI CARICHI/SCARICHI ES. SUCCESSIVO
-- I CARICHI/SCARICHI DI ESERCIZIO SUCCESSIVO SONO ESTRATTI IN VALORE ASSOLUTO
-- E QUINDI SEMPRE SOTTRATTI ALL'ATTUALE PER RECUPERARE LA CIFRA PRESENTE ALL'ESERCIZIO PRECEDENTE

      aRecVAmmortamentoBeni.VARIAZIONE_PIU  := aRecVAmmortamentoBeni.VARIAZIONE_PIU - aAmmontare_CAR;
      aRecVAmmortamentoBeni.VARIAZIONE_MENO := aRecVAmmortamentoBeni.VARIAZIONE_MENO - aAmmontare_SCAR;
      aRecVAmmortamentoBeni.Valore_ammortizzato := aRecVAmmortamentoBeni.Valore_ammortizzato + abs(astorno);
   END IF;

EXCEPTION
   WHEN no_data_found Then
        RETURN;

END upgRecBenePerAmmortamento;

-- =================================================================================================
-- Ammortamento beni
-- =================================================================================================
PROCEDURE ammortamentoBeniInv
   (aPgExec NUMBER,
    aEs NUMBER,
    aCdCds VARCHAR2,
    aUser VARCHAR2,
    aTSNow DATE ) Is

   aRataAmmortamento number(15,2);
   aPrcAmmortamento number(5,2);
   isEseguiAmmortamento boolean;
   aNumAnno number(4);
   progressivo_riga number(3);

   aRecAssInventarioUo ASS_INVENTARIO_UO%ROWTYPE;
   aRecVAmmortamentoBeni V_AMMORTAMENTO_BENI%ROWTYPE;
   aAmmBInv AMMORTAMENTO_BENE_INV%rowtype;

   gen_cur_a GenericCurTyp;
   gen_cur_b GenericCurTyp;

BEGIN
    For aAmmInv In(Select * From AMMORTAMENTO_BENE_INV
  Where CD_CDS_UBICAZIONE       =aCdCds FOR UPDATE NOWAIT) Loop
  Null;
  End Loop;
 For aBeneInv In(Select * From INVENTARIO_BENI
  Where cd_cds =aCdCds For Update NOWAIT) Loop
  	Null;
  End Loop;

   -------------------------------------------------------------------------------------------------
   -- Controllo eseguibilità dell'ammortamento

   IF (aEs IS NULL OR
       aCdCds IS NULL OR
       aUser IS NULL OR
       aTSNow IS NULL) THEN
      IBMUTL200.logErr(aPgExec, DBMS_UTILITY.FORMAT_ERROR_STACK,'Parametri non definiti per ammortamento',null);
      RETURN;
   END IF;

  LOCK TABLE TIPO_AMMORTAMENTO IN EXCLUSIVE MODE NOWAIT;
  LOCK TABLE ASS_TIPO_AMM_CAT_GRUP_INV IN EXCLUSIVE MODE NOWAIT;

   -------------------------------------------------------------------------------------------------
   -- Carico tutti i beni che devono essere ammortizzati nell'esercizo in esame cioe, tutti i beni
   -- per cui risulta essere che il flag AMMORTAMENTO = 'Y' e per cui risulta esistere un associazione
   -- valida con un tipo di ammortamento.

   BEGIN

      -- Ciclo principale per inventario -----------------------------------------------------------

      OPEN gen_cur_a FOR

           SELECT DISTINCT pg_inventario
           FROM   ASS_INVENTARIO_UO
           WHERE  cd_cds = aCdCds
           ORDER BY pg_inventario;

      LOOP

         FETCH gen_cur_a INTO
               aRecAssInventarioUo.pg_inventario;

         EXIT WHEN gen_cur_a%NOTFOUND;

         BEGIN

            -- Ciclo secondario su V_AMMORTAMENTO_BENI ---------------------------------------------

            OPEN gen_cur_b FOR

                 SELECT *
                 FROM   V_AMMORTAMENTO_BENI
                 WHERE  pg_inventario = aRecAssInventarioUo.pg_inventario AND
                        (esercizio_competenza = aEs OR esercizio_competenza IS NULL) AND
                        esercizio_carico_bene <= aEs;

            LOOP

               savepoint CNRCTB400_SP_001;

               BEGIN

                  FETCH gen_cur_b INTO
                        aRecVAmmortamentoBeni;

                  EXIT WHEN gen_cur_b%NOTFOUND;

	     	  -- controlli per esecuzione dell'ammortamento -----------------------------------

                  -- Si processano i soli record che non hanno subito ammortamento nell'esercizio selezionato

	    	  IF ChkBeneAmmortato(aRecVAmmortamentoBeni, aEs) THEN

                     -- Controllo se esiste un tipo di ammortamento associato al gruppo categoria. Se
                     -- tale tipo non è definito per il bene si verifica che lo sia e univocamente per
                     -- il suo GRUPPO di appartenenza

                     chkEsisteTipoAmm (aRecVAmmortamentoBeni, aEs);

                     -- Stabilisco se devo usare aliquota del primo anno o di anni successivi.
                     -- Se vale 0 sollevo eccezione

                     IF aRecVAmmortamentoBeni.esercizio_carico_bene = aEs THEN
                        aPrcAmmortamento := aRecVAmmortamentoBeni.PERC_PRIMO_ANNO;
                     ELSE
                        aPrcAmmortamento := aRecVAmmortamentoBeni.PERC_SUCCESSIVI;
                     END IF;
                     IF (aPrcAmmortamento = 0 OR aPrcAmmortamento IS NULL) THEN
                        IBMERR001.RAISE_ERR_GENERICO('La percentuale di ammortamento per il bene risulta pari a 0');
                     END IF;

                     -- Normalizzo il record per escludere quanto movimentato in anni successivi

                     upgRecBenePerAmmortamento(aRecVAmmortamentoBeni, aEs);

                     -- Si processano i soli record che hanno:
                     -- imponibile_ammortamento > 0
                     -- fl_totalmente_scaricato = 'N'
                     -- valore_ammortizzato < imponibile_ammortamento

                     IF (aRecVAmmortamentoBeni.valore_ammortizzato > aRecVAmmortamentoBeni.imponibile_ammortamento) And
                      		aRecVAmmortamentoBeni.fl_totalmente_scaricato = 'N'  THEN
                        IBMERR001.RAISE_WRN_GENERICO('Il valore ammortizzato è maggiore dell''imponibile ammortamento');
                     END IF;

                     IF (aRecVAmmortamentoBeni.valore_iniziale + aRecVAmmortamentoBeni.variazione_piu -
                         aRecVAmmortamentoBeni.variazione_meno = 0 AND
                         aRecVAmmortamentoBeni.imponibile_ammortamento > 0 AND
                         aRecVAmmortamentoBeni.fl_totalmente_scaricato = 'N') THEN
                        IBMERR001.RAISE_WRN_GENERICO('L''assestato del bene vale 0 e risulta non totalmente scaricato e con imponibile ammortamento > 0');
                     END IF;


                     IF (aRecVAmmortamentoBeni.imponibile_ammortamento > 0 AND
                         aRecVAmmortamentoBeni.fl_totalmente_scaricato = 'N' AND
                         aRecVAmmortamentoBeni.valore_ammortizzato < aRecVAmmortamentoBeni.imponibile_ammortamento) THEN
		begin
                        -- Calcolo dell'importo della rata di ammortamento

                        aRataAmmortamento:=(aRecVAmmortamentoBeni.imponibile_ammortamento * aPrcAmmortamento /100 );

                        -- Controllare se il bene può essere ammortizzato dell'importo della rata calcolata precedentemente.
                        -- Si posssono verificare i seguenti casi:
                        --   a) la rata di ammortamento calcolata con la percentuale stabilita è troppo
                        --      alta VALORE_AMMORTIZZATO + rata_ammortamento > IMPONIBILE_AMMORTAMENTO
                        --      In questo caso il bene viene ammortizzato di un valore pari allo scarto cosi calcolato:
                        --      IMPONIBILE_AMMORTAMENTO - VALORE_AMMORTIZZATO
                        --   b) la rata di ammortamento calcolata con la percentuale stabilita è consistente in quanto risulta:
                        --      VALORE_AMMORTIZZATO + rata_ammortamento <= IMPONIBILE_AMMORTAMENTO (valore da ammortizzare),
                        --      in questo caso il bene viene ammortizzato con un importo pari alla rata di ammortamento in esame.
                        --  Per tutti i casi in cui il bene deve subire una rata di ammortamento si deve aggiornare il :
                        --  1) VALORE_AMMORTIZZATO del bene in esame
                        --  2) inserire un movimento di ammortamento relativo alla rata.

                        IF (aRataAmmortamento + aRecVAmmortamentoBeni.valore_ammortizzato >
                            aRecVAmmortamentoBeni.imponibile_ammortamento) THEN
                           aRataAmmortamento:=aRecVAmmortamentoBeni.imponibile_ammortamento -
                                              aRecVAmmortamentoBeni.valore_ammortizzato;
                        END IF;

                        -- esegue aggiornamento del valore_ammortizzato del bene in esame

                        updBene(aRecVAmmortamentoBeni.pg_inventario,
                                aRecVAmmortamentoBeni.nr_inventario,
                                aRecVAmmortamentoBeni.progressivo,
                                aRataAmmortamento,
                                aTSNow,
                                aUser);

                        -- Calcola il numero di anno di ammortamento

                        SELECT NVL(COUNT(*)+1,1) into aNumAnno
                        FROM   AMMORTAMENTO_BENE_INV
                        WHERE  pg_inventario = aRecVAmmortamentoBeni.pg_inventario AND
                               nr_inventario = aRecVAmmortamentoBeni.nr_inventario AND
                               progressivo = aRecVAmmortamentoBeni.progressivo And
                               fl_storno ='N';

                        -- esegue l'inserimento della rata di ammortamento

                        aAmmBInv.pg_inventario:=aRecVAmmortamentoBeni.pg_inventario;
                        aAmmBInv.nr_inventario:=aRecVAmmortamentoBeni.nr_inventario;
                        aAmmBInv.progressivo:=aRecVAmmortamentoBeni.progressivo;
                        aAmmBInv.esercizio:=aEs;
                        aAmmBInv.cd_tipo_ammortamento:=aRecVAmmortamentoBeni.cd_tipo_ammortamento;
                        aAmmBInv.ti_ammortamento:=aRecVAmmortamentoBeni.ti_ammortamento;
                        aAmmBInv.cd_categoria_gruppo:=aRecVAmmortamentoBeni.cd_categoria_gruppo;
                        aAmmBInv.esercizio_competenza:=aRecVAmmortamentoBeni.esercizio_competenza;
                        aAmmBInv.imponibile_ammortamento:=aRecVAmmortamentoBeni.imponibile_ammortamento;
                        aAmmBInv.im_movimento_ammort:=aRataAmmortamento;
                        aAmmBInv.perc_ammortamento:=aPrcAmmortamento;
                        aAmmBInv.numero_anni:=aRecVAmmortamentoBeni.numero_anni;
                        aAmmBInv.numero_anno:=aNumAnno;
                        aAmmBInv.perc_primo_anno:=aRecVAmmortamentoBeni.perc_primo_anno;
                        aAmmBInv.perc_successivi:=aRecVAmmortamentoBeni.perc_successivi;
                        aAmmBInv.cd_cds_ubicazione:=aRecVAmmortamentoBeni.cd_cds;
                        aAmmBInv.cd_uo_ubicazione:=aRecVAmmortamentoBeni.cd_unita_organizzativa;
                        aAmmBInv.duva:=aTSNow;
                        aAmmBInv.utuv:=aUser;
                        aAmmBInv.dacr:=aTSNow;
                        aAmmBInv.utcr:=aUser;
                        aAmmBInv.pg_ver_rec:=1;
                          -- inserimento gestione quote di storno
                        Begin
	                        Select NVL(Max(PG_RIGA)+1,1) into progressivo_riga
	                        FROM   AMMORTAMENTO_BENE_INV
	                        WHERE  pg_inventario = aRecVAmmortamentoBeni.pg_inventario AND
	                               nr_inventario = aRecVAmmortamentoBeni.nr_inventario AND
	                               progressivo = aRecVAmmortamentoBeni.progressivo and
	                               esercizio = aEs;
                        Exception When No_Data_Found Then
                           progressivo_riga:=1;
                        End;
			aAmmBInv.pg_riga:=progressivo_riga;
                        aAmmBInv.fl_storno :='N';

                        ins_AMMORTAMENTO_BENE_INV(aAmmBInv);
 		EXCEPTION  When others THEN

			dbms_output.put_line('errore '||aRecVAmmortamentoBeni.nr_inventario);
               	END;
                     END IF;

	    	  ELSE -- Controllo se il bene risulta già ammortizzato nell'esercio in esame;

                     IBMERR001.RAISE_ERR_GENERICO('Il bene risulta aver subito ammortamento nell''anno ' || aEs );

                  END IF; -- Controllo se il bene risulta già ammortizzato nell'esercio in esame;

               EXCEPTION

                  WHEN others THEN
                       Rollback to savepoint CNRCTB400_SP_001;
                       IF sqlCode = IBMERR001.WRN_GENERICO THEN
                          IBMUTL200.logWar(aPgExec, DBMS_UTILITY.FORMAT_ERROR_STACK,null,getDesc(aRecVAmmortamentoBeni));
                       ELSE
                          IBMUTL200.logErr(aPgExec, DBMS_UTILITY.FORMAT_ERROR_STACK,null,getDesc(aRecVAmmortamentoBeni));
                       END IF;

               END;

            END LOOP;

            CLOSE gen_cur_b;

         END;

      END LOOP;

      CLOSE gen_cur_a;
	IBMUTL200.logInf(aPgExec, 'FINE','Termine esecuzione','Termine esecuzione');
   END;


END ammortamentoBeniInv;

-- =================================================================================================
-- Controllo che il bene non risulti essere stato ammortato nell'esercizio
-- =================================================================================================
FUNCTION chkBeneAmmortato
   (
    aRecVAmmortamentoBeni V_AMMORTAMENTO_BENI%ROWTYPE,
    aEs NUMBER
   ) RETURN BOOLEAN IS

   aCount INTEGER;

BEGIN

   SELECT COUNT(*) INTO aCount
   FROM   DUAL
   WHERE  EXISTS
          (SELECT 1
           FROM   AMMORTAMENTO_BENE_INV
           WHERE  pg_inventario = aRecVAmmortamentoBeni.pg_inventario AND
                  nr_inventario = aRecVAmmortamentoBeni.nr_inventario AND
                  progressivo = aRecVAmmortamentoBeni.progressivo AND
                  esercizio = aEs  And
                  fl_storno = 'N');

   IF aCount = 0 THEN
      RETURN TRUE;
   ELSE
      RETURN FALSE;
   END IF;

END chkBeneAmmortato;

-- =================================================================================================
-- Controllo se esiste un tipo di ammortamento associato al gruppo categoria. Se tale tipo non è
-- definito per il bene si verifica che lo sia e univocamente per il suo GRUPPO di appartenenza
-- =================================================================================================
PROCEDURE chkEsisteTipoAmm
   (
    aRecVAmmortamentoBeni IN OUT V_AMMORTAMENTO_BENI%ROWTYPE,
    aEs NUMBER
    ) IS

   aRecTipoAmmortamento TIPO_AMMORTAMENTO%ROWTYPE;

BEGIN

   -- Nella vista V_AMMORTAMENTO_BENI se risulta che il campo CD_TIPO_AMMORTAMENTO IS NULL ->
   -- il bene non risulta associato ad un tipo di ammortamento

   IF aRecVAmmortamentoBeni.cd_tipo_ammortamento IS NULL THEN

      -- Cerca un tipo ammortamento collegato al gruppo inventariale del bene

      BEGIN

         IF aRecVAmmortamentoBeni.ti_ammortamento_bene IS NULL THEN

            SELECT * INTO aRecTipoAmmortamento
            FROM   TIPO_AMMORTAMENTO aTA
            WHERE  EXISTS
                      (SELECT 1
                       FROM   ASS_TIPO_AMM_CAT_GRUP_INV
                       WHERE  cd_categoria_gruppo = aRecVAmmortamentoBeni.cd_categoria_gruppo AND
                              cd_tipo_ammortamento = aTA.cd_tipo_ammortamento AND
                              ti_ammortamento = aTA.ti_ammortamento AND
                              esercizio_competenza = aEs);

         ELSE

            SELECT * INTO aRecTipoAmmortamento
            FROM   TIPO_AMMORTAMENTO aTA
            WHERE  aTA.ti_ammortamento = aRecVAmmortamentoBeni.ti_ammortamento_bene AND
                   EXISTS
                      (SELECT 1
                       FROM   ASS_TIPO_AMM_CAT_GRUP_INV
                       WHERE  cd_categoria_gruppo = aRecVAmmortamentoBeni.cd_categoria_gruppo AND
                              cd_tipo_ammortamento = aTA.cd_tipo_ammortamento AND
                              ti_ammortamento = aTA.ti_ammortamento AND
                              esercizio_competenza = aEs);

         END IF;

      EXCEPTION

         WHEN too_many_rows THEN
              IBMERR001.RAISE_ERR_GENERICO('Tipo ammortamento non definito per il bene: il gruppo inventariale a cui il bene appartiene ha più di un tipo di ammortamento definito');
         WHEN no_data_found THEN
              IBMERR001.RAISE_ERR_GENERICO('Tipo ammortamento non definito per il bene: il gruppo inventariale a cui il bene appartiene non ha tipo di ammortamento definito');
      END;

      aRecVAmmortamentoBeni.ESERCIZIO_COMPETENZA:=aEs;
      aRecVAmmortamentoBeni.CD_TIPO_AMMORTAMENTO:=aRecTipoAmmortamento.cd_tipo_ammortamento;
      aRecVAmmortamentoBeni.TI_AMMORTAMENTO:=aRecTipoAmmortamento.ti_ammortamento;
      aRecVAmmortamentoBeni.DT_CANCELLAZIONE:= aRecTipoAmmortamento.dt_cancellazione;
      aRecVAmmortamentoBeni.PERC_PRIMO_ANNO:=aRecTipoAmmortamento.perc_primo_anno;
      aRecVAmmortamentoBeni.PERC_SUCCESSIVI:=aRecTipoAmmortamento.perc_successivi;
      aRecVAmmortamentoBeni.NUMERO_ANNI:= aRecTipoAmmortamento.numero_anni;

   END IF;

END chkEsisteTipoAmm;

-- =================================================================================================
-- Annullamento ammortamento beni
-- =================================================================================================
PROCEDURE annullaAmmortBeniInv
   (aPgExec NUMBER,
    aEs NUMBER,
    aCdCds VARCHAR2,
    aUser VARCHAR2,
    aTSNow DATE ) IS

BEGIN
  For aAmmInv In(Select * From AMMORTAMENTO_BENE_INV
  Where CD_CDS_UBICAZIONE       =aCdCds FOR UPDATE NOWAIT) Loop
  Null;
  End Loop;
 For aBeneInv In(Select * From INVENTARIO_BENI
  Where cd_cds =aCdCds FOR UPDATE NOWAIT) Loop
  	Null;
  End Loop;

   IF aEs IS NULL OR aCdCds IS NULL OR aUser IS NULL OR aTSNow IS NULL THEN
      IBMUTL200.logErr(aPgExec, DBMS_UTILITY.FORMAT_ERROR_STACK,
                       'Parametri non definiti per annulamento ammortamento', NULL);
      RETURN;
   END IF;


   LOCK TABLE TIPO_AMMORTAMENTO IN EXCLUSIVE MODE NOWAIT;
   LOCK TABLE ASS_TIPO_AMM_CAT_GRUP_INV IN EXCLUSIVE MODE NOWAIT;

   FOR aAmmEs IN
       (SELECT *
        FROM   AMMORTAMENTO_BENE_INV
        WHERE  esercizio = aEs AND
               cd_cds_ubicazione = aCdCds And
               fl_storno = 'N')
   LOOP

      updBene(aAmmEs.pg_inventario,
              aAmmEs.nr_inventario,
              aAmmEs.progressivo,
              0 - aAmmEs.im_movimento_ammort,
              aTSNow,
              aUser);

      DELETE FROM AMMORTAMENTO_BENE_INV
      WHERE  pg_inventario = aAmmEs.pg_inventario AND
             nr_inventario = aAmmEs.nr_inventario AND
             progressivo = aAmmEs.progressivo AND
             esercizio = aEs  And
             fl_storno = 'N';

   END LOOP;
Exception When Others Then
  Dbms_Output.put_line ('errore '||sqlcode||' '||Sqlerrm);
END annullaAmmortBeniInv;

-- =================================================================================================
-- Aggiornamento bene per esecuzione o annullamento di ammortamento
-- =================================================================================================
PROCEDURE updBene
   (aPgInv NUMBER,
    aNrInv NUMBER,
    aProgressivo NUMBER,
    aDelta NUMBER,
    aTSNow DATE,
    aUser VARCHAR2) IS

BEGIN

   UPDATE inventario_beni
   SET    valore_ammortizzato = valore_ammortizzato + aDelta,
          duva = aTSNow,
          utuv = aUser,
          pg_ver_rec = pg_ver_rec +1
   WHERE  pg_inventario = aPgInv AND
          nr_inventario = aNrInv AND
          progressivo = aProgressivo;

END updBene;

-- ===================================== TRASFERIMENTO BENI ========================================

-- =================================================================================================
-- Esecuzione del trasferimento beni
-- =================================================================================================
PROCEDURE eseguiTrasferisciBeni
   (inPgInventarioOri NUMBER,
    aPgInventarioDest NUMBER,
    inEsercizio NUMBER,
    inCdTipoCarico VARCHAR2,
    aFlTrasferisciTutto VARCHAR2,
    inUtente VARCHAR2,
    aPgBuonoCarico IN OUT NUMBER,
    aPgBuonoScarico IN OUT NUMBER,
    aNumDettaglio IN OUT NUMBER,
    inRecBuonoScarico BUONO_CARICO_SCARICO%ROWTYPE,
    aCdCdsUbicazione VARCHAR2,
    aCdUoUbicazione VARCHAR2,
    aCdUbicazione VARCHAR2,
    inDtRegistrazione DATE) IS

   esisteBenePrincipale CHAR(1);
   eseguiLock CHAR(1);
   aTmpPgBuonoCarico NUMBER(10);
   aTmpPgBuonoScarico NUMBER(10);
   aTmpNumDettaglio NUMBER(10);
   dataOdierna DATE;

   i BINARY_INTEGER;
   j BINARY_INTEGER;

   aRecInventarioBeniOri INVENTARIO_BENI%ROWTYPE;
   aRecInventarioBeniDest INVENTARIO_BENI%ROWTYPE;
   aRecBuonoCarico BUONO_CARICO_SCARICO%ROWTYPE;
   aRecBuonoCaricoDett BUONO_CARICO_SCARICO_DETT%ROWTYPE;
   aRecBuonoScarico BUONO_CARICO_SCARICO%ROWTYPE;
   aRecBuonoScaricoDett BUONO_CARICO_SCARICO_DETT%ROWTYPE;
   aRecNumeratoreBuonoCS NUMERATORE_BUONO_C_S%ROWTYPE;
   aRecAssTrasferimentoBeniInv ASS_TRASFERIMENTO_BENI_INV%ROWTYPE;
   aRecCategoriaGruppoInvent CATEGORIA_GRUPPO_INVENT%ROWTYPE;
   tipo_amm char(1);
BEGIN

   IF beniDaTrasf_tab.COUNT = 0 THEN
      IBMERR001.RAISE_ERR_GENERICO ('Matrice gruppo beni da trasferire vuota');
   END IF;

   esisteBenePrincipale:='N';
   eseguiLock:='Y';
   dataOdierna:=SYSDATE;

   -- Si controlla se il primo record riguarda un bene principale

   IF beniDaTrasf_tab(1).tProgressivo = 0 THEN
      esisteBenePrincipale:='Y';
   END IF;

   -- Inizializzazione default per testata e dettagli buono di carico e scarico

   aRecBuonoScarico:=inRecBuonoScarico;
   If(inPgInventarioOri!=aPgInventarioDest ) Then
        aRecBuonoScarico.ds_buono_carico_scarico:=Substr(inRecBuonoScarico.ds_buono_carico_scarico,1,70)||' Trasferimento a Uo: '||aCdUoUbicazione;
   End If;
   aRecBuonoScarico.dacr:=dataOdierna;
   aRecBuonoScarico.duva:=dataOdierna;
   aRecBuonoScaricoDett.pg_inventario:=aRecBuonoScarico.pg_inventario;
   aRecBuonoScaricoDett.ti_documento:=aRecBuonoScarico.ti_documento;
   aRecBuonoScaricoDett.esercizio:=aRecBuonoScarico.esercizio;
   aRecBuonoScaricoDett.quantita:=1;
   aRecBuonoScaricoDett.dacr:=aRecBuonoScarico.dacr;
   aRecBuonoScaricoDett.utcr:=aRecBuonoScarico.utcr;
   aRecBuonoScaricoDett.duva:=aRecBuonoScarico.duva;
   aRecBuonoScaricoDett.utuv:=aRecBuonoScarico.utuv;
   aRecBuonoScaricoDett.pg_ver_rec:=aRecBuonoScarico.pg_ver_rec;
   aRecBuonoCarico:=inRecBuonoScarico;
   aRecBuonoCarico.pg_inventario:=aPgInventarioDest;
   aRecBuonoCarico.ti_documento:=BUONO_CARICO;
   aRecBuonoCarico.cd_tipo_carico_scarico:=inCdTipoCarico;
   aRecBuonoCarico.dacr:=dataOdierna;
   aRecBuonoCarico.duva:=dataOdierna;
   aRecBuonoCaricoDett.pg_inventario:=aRecBuonoCarico.pg_inventario;
   aRecBuonoCaricoDett.ti_documento:=aRecBuonoCarico.ti_documento;
   aRecBuonoCaricoDett.esercizio:=aRecBuonoCarico.esercizio;
   aRecBuonoCaricoDett.quantita:=1;
   aRecBuonoCaricoDett.dacr:=aRecBuonoCarico.dacr;
   aRecBuonoCaricoDett.utcr:=aRecBuonoCarico.utcr;
   aRecBuonoCaricoDett.duva:=aRecBuonoCarico.duva;
   aRecBuonoCaricoDett.utuv:=aRecBuonoCarico.utuv;
   aRecBuonoCaricoDett.pg_ver_rec:=aRecBuonoCarico.pg_ver_rec;

   -- Resetta il contatore per generare buoni di carico e scarico testata

   aTmpPgBuonoCarico:=aPgBuonoCarico;
   aTmpPgBuonoScarico:=aPgBuonoScarico;
   aTmpNumDettaglio:=aNumDettaglio;
   IF aTmpNumDettaglio > 150 THEN
      aTmpPgBuonoCarico:=0;
      aTmpPgBuonoScarico:=0;
      aTmpNumDettaglio:=0;
   END IF;

   -------------------------------------------------------------------------------------------------
   -- Ciclo di lettura dei beni da trasferire

   BEGIN

      FOR i IN 1 .. beniDaTrasf_tab.COUNT

      LOOP

         -- Leggo ed eseguo il lock sul bene in elaborazione

         aRecInventarioBeniOri:=getInventarioBeni(beniDaTrasf_tab(i).tPgInventario,
                                                  beniDaTrasf_tab(i).tNrInventario,
                                                  beniDaTrasf_tab(i).tProgressivo,
                                                  eseguiLock);

         -- Se il bene risulta totalmente scaricato o ha valore assestato = 0 segnalo errore

         IF (aRecInventarioBeniOri.fl_totalmente_scaricato = 'Y' OR
             aRecInventarioBeniOri.valore_iniziale + aRecInventarioBeniOri.variazione_piu -
             aRecInventarioBeniOri.variazione_meno = 0 ) THEN
            IBMERR001.RAISE_ERR_GENERICO
                ('E'' stato richiesto il trasferimento di un bene totalmente scaricato o con assestato = 0');
         END IF;

         -- Controlli consistenza ----------------------------------------------------------------

         -- Trasferimento stessa UO

         IF inPgInventarioOri = aPgInventarioDest THEN

            if(beniDaTrasf_tab(i).tCategoriaNew is not null) then
                IF (beniDaTrasf_tab(i).tCategoriaNew =aRecInventarioBeniOri.cd_categoria_gruppo) THEN
                  IBMERR001.RAISE_ERR_GENERICO
                     ('Trasferimento per cambio categoria non necessario per il bene '||aRecInventarioBeniOri.nr_inventario);
                END IF;
                if  (aRecInventarioBeniOri.FL_AMMORTAMENTO='Y'  And aRecInventarioBeniOri.valore_ammortizzato!=0) then
                   aRecCategoriaGruppoInvent:=getCategoriaGruppoInvent(beniDaTrasf_tab(i).tCategoriaNew);
                   if(aRecCategoriaGruppoInvent.fl_ammortamento='N') then
                   		 IBMERR001.RAISE_ERR_GENERICO
                     ('Trasferimento per cambio categoria su categoria non ammortizzabile, non coerente per il bene '||aRecInventarioBeniOri.nr_inventario);
                   end if;
                end if;
  					else  -- if(beniDaTrasf_tab(i).tCategoriaNew is not null) then

            -- Esiste bene principale

            IF esisteBenePrincipale = 'Y' THEN

               -- Tutti i beni devono presentare il flag trasferisci come bene principale = 'N'

               IF beniDaTrasf_tab(i).tFlTrasfComePrincipale = 'Y' THEN
                  IBMERR001.RAISE_ERR_GENERICO
                     ('Trasferimento nello stesso inventario. E'' indicato un bene principale e si richiede ' ||
                      'il trasferimento come bene principale');
               END IF;

               -- Tutti i beni devono diventare accessori dello stesso bene di destinazione e questo non può
               -- essere nullo

               IF (beniDaTrasf_tab(i).tPgInventarioPrincipale IS NULL OR
                   beniDaTrasf_tab(i).tNrInventarioPrincipale IS NULL) THEN
                  IBMERR001.RAISE_ERR_GENERICO
                     ('Trasferimento nello stesso inventario. E'' indicato un bene principale e non è richiesto ' ||
                      'il trasferimento come bene principale e non è indicato il bene di destinazione');
               END IF;

               IF (beniDaTrasf_tab(i).tPgInventarioPrincipale != beniDaTrasf_tab(1).tPgInventarioPrincipale OR
                   beniDaTrasf_tab(i).tNrInventarioPrincipale != beniDaTrasf_tab(1).tNrInventarioPrincipale) THEN
                  IBMERR001.RAISE_ERR_GENERICO
                     ('Trasferimento nello stesso inventario. E'' indicato un bene principale e non è richiesto ' ||
                      'il trasferimento come bene principale e il bene di destinazione non è lo stesso per tutti i records');
               END IF;

            -- Non esiste bene principale

            ELSE

               -- Se l'accessorio non è da trasferire come principale deve esistere l'indicazione del bene
               -- di destinazione

               IF beniDaTrasf_tab(i).tFlTrasfComePrincipale = 'N' THEN
                  IF (beniDaTrasf_tab(i).tPgInventarioPrincipale IS NULL OR
                      beniDaTrasf_tab(i).tNrInventarioPrincipale IS NULL) THEN
                     IBMERR001.RAISE_ERR_GENERICO
                        ('Trasferimento nello stesso inventario. Non è indicato un bene principale e non è richiesto ' ||
                         'il trasferimento come bene principale e non è indicato il bene di destinazione');
                  END IF;
               END IF;
            END IF;
           end if;-- else di if(beniDaTrasf_tab(i).tCategoriaNew is not null) then
         END IF;

         ------------------------------------  BUONO DI SCARICO ----------------------------------

         -- Creazione buono di scarico testata ---------------------------------------------------

         -- La testata del buono di scarico è generata solo se è la prima volta o se il numero delle
         -- righe di dettaglio è maggiore di 200

         IF aTmpPgBuonoScarico = 0 THEN
            aRecNumeratoreBuonoCS:=getNumeratoreBuonoCS(aRecBuonoScarico.pg_inventario,
                                                        aRecBuonoScarico.ti_documento,
                                                        aRecBuonoScarico.esercizio,
                                                        inUtente,
                                                        dataOdierna,
                                                        eseguiLock);
            aRecBuonoScarico.pg_buono_c_s:=aRecNumeratoreBuonoCS.corrente + 1;
            aTmpPgBuonoScarico:=aRecBuonoScarico.pg_buono_c_s;
            upgCorrenteNumeratoreBuonoCS(aRecBuonoScarico.pg_inventario,
                                         aRecBuonoScarico.ti_documento,
                                         aRecBuonoScarico.esercizio,
                                         dataOdierna,
                                         inUtente);

            insBuonoCaricoScarico(aRecBuonoScarico);
         ELSE
            aRecBuonoScarico.pg_buono_c_s:=aTmpPgBuonoScarico;
         END IF;

         -- Creazione buono di scarico dettaglio -------------------------------------------------

         aTmpNumDettaglio:=aTmpNumDettaglio + 1;
         aRecBuonoScaricoDett.pg_buono_c_s:=aRecBuonoScarico.pg_buono_c_s;
         aRecBuonoScaricoDett.nr_inventario:=beniDaTrasf_tab(i).tNrInventario;
         aRecBuonoScaricoDett.progressivo:=beniDaTrasf_tab(i).tProgressivo;
         aRecBuonoScaricoDett.intervallo:=aTmpNumDettaglio || '-' || aTmpNumDettaglio;
         aRecBuonoScaricoDett.valore_unitario:=aRecInventarioBeniOri.valore_iniziale +
                                               aRecInventarioBeniOri.variazione_piu -
                                               aRecInventarioBeniOri.variazione_meno;
         IF inPgInventarioOri = aPgInventarioDest THEN
            if(beniDaTrasf_tab(i).tCategoriaNew is not null) then
            	aRecBuonoScaricoDett.stato_coge:='N';
            else
            	aRecBuonoScaricoDett.stato_coge:='X';
            end if;
         ELSE
            aRecBuonoScaricoDett.stato_coge:='N';
         END IF;
         aRecBuonoScaricoDett.stato_coge_quote:='X';
         insBuonoCaricoScaricoDett(aRecBuonoScaricoDett);

         -- Aggiornamento del bene ---------------------------------------------------------------

         IF (aRecInventarioBeniOri.imponibile_ammortamento = aRecInventarioBeniOri.valore_iniziale +
                                                            aRecInventarioBeniOri.variazione_piu -
                                                            aRecInventarioBeniOri.variazione_meno) THEN

            UPDATE INVENTARIO_BENI
            SET    fl_totalmente_scaricato = 'Y',
                   dt_validita_variazione = inDtRegistrazione,-- r.p. 13/02/2006 vecchia versione erroneamente veniva imputata TRUNC(dataOdierna),
                   imponibile_ammortamento = 0,
                   variazione_meno = variazione_meno + aRecBuonoScaricoDett.valore_unitario,
                   duva = dataOdierna,
                   utuv = inUtente,
                   pg_ver_rec = pg_ver_rec + 1
            WHERE  pg_inventario = aRecBuonoScaricoDett.pg_inventario AND
                   nr_inventario = aRecBuonoScaricoDett.nr_inventario AND
                   progressivo = aRecBuonoScaricoDett.progressivo;

         ELSE

            UPDATE INVENTARIO_BENI
            SET    fl_totalmente_scaricato = 'Y',
                   dt_validita_variazione = inDtRegistrazione,-- r.p. 13/02/2006 vecchia versione erroneamente veniva imputata TRUNC(dataOdierna),
                   variazione_meno = variazione_meno + aRecBuonoScaricoDett.valore_unitario,
                   duva = dataOdierna,
                   utuv = inUtente,
                   pg_ver_rec = pg_ver_rec + 1
            WHERE  pg_inventario = aRecBuonoScaricoDett.pg_inventario AND
                   nr_inventario = aRecBuonoScaricoDett.nr_inventario AND
                   progressivo = aRecBuonoScaricoDett.progressivo;

         END IF;

         ------------------------------------  BUONO DI CARICO -----------------------------------

         -- Creazione buono di carico testata ----------------------------------------------------

         -- La testata del buono di scarico è generata solo se è la prima volta o se il numero delle
         -- righe di dettaglio è maggiore di 200

         IF aTmpPgBuonoCarico = 0 THEN
            aRecNumeratoreBuonoCS:=getNumeratoreBuonoCS(aRecBuonoCarico.pg_inventario,
                                                        aRecBuonoCarico.ti_documento,
                                                        aRecBuonoCarico.esercizio,
                                                        inUtente,
                                                        dataOdierna,
                                                        eseguiLock);
            aRecBuonoCarico.pg_buono_c_s:=aRecNumeratoreBuonoCS.corrente + 1;
            aTmpPgBuonoCarico:=aRecBuonoCarico.pg_buono_c_s;
            upgCorrenteNumeratoreBuonoCS(aRecBuonoCarico.pg_inventario,
                                         aRecBuonoCarico.ti_documento,
                                         aRecBuonoCarico.esercizio,
                                         dataOdierna,
                                         inUtente);
                If(inPgInventarioOri!=aPgInventarioDest) Then
                        aRecBuonoCarico.ds_buono_carico_scarico:=Substr(inRecBuonoScarico.ds_buono_carico_scarico,1,70)||' Trasferimento da Uo: '||aRecInventarioBeniOri.cd_unita_organizzativa;
                End If;
            insBuonoCaricoScarico(aRecBuonoCarico);
         ELSE
            aRecBuonoCarico.pg_buono_c_s:=aTmpPgBuonoCarico;
         END IF;

         -- Creazione buono di carico dettaglio --------------------------------------------------

         aRecBuonoCaricoDett.pg_buono_c_s:=aRecBuonoCarico.pg_buono_c_s;

         -- Numero e progressivo inventario

         IF inPgInventarioOri = aPgInventarioDest THEN

           if(beniDaTrasf_tab(i).tCategoriaNew is not null) Then
              if (beniDaTrasf_tab(i).tProgressivo=0 ) then
              		aRecBuonoCaricoDett.nr_inventario:=getNewNrInventario(aRecBuonoCaricoDett.pg_inventario);
              end if;		
              aRecBuonoCaricoDett.progressivo:=beniDaTrasf_tab(i).tProgressivo;
           else
            IF esisteBenePrincipale = 'Y' THEN
               aRecBuonoCaricoDett.nr_inventario:=beniDaTrasf_tab(i).tNrInventarioPrincipale;
               aRecBuonoCaricoDett.progressivo:=getNewProgressivo(aRecBuonoCaricoDett.pg_inventario,
                                                                  aRecBuonoCaricoDett.nr_inventario);
            ELSE
               IF beniDaTrasf_tab(i).tFlTrasfComePrincipale = 'N' THEN
                  aRecBuonoCaricoDett.nr_inventario:=beniDaTrasf_tab(i).tNrInventarioPrincipale;
                  aRecBuonoCaricoDett.progressivo:=getNewProgressivo(aRecBuonoCaricoDett.pg_inventario,
                                                                     aRecBuonoCaricoDett.nr_inventario);
               ELSE
                  aRecBuonoCaricoDett.nr_inventario:=getNewNrInventario(aRecBuonoCaricoDett.pg_inventario);
                  aRecBuonoCaricoDett.progressivo:=0;
               END IF;
            END IF;
           end if;
         ELSE
            IF esisteBenePrincipale = 'Y' THEN
               IF beniDaTrasf_tab(i).tProgressivo = 0 THEN
                  aRecBuonoCaricoDett.nr_inventario:=getNewNrInventario(aRecBuonoCaricoDett.pg_inventario);
                  aRecBuonoCaricoDett.progressivo:=0;
               ELSE
                  aRecBuonoCaricoDett.progressivo:=getNewProgressivo(aRecBuonoCaricoDett.pg_inventario,
                                                                     aRecBuonoCaricoDett.nr_inventario);
               END IF;
            ELSE
               aRecBuonoCaricoDett.nr_inventario:=getNewNrInventario(aRecBuonoCaricoDett.pg_inventario);
               aRecBuonoCaricoDett.progressivo:=0;
            END IF;
         END IF;
         aRecBuonoCaricoDett.intervallo:=aTmpNumDettaglio || '-' || aTmpNumDettaglio;
         aRecBuonoCaricoDett.valore_unitario:=aRecBuonoScaricoDett.valore_unitario;
         IF inPgInventarioOri = aPgInventarioDest THEN
              if(beniDaTrasf_tab(i).tCategoriaNew is not null) Then
              	aRecBuonoCaricoDett.stato_coge:='N';
              else
            		aRecBuonoCaricoDett.stato_coge:='X';
            	end if;
         ELSE
            aRecBuonoCaricoDett.stato_coge:='N';
         END IF;
         aRecBuonoCaricoDett.stato_coge_quote:='X';
         insBuonoCaricoScaricoDett(aRecBuonoCaricoDett);

         -- Creazione del bene -------------------------------------------------------------------

         aRecInventarioBeniDest:=aRecInventarioBeniOri;
         aRecInventarioBeniDest.pg_inventario:=aRecBuonoCaricoDett.pg_inventario;
         aRecInventarioBeniDest.nr_inventario:=aRecBuonoCaricoDett.nr_inventario;
         aRecInventarioBeniDest.progressivo:=aRecBuonoCaricoDett.progressivo;
         aRecInventarioBeniDest.fl_totalmente_scaricato:='N';
         aRecInventarioBeniDest.dt_validita_variazione:=inDtRegistrazione; -- r.p. 13/02/2006 vecchia versione erroneamente veniva imputata TRUNC(dataOdierna),
         IF inPgInventarioOri != aPgInventarioDest THEN
            aRecInventarioBeniDest.cd_cds:=aCdCdsUbicazione;
            aRecInventarioBeniDest.cd_unita_organizzativa:=aCdUoUbicazione;
            aRecInventarioBeniDest.cd_ubicazione:=aCdUbicazione;
         END IF;
         if(beniDaTrasf_tab(i).tCategoriaNew is not null) Then
            select ti_ammortamento into tipo_amm
              from ASS_TIPO_AMM_CAT_GRUP_INV
              where esercizio_competenza = aRecBuonoCaricoDett.esercizio   and
                    cd_categoria_gruppo = beniDaTrasf_tab(i).tCategoriaNew;
            aRecCategoriaGruppoInvent:=getCategoriaGruppoInvent(beniDaTrasf_tab(i).tCategoriaNew);
            aRecInventarioBeniDest.cd_categoria_gruppo:=beniDaTrasf_tab(i).tCategoriaNew;
          	aRecInventarioBeniDest.fl_ammortamento:=aRecCategoriaGruppoInvent.fl_ammortamento;
          	aRecInventarioBeniDest.ti_ammortamento:=tipo_amm;
         end if;
         aRecInventarioBeniDest.dacr:=dataOdierna;
         aRecInventarioBeniDest.utcr:=inUtente;
         aRecInventarioBeniDest.duva:=dataOdierna;
         aRecInventarioBeniDest.utuv:=inUtente;
         aRecInventarioBeniDest.pg_ver_rec:=1;
         aRecInventarioBeniDest.esercizio_carico_bene:=inEsercizio;
         insInventarioBeni(aRecInventarioBeniDest);

         -- Riporti dati utilizzatori (solo per trasferimento stessa UO e se la destinazione è bene principale)

         IF (inPgInventarioOri = aPgInventarioDest AND
             aRecBuonoCaricoDett.progressivo = 0) THEN
            riportaUtilizzatoriLa(aRecBuonoScaricoDett.pg_inventario,
                                  aRecBuonoScaricoDett.nr_inventario,
                                  aRecBuonoCaricoDett.nr_inventario,
                                  aRecBuonoCaricoDett.progressivo,
                                  inUtente,
                                  dataOdierna);
         END IF;

         -- Creazione associativa ----------------------------------------------------------------

         aRecAssTrasferimentoBeniInv.pg_inventario_origine:=aRecBuonoScaricoDett.pg_inventario;
         aRecAssTrasferimentoBeniInv.nr_inventario_origine:=aRecBuonoScaricoDett.nr_inventario;
         aRecAssTrasferimentoBeniInv.progressivo_origine:=aRecBuonoScaricoDett.progressivo;
         aRecAssTrasferimentoBeniInv.pg_inventario_dest:=aRecBuonoCaricoDett.pg_inventario;
         aRecAssTrasferimentoBeniInv.nr_inventario_dest:=aRecBuonoCaricoDett.nr_inventario;
         aRecAssTrasferimentoBeniInv.progressivo_dest:=aRecBuonoCaricoDett.progressivo;
         aRecAssTrasferimentoBeniInv.valore_iniziale:=aRecInventarioBeniDest.valore_iniziale;
         aRecAssTrasferimentoBeniInv.variazione_piu:=aRecInventarioBeniDest.variazione_piu;
         aRecAssTrasferimentoBeniInv.variazione_meno:=aRecInventarioBeniDest.variazione_meno;
         aRecAssTrasferimentoBeniInv.imponibile_ammortamento:=aRecInventarioBeniDest.imponibile_ammortamento;
         aRecAssTrasferimentoBeniInv.valore_ammortizzato:=aRecInventarioBeniDest.valore_ammortizzato;
         aRecAssTrasferimentoBeniInv.dacr:=dataOdierna;
         aRecAssTrasferimentoBeniInv.utcr:=inUtente;
         aRecAssTrasferimentoBeniInv.duva:=dataOdierna;
         aRecAssTrasferimentoBeniInv.utuv:=inUtente;
         aRecAssTrasferimentoBeniInv.pg_ver_rec:=1;

         insAssTrasferimentoBeniInv(aRecAssTrasferimentoBeniInv);

      END LOOP;

      COMMIT;
      aPgBuonoCarico:=aTmpPgBuonoCarico;
      aPgBuonoScarico:=aTmpPgBuonoScarico;
      aNumDettaglio:=aTmpNumDettaglio;

   END;

END eseguiTrasferisciBeni;

-- =================================================================================================
-- Procedura di trasferimento beni
-- =================================================================================================
PROCEDURE leggiTrasferisciBeni
   (
    inLocalTransId VARCHAR2,
    inPgInventarioOri NUMBER,
    aPgInventarioDest NUMBER,
    inEsercizio NUMBER,
    inCdTipoCarico VARCHAR2,
    inCdTipoScarico VARCHAR2,
    inDsBuonoCarScar VARCHAR2,
    inDtRegistrazione DATE,
    aFlTrasferisciTutto VARCHAR2,
    inUtente VARCHAR2,
    inCdsDest VARCHAR2,
    inUoDest VARCHAR2
   ) IS

   memPgInventario INVENTARIO_BENI.pg_inventario%TYPE;
   memNrInventario INVENTARIO_BENI.nr_inventario%TYPE;
   memProgressivo INVENTARIO_BENI.progressivo%TYPE;
   strBeneOrigine VARCHAR2(30);
   strBeneDestinazione VARCHAR2(30);
   aPgBuonoCarico NUMBER(10);
   aPgBuonoScarico NUMBER(10);
   aNumDettaglio NUMBER(10);
   aFlTrasferisci CHAR(1);

   j BINARY_INTEGER;
   i BINARY_INTEGER;

   aRecInventarioBeniApgOri INVENTARIO_BENI_APG%ROWTYPE;
   aRecBuonoScarico BUONO_CARICO_SCARICO%ROWTYPE;
   aRecUbicazioneBene UBICAZIONE_BENE%ROWTYPE;

   gen_cv GenericCurTyp;

BEGIN

   -------------------------------------------------------------------------------------------------
   -- Inizializza variabili

   memPgInventario:=NULL;
   memNrInventario:=NULL;
   memProgressivo:=NULL;
   strBeneOrigine:=NULL;
   strBeneDestinazione:=NULL;
   aPgBuonoCarico:=0;
   aPgBuonoScarico:=0;
   aNumDettaglio:=0;

   -- Base testata buono carico scarico

   aRecBuonoScarico:=NULL;
   aRecBuonoScarico.pg_inventario:=inPgInventarioOri;
   aRecBuonoScarico.ti_documento:=BUONO_SCARICO;
   aRecBuonoScarico.esercizio:=inEsercizio;
   aRecBuonoScarico.ds_buono_carico_scarico:=inDsBuonoCarScar;
   aRecBuonoScarico.data_registrazione:=inDtRegistrazione;
   aRecBuonoScarico.cd_tipo_carico_scarico:=inCdTipoScarico;
   aRecBuonoScarico.utcr:=inUtente;
   aRecBuonoScarico.utuv:=inUtente;
   aRecBuonoScarico.pg_ver_rec:=1;

   -------------------------------------------------------------------------------------------------
   -- Controlli di base

   -- Se l'esercizio di riferimento è 2003 sollevo errore

   IF inEsercizio < 2004 THEN
      IBMERR001.RAISE_ERR_GENERICO
         ('Errore generale. Non è possibile eseguire il trasferimento beni in esercizio anteriore al 2004');
   END IF;

   -- Recupero dati per ubicazione bene di default

   IF inPgInventarioOri != aPgInventarioDest THEN
      aRecUbicazioneBene:=getUbicazioneDefault(inCdsDest,
                                               inUoDest);
   END IF;


   -------------------------------------------------------------------------------------------------
   -- Elaborazione trasferimento

   BEGIN

      IF aFlTrasferisciTutto = 'Y' THEN

         OPEN gen_cv FOR

              SELECT pg_inventario,
                     nr_inventario,
                     progressivo,
                     TO_CHAR(NULL),
                     TO_NUMBER(NULL),
                     TO_NUMBER(NULL),
                     TO_NUMBER(NULL),
                     to_char(null)
              FROM   INVENTARIO_BENI
              WHERE  pg_inventario = inPgInventarioOri AND
                     fl_totalmente_scaricato = 'N' And
                     dt_validita_variazione <= inDtRegistrazione
              ORDER BY pg_inventario,
                       nr_inventario,
                       progressivo;

      ELSE

         OPEN gen_cv FOR

              SELECT DISTINCT pg_inventario,
                     nr_inventario,
                     progressivo,
                     fl_trasf_come_principale,
                     pg_inventario_principale,
                     nr_inventario_principale,
                     progressivo_principale,
                     cd_categoria_gruppo_new
              FROM   INVENTARIO_BENI_APG
              WHERE  local_transaction_id = inLocalTransId AND
                     pg_inventario = inPgInventarioOri
              ORDER BY pg_inventario,
                       nr_inventario,
                       progressivo;

      END IF;

      LOOP

         BEGIN

            FETCH gen_cv INTO
                  aRecInventarioBeniApgOri.pg_inventario,
                  aRecInventarioBeniApgOri.nr_inventario,
                  aRecInventarioBeniApgOri.progressivo,
                  aRecInventarioBeniApgOri.fl_trasf_come_principale,
                  aRecInventarioBeniApgOri.pg_inventario_principale,
                  aRecInventarioBeniApgOri.nr_inventario_principale,
                  aRecInventarioBeniApgOri.progressivo_principale,
									aRecInventarioBeniApgOri.cd_categoria_gruppo_new;
            EXIT WHEN gen_cv%NOTFOUND;

            IF memPgInventario IS NULL THEN
               memPgInventario:=aRecInventarioBeniApgOri.pg_inventario;
               memNrInventario:=aRecInventarioBeniApgOri.nr_inventario;
               memProgressivo:=aRecInventarioBeniApgOri.progressivo;
               beniDaTrasf_tab.DELETE;
               i:=0;
            END IF;

            -- Se il numero inventario è diverso da quello memorizzato allora indico l'esecuzione del
            -- trasferimento

            IF aRecInventarioBeniApgOri.nr_inventario != memNrInventario THEN
               aFlTrasferisci:='Y';
            END IF;

            -- Se ho già portato dei beni sulla tabella di appoggio e la prima occorrenza non è un bene
            -- principale, anche se il numero inventario è uguale al precedente, indico l'esecuzione del
            -- trasferimento: ogni accessorio vive di vita propria

            IF (i > 0 AND
                beniDaTrasf_tab(1).tProgressivo != 0) THEN
               aFlTrasferisci:='Y';
            END IF;

            -- Esecuzione del trasferimento e azzeramento della tabella per memorizzare la nuova occorrenza

            BEGIN

               IF aFlTrasferisci='Y' THEN
                  eseguiTrasferisciBeni(inPgInventarioOri,
                                        aPgInventarioDest,
                                        inEsercizio,
                                        inCdTipoCarico,
                                        aFlTrasferisciTutto,
                                        inUtente,
                                        aPgBuonoCarico,
                                        aPgBuonoScarico,
                                        aNumDettaglio,
                                        aRecBuonoScarico,
                                        aRecUbicazioneBene.cd_cds,
                                        aRecUbicazioneBene.cd_unita_organizzativa,
                                        aRecUbicazioneBene.cd_ubicazione,
                                        inDtRegistrazione);

                  beniDaTrasf_tab.DELETE;
                  i:=0;
               END IF;

            EXCEPTION

               WHEN others THEN
                    j:=(errori_tab.COUNT + 1);
                    errori_tab(j).tStrIdBeneOrigine:=strBeneOrigine;
                    errori_tab(j).tStrIdBeneDest:=strBeneDestinazione;
                    errori_tab(j).tStringaMsg:=SUBSTR(DBMS_UTILITY.FORMAT_ERROR_STACK,1,3900);
                    ROLLBACK;
                    beniDaTrasf_tab.DELETE;
                    i:=0;

            END;

            -- Memorizzo sulla tabella di appoggio i beni

            aFlTrasferisci:='N';
            i:=i + 1;
            IF i = 1 THEN
               strBeneOrigine:='Bene Ori = ' || aRecInventarioBeniApgOri.pg_inventario || '-' ||
                                aRecInventarioBeniApgOri.nr_inventario || '-' ||
                                aRecInventarioBeniApgOri.progressivo;
               strBeneDestinazione:='Bene Dest = ' || aRecInventarioBeniApgOri.pg_inventario_principale || '-' ||
                                aRecInventarioBeniApgOri.nr_inventario_principale || '-' ||
                                aRecInventarioBeniApgOri.progressivo_principale;
            END IF;
            memPgInventario:=aRecInventarioBeniApgOri.pg_inventario;
            memNrInventario:=aRecInventarioBeniApgOri.nr_inventario;
            memProgressivo:=aRecInventarioBeniApgOri.progressivo;
            beniDaTrasf_tab(i).tPgInventario:=aRecInventarioBeniApgOri.pg_inventario;
            beniDaTrasf_tab(i).tNrInventario:=aRecInventarioBeniApgOri.nr_inventario;
            beniDaTrasf_tab(i).tProgressivo:=aRecInventarioBeniApgOri.progressivo;
            beniDaTrasf_tab(i).tFlTrasfComePrincipale:=aRecInventarioBeniApgOri.fl_trasf_come_principale;
            beniDaTrasf_tab(i).tPgInventarioPrincipale:=aRecInventarioBeniApgOri.pg_inventario_principale;
            beniDaTrasf_tab(i).tNrInventarioPrincipale:=aRecInventarioBeniApgOri.nr_inventario_principale;
            beniDaTrasf_tab(i).tProgressivoPrincipale:=aRecInventarioBeniApgOri.progressivo_principale;
					  beniDaTrasf_tab(i).tCategoriaNew:=aRecInventarioBeniApgOri.cd_categoria_gruppo_new;

         EXCEPTION

            WHEN others THEN
                 j:=(errori_tab.COUNT + 1);
                 errori_tab(j).tStrIdBeneOrigine:=strBeneOrigine;
                 errori_tab(j).tStrIdBeneDest:=strBeneDestinazione;
                 errori_tab(j).tStringaMsg:=SUBSTR(DBMS_UTILITY.FORMAT_ERROR_STACK,1,3900);
                 ROLLBACK;
                 aFlTrasferisci:='N';
                 beniDaTrasf_tab.DELETE;
                 i:=0;

         END;

      END LOOP;

      CLOSE gen_cv;

      eseguiTrasferisciBeni(inPgInventarioOri,
                            aPgInventarioDest,
                            inEsercizio,
                            inCdTipoCarico,
                            aFlTrasferisciTutto,
                            inUtente,
                            aPgBuonoCarico,
                            aPgBuonoScarico,
                            aNumDettaglio,
                            aRecBuonoScarico,
                            aRecUbicazioneBene.cd_cds,
                            aRecUbicazioneBene.cd_unita_organizzativa,
                            aRecUbicazioneBene.cd_ubicazione,
                            inDtRegistrazione);

   EXCEPTION

      WHEN others THEN
           j:=(errori_tab.COUNT + 1);
           errori_tab(j).tStrIdBeneOrigine:=strBeneOrigine;
           errori_tab(j).tStrIdBeneDest:=strBeneDestinazione;
           errori_tab(j).tStringaMsg:=SUBSTR(DBMS_UTILITY.FORMAT_ERROR_STACK,1,3900);
           ROLLBACK;

   END;

END leggiTrasferisciBeni;

-- =================================================================================================
-- Guscio per gestione del trasferimento beni batch
-- =================================================================================================
PROCEDURE job_trasferisciBeni
   (job NUMBER,
    pg_exec NUMBER,
    next_date DATE,
    inLocalTransId VARCHAR2,
    inPgInventarioOri NUMBER,
    aPgInventarioDest NUMBER,
    inEsercizio NUMBER,
    inCdTipoCarico VARCHAR2,
    inCdTipoScarico VARCHAR2,
    inDsBuonoCarScar VARCHAR2,
    inDtRegistrazione DATE,
    aFlTrasferisciTutto VARCHAR2,
    inUtente VARCHAR2,
    inCdsDest VARCHAR2,
    inUoDest VARCHAR2) IS

   i BINARY_INTEGER;

BEGIN

   -- Lancio start esecuzione log

   IBMUTL210.logStartExecutionUpd(pg_exec, LOG_TIPO_TRASFBENI, job, 'Richiesta utente:' || inUtente,
                                  'Trasferimento beni. Start:' || TO_CHAR(sysdate,'YYYY/MM/DD HH-MI-SS'));

   BEGIN

      leggiTrasferisciBeni(inLocalTransId,
                           inPgInventarioOri,
                           aPgInventarioDest,
                           inEsercizio,
                           inCdTipoCarico,
                           inCdTipoScarico,
                           inDsBuonoCarScar,
                           inDtRegistrazione,
                           aFlTrasferisciTutto,
                           inUtente,
                           inCdsDest,
                           inUoDest);

      -- Cancellazione della tabella di appoggio

      IF aFlTrasferisciTutto = 'N' THEN
         cancellaInventarioBeniApg(inLocalTransId);
      END IF;

      -- Controllo se vi sono stati errori

      IF errori_tab.COUNT > 0 THEN
         IBMERR001.RAISE_ERR_GENERICO
            ('Operazione completata con successo ma con errori. Verificare dettaglio log per elenco errori');
      END IF;

      COMMIT;

      -- Messaggio di operazione completata ad utente

      IBMUTL205.LOGINF('Trasferimento beni',
                       'Trasferimento beni ' || TO_CHAR(sysdate,'DD/MM/YYYY HH:MI:SS'),
                       'Operazione completata con successo',inUtente);

   EXCEPTION

      WHEN others THEN
           ROLLBACK;

      -- Messaggio di attenzione ad utente

      IBMUTL205.LOGERR('Trasferimento beni ' || errori_tab.COUNT,
                       'Trasferimento beni ' || TO_CHAR(sysdate,'DD/MM/YYYY HH:MI:SS') ||
                       ' (pg_exec= ' || pg_exec || ')', DBMS_UTILITY.FORMAT_ERROR_STACK,inUtente);

      -- Scrittura degli eventuali altri errori

      IF errori_tab.COUNT > 0 THEN

         FOR i IN errori_tab.FIRST .. errori_tab.LAST

         LOOP

            IBMUTL200.LOGERR(pg_exec,
                             'Trasferimento beni - Dettaglio errori',
                             'Errore : ' || errori_tab(i).tStringaMsg,
                             'Bene Origine = ' || errori_tab(i).tStrIdBeneOrigine || ' ' ||
                             'Bene Destinazione ' || errori_tab(i).tStrIdBeneDest);

         END LOOP;

      END IF;

      -- Cancellazione della tabella di appoggio

      IF aFlTrasferisciTutto = 'N' THEN
         cancellaInventarioBeniApg(inLocalTransId);
      END IF;

   END;

END job_trasferisciBeni;

-- =================================================================================================
-- Main trasferimento beni
-- =================================================================================================
PROCEDURE trasferisciBeni
   (inLocalTransId VARCHAR2,
    inPgInventarioOri NUMBER,
    inPgInventarioDest NUMBER,
    inEsercizio NUMBER,
    inCdTipoCarico VARCHAR2,
    inCdTipoScarico VARCHAR2,
    inDsBuonoCarScar VARCHAR2,
    inDtRegistrazione DATE,
    inFlTrasferisciTutto VARCHAR2,
    inUtente VARCHAR2,
    inCdsDest VARCHAR2,
    inUoDest VARCHAR2) IS

   aPgInventarioDest NUMBER;
   aFlTrasferisciTutto VARCHAR2(1);
   aDtReg varchar2(50);
   aProcedure VARCHAR2(2000);

BEGIN

   -------------------------------------------------------------------------------------------------
   -- La funzione di trasferimento beni è attivata come batch

   aDtReg:='TO_DATE(' || '''' || TO_CHAR(inDtRegistrazione,'DDMMYYYY') || '''' || ',''DDMMYYYY'')';

   IF (inPgInventarioDest IS NULL OR
       inPgInventarioDest = 0) THEN
      aPgInventarioDest:=inPgInventarioOri;
   ELSE
      aPgInventarioDest:=inPgInventarioDest;
   END IF;

   IF inFlTrasferisciTutto IS NULL THEN
      aFlTrasferisciTutto:= 'N';
   ELSE
      aFlTrasferisciTutto:=inFlTrasferisciTutto;
   END IF;

   aProcedure:='CNRCTB400.job_trasferisciBeni(job, pg_exec, next_date, ' ||
                '''' || inLocalTransId || ''',' ||
                inPgInventarioOri || ',' || aPgInventarioDest || ',' ||
                inEsercizio || ',''' || inCdTipoCarico || ''',' ||
                '''' || inCdTipoScarico  || ''',' ||
                '''' || inDsBuonoCarScar  || ''',' ||
                aDtReg || ',''' || aFlTrasferisciTutto || ''',' ||
                '''' || inUtente  || ''',' ||
                '''' || inCdsDest  || ''',' ||
                '''' || inUoDest || ''');';

   IBMUTL210.CREABATCHDINAMICO('Trasferimento Beni',
                               aProcedure,
                               inUtente);

   IBMUTL001.deferred_commit;

   IBMERR001.RAISE_ERR_GENERICO
       ('Operazione in corso. Al completamento l''utente riceverà un messaggio di notifica ' ||
        'dello stato dell''operazione');

END trasferisciBeni;
-- =================================================================================================
-- Cancella un documento di scarico di inventario, con eventualmente la relativa testata ed il bene
-- =================================================================================================
PROCEDURE cancella_variazioni
   (p_esercizio 	number,
    p_inventario 	number,
    n_inventario 	number,
    p_progressivo	number,
    p_buono		number,
    p_utente	 	varchar2,
    p_data 		date,
    segno		varchar2,
    effettuato         In Out NUMBER) IS

   ALTRE_VARIAZIONI 	number;
   VARIAZIONI  		number;
   valore 		number;
   AMM			NUMBER;
   migrato 		char;
   tot_scaricato	char;
   tipo			char;
   DATA_VAR		DATE;
   p_var		number;
   quote_storno		number:=0;
   tipo_canc		char;
Begin
If segno = '-' Then
    tipo:='C';
    tipo_canc:='S';
Else
    tipo:='S';
    tipo_canc:='C';
End If;
   SELECT COUNT(*) INTO ALTRE_VARIAZIONI
   FROM BUONO_CARICO_SCARICO_DETT DETT ,BUONO_CARICO_SCARICO TEST
   WHERE
   DETT.PG_INVENTARIO = p_Inventario 		AND
   DETT.NR_INVENTARIO = n_Inventario 		AND
   DETT.PROGRESSIVO   = p_Progressivo  		AND
   --DETT.ESERCIZIO     = p_ESERCIZIO		AND
   DETT.PG_INVENTARIO = TEST.PG_INVENTARIO 	AND
   DETT.TI_DOCUMENTO  = TEST.TI_DOCUMENTO  	AND
   DETT.ESERCIZIO     = TEST.ESERCIZIO     	AND
   DETT.PG_BUONO_C_S  = TEST.PG_BUONO_C_S	AND
   ((tipo='C' And
   Trunc(DATA_REGISTRAZIONE) > Trunc(p_data)) Or
   (tipo='S' And
   Trunc(DATA_REGISTRAZIONE) >= Trunc(p_data)))   And
   (DETT.PG_BUONO_C_S  > P_BUONO Or
   test.ti_documento = tipo);
  IF ALTRE_VARIAZIONI >0 THEN
    effettuato:=1;
  Else
   Begin
   	SELECT COUNT(*),fl_migrato,fl_totalmente_scaricato INTO VARIAZIONI,migrato,tot_scaricato
   	FROM BUONO_CARICO_SCARICO_DETT DETT ,inventario_beni beni
   	WHERE
   	DETT.PG_INVENTARIO = p_inventario 		AND
   	DETT.NR_INVENTARIO = N_inventario 		AND
   	DETT.PROGRESSIVO   = p_progressivo  		AND
   	-- r.p. viene controllato prima della chiamata
   	--VALORE_AMMORTIZZATO  = 0 			AND
   	DETT.PG_INVENTARIO = beni.pg_Inventario	AND
   	DETT.NR_INVENTARIO = beni.Nr_Inventario	AND
   	DETT.PROGRESSIVO   = beni.Progressivo
   	group by fl_migrato,fl_totalmente_scaricato;
   Exception When No_Data_Found Then
   	variazioni:=0;
   	SELECT fl_migrato,fl_totalmente_scaricato Into migrato,tot_scaricato
   	FROM inventario_beni beni
   	WHERE
   	beni.PG_INVENTARIO = p_inventario 		AND
   	beni.NR_INVENTARIO = N_inventario 		AND
   	beni.PROGRESSIVO   = p_progressivo;
   End;
   Select Max(DATA_REGISTRAZIONE) Into DATA_VAR
   From BUONO_CARICO_SCARICO TEST,BUONO_CARICO_SCARICO_DETT DETT
   Where
   DETT.PG_INVENTARIO = p_Inventario 		AND
   DETT.NR_INVENTARIO = n_Inventario 		AND
   DETT.PROGRESSIVO   = p_Progressivo  		AND
   DETT.PG_INVENTARIO = TEST.PG_INVENTARIO 	AND
   DETT.TI_DOCUMENTO  = TEST.TI_DOCUMENTO  	AND
   DETT.ESERCIZIO     = TEST.ESERCIZIO     	AND
   DETT.PG_BUONO_C_S  = TEST.PG_BUONO_C_S	AND
   Trunc(DATA_REGISTRAZIONE) < Trunc(p_data);

  end if;
  Begin
  if variazioni > 1 Or migrato ='Y' Then
	Select valore_unitario,(valore_iniziale+variazione_piu-variazione_meno),IMPONIBILE_AMMORTAMENTO INTO p_var,valore,AMM
   	FROM BUONO_CARICO_SCARICO_DETT DETT ,inventario_beni beni
   	WHERE
   	DETT.PG_INVENTARIO = p_inventario 		AND
   	DETT.NR_INVENTARIO = N_inventario 		AND
   	DETT.PROGRESSIVO   = p_progressivo  		AND
   	dett.pg_buono_c_s  = p_buono			and
   	dett.TI_DOCUMENTO  = TIPO_CANC 			AND
   	DETT.ESERCIZIO 	   = P_ESERCIZIO		AND
   	DETT.PG_INVENTARIO = beni.pg_Inventario		AND
   	DETT.NR_INVENTARIO = beni.Nr_Inventario		AND
   	DETT.PROGRESSIVO   = beni.Progressivo;
   	if segno ='-' Then
   	   Begin
	   	   Select im_movimento_ammort*(-1) Into quote_storno
	   	   From ammortamento_bene_inv
	   	   Where
	   	     	PG_INVENTARIO = p_Inventario	AND
	   		NR_INVENTARIO = N_inventario	AND
	   		PROGRESSIVO   = p_Progressivo   And
	   		pg_buono_s    = p_buono         And
	   		esercizio     = p_esercizio     And
	   		fl_storno     = 'Y';
	   		delete From ammortamento_bene_inv
	   		where
	   		PG_INVENTARIO = p_Inventario	AND
	   		NR_INVENTARIO = N_inventario	AND
	   		PROGRESSIVO   = p_Progressivo   And
	   		pg_buono_s    = p_buono         And
	   		esercizio     = p_esercizio     And
	   		fl_storno     = 'Y';
   	    Exception When No_Data_Found Then
   	      quote_storno:=0;
   	    End;

	  If valore=0 And tot_scaricato='Y'  Then
               UPDATE INVENTARIO_BENI
               SET    variazione_meno = variazione_meno - P_var,
                      imponibile_ammortamento = imponibile_ammortamento +P_var,
                      valore_ammortizzato = valore_ammortizzato + quote_storno,
                      dt_validita_variazione = Nvl(DATA_VAR,DT_VALIDITA_VARIAZIONE),
                      valore_alienazione =0,
                      fl_totalmente_scaricato='N',
                      duva = SYSDATE,
                      utuv = P_Utente,
                      pg_ver_rec = pg_ver_rec + 1
               WHERE  pg_inventario = p_inventario AND
                      nr_inventario = n_inventario AND
                      progressivo   = p_progressivo;
            Elsif  tot_scaricato='N'  Then
               If AMM>0 Then
               		UPDATE INVENTARIO_BENI
               		SET    	variazione_meno = variazione_meno - P_var,
                      		imponibile_ammortamento = imponibile_ammortamento +P_var,
                      		valore_ammortizzato = valore_ammortizzato + quote_storno,
                      		dt_validita_variazione = Nvl(DATA_VAR,DT_VALIDITA_VARIAZIONE),
                      		duva = SYSDATE,
                      		utuv = P_Utente,
                      		pg_ver_rec = pg_ver_rec + 1
               		WHERE  	pg_inventario = p_inventario AND
                      		nr_inventario = n_inventario AND
                      		progressivo   = p_progressivo;
                 Else
                      UPDATE INVENTARIO_BENI
               		SET    	variazione_meno = variazione_meno - P_var,
                      		--imponibile_ammortamento = imponibile_ammortamento +P_var,
                      		dt_validita_variazione = Nvl(DATA_VAR,DT_VALIDITA_VARIAZIONE),
                      		duva = SYSDATE,
                      		utuv = P_Utente,
                      		pg_ver_rec = pg_ver_rec + 1
               		WHERE  	pg_inventario = p_inventario AND
                      		nr_inventario = n_inventario AND
                      		progressivo   = p_progressivo;
                  End If;
             Else
                     effettuato  :=1;
             End If;

         Else
            If AMM-P_VAR>0 Then
                  UPDATE INVENTARIO_BENI
               SET    variazione_piu = variazione_piu - P_var,
                      imponibile_ammortamento = imponibile_ammortamento -P_var,
                      dt_validita_variazione = Nvl(DATA_VAR,DT_VALIDITA_VARIAZIONE),
                      duva = SYSDATE,
                      utuv = P_Utente,
                      pg_ver_rec = pg_ver_rec + 1
               WHERE  pg_inventario = p_inventario AND
                      nr_inventario = n_inventario AND
                      progressivo   = p_progressivo;
            Else
           	UPDATE INVENTARIO_BENI
               SET    variazione_piu = variazione_piu - P_var,
                      dt_validita_variazione = Nvl(DATA_VAR,DT_VALIDITA_VARIAZIONE),
                      duva = SYSDATE,
                      utuv = P_Utente,
                      pg_ver_rec = pg_ver_rec + 1
               WHERE  pg_inventario = p_inventario AND
                      nr_inventario = n_inventario AND
                      progressivo   = p_progressivo;
            End If;
         end if;
     effettuato  :=0;
  Elsif variazioni =1 And migrato ='N' Then
     effettuato  :=0; -- caso che rimane solo il carico iniziale
  Else
      effettuato  :=1;
  end if;
Exception When No_Data_Found Then
            effettuato  :=1;
End;

END cancella_variazioni;
-- =================================================================================================
-- Main Ammortamento Beni
-- =================================================================================================
Procedure AmmortamentoBeni(
p_esercizio 	number,
p_cds		varchar2,
p_utente 	varchar2)Is

  aProcedure VARCHAR2(2000);

BEGIN



   aProcedure:='CNRCTB400.job_ammortamentoBeniInv(job, pg_exec, next_date, ' ||
                p_esercizio || ',' ||
                '''' ||  p_cds || ''',' ||
                 '''' || p_utente   || ''');';

   IBMUTL210.CREABATCHDINAMICO('Ammortamento beni',
                               aProcedure,
                               p_utente);

   IBMUTL001.deferred_commit;

  /* IBMERR001.RAISE_ERR_GENERICO
       ('Operazione sottomessa per esecuzione. Al completamento l''utente riceverà un messaggio di notifica ' ||
        'dello stato dell''operazione');*/
Exception When Others Then
  Dbms_Output.PUT_LINE('ERRORE '||SQLCODE||' '||Sqlerrm);
END AmmortamentoBeni;

Procedure job_ammortamentoBeniInv
  (job NUMBER,
   pg_exec NUMBER,
   next_date DATE,
   aEs NUMBER,
   aCdCds VARCHAR2,
   aUser VARCHAR2) IS
Begin

   IBMUTL210.logStartExecutionUpd(pg_exec, LOG_TIPO_AMMBENI, job, 'Richiesta utente:' || aUser,
                              'Calcolo Ammortamento beni. Start:' || TO_CHAR(sysdate,'YYYY/MM/DD HH-MI-SS'));
   -------------------------------------------------------------------------------------------------
   -- La funzione di ammortamento dei beni è attivata come batch
	CNRCTB400.annullaAmmortBeniInv(pg_exec,aEs,aCdCds,aUser,Sysdate);


   -------------------------------------------------------------------------------------------------
   -- La funzione di ammortamento dei beni è attivata come batch
	CNRCTB400.ammortamentoBeniInv(pg_exec,aEs,aCdCds,aUser,Sysdate);


      -- Messaggio di operazione completata ad utente
 /*     IBMUTL205.LOGINF('Calcolo Ammortamento beni',
                       'Calcolo Ammortamento beni ' ||' CDS: '||aCdCds||' '||To_Char(sysdate,'DD/MM/YYYY HH:MI:SS'),
                       'Operazione completata con successo',aUser);
*/
End job_ammortamentoBeniInv;
-- =================================================================================================
-- Crea un documento di carico di inventario, con i relativi dettagli e le eventuali associazioni
-- con i documenti.
-- =================================================================================================
PROCEDURE updCaricoBeniAumentoValDoc
   (
    localTransId VARCHAR2,
    aPgInventario NUMBER,
    aEsercizio NUMBER,
    aPgBuonoCaricoScarico NUMBER,
    aDsBuonoCaricoScarico VARCHAR2,
    aCdTipoCaricoScarico VARCHAR2,
    aPgDocumento number,
    aUtente VARCHAR2,
    aDtRegistrazione DATE,
    aMessaggio IN OUT VARCHAR2
   ) IS

   pg_inv NUMBER;
   cont INTEGER;
   aStatoCoge CHAR(1);
   eseguiLock CHAR(1);
   aMessaggioBase VARCHAR2(100);
   aMessaggioBaseSegnala VARCHAR2(500);
   aMessaggioDettSegnala VARCHAR2(3900);

   aBuonoCaricoScarico BUONO_CARICO_SCARICO%ROWTYPE;
   aBuonoCaricoScaricoDett BUONO_CARICO_SCARICO_DETT%ROWTYPE;
   aAssInvBeneFattura ASS_INV_BENE_FATTURA%ROWTYPE;
   aRecInventarioBeni INVENTARIO_BENI%ROWTYPE;
   progressivo_riga number:=0;
BEGIN

   eseguiLock:='Y';

   -------------------------------------------------------------------------------------------------
   -- Valorizzazione messaggi da esporre in output

   aMessaggioBase:='Operazione completata con successo. ';
   aMessaggioBaseSegnala:='Attenzione, per i seguenti beni non Š stato modificato automaticamente ' ||
                          'l''imponibile ammortamento in quanto non risulta allineato al suo valore assestato, ' ||
                          'procedere manualmente.';
   aMessaggioDettSegnala:=NULL;

   -------------------------------------------------------------------------------------------------
   -- Inserimento testata BUONO_CARICO_SCARICO (TIPO = carico)

   aBuonoCaricoScarico:=NULL;

   aBuonoCaricoScarico.pg_inventario:=aPgInventario;
   aBuonoCaricoScarico.ti_documento:=BUONO_CARICO;
   aBuonoCaricoScarico.esercizio:=aEsercizio;
   aBuonoCaricoScarico.pg_buono_c_s:=aPgBuonoCaricoScarico;
   aBuonoCaricoScarico.ds_buono_carico_scarico:=aDsBuonoCaricoScarico;
   aBuonoCaricoScarico.data_registrazione:=aDtRegistrazione;
   aBuonoCaricoScarico.cd_tipo_carico_scarico:=aCdTipoCaricoScarico;
   aBuonoCaricoScarico.dacr:=SYSDATE;
   aBuonoCaricoScarico.utcr:=aUtente;
   aBuonoCaricoScarico.duva:=SYSDATE;
   aBuonoCaricoScarico.utuv:=aUtente;
   aBuonoCaricoScarico.pg_ver_rec:=1;

   insBuonoCaricoScarico(aBuonoCaricoScarico);

   -------------------------------------------------------------------------------------------------
   -- Ciclo inserimento dettaglio BUONO_CARICO_SCARICO_DETT e ASS_INV_BENE_FATTURA

   cont :=0;

   BEGIN

      FOR riga_group_invetario_beni_apg IN
          (SELECT PG_INVENTARIO, NR_INVENTARIO, PROGRESSIVO, SUM(VARIAZIONE_PIU) variazione_piu
           FROM   INVENTARIO_BENI_APG
           WHERE  TRIM(LOCAL_TRANSACTION_ID) = TRIM (localTransId)
               and pg_buono_c_s < 0
           GROUP BY PG_INVENTARIO, NR_INVENTARIO, PROGRESSIVO)

      LOOP

         cont := cont+1;

         -- inserimento su tabella BUONO_CARICO_SCARICO_DETT ---------------------------------------

         BEGIN

            aStatoCoge:='X';

            aBuonoCaricoScaricoDett:=NULL;

            aBuonoCaricoScaricoDett.pg_inventario:=aPgInventario;
            aBuonoCaricoScaricoDett.ti_documento:=BUONO_CARICO;
            aBuonoCaricoScaricoDett.esercizio:=aEsercizio;
            aBuonoCaricoScaricoDett.pg_buono_c_s:=aPgBuonoCaricoScarico;
            aBuonoCaricoScaricoDett.nr_inventario:=riga_group_invetario_beni_apg.NR_INVENTARIO;
            aBuonoCaricoScaricoDett.progressivo:=riga_group_invetario_beni_apg.PROGRESSIVO;
            aBuonoCaricoScaricoDett.intervallo:=cont || '-' || cont;
            aBuonoCaricoScaricoDett.quantita:=1;
            aBuonoCaricoScaricoDett.valore_unitario:=riga_group_invetario_beni_apg.VARIAZIONE_PIU;
            aBuonoCaricoScaricoDett.dacr:=SYSDATE;
            aBuonoCaricoScaricoDett.utcr:=aUtente;
            aBuonoCaricoScaricoDett.duva:=SYSDATE;
            aBuonoCaricoScaricoDett.utuv:=aUtente;
            aBuonoCaricoScaricoDett.pg_ver_rec:=1;
            aBuonoCaricoScaricoDett.stato_coge:=aStatoCoge;
	    aBuonoCaricoScaricoDett.stato_coge_quote:='X';
            insBuonoCaricoScaricoDett(aBuonoCaricoScaricoDett);

         END;

         -- inserimento su tabella ASS_INV_BENE_FATTURA --------------------------------------------

         BEGIN

            FOR riga_invetario_beni_apg IN
                    (SELECT *
                     FROM   INVENTARIO_BENI_APG
                     where  TRIM(LOCAL_TRANSACTION_ID) =TRIM(localTransId)
                        and pg_buono_c_s < 0
                        and PG_INVENTARIO = riga_group_invetario_beni_apg.PG_INVENTARIO
                        and NR_INVENTARIO = riga_group_invetario_beni_apg.NR_INVENTARIO
                        and PROGRESSIVO = riga_group_invetario_beni_apg.PROGRESSIVO)

               LOOP
		Select NVL(Max(PG_RIGA)+1,1) into progressivo_riga
                FROM   ass_inv_bene_fattura;
                  aAssInvBeneFattura:=NULL;

                  aAssInvBeneFattura.cd_cds_doc_gen:=riga_invetario_beni_apg.CD_CDS;
                  aAssInvBeneFattura.cd_uo_doc_gen:=riga_invetario_beni_apg.CD_UNITA_ORGANIZZATIVA;
                  aAssInvBeneFattura.esercizio_doc_gen:=riga_invetario_beni_apg.ESERCIZIO;
                  aAssInvBeneFattura.pg_documento_generico:=aPgDocumento;
                  aAssInvBeneFattura.progressivo_riga_doc_gen:=riga_invetario_beni_apg.PROGRESSIVO_RIGA;
                  aAssInvBeneFattura.cd_tipo_documento_amm:=riga_invetario_beni_apg.cd_tipo_documento_amm;
                  aAssInvBeneFattura.pg_inventario:=riga_invetario_beni_apg.PG_INVENTARIO;
                  aAssInvBeneFattura.nr_inventario:=riga_invetario_beni_apg.NR_INVENTARIO;
                  aAssInvBeneFattura.progressivo:=riga_invetario_beni_apg.PROGRESSIVO;
                  aAssInvBeneFattura.dacr:=SYSDATE;
                  aAssInvBeneFattura.utcr:=aUtente;
                  aAssInvBeneFattura.duva:=SYSDATE;
                  aAssInvBeneFattura.utuv:=aUtente;
                  aAssInvBeneFattura.pg_ver_rec:=1;
		  aAssInvBeneFattura.pg_riga:=progressivo_riga;
		  aAssInvBeneFattura.ESERCIZIO:=riga_invetario_beni_apg.ESERCIZIO;
		  aAssInvBeneFattura.PG_BUONO_C_S:=aPgBuonoCaricoScarico;
		  aAssInvBeneFattura.TI_DOCUMENTO:=riga_invetario_beni_apg.TI_DOCUMENTO;

                  insAssInvBeneFattura(aAssInvBeneFattura);

               END LOOP;

         END;

         -- Aggiornamento INVENTARIO_BENI ----------------------------------------------------------

         BEGIN

            -- Lettura del bene per verificare se aggiornare o meno il campo imponibile_ammortamento

            aRecInventarioBeni:=getInventarioBeni(riga_group_invetario_beni_apg.pg_inventario,
                                                  riga_group_invetario_beni_apg.nr_inventario,
                                                  riga_group_invetario_beni_apg.progressivo,
                                                  eseguiLock);

            IF (aRecInventarioBeni.imponibile_ammortamento = aRecInventarioBeni.valore_iniziale +
                                                             aRecInventarioBeni.variazione_piu -
                                                             aRecInventarioBeni.variazione_meno) THEN

               UPDATE INVENTARIO_BENI
               SET    variazione_piu = variazione_piu + riga_group_invetario_beni_apg.variazione_piu,
                      imponibile_ammortamento = imponibile_ammortamento + riga_group_invetario_beni_apg.variazione_piu,
                      dt_validita_variazione = aDtRegistrazione,
                      duva = SYSDATE,
                      utuv = aUtente,
                      pg_ver_rec = pg_ver_rec + 1
               WHERE  pg_inventario= riga_group_invetario_beni_apg.pg_inventario AND
                      nr_inventario= riga_group_invetario_beni_apg.nr_inventario AND
                      progressivo = riga_group_invetario_beni_apg.progressivo;
            ELSE

               UPDATE INVENTARIO_BENI
               SET    variazione_piu = variazione_piu + riga_group_invetario_beni_apg.variazione_piu,
                      dt_validita_variazione = aDtRegistrazione,
                      duva = SYSDATE,
                      utuv = aUtente,
                      pg_ver_rec = pg_ver_rec + 1
               WHERE  pg_inventario= riga_group_invetario_beni_apg.pg_inventario AND
                      nr_inventario= riga_group_invetario_beni_apg.nr_inventario AND
                      progressivo = riga_group_invetario_beni_apg.progressivo;
                      -- r.p. 13/02/2006 da verificare per segnalare i beni per cui non è stato possibile
                      -- aggiornare l'ammortamento
		if aRecInventarioBeni.fl_ammortamento = 'Y' Then
               		IF aMessaggioDettSegnala IS NULL THEN
                  		aMessaggioDettSegnala:='Bene: ' || riga_group_invetario_beni_apg.pg_inventario || '-' ||
                                         riga_group_invetario_beni_apg.nr_inventario || '-' ||
                                         riga_group_invetario_beni_apg.progressivo || CHR(10);
               		ELSE
                  		aMessaggioDettSegnala:=aMessaggioDettSegnala ||
                                         'Bene: ' || riga_group_invetario_beni_apg.pg_inventario || '-' ||
                                         riga_group_invetario_beni_apg.nr_inventario || '-' ||
                                         riga_group_invetario_beni_apg.progressivo || CHR(10);
               		END IF;
		end If;
            END IF;

         END;

      END LOOP;

   END;

   -- Cancellazione della tabella di appoggio

   cancellaInventarioBeniApg(localTransId);

   -- Composizione del messaggio

   IF aMessaggioDettSegnala IS NULL THEN
      aMessaggio:=aMessaggioBase;
   ELSE
      aMessaggio:=SUBSTR(aMessaggioBase || CHR(10) || aMessaggioBaseSegnala || CHR(10) || aMessaggioDettSegnala, 1, 3900);
   END IF;

END updCaricoBeniAumentoValDoc;
end;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy