CREATE TABLE TBPDV_CONFERENCIA_ITEM_SALDO (
    ID INTEGER NOT NULL,
    PDV_CONFERENCIA_ID INTEGER,
    PDV_CONFERENCIA_ITEM_ID INTEGER,
    TAMANHO INTEGER,
    QUANTIDADE NUMERIC(15,2),
    DATAHORA TIMESTAMP DEFAULT 'NOW');

ALTER TABLE TBPDV_CONFERENCIA_ITEM_SALDO
ADD CONSTRAINT PK_TBPDV_CONFERENCIA_ITEM_SALDO
PRIMARY KEY (ID);

CREATE SEQUENCE GTBPDV_CONFERENCIA_ITEM_SALDO;

create trigger ttbpdv_confer_item_saldo_b01i for tbpdv_conferencia_item_saldo
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbpdv_conferencia_item_saldo,1);
end;


CREATE OR ALTER trigger ttbpdv_conferencia_item_biud02 for tbpdv_conferencia_item
active before insert or update or delete position 2
AS
BEGIN
    IF(INSERTING OR UPDATING) THEN
    BEGIN
        IF(INSERTING) THEN
        BEGIN
            UPDATE OR INSERT INTO TBPDV_CONFERENCIA_ITEM_SALDO (PDV_CONFERENCIA_ID, PDV_CONFERENCIA_ITEM_ID, TAMANHO, QUANTIDADE)
                VALUES (NEW.PDV_CONFERENCIA_ID, NEW.ID, NEW.TAMANHO, NEW.QUANTIDADE)
            MATCHING (PDV_CONFERENCIA_ID, PDV_CONFERENCIA_ITEM_ID);
        END ELSE
        BEGIN
            IF(OLD.QUANTIDADE <> NEW.QUANTIDADE) THEN
            BEGIN
                UPDATE OR INSERT INTO TBPDV_CONFERENCIA_ITEM_SALDO (PDV_CONFERENCIA_ID, PDV_CONFERENCIA_ITEM_ID, TAMANHO, QUANTIDADE)
                    VALUES (NEW.PDV_CONFERENCIA_ID, NEW.ID, NEW.TAMANHO, NEW.QUANTIDADE)
                MATCHING (PDV_CONFERENCIA_ID, PDV_CONFERENCIA_ITEM_ID);
            END

        END


    END ELSE
    BEGIN
        DELETE FROM TBPDV_CONFERENCIA_ITEM_SALDO T WHERE T.PDV_CONFERENCIA_ID = OLD.PDV_CONFERENCIA_ID AND T.PDV_CONFERENCIA_ITEM_ID = OLD.ID;
    END

END;


