ALTER TABLE TBCFOP_INVERSO_REGRA
    ADD ESTOQUE_LANCAMENTO INTEGER DEFAULT 0;

COMMENT ON COLUMN TBCFOP_INVERSO_REGRA.ESTOQUE_LANCAMENTO IS
'0 - REGISTAR ESTOQUE NO LANCAMENTO DA NOTA;
1 - NAO REGISTRAR O ESTOQUE NO LANCAMENTO DA NOTA;';

/************************************************************************************/

UPDATE TBCFOP_INVERSO_REGRA
    SET ESTOQUE_LANCAMENTO = 0
    WHERE ESTOQUE_LANCAMENTO IS NULL;

/************************************************************************************/
/************************************************************************************/

SET TERM ^ ;

CREATE OR ALTER trigger ttbcfop_inverso_regra_b01u for tbcfop_inverso_regra
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(5000);
DECLARE VARIABLE OLD_CFOP_CODIGO VARCHAR(500);
DECLARE VARIABLE NEW_CFOP_CODIGO VARCHAR(500);
DECLARE VARIABLE OLD_CFOP_INVERSO VARCHAR(500);
DECLARE VARIABLE NEW_CFOP_INVERSO VARCHAR(500);
DECLARE VARIABLE OLD_ESTABELECIMENTO VARCHAR(500);
DECLARE VARIABLE NEW_ESTABELECIMENTO VARCHAR(500);
DECLARE VARIABLE OLD_OPERACAO_FISCAL VARCHAR(500);
DECLARE VARIABLE NEW_OPERACAO_FISCAL VARCHAR(500);
BEGIN

    HISTORICO = '';

    OLD_CFOP_CODIGO     = COALESCE((SELECT FIRST 1 A.CODIGO||' - '||A.DESCRICAO FROM TBCFOP A WHERE A.CODIGO = OLD.CFOP_CODIGO), '');
    NEW_CFOP_CODIGO     = COALESCE((SELECT FIRST 1 A.CODIGO||' - '||A.DESCRICAO FROM TBCFOP A WHERE A.CODIGO = NEW.CFOP_CODIGO), '');
    OLD_CFOP_INVERSO    = COALESCE((SELECT FIRST 1 B.CODIGO||' - '||B.DESCRICAO FROM TBCFOP B WHERE B.CODIGO = OLD.CFOP_INVERSO_CODIGO), '');
    NEW_CFOP_INVERSO    = COALESCE((SELECT FIRST 1 B.CODIGO||' - '||B.DESCRICAO FROM TBCFOP B WHERE B.CODIGO = NEW.CFOP_INVERSO_CODIGO), '');
    OLD_ESTABELECIMENTO = COALESCE((SELECT FIRST 1 FN_LPAD(C.CODIGO, 4, '0')||' - '||C.RAZAOSOCIAL FROM TBESTABELECIMENTO C WHERE C.CODIGO = OLD.ESTABELECIMENTO_ID), '');
    NEW_ESTABELECIMENTO = COALESCE((SELECT FIRST 1 FN_LPAD(C.CODIGO, 4, '0')||' - '||C.RAZAOSOCIAL FROM TBESTABELECIMENTO C WHERE C.CODIGO = NEW.ESTABELECIMENTO_ID), '');
    OLD_OPERACAO_FISCAL = COALESCE((SELECT FIRST 1 D.CODIGO||' - '||D.DESCRICAO FROM TBOPERACAO D WHERE D.CODIGO = OLD.OPERACAO_FISCAL), '');
    NEW_OPERACAO_FISCAL = COALESCE((SELECT FIRST 1 D.CODIGO||' - '||D.DESCRICAO FROM TBOPERACAO D WHERE D.CODIGO = NEW.OPERACAO_FISCAL), '');

    IF (OLD.CFOP_CODIGO IS DISTINCT FROM NEW.CFOP_CODIGO) THEN
    BEGIN
        HISTORICO = HISTORICO||' CFOP:'||OLD_CFOP_CODIGO||'->'||NEW_CFOP_CODIGO;
    END

    IF (OLD.ESTABELECIMENTO_ID IS DISTINCT FROM NEW.ESTABELECIMENTO_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||' ESTABELECIMENTO:'||OLD_ESTABELECIMENTO||'->'||NEW_ESTABELECIMENTO;
    END

    IF (OLD.CFOP_INVERSO_CODIGO IS DISTINCT FROM NEW.CFOP_INVERSO_CODIGO) THEN
    BEGIN
        HISTORICO = HISTORICO||' CFOP INVERSO:'||OLD_CFOP_INVERSO||'->'||NEW_CFOP_INVERSO;
    END

    IF (OLD.OPERACAO_FISCAL IS DISTINCT FROM NEW.OPERACAO_FISCAL) THEN
    BEGIN
        HISTORICO = HISTORICO||' OP.FISCAL:'||OLD_OPERACAO_FISCAL||'->'||NEW_OPERACAO_FISCAL;
    END

    IF (OLD.ESTOQUE_LANCAMENTO IS DISTINCT FROM NEW.ESTOQUE_LANCAMENTO) THEN
    BEGIN
        HISTORICO = HISTORICO||' EST.LANC:'||OLD.ESTOQUE_LANCAMENTO||'->'||NEW.ESTOQUE_LANCAMENTO;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        HISTORICO = 'CFOP INVERSO: '||NEW_CFOP_INVERSO||' ALTERADO:'||HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBCFOP', CAST(FN_REPLACE(OLD.CFOP_CODIGO, '.', '') AS INTEGER), FN_ELIPSE(HISTORICO, 500));
    END
END
^

SET TERM ; ^

/************************************************************************************/
/************************************************************************************/
/************************************************************************************/

SET TERM ^ ;

CREATE OR ALTER procedure SP_NF_ITEM_ESTOQUE (
    ORIGEM varchar(3),
    NF_ITEM_ID integer,
    NF_ID integer,
    ACAO integer)
as
declare variable CONTROLE integer;
declare variable NUMERO_NOTAFISCAL integer;
declare variable ESTABELECIMENTO_CODIGO integer;
declare variable LOCALIZACAO_CODIGO integer;
declare variable PRODUTO_CODIGO integer;
declare variable DATA date;
declare variable TIPO char(1);
declare variable QUANTIDADE numeric(10,5);
declare variable T01 numeric(10,5);
declare variable T02 numeric(10,5);
declare variable T03 numeric(10,5);
declare variable T04 numeric(10,5);
declare variable T05 numeric(10,5);
declare variable T06 numeric(10,5);
declare variable T07 numeric(10,5);
declare variable T08 numeric(10,5);
declare variable T09 numeric(10,5);
declare variable T10 numeric(10,5);
declare variable T11 numeric(10,5);
declare variable T12 numeric(10,5);
declare variable T13 numeric(10,5);
declare variable T14 numeric(10,5);
declare variable T15 numeric(10,5);
declare variable T16 numeric(10,5);
declare variable T17 numeric(10,5);
declare variable T18 numeric(10,5);
declare variable T19 numeric(10,5);
declare variable T20 numeric(10,5);
declare variable OPERACAO_CODIGO varchar(3);
declare variable CUSTO_UNITARIO numeric(10,5);
declare variable EMPRESA_CODIGO integer;
declare variable VEMPRESA_CODIGO integer;
declare variable VALOR_UNITARIO numeric(18,8);
declare variable VCUSTO_MEDIO integer;
declare variable NF_EXTERNO integer;
declare variable NF_EXTERNO_ITEM_CONTROLE integer;
declare variable NFE integer;
declare variable NFE_ITEM_CONTROLE integer;
declare variable NFS integer;
declare variable NFS_ITEM_CONTROLE integer;
declare variable PDV_CFE_ID integer;
declare variable PDV_CFE_ITEM_ID integer;
declare variable NF_CONSIGNACAO integer;
declare variable NF_CONSIGNACAO_ITEM integer;
declare variable CONTROLE_ESTOQUE_EXTERNO char(1);
declare variable EXIGE_NF_REFERENCIA char(1);
declare variable CONTROLE_ESTOQUE char(1);
declare variable CONTROLE_CONSIGNACAO char(1);
declare variable BLOQ_MOV_EST char(1);
declare variable CONTROLE_TRANSACAO_ITEM_OLD integer;
BEGIN

  IF (ORIGEM = 'NFS') THEN
      BEGIN

      SELECT T.CONTROLE, T.NUMERO_NOTAFISCAL, T.ESTABELECIMENTO_CODIGO,
            T.LOCALIZACAO_CODIGO, T.DATA_EMISSAO, T.PRODUTO_CODIGO, T.QUANTIDADE,
            T.T01, T.T02, T.T03, T.T04, T.T05, T.T06, T.T07, T.T08, T.T09, T.T10, T.T11, T.T12,
            T.T13, T.T14, T.T15, T.T16, T.T17, T.T18, T.T19, T.T20, T.OPERACAO_CODIGO, T.EMPRESA_CODIGO,
            T.VALOR_UNITARIO, T.VALOR_CUSTO, T.NF_EXTERNO, T.NF_EXTERNO_ITEM_CONTROLE,
            T.NFE, T.NFE_ITEM_CONTROLE, T.NF_CONSIGNACAO, T.NF_CONSIGNACAO_ITEM,
            O.CONTROLE_ESTOQUE_EXTERNO, O.EXIGE_NF_REFERENCIA, O.CONTROLE_ESTOQUE, O.CONTROLE_CONSIGNACAO
            FROM TBNFS_ITEM T, TBOPERACAO O
           WHERE O.CODIGO = T.OPERACAO_CODIGO
           AND T.NFS_CONTROLE = :NF_ID
           AND T.CONTROLE = :NF_ITEM_ID
      INTO :CONTROLE, :NUMERO_NOTAFISCAL, :ESTABELECIMENTO_CODIGO, :LOCALIZACAO_CODIGO, :DATA, :PRODUTO_CODIGO, :QUANTIDADE,
           :T01, :T02, :T03, :T04, :T05, :T06, :T07, :T08, :T09, :T10, :T11, :T12, :T13, :T14, :T15, :T16, :T17, :T18, :T19, :T20,
           :OPERACAO_CODIGO, :EMPRESA_CODIGO, :VALOR_UNITARIO, :CUSTO_UNITARIO, :NF_EXTERNO, :NF_EXTERNO_ITEM_CONTROLE,
           :NFE, :NFE_ITEM_CONTROLE, :NF_CONSIGNACAO, :NF_CONSIGNACAO_ITEM,
           :CONTROLE_ESTOQUE_EXTERNO, :EXIGE_NF_REFERENCIA, :CONTROLE_ESTOQUE, :CONTROLE_CONSIGNACAO;

       IF(ACAO = 1) THEN -- INCLUSAO
       BEGIN

           IF(CONTROLE_ESTOQUE = '1' OR CONTROLE_ESTOQUE_EXTERNO = '1') THEN
           BEGIN
                VCUSTO_MEDIO     = 0;
                VEMPRESA_CODIGO  = 0;
                TIPO             = 'B';

                IF(CONTROLE_ESTOQUE = '1') THEN
                   TIPO = 'S';
    
                        /*  ATUALIZA TABELAS DE ESTOQUE DE TERCEIROS POR EMPRESA */
                        BLOQ_MOV_EST = (SELECT TRIM(FN_PARAMETRO('SISTEMA.5')) FROM RDB$DATABASE);
                        IF(BLOQ_MOV_EST = '1') THEN
                        BEGIN
                           IF(CONTROLE_ESTOQUE_EXTERNO = '1') THEN
                           BEGIN
                             IF(EXIGE_NF_REFERENCIA = '1') THEN
                                BEGIN
                                    IF(CONTROLE_CONSIGNACAO <> '1') THEN
                                       BEGIN
                                        VEMPRESA_CODIGO     = (SELECT FIRST 1 A.EMPRESA_CODIGO FROM TBNFE_ITEM A, TBNFE B WHERE A.NFE_CONTROLE = B.CONTROLE AND A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_CODIGO AND A.NUMERO_NOTAFISCAL = :NF_EXTERNO AND A.CONTROLE = :NF_EXTERNO_ITEM_CONTROLE);
                                        VCUSTO_MEDIO        = 0;
                                       END
            
                                    IF(CONTROLE_CONSIGNACAO = '1') THEN
                                       BEGIN
                                       TIPO                 = 'B';
                                       VEMPRESA_CODIGO      =  EMPRESA_CODIGO;
                                       END
                                END
                            IF(EXIGE_NF_REFERENCIA = '0') THEN
                                BEGIN
                                VEMPRESA_CODIGO  =  EMPRESA_CODIGO;
                                VCUSTO_MEDIO     = VALOR_UNITARIO;
                                END
                           END
                        END

                /* REGISTRA TRANSACAO DE ESTOQUE */
                EXECUTE PROCEDURE SPI_ESTOQUE_SALDO(
                ESTABELECIMENTO_CODIGO, LOCALIZACAO_CODIGO, PRODUTO_CODIGO, TIPO, DATA, QUANTIDADE,
                T01, T02, T03, T04, T05, T06, T07, T08, T09, T10, T11, T12,
                T13, T14, T15, T16, T17, T18, T19, T20, 0, NUMERO_NOTAFISCAL, CONTROLE, 0,
                OPERACAO_CODIGO, NULL, NULL, 0, CUSTO_UNITARIO, FN_CURRENT_USER_ID(), CURRENT_DATE,
                0, '', '', 0, 0, NULL, VEMPRESA_CODIGO, VCUSTO_MEDIO);
           END

           /* BAIXAR SALDO DA PECA DO LOTE */
           IF (:CONTROLE > 0) THEN
               BEGIN
                EXECUTE PROCEDURE SPU_SALDO_PECA(:CONTROLE, 1);
               END

           IF (:NF_EXTERNO_ITEM_CONTROLE > 0 OR :NFE_ITEM_CONTROLE > 0) THEN
               BEGIN
                  UPDATE TBNFE_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE - :QUANTIDADE,
                  T01 = T01 - :T01, T02 = T02 - :T02, T03 = T03 - :T03, T04 = T04 - :T04,
                  T05 = T05 - :T05, T06 = T06 - :T06, T07 = T07 - :T07, T08 = T08 - :T08,
                  T09 = T09 - :T09, T10 = T10 - :T10, T11 = T11 - :T11, T12 = T12 - :T12,
                  T13 = T13 - :T13, T14 = T14 - :T14, T15 = T15 - :T15, T16 = T16 - :T16,
                  T17 = T17 - :T17, T18 = T18 - :T18, T19 = T19 - :T19, T20 = T20 - :T20
                  WHERE NFE_ITEM_CONTROLE = IIF(:NF_EXTERNO_ITEM_CONTROLE>0,:NF_EXTERNO_ITEM_CONTROLE,:NFE_ITEM_CONTROLE);
               END
        
           IF (:NF_CONSIGNACAO_ITEM > 0) THEN
               BEGIN
                  UPDATE TBNFS_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE - :QUANTIDADE,
                  T01 = T01 - :T01, T02 = T02 - :T02, T03 = T03 - :T03, T04 = T04 - :T04,
                  T05 = T05 - :T05, T06 = T06 - :T06, T07 = T07 - :T07, T08 = T08 - :T08,
                  T09 = T09 - :T09, T10 = T10 - :T10, T11 = T11 - :T11, T12 = T12 - :T12,
                  T13 = T13 - :T13, T14 = T14 - :T14, T15 = T15 - :T15, T16 = T16 - :T16,
                  T17 = T17 - :T17, T18 = T18 - :T18, T19 = T19 - :T19, T20 = T20 - :T20
                  WHERE NFS_ITEM_CONTROLE = :NF_CONSIGNACAO_ITEM;
               END

    END ELSE

    IF (ACAO = 2) THEN -- ALTERAÇÃO
        BEGIN

          /* DESFAZER BAIXAR DE SALDO DA PECA DO LOTE */
          EXECUTE PROCEDURE SPU_SALDO_PECA(CONTROLE, 2);
          /* EXCLUI TRANSACAO DE ESTOQUE */
          EXECUTE PROCEDURE SPD_ESTOQUE_TRANSACAO2(ESTABELECIMENTO_CODIGO, LOCALIZACAO_CODIGO, DATA, PRODUTO_CODIGO, NUMERO_NOTAFISCAL, 0, CONTROLE, 0, 0, 0, 0);

           IF (:NF_EXTERNO_ITEM_CONTROLE > 0 OR :NFE_ITEM_CONTROLE > 0) THEN
               BEGIN
                  UPDATE TBNFE_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE + :QUANTIDADE,
                  T01 = T01 + :T01, T02 = T02 + :T02, T03 = T03 + :T03, T04 = T04 + :T04,
                  T05 = T05 + :T05, T06 = T06 + :T06, T07 = T07 + :T07, T08 = T08 + :T08,
                  T09 = T09 + :T09, T10 = T10 + :T10, T11 = T11 + :T11, T12 = T12 + :T12,
                  T13 = T13 + :T13, T14 = T14 + :T14, T15 = T15 + :T15, T16 = T16 + :T16,
                  T17 = T17 + :T17, T18 = T18 + :T18, T19 = T19 + :T19, T20 = T20 + :T20
                  WHERE NFE_ITEM_CONTROLE = IIF(:NF_EXTERNO_ITEM_CONTROLE>0,:NF_EXTERNO_ITEM_CONTROLE,:NFE_ITEM_CONTROLE);
               END
        
           IF (:NF_CONSIGNACAO_ITEM > 0) THEN
               BEGIN
                  UPDATE TBNFS_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE + :QUANTIDADE,
                  T01 = T01 + :T01, T02 = T02 + :T02, T03 = T03 + :T03, T04 = T04 + :T04,
                  T05 = T05 + :T05, T06 = T06 + :T06, T07 = T07 + :T07, T08 = T08 + :T08,
                  T09 = T09 + :T09, T10 = T10 + :T10, T11 = T11 + :T11, T12 = T12 + :T12,
                  T13 = T13 + :T13, T14 = T14 + :T14, T15 = T15 + :T15, T16 = T16 + :T16,
                  T17 = T17 + :T17, T18 = T18 + :T18, T19 = T19 + :T19, T20 = T20 + :T20
                  WHERE NFS_ITEM_CONTROLE = :NF_CONSIGNACAO_ITEM;
               END



            -- REMOVENDO COTA DO CCUSTO
            UPDATE TBCCUSTO_COTA_DETALHE C SET C.STATUSEXCLUSAO = '1' WHERE C.TABELA = 'NFS' AND C.TABELA_ID = :CONTROLE;
        END

      END -- FIM PARA NFS



  IF (ORIGEM = 'NFE') THEN
      BEGIN

      SELECT T.CONTROLE, T.NUMERO_NOTAFISCAL, T.ESTABELECIMENTO_CODIGO,
            T.LOCALIZACAO_CODIGO, T.DATA_ENTRADA, T.PRODUTO_CODIGO, T.QUANTIDADE,
            T.T01, T.T02, T.T03, T.T04, T.T05, T.T06, T.T07, T.T08, T.T09, T.T10, T.T11, T.T12,
            T.T13, T.T14, T.T15, T.T16, T.T17, T.T18, T.T19, T.T20, T.OPERACAO_CODIGO, T.EMPRESA_CODIGO,
            T.VALOR_UNITARIO, T.VALOR_CUSTO, T.NF_EXTERNO, T.NF_EXTERNO_ITEM_CONTROLE,
            T.NFS, T.NFS_ITEM_CONTROLE, T.PDV_CFE_ID, T.PDV_CFE_ITEM_ID,
            O.CONTROLE_ESTOQUE_EXTERNO, O.EXIGE_NF_REFERENCIA, O.CONTROLE_ESTOQUE
            FROM TBNFE_ITEM T, TBOPERACAO O
           WHERE O.CODIGO = T.OPERACAO_CODIGO
           AND NFE_CONTROLE = :NF_ID
           AND CONTROLE = :NF_ITEM_ID
           AND T.LOCALIZACAO_CODIGO > 0
      INTO :CONTROLE, :NUMERO_NOTAFISCAL, :ESTABELECIMENTO_CODIGO, :LOCALIZACAO_CODIGO, :DATA, :PRODUTO_CODIGO, :QUANTIDADE,
           :T01, :T02, :T03, :T04, :T05, :T06, :T07, :T08, :T09, :T10, :T11, :T12, :T13, :T14, :T15, :T16, :T17, :T18, :T19, :T20,
           :OPERACAO_CODIGO, :EMPRESA_CODIGO, :VALOR_UNITARIO, :CUSTO_UNITARIO, :NF_EXTERNO, :NF_EXTERNO_ITEM_CONTROLE,
           :NFS, :NFS_ITEM_CONTROLE, :PDV_CFE_ID, :PDV_CFE_ITEM_ID,
           :CONTROLE_ESTOQUE_EXTERNO, :EXIGE_NF_REFERENCIA, :CONTROLE_ESTOQUE;


       IF (ACAO = 1) THEN -- INCLUSAO
           BEGIN

               IF(CONTROLE_ESTOQUE = '1' OR CONTROLE_ESTOQUE_EXTERNO = '1') THEN
               BEGIN
    
                   VCUSTO_MEDIO     = 0;
                   VEMPRESA_CODIGO  = 0;
                   TIPO    = 'B';
                   IF(CONTROLE_ESTOQUE = 1) THEN
                      TIPO = 'E';
        
                               /*  ATUALIZA TABELAS DE ESTOQUE DE TERCEIROS POR EMPRESA */
                               BLOQ_MOV_EST = (SELECT TRIM(FN_PARAMETRO('SISTEMA.5')) FROM RDB$DATABASE);
                               IF(BLOQ_MOV_EST = '1') THEN
                               BEGIN
                                   IF(CONTROLE_ESTOQUE_EXTERNO = 1) THEN
                                   BEGIN
                                     IF(EXIGE_NF_REFERENCIA = 1) THEN
                                        VEMPRESA_CODIGO     = (SELECT FIRST 1 A.EMPRESA_CODIGO FROM TBNFS_ITEM A WHERE A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_CODIGO AND A.NUMERO_NOTAFISCAL = :NF_EXTERNO AND A.CONTROLE = :NF_EXTERNO_ITEM_CONTROLE);
                                        VCUSTO_MEDIO        = 0;
                                     IF(EXIGE_NF_REFERENCIA = 0) THEN
                                        VEMPRESA_CODIGO     =  EMPRESA_CODIGO;
                                        VCUSTO_MEDIO        = VALOR_UNITARIO;
                                   END
                               END
    

                    /* CONTROLE_TRANSACAO_ITEM_OLD = COALESCE((SELECT
                                T.CONTROLE
                        FROM TBESTOQUE_TRANSACAO_ITEM T
                        WHERE NFE_ITEM_CONTROLE         = :CONTROLE
                        AND DOCUMENTO                   = :NUMERO_NOTAFISCAL
                        AND ESTABELECIMENTO_CODIGO      = :ESTABELECIMENTO_CODIGO
                        AND LOCALIZACAO_CODIGO          = :LOCALIZACAO_CODIGO
                        AND DATA                        = :DATA
                        AND PRODUTO_CODIGO              = :PRODUTO_CODIGO
                        AND TRANSACAO_CONTROLE          = -1000), 0); /*


                   /* INSERT SALDO */
                   EXECUTE PROCEDURE SPI_ESTOQUE_SALDO(
                    ESTABELECIMENTO_CODIGO, LOCALIZACAO_CODIGO, PRODUTO_CODIGO, TIPO, DATA, QUANTIDADE,
                    T01, T02, T03, T04, T05, T06, T07, T08, T09, T10, T11, T12,
                    T13, T14, T15, T16, T17, T18, T19, T20, 0, NUMERO_NOTAFISCAL, 0, CONTROLE,
                    OPERACAO_CODIGO, NULL, NULL, 0, CUSTO_UNITARIO, FN_CURRENT_USER_ID(), CURRENT_DATE,
                    0, '', '', 0, 0, NULL, VEMPRESA_CODIGO, VCUSTO_MEDIO);

               END

           IF (:NF_EXTERNO_ITEM_CONTROLE > 0 OR :NFS_ITEM_CONTROLE > 0) THEN
               BEGIN
                  UPDATE TBNFS_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE - :QUANTIDADE,
                  T01 = T01 - :T01, T02 = T02 - :T02, T03 = T03 - :T03, T04 = T04 - :T04,
                  T05 = T05 - :T05, T06 = T06 - :T06, T07 = T07 - :T07, T08 = T08 - :T08,
                  T09 = T09 - :T09, T10 = T10 - :T10, T11 = T11 - :T11, T12 = T12 - :T12,
                  T13 = T13 - :T13, T14 = T14 - :T14, T15 = T15 - :T15, T16 = T16 - :T16,
                  T17 = T17 - :T17, T18 = T18 - :T18, T19 = T19 - :T19, T20 = T20 - :T20
                  WHERE NFS_ITEM_CONTROLE = IIF(:NF_EXTERNO_ITEM_CONTROLE>0,:NF_EXTERNO_ITEM_CONTROLE,:NFS_ITEM_CONTROLE);
               END

           IF (:PDV_CFE_ID > 0) THEN
               BEGIN
                  UPDATE TBPDV_CFE_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE - :QUANTIDADE
                  WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;
               END

          END ELSE
      IF (ACAO = 2) THEN -- ALTERAÇÃO
          BEGIN
            
            CONTROLE_TRANSACAO_ITEM_OLD = COALESCE((SELECT
                        T.CONTROLE
                FROM TBESTOQUE_TRANSACAO_ITEM T
                WHERE NFE_ITEM_CONTROLE         = :CONTROLE
                AND DOCUMENTO                   = :NUMERO_NOTAFISCAL
                AND ESTABELECIMENTO_CODIGO      = :ESTABELECIMENTO_CODIGO
                AND LOCALIZACAO_CODIGO          = :LOCALIZACAO_CODIGO
                AND DATA                        = :DATA
                AND PRODUTO_CODIGO              = :PRODUTO_CODIGO), 0);

            IF(CONTROLE_ESTOQUE = 1) THEN
            BEGIN
                EXECUTE PROCEDURE SPI_ESTOQUE_SALDO(
                    ESTABELECIMENTO_CODIGO, LOCALIZACAO_CODIGO, PRODUTO_CODIGO, 'E', DATA, QUANTIDADE,
                    T01, T02, T03, T04, T05, T06, T07, T08, T09, T10, T11, T12,
                    T13, T14, T15, T16, T17, T18, T19, T20, 0, NUMERO_NOTAFISCAL, 0, CONTROLE,
                    OPERACAO_CODIGO, NULL, -1000, 0, 0, FN_CURRENT_USER_ID(), CURRENT_DATE,
                    0, '', '', 0, 0, NULL, 0, 0);
            END

            IF(:CONTROLE_TRANSACAO_ITEM_OLD > 0) THEN
            BEGIN
                DELETE FROM TBESTOQUE_TRANSACAO_ITEM T WHERE T.CONTROLE = :CONTROLE_TRANSACAO_ITEM_OLD;
            END


            --EXECUTE PROCEDURE SPD_ESTOQUE_TRANSACAO2(ESTABELECIMENTO_CODIGO, LOCALIZACAO_CODIGO, DATA, PRODUTO_CODIGO, NUMERO_NOTAFISCAL, CONTROLE, 0, 0, 0, 0, 0);

            IF (:NF_EXTERNO_ITEM_CONTROLE > 0 OR :NFS_ITEM_CONTROLE > 0) THEN
               BEGIN
                  UPDATE TBNFS_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE + :QUANTIDADE,
                  T01 = T01 + :T01, T02 = T02 + :T02, T03 = T03 + :T03, T04 = T04 + :T04,
                  T05 = T05 + :T05, T06 = T06 + :T06, T07 = T07 + :T07, T08 = T08 + :T08,
                  T09 = T09 + :T09, T10 = T10 + :T10, T11 = T11 + :T11, T12 = T12 + :T12,
                  T13 = T13 + :T13, T14 = T14 + :T14, T15 = T15 + :T15, T16 = T16 + :T16,
                  T17 = T17 + :T17, T18 = T18 + :T18, T19 = T19 + :T19, T20 = T20 + :T20
                  WHERE NFS_ITEM_CONTROLE = IIF(:NF_EXTERNO_ITEM_CONTROLE>0,:NF_EXTERNO_ITEM_CONTROLE,:NFS_ITEM_CONTROLE);
               END



            IF (:PDV_CFE_ID > 0) THEN
               BEGIN
                  UPDATE TBPDV_CFE_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE + :QUANTIDADE
                  WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;
               END

          END

      END -- FIM PARA NFE

END
^

SET TERM ; ^

/************************************************************************************/
/************************************************************************************/

ALTER TABLE TBCONFERENCIA
    ADD LOCALIZACAO_ALTERADA INTEGER DEFAULT 0;

COMMENT ON COLUMN TBCONFERENCIA.LOCALIZACAO_ALTERADA IS
'0 - Localizacao nao alterada via conferencia de NFE;
1 - Localizacao alterada via conferencia de NFE;';


ALTER TABLE TBCONFERENCIA_ITEM
    ADD LOCALIZACAO_ORIGINAL INTEGER DEFAULT 0;

COMMENT ON COLUMN TBCONFERENCIA_ITEM.LOCALIZACAO_ORIGINAL IS
'Localizacao original  do item na NFE antes da alteracao via conferencia';

/************************************************************************************/

SET TERM ^ ;

CREATE trigger ttbconferencia_item_b04d for tbconferencia_item
active before delete position 5
AS
DECLARE VARIABLE TABELA VARCHAR(10);
DECLARE VARIABLE TABELA_ID INTEGER;
DECLARE VARIABLE LOCALIZACAO_ALTERADA INTEGER;
BEGIN

    :TABELA = COALESCE((SELECT FIRST 1 A.TABELA FROM TBCONFERENCIA A WHERE A.ID = OLD.CONFERENCIA_ID), '');
    :TABELA_ID = COALESCE((SELECT FIRST 1 A.TABELA_ID FROM TBCONFERENCIA A WHERE A.ID = OLD.CONFERENCIA_ID), '');
    :LOCALIZACAO_ALTERADA = COALESCE((SELECT FIRST 1 COALESCE(A.LOCALIZACAO_ALTERADA, 0) FROM TBCONFERENCIA A WHERE A.ID = OLD.CONFERENCIA_ID), 0);

    IF (OLD.ID > 0 AND COALESCE(:LOCALIZACAO_ALTERADA, 0) = 1 AND FN_IS_EMPTY(:TABELA) = 'NFE') THEN
    BEGIN

        UPDATE TBNFE_ITEM B
            SET B.LOCALIZACAO_CODIGO = OLD.LOCALIZACAO_ORIGINAL
            WHERE B.NFE_CONTROLE = :TABELA_ID
            AND B.PRODUTO_CODIGO = OLD.PRODUTO_ID
            AND B.TAMANHO = OLD.TAMANHO;

    END
END
^

SET TERM ; ^

/************************************************************************************/

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_b01u for tbconferencia
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(5000);

DECLARE VARIABLE HISTORICO_ID INTEGER;
DECLARE VARIABLE OLD_STATUS VARCHAR(500);
DECLARE VARIABLE NEW_STATUS VARCHAR(500);
DECLARE VARIABLE OLD_USUARIO VARCHAR(500);
DECLARE VARIABLE NEW_USUARIO VARCHAR(500);
BEGIN

    :HISTORICO = '';

    OLD_STATUS  = IIF(OLD.STATUS = '0', 'NAO REALIZADA', IIF(OLD.STATUS = '1', 'INICIADA', IIF(OLD.STATUS = '2', 'FINALIZADA OK', IIF(OLD.STATUS = '3', 'FINALIZADA COM DIVERGÊNCIAS', IIF(OLD.STATUS = '4', 'FATURADA', IIF(OLD.STATUS = '5', 'PARCIALMENTE FATURADA', ''))))));
    NEW_STATUS  = IIF(NEW.STATUS = '0', 'NAO REALIZADA', IIF(NEW.STATUS = '1', 'INICIADA', IIF(NEW.STATUS = '2', 'FINALIZADA OK', IIF(NEW.STATUS = '3', 'FINALIZADA COM DIVERGÊNCIAS', IIF(NEW.STATUS = '4', 'FATURADA', IIF(NEW.STATUS = '5', 'PARCIALMENTE FATURADA', ''))))));
    OLD_USUARIO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 4, '0')||' - '||A.USUARIO FROM TBUSUARIO A WHERE A.CODIGO = OLD.USUARIO_ID), '');
    NEW_USUARIO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 4, '0')||' - '||A.USUARIO FROM TBUSUARIO A WHERE A.CODIGO = NEW.USUARIO_ID), '');

    IF (OLD.TABELA <> NEW.TABELA) THEN
    BEGIN
        HISTORICO = HISTORICO||' TABELA:'||OLD.TABELA||'->'||NEW.TABELA;
    END

    IF (OLD.TABELA_ID <> NEW.TABELA_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||' CODIGO:'||FN_LPAD(OLD.TABELA_ID, 8, '0')||'->'||FN_LPAD(NEW.TABELA_ID, 8, '0');
    END

    IF ((OLD.DATAHORA IS NULL AND NEW.DATAHORA IS NOT NULL) OR (OLD.DATAHORA IS NOT NULL AND NEW.DATAHORA IS NULL) OR (OLD.DATAHORA <> NEW.DATAHORA)) THEN
    BEGIN
        HISTORICO = HISTORICO||' DT.HORA INI:'||FN_TIMESTAMP_TO_STRING(OLD.DATAHORA)||'->'||FN_TIMESTAMP_TO_STRING(NEW.DATAHORA);
    END

    IF (OLD.USUARIO_ID <> NEW.USUARIO_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||' USUARIO:'||OLD_USUARIO||'->'||NEW_USUARIO;
    END

    IF (OLD.STATUS <> NEW.STATUS) THEN
    BEGIN
        HISTORICO = HISTORICO||' STATUS:'||OLD_STATUS||'->'||NEW_STATUS;
    END

    IF (OLD.JUSTIFICATIVA <> NEW.JUSTIFICATIVA) THEN
    BEGIN
        HISTORICO = HISTORICO||' JUSTIF:'||OLD.JUSTIFICATIVA||'->'||NEW.JUSTIFICATIVA;
    END

    IF ((OLD.DATAHORA_FIM IS NULL AND NEW.DATAHORA_FIM IS NOT NULL) OR (OLD.DATAHORA_FIM IS NOT NULL AND NEW.DATAHORA_FIM IS NULL) OR (OLD.DATAHORA_FIM <> NEW.DATAHORA_FIM)) THEN
    BEGIN
        HISTORICO = HISTORICO||' DT.HORA FIM:'||FN_TIMESTAMP_TO_STRING(OLD.DATAHORA_FIM)||'->'||FN_TIMESTAMP_TO_STRING(NEW.DATAHORA_FIM);
    END

    IF (OLD.SEQUENCIA <> NEW.SEQUENCIA) THEN
    BEGIN
        HISTORICO = HISTORICO||' SEQ:'||OLD.SEQUENCIA||'->'||NEW.SEQUENCIA;
    END

    IF (OLD.ESPECIE <> NEW.ESPECIE) THEN
    BEGIN
        HISTORICO = HISTORICO||' ESPECIE:'||OLD.ESPECIE||'->'||NEW.ESPECIE;
    END

    IF (OLD.VOLUMES <> NEW.VOLUMES) THEN
    BEGIN
        HISTORICO = HISTORICO||' VOLUMES:'||OLD.VOLUMES||'->'||NEW.VOLUMES;
    END

    IF (OLD.PESO_BRUTO <> NEW.PESO_BRUTO) THEN
    BEGIN
        HISTORICO = HISTORICO||' PESO BRUTO:'||FN_FORMAT_NUMBER2(OLD.PESO_BRUTO, 4)||'->'||FN_FORMAT_NUMBER2(NEW.PESO_BRUTO, 4);
    END

    IF (OLD.PESO_LIQUIDO <> NEW.PESO_LIQUIDO) THEN
    BEGIN
        HISTORICO = HISTORICO||' PESO LIQ:'||FN_FORMAT_NUMBER2(OLD.PESO_LIQUIDO, 4)||'->'||FN_FORMAT_NUMBER2(NEW.PESO_LIQUIDO, 4);
    END

    IF (OLD.LOCALIZACAO_ALTERADA <> NEW.LOCALIZACAO_ALTERADA) THEN
    BEGIN
        HISTORICO = HISTORICO||' LOCAL.ALT:'||OLD.LOCALIZACAO_ALTERADA||'->'||NEW.LOCALIZACAO_ALTERADA;
    END

    -- GRAVAR HISTORICO
    IF (HISTORICO <> '') THEN
    BEGIN
        IF (OLD.TABELA = 'NFE') THEN
        BEGIN
          :HISTORICO_ID = '01'||OLD.TABELA_ID;
        END ELSE IF (OLD.TABELA = 'NFS') THEN
        BEGIN
          :HISTORICO_ID = '02'||OLD.TABELA_ID;
        END ELSE IF (OLD.TABELA = 'PED') THEN
        BEGIN
          :HISTORICO_ID = '03'||OLD.TABELA_ID;
        END ELSE IF (OLD.TABELA = 'COM') THEN
        BEGIN
          :HISTORICO_ID = '04'||OLD.TABELA_ID;
        END
    
        HISTORICO = 'CONFERENCIA '||FN_LPAD(NEW.TABELA_ID, 8, '0')||FN_IS_EMPTY(NEW.SEQUENCIA)||' ALTERADA:'||HISTORICO;
        IF (OLD.TABELA = 'PED') THEN
        BEGIN
            EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', OLD.ID, FN_ELIPSE(:HISTORICO, 500));
        END ELSE IF (OLD.TABELA = 'COM') THEN
        BEGIN
            EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', OLD.ID, FN_ELIPSE(:HISTORICO, 500));
        END ELSE
        BEGIN
            EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', :HISTORICO_ID, FN_ELIPSE(:HISTORICO, 500));
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_item_b01u for tbconferencia_item
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(5000);

DECLARE VARIABLE PEDIDO_ITEM_SEQ VARCHAR(500);
DECLARE VARIABLE PEDIDO VARCHAR(500);
BEGIN
    
    :HISTORICO = '';

    IF (OLD.ID <> NEW.ID) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' ID:'||OLD.ID||'->'||NEW.ID;
    END

    IF (OLD.CONFERENCIA_ID <> NEW.CONFERENCIA_ID) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' CONF.ID:'||OLD.CONFERENCIA_ID||'->'||NEW.CONFERENCIA_ID;
    END

    IF (OLD.PRODUTO_ID <> NEW.PRODUTO_ID) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' PRODUTO:'||OLD.PRODUTO_ID||'->'||NEW.PRODUTO_ID;
    END

    IF (OLD.TAMANHO <> NEW.TAMANHO) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' TAM:'||OLD.TAMANHO||'->'||NEW.TAMANHO;
    END

    IF (OLD.QTD_TOTAL <> NEW.QTD_TOTAL) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' QTD.TOTAL:'||OLD.QTD_TOTAL||'->'||NEW.QTD_TOTAL;
    END

    IF (OLD.QTD_CONFERIDA <> NEW.QTD_CONFERIDA) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' QTD.CONFERIDA:'||OLD.QTD_CONFERIDA||'->'||NEW.QTD_CONFERIDA;
    END

    IF (OLD.TABELA_ITEM_ID <> NEW.TABELA_ITEM_ID) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' ITEM PEDIDO:'||OLD.TABELA_ITEM_ID||'->'||NEW.TABELA_ITEM_ID;
    END

    IF (OLD.QTD_ALOCADA <> NEW.QTD_ALOCADA) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' QTD.ALOCADA:'||OLD.QTD_ALOCADA||'->'||NEW.QTD_ALOCADA;
    END

    IF (OLD.QTD_DISPONIVEL <> NEW.QTD_DISPONIVEL) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' QTD.DISPONIVEL:'||OLD.QTD_DISPONIVEL||'->'||NEW.QTD_DISPONIVEL;
    END

    IF (OLD.STATUS <> NEW.STATUS) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' STATUS:'||OLD.STATUS||'->'||NEW.STATUS;
    END

    IF (OLD.NF_ID <> NEW.NF_ID) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' NF:'||OLD.NF_ID||'->'||NEW.NF_ID;
    END

    IF (OLD.LOCALIZACAO_ORIGINAL <> NEW.LOCALIZACAO_ORIGINAL) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' LOCAL.ORIGINAL:'||OLD.LOCALIZACAO_ORIGINAL||'->'||NEW.LOCALIZACAO_ORIGINAL;
    END

    IF (HISTORICO <> '') THEN
    BEGIN

        SELECT FIRST 1
            FN_LPAD(A.SEQUENCIA, 3, '0'),
            FN_LPAD(A.PEDIDO, 8, '0')
        FROM TBPEDIDO_ITEM A
        WHERE A.CONTROLE = NEW.TABELA_ITEM_ID INTO :PEDIDO_ITEM_SEQ, :PEDIDO;
        
        :HISTORICO = 'ITEM: '||:PEDIDO_ITEM_SEQ||' ALTERADO NA CONFERENCIA: '||FN_LPAD(NEW.CONFERENCIA_ID, 6, '0')||' DO PEDIDO: '||:PEDIDO||:HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA_ITEM', OLD.CONFERENCIA_ID, FN_ELIPSE(:HISTORICO, 500));
    END
END
^

SET TERM ; ^