CREATE trigger tbpdv_confer_item_saldo_b01u for tbpdv_conferencia_item_saldo
active before update position 1
AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE QUANTIDADE NUMERIC(15,4);
DECLARE VARIABLE QUANT_ALOC NUMERIC(15,4);
DECLARE VARIABLE SALDO NUMERIC(15,4);
DECLARE VARIABLE ESTOQUE_DETALHE_ID INTEGER;
BEGIN
  QUANTIDADE = ABS(OLD.QUANTIDADE - NEW.QUANTIDADE);

  IF (:QUANTIDADE > 0) THEN
      BEGIN
        FOR
        SELECT A.ID, A.QUANTIDADE, A.SALDO, A.ESTOQUE_DETALHE_ID
        FROM TBESTOQUE_DETALHE_ALOCACAO A
        WHERE A.TABELA_ID = OLD.PDV_CONFERENCIA_ID
          AND A.TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
          AND A.TAMANHO = OLD.TAMANHO
          AND A.TIPO = 'O'
        INTO :ID, :QUANT_ALOC, :SALDO, :ESTOQUE_DETALHE_ID
        DO
        BEGIN
          --SAIDA/BAIXA
          IF (NEW.QUANTIDADE < OLD.QUANTIDADE) THEN
              BEGIN
              IF (:QUANTIDADE > 0 AND :SALDO > 0) THEN
                  BEGIN
                      IF (:SALDO <= :QUANTIDADE) THEN
                      BEGIN
                        UPDATE TBESTOQUE_DETALHE_ALOCACAO A
                            SET SALDO = 0
                        WHERE ID = :ID AND TABELA_ID = OLD.PDV_CONFERENCIA_ID
                        AND TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
                        AND TAMANHO = OLD.TAMANHO AND TIPO = 'O';
    
                        QUANTIDADE = :QUANTIDADE - :SALDO;
                      END ELSE
                      IF (:SALDO > :QUANTIDADE) THEN
                      BEGIN
                        UPDATE TBESTOQUE_DETALHE_ALOCACAO A
                            SET SALDO = SALDO - :QUANTIDADE
                        WHERE ID = :ID AND TABELA_ID = OLD.PDV_CONFERENCIA_ID
                        AND TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
                        AND TAMANHO = OLD.TAMANHO AND TIPO = 'O';
    
                        QUANTIDADE = 0;
                      END
                  END
              END ELSE
          --ENTRADA/CANCELAMENTO DA SAÍDA
          IF (NEW.QUANTIDADE > OLD.QUANTIDADE) THEN
              BEGIN
              IF (:QUANTIDADE > 0 AND :SALDO < :QUANT_ALOC) THEN
                  BEGIN
                      IF (:QUANT_ALOC-:SALDO <= :QUANTIDADE) THEN
                      BEGIN
                        UPDATE TBESTOQUE_DETALHE_ALOCACAO A SET
                            SALDO = QUANTIDADE
                        WHERE ID = :ID AND TABELA_ID = OLD.PDV_CONFERENCIA_ID
                        AND TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
                        AND TAMANHO = OLD.TAMANHO AND TIPO = 'O';
                        QUANTIDADE = :QUANTIDADE - (:QUANT_ALOC-:SALDO);
                      END ELSE
                      IF (:QUANT_ALOC-:SALDO > :QUANTIDADE) THEN
                      BEGIN
                        UPDATE TBESTOQUE_DETALHE_ALOCACAO A SET
                            SALDO = SALDO + :QUANTIDADE
                        WHERE ID = :ID AND TABELA_ID = OLD.PDV_CONFERENCIA_ID
                        AND TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
                        AND TAMANHO = OLD.TAMANHO AND TIPO = 'O';
                        QUANTIDADE = 0;
                      END
                  END
              END
        END
    END
END;

CREATE OR ALTER PROCEDURE SPU_NFS_PRE_PEDIDO (
    NFS_CONTROLE INTEGER,
    CONTROLE INTEGER)
AS
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE PDV_CONFERENCIA_ID INTEGER;
DECLARE VARIABLE PDV_CONFERENCIA_ITEM_ID INTEGER;
DECLARE VARIABLE TAMANHO INTEGER;
DECLARE VARIABLE IQUANTIDADE NUMERIC(10,5);
BEGIN

    FOR
    SELECT
        A.PRODUTO_CODIGO,
        C.PDV_CONFERENCIA_ID,
        A.PDV_CONFERENCIA_ITEM_ID,
        C.TAMANHO,
        A.QUANTIDADE
    FROM TBNFS_ITEM A, TBPDV_CONFERENCIA_ITEM C
    WHERE A.PDV_CONFERENCIA_ITEM_ID = C.ID
      AND A.PDV_CONFERENCIA_ITEM_ID > 0
      AND A.NFS_CONTROLE            = :NFS_CONTROLE
      AND A.CONTROLE                = :CONTROLE
    INTO
    :PRODUTO_ID, :PDV_CONFERENCIA_ID, :PDV_CONFERENCIA_ITEM_ID, :TAMANHO, :IQUANTIDADE
    DO BEGIN

       IF (:PRODUTO_ID > 0) THEN
       BEGIN

           UPDATE TBPDV_CONFERENCIA_ITEM_SALDO T
            SET T.QUANTIDADE = QUANTIDADE - :IQUANTIDADE
           WHERE T.PDV_CONFERENCIA_ITEM_ID = :PDV_CONFERENCIA_ITEM_ID
           AND T.TAMANHO = :TAMANHO;

       END

    END

END;



CREATE OR ALTER trigger ttbnfs_item_ai1 for tbnfs_item
active after insert position 1
AS
BEGIN

  IF(NEW.GC_WEB = 1) THEN
  BEGIN

       IF (NEW.NF_NATUREZA = 2)  THEN
       BEGIN
            -- REALIZAR BAIXA DE PEDIDO PARA NATUREZA LANÇAMENTO
            EXECUTE PROCEDURE SPU_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

            -- REALIZAR BAIXA DE PRE PEDIDO PARA NATUREZA LANÇAMENTO
            EXECUTE PROCEDURE SPU_NFS_PRE_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

            -- INCLUIR ESTOQUE
            EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 1);

            -- REALIZAR BAIXA DE ROMANEIO
            IF(COALESCE(NEW.TECELAGEM, 0) > 0) THEN
            BEGIN
                EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(NEW.ESTABELECIMENTO_CODIGO, NEW.SEQUENCIA, NEW.TECELAGEM, NEW.QUANTIDADE, 1);
            END

       END

       IF(COALESCE(NEW.PDV_CONFERENCIA_ITEM_ID, 0) > 0) THEN
       BEGIN
          EXECUTE PROCEDURE SP_NFS_ITEM_PRE_PEDIDO(NEW.PDV_CONFERENCIA_ITEM_ID, 1);
       END
  END

END;

CREATE OR ALTER trigger ttbnfs_item_au1 for tbnfs_item
active after update position 1
AS

BEGIN

  IF(NEW.GC_WEB = 1) THEN
  BEGIN

       IF (OLD.NF_NATUREZA = 1 AND NEW.NF_NATUREZA = 2)  THEN
       BEGIN

          -- REALIZAR BAIXA DE PEDIDO PARA NATUREZA LANÇAMENTO
          EXECUTE PROCEDURE SPU_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

          -- REALIZAR BAIXA DE PRE PEDIDO PARA NATUREZA LANÇAMENTO
          EXECUTE PROCEDURE SPU_NFS_PRE_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

          -- INCLUIR ESTOQUE PARA NATUREZA LANÇAMENTO
          EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 1);

          -- REALIZAR BAIXA DE ROMANEIO
          IF(COALESCE(NEW.TECELAGEM, 0) > 0) THEN
          BEGIN
            EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(NEW.ESTABELECIMENTO_CODIGO, NEW.SEQUENCIA, NEW.TECELAGEM, NEW.QUANTIDADE, 1);
          END

       END ELSE

       IF(OLD.NF_NATUREZA = 2 AND NEW.NF_NATUREZA = 2) THEN
       BEGIN
           IF(OLD.ESTABELECIMENTO_CODIGO <> NEW.ESTABELECIMENTO_CODIGO OR
              OLD.DATA_EMISSAO           <> NEW.DATA_EMISSAO OR
              OLD.LOCALIZACAO_CODIGO     <> NEW.LOCALIZACAO_CODIGO OR
              OLD.EMPRESA_CODIGO         <> NEW.EMPRESA_CODIGO OR
              OLD.NUMERO_NOTAFISCAL      <> NEW.NUMERO_NOTAFISCAL OR
              OLD.OPERACAO_CODIGO        <> NEW.OPERACAO_CODIGO OR
              OLD.PRODUTO_CODIGO         <> NEW.PRODUTO_CODIGO OR
              OLD.QUANTIDADE             <> NEW.QUANTIDADE OR
              OLD.T01 <> NEW.T01 OR   OLD.T02 <> NEW.T02 OR   OLD.T03 <> NEW.T03 OR
              OLD.T04 <> NEW.T04 OR   OLD.T05 <> NEW.T05 OR   OLD.T06 <> NEW.T06 OR
              OLD.T07 <> NEW.T07 OR   OLD.T08 <> NEW.T08 OR   OLD.T09 <> NEW.T09 OR
              OLD.T10 <> NEW.T10 OR   OLD.T11 <> NEW.T11 OR   OLD.T12 <> NEW.T12 OR
              OLD.T13 <> NEW.T13 OR   OLD.T14 <> NEW.T14 OR   OLD.T15 <> NEW.T15 OR
              OLD.T16 <> NEW.T16 OR   OLD.T17 <> NEW.T17 OR   OLD.T18 <> NEW.T18 OR
              OLD.T19 <> NEW.T19 OR   OLD.T20 <> NEW.T20)  THEN
              BEGIN

                  -- REALIZAR BAIXA DE PEDIDO PARA NATUREZA LANÇAMENTO
                  EXECUTE PROCEDURE SPU_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                  -- REALIZAR BAIXA DE PRE PEDIDO PARA NATUREZA LANÇAMENTO
                  EXECUTE PROCEDURE SPU_NFS_PRE_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                  -- INCLUIR ESTOQUE
                  EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 1);

                  -- REALIZAR BAIXA DE ROMANEIO
                  IF(COALESCE(NEW.TECELAGEM, 0) > 0) THEN
                  BEGIN
                    EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(NEW.ESTABELECIMENTO_CODIGO, NEW.SEQUENCIA, NEW.TECELAGEM, NEW.QUANTIDADE, 1);
                  END

              END
       END


  END
END;


CREATE OR ALTER trigger ttbnfs_item_bu4 for tbnfs_item
active before update position 1
AS

BEGIN

  IF(NEW.GC_WEB = 1) THEN
  BEGIN

       IF (OLD.NF_NATUREZA = 2 AND NEW.NF_NATUREZA = 1)  THEN
       BEGIN
              -- DELETAR ESTOQUE PARA NATUREZA EMISSAO
              EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 2);
              -- DESFAZER BAIXA DE PEDIDO
              EXECUTE PROCEDURE SPD_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

              -- DESFAZER BAIXA DE ROMANEIO
              IF(COALESCE(OLD.TECELAGEM, 0) > 0) THEN
              BEGIN
                EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(OLD.ESTABELECIMENTO_CODIGO, OLD.SEQUENCIA, OLD.TECELAGEM, OLD.QUANTIDADE, 2);
              END

       END ELSE

       IF(OLD.NF_NATUREZA = 2 AND NEW.NF_NATUREZA = 2) THEN
       BEGIN
           IF(OLD.ESTABELECIMENTO_CODIGO <> NEW.ESTABELECIMENTO_CODIGO OR
              OLD.DATA_EMISSAO           <> NEW.DATA_EMISSAO OR
              OLD.LOCALIZACAO_CODIGO     <> NEW.LOCALIZACAO_CODIGO OR
              OLD.EMPRESA_CODIGO         <> NEW.EMPRESA_CODIGO OR
              OLD.NUMERO_NOTAFISCAL      <> NEW.NUMERO_NOTAFISCAL OR
              OLD.OPERACAO_CODIGO        <> NEW.OPERACAO_CODIGO OR
              OLD.PRODUTO_CODIGO         <> NEW.PRODUTO_CODIGO OR
              OLD.QUANTIDADE             <> NEW.QUANTIDADE OR
              OLD.T01 <> NEW.T01 OR   OLD.T02 <> NEW.T02 OR   OLD.T03 <> NEW.T03 OR
              OLD.T04 <> NEW.T04 OR   OLD.T05 <> NEW.T05 OR   OLD.T06 <> NEW.T06 OR
              OLD.T07 <> NEW.T07 OR   OLD.T08 <> NEW.T08 OR   OLD.T09 <> NEW.T09 OR
              OLD.T10 <> NEW.T10 OR   OLD.T11 <> NEW.T11 OR   OLD.T12 <> NEW.T12 OR
              OLD.T13 <> NEW.T13 OR   OLD.T14 <> NEW.T14 OR   OLD.T15 <> NEW.T15 OR
              OLD.T16 <> NEW.T16 OR   OLD.T17 <> NEW.T17 OR   OLD.T18 <> NEW.T18 OR
              OLD.T19 <> NEW.T19 OR   OLD.T20 <> NEW.T20)  THEN
              BEGIN
                  -- DELETAR ESTOQUE
                  EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 2);
                  -- DESFAZER BAIXA DE PEDIDO
                  EXECUTE PROCEDURE SPD_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                  -- DESFAZER BAIXA DE ROMANEIO
                  IF(COALESCE(OLD.TECELAGEM, 0) > 0) THEN
                  BEGIN
                    EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(OLD.ESTABELECIMENTO_CODIGO, OLD.SEQUENCIA, OLD.TECELAGEM, OLD.QUANTIDADE, 2);
                  END

              END
       END ELSE

       IF(OLD.NF_NATUREZA = 1 AND NEW.NF_NATUREZA = 1) THEN
       BEGIN
            IF(OLD.NF_SITUACAO = 1 AND NEW.NF_SITUACAO = 2) THEN
            BEGIN

                -- REALIZAR BAIXA DE PEDIDO PARA NATUREZA EMISSÃO, CONCLUÍDA
                EXECUTE PROCEDURE SPU_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                -- REALIZAR BAIXA DE PRE PEDIDO PARA NATUREZA EMISSÃO, CONCLUÍDA
                EXECUTE PROCEDURE SPU_NFS_PRE_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                -- INCLUIR ESTOQUE
                EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 1);

                -- REALIZAR BAIXA DE ROMANEIO
                IF(COALESCE(NEW.TECELAGEM, 0) > 0) THEN
                BEGIN
                    EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(NEW.ESTABELECIMENTO_CODIGO, NEW.SEQUENCIA, NEW.TECELAGEM, NEW.QUANTIDADE, 1);
                END

            END ELSE
            IF(OLD.NF_SITUACAO = 2 AND NEW.NF_SITUACAO = 1) THEN
            BEGIN

                -- DELETAR ESTOQUE
                EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 2);
                -- DESFAZER BAIXA DE PEDIDO
                EXECUTE PROCEDURE SPD_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                -- DESFAZER BAIXA DE ROMANEIO
                IF(COALESCE(OLD.TECELAGEM, 0) > 0) THEN
                BEGIN
                    EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(OLD.ESTABELECIMENTO_CODIGO, OLD.SEQUENCIA, OLD.TECELAGEM, OLD.QUANTIDADE, 2);
                END

            END ELSE
            IF(OLD.NF_SITUACAO = 2 AND NEW.NF_SITUACAO = 3) THEN
            BEGIN

                -- DELETAR ESTOQUE
                EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 2);
                -- DESFAZER BAIXA DE PEDIDO
                EXECUTE PROCEDURE SPD_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                -- DESFAZER BAIXA DE ROMANEIO
                IF(COALESCE(NEW.TECELAGEM, 0) > 0) THEN
                BEGIN
                    EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(NEW.ESTABELECIMENTO_CODIGO, NEW.SEQUENCIA, NEW.TECELAGEM, NEW.QUANTIDADE, 2);
                END

            END
       END
  END
END;


create or alter procedure SPD_NFS_PRE_PEDIDO (
    NFS_CONTROLE integer,
    CONTROLE integer)
as
declare variable PRODUTO_ID integer;
declare variable PDV_CONFERENCIA_ID integer;
declare variable PDV_CONFERENCIA_ITEM_ID integer;
declare variable TAMANHO integer;
declare variable IQUANTIDADE numeric(10,5);
BEGIN

    FOR
    SELECT
        A.PRODUTO_CODIGO,
        C.PDV_CONFERENCIA_ID,
        A.PDV_CONFERENCIA_ITEM_ID,
        C.TAMANHO,
        A.QUANTIDADE
    FROM TBNFS_ITEM A, TBPDV_CONFERENCIA_ITEM C
    WHERE A.PDV_CONFERENCIA_ITEM_ID = C.ID
      AND A.PDV_CONFERENCIA_ITEM_ID > 0
      AND A.NFS_CONTROLE            = :NFS_CONTROLE
      AND A.CONTROLE                = :CONTROLE
    INTO
    :PRODUTO_ID, :PDV_CONFERENCIA_ID, :PDV_CONFERENCIA_ITEM_ID, :TAMANHO, :IQUANTIDADE
    DO BEGIN

       IF (:PRODUTO_ID > 0) THEN
       BEGIN

           UPDATE TBPDV_CONFERENCIA_ITEM_SALDO T
            SET T.QUANTIDADE = QUANTIDADE + :IQUANTIDADE
           WHERE T.PDV_CONFERENCIA_ITEM_ID = :PDV_CONFERENCIA_ITEM_ID
           AND T.TAMANHO = :TAMANHO;

       END

    END

END;


CREATE OR ALTER trigger ttbnfs_item_b05d for tbnfs_item
active before delete position 5
AS
BEGIN

    DELETE FROM TBNFS_ITEM_SALDO WHERE NFS_ITEM_CONTROLE = OLD.CONTROLE;

    IF(OLD.GC_WEB = 1) THEN
    BEGIN
      IF(OLD.NF_NATUREZA = 2) THEN
      BEGIN
         -- DELETAR ESTOQUE PARA NATUREZA LANÇAMENTO
          EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', OLD.CONTROLE, OLD.NFS_CONTROLE, 2);

          -- DESFAZER BAIXA DE PEDIDO
          EXECUTE PROCEDURE SPD_NFS_PEDIDO(OLD.NFS_CONTROLE, OLD.CONTROLE);

           -- DESFAZER BAIXA DE PRE PEDIDO
          EXECUTE PROCEDURE SPD_NFS_PRE_PEDIDO(OLD.NFS_CONTROLE, OLD.CONTROLE);
      END

      UPDATE TBLOTE_PECA_ITEM T SET T.NFS_ITEM_ID = NULL WHERE T.NFS_ITEM_ID = OLD.CONTROLE;

      IF(COALESCE(OLD.PDV_CONFERENCIA_ITEM_ID, 0) > 0) THEN
      BEGIN
          EXECUTE PROCEDURE SP_NFS_ITEM_PRE_PEDIDO(OLD.PDV_CONFERENCIA_ITEM_ID, 2);
      END
    END
END;

CREATE OR ALTER trigger ttbnfs_item_bu4 for tbnfs_item
active before update position 1
AS

BEGIN

  IF(NEW.GC_WEB = 1) THEN
  BEGIN

       IF (OLD.NF_NATUREZA = 2 AND NEW.NF_NATUREZA = 1)  THEN
       BEGIN
              -- DELETAR ESTOQUE PARA NATUREZA EMISSAO
              EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 2);
              -- DESFAZER BAIXA DE PEDIDO
              EXECUTE PROCEDURE SPD_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

              -- DESFAZER BAIXA DE PRE PEDIDO
              EXECUTE PROCEDURE SPD_NFS_PRE_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

              -- DESFAZER BAIXA DE ROMANEIO
              IF(COALESCE(OLD.TECELAGEM, 0) > 0) THEN
              BEGIN
                EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(OLD.ESTABELECIMENTO_CODIGO, OLD.SEQUENCIA, OLD.TECELAGEM, OLD.QUANTIDADE, 2);
              END

       END ELSE

       IF(OLD.NF_NATUREZA = 2 AND NEW.NF_NATUREZA = 2) THEN
       BEGIN
           IF(OLD.ESTABELECIMENTO_CODIGO <> NEW.ESTABELECIMENTO_CODIGO OR
              OLD.DATA_EMISSAO           <> NEW.DATA_EMISSAO OR
              OLD.LOCALIZACAO_CODIGO     <> NEW.LOCALIZACAO_CODIGO OR
              OLD.EMPRESA_CODIGO         <> NEW.EMPRESA_CODIGO OR
              OLD.NUMERO_NOTAFISCAL      <> NEW.NUMERO_NOTAFISCAL OR
              OLD.OPERACAO_CODIGO        <> NEW.OPERACAO_CODIGO OR
              OLD.PRODUTO_CODIGO         <> NEW.PRODUTO_CODIGO OR
              OLD.QUANTIDADE             <> NEW.QUANTIDADE OR
              OLD.T01 <> NEW.T01 OR   OLD.T02 <> NEW.T02 OR   OLD.T03 <> NEW.T03 OR
              OLD.T04 <> NEW.T04 OR   OLD.T05 <> NEW.T05 OR   OLD.T06 <> NEW.T06 OR
              OLD.T07 <> NEW.T07 OR   OLD.T08 <> NEW.T08 OR   OLD.T09 <> NEW.T09 OR
              OLD.T10 <> NEW.T10 OR   OLD.T11 <> NEW.T11 OR   OLD.T12 <> NEW.T12 OR
              OLD.T13 <> NEW.T13 OR   OLD.T14 <> NEW.T14 OR   OLD.T15 <> NEW.T15 OR
              OLD.T16 <> NEW.T16 OR   OLD.T17 <> NEW.T17 OR   OLD.T18 <> NEW.T18 OR
              OLD.T19 <> NEW.T19 OR   OLD.T20 <> NEW.T20)  THEN
              BEGIN
                  -- DELETAR ESTOQUE
                  EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 2);
                  -- DESFAZER BAIXA DE PEDIDO
                  EXECUTE PROCEDURE SPD_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                   -- DESFAZER BAIXA DE PRE PEDIDO
                  EXECUTE PROCEDURE SPD_NFS_PRE_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                  -- DESFAZER BAIXA DE ROMANEIO
                  IF(COALESCE(OLD.TECELAGEM, 0) > 0) THEN
                  BEGIN
                    EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(OLD.ESTABELECIMENTO_CODIGO, OLD.SEQUENCIA, OLD.TECELAGEM, OLD.QUANTIDADE, 2);
                  END

              END
       END ELSE

       IF(OLD.NF_NATUREZA = 1 AND NEW.NF_NATUREZA = 1) THEN
       BEGIN
            IF(OLD.NF_SITUACAO = 1 AND NEW.NF_SITUACAO = 2) THEN
            BEGIN

                -- REALIZAR BAIXA DE PEDIDO PARA NATUREZA EMISSÃO, CONCLUÍDA
                EXECUTE PROCEDURE SPU_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                -- REALIZAR BAIXA DE PRE PEDIDO PARA NATUREZA EMISSÃO, CONCLUÍDA
                EXECUTE PROCEDURE SPU_NFS_PRE_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                -- INCLUIR ESTOQUE
                EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 1);

                -- REALIZAR BAIXA DE ROMANEIO
                IF(COALESCE(NEW.TECELAGEM, 0) > 0) THEN
                BEGIN
                    EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(NEW.ESTABELECIMENTO_CODIGO, NEW.SEQUENCIA, NEW.TECELAGEM, NEW.QUANTIDADE, 1);
                END

            END ELSE
            IF(OLD.NF_SITUACAO = 2 AND NEW.NF_SITUACAO = 1) THEN
            BEGIN

                -- DELETAR ESTOQUE
                EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 2);
                -- DESFAZER BAIXA DE PEDIDO
                EXECUTE PROCEDURE SPD_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                -- DESFAZER BAIXA DE PRE PEDIDO
                EXECUTE PROCEDURE SPD_NFS_PRE_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                -- DESFAZER BAIXA DE ROMANEIO
                IF(COALESCE(OLD.TECELAGEM, 0) > 0) THEN
                BEGIN
                    EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(OLD.ESTABELECIMENTO_CODIGO, OLD.SEQUENCIA, OLD.TECELAGEM, OLD.QUANTIDADE, 2);
                END

            END ELSE
            IF(OLD.NF_SITUACAO = 2 AND NEW.NF_SITUACAO = 3) THEN
            BEGIN

                -- DELETAR ESTOQUE
                EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, 2);
                -- DESFAZER BAIXA DE PEDIDO
                EXECUTE PROCEDURE SPD_NFS_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                 -- DESFAZER BAIXA DE PRE PEDIDO
                EXECUTE PROCEDURE SPD_NFS_PRE_PEDIDO(NEW.NFS_CONTROLE, NEW.CONTROLE);

                -- DESFAZER BAIXA DE ROMANEIO
                IF(COALESCE(NEW.TECELAGEM, 0) > 0) THEN
                BEGIN
                    EXECUTE PROCEDURE SPU_SALDO_ROMANEIO(NEW.ESTABELECIMENTO_CODIGO, NEW.SEQUENCIA, NEW.TECELAGEM, NEW.QUANTIDADE, 2);
                END

            END
       END
  END
END;


CREATE OR ALTER procedure SP_CFE_CONFERENCIA (
    PDV_CFE_ID integer,
    ACAO integer)
as
declare variable PDV_CFE_ITEM_ID integer;
declare variable CONFERENCIA_ITEM_ID integer;
declare variable QUANTIDADE numeric(10,5);
declare variable TAMANHO integer;
BEGIN

    FOR SELECT
        A.ID,
        A.CONFERENCIA_ITEM_ID,
        A.QUANTIDADE,
        A.TAMANHO
    FROM TBPDV_CFE_ITEM A
    WHERE A.CONFERENCIA_ITEM_ID > 0
      AND A.PDV_CFE_ID = :PDV_CFE_ID
    INTO
    :PDV_CFE_ITEM_ID, :CONFERENCIA_ITEM_ID, :QUANTIDADE, :TAMANHO
    DO BEGIN

        /* REALIZAR BAIXA DE CONFERENCIA */
        IF (:ACAO = 1) THEN
           BEGIN
                UPDATE TBPDV_CONFERENCIA_ITEM_SALDO T
                    SET T.QUANTIDADE = QUANTIDADE - :QUANTIDADE
                WHERE T.PDV_CONFERENCIA_ITEM_ID = :CONFERENCIA_ITEM_ID
                AND T.TAMANHO = :TAMANHO;

                UPDATE TBPDV_CONFERENCIA_ITEM T SET T.SITUACAO = 3 WHERE T.ID = :CONFERENCIA_ITEM_ID;

           END
           /* DESFAZ BAIXA DE CONFERENCIA */
           ELSE IF(:ACAO = 2) THEN
           BEGIN
                UPDATE TBPDV_CONFERENCIA_ITEM_SALDO T
                    SET T.QUANTIDADE = QUANTIDADE + :QUANTIDADE
                WHERE T.PDV_CONFERENCIA_ITEM_ID = :CONFERENCIA_ITEM_ID
                AND T.TAMANHO = :TAMANHO;

                UPDATE TBPDV_CONFERENCIA_ITEM T SET T.SITUACAO = 0 WHERE T.ID = :CONFERENCIA_ITEM_ID;

           END

       END

END;

CREATE OR ALTER trigger ttbnfs_item_b05d for tbnfs_item
active before delete position 5
AS
BEGIN

    DELETE FROM TBNFS_ITEM_SALDO WHERE NFS_ITEM_CONTROLE = OLD.CONTROLE;

    IF(OLD.GC_WEB = 1) THEN
    BEGIN
      IF(OLD.NF_NATUREZA = 2) THEN
      BEGIN
         -- DELETAR ESTOQUE PARA NATUREZA LANÇAMENTO
          EXECUTE PROCEDURE SP_NF_ITEM_ESTOQUE('NFS', OLD.CONTROLE, OLD.NFS_CONTROLE, 2);

          -- DESFAZER BAIXA DE PEDIDO
          EXECUTE PROCEDURE SPD_NFS_PEDIDO(OLD.NFS_CONTROLE, OLD.CONTROLE);

           -- DESFAZER BAIXA DE PRE PEDIDO
          EXECUTE PROCEDURE SPD_NFS_PRE_PEDIDO(OLD.NFS_CONTROLE, OLD.CONTROLE);
      END

      UPDATE TBLOTE_PECA_ITEM T SET T.NFS_ITEM_ID = NULL WHERE T.NFS_ITEM_ID = OLD.CONTROLE;

      IF(COALESCE(OLD.PDV_CONFERENCIA_ITEM_ID, 0) > 0) THEN
      BEGIN
          EXECUTE PROCEDURE SP_NFS_ITEM_PRE_PEDIDO(OLD.PDV_CONFERENCIA_ITEM_ID, 2);
      END
    END
END;