SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_trans_item_b0iu_01 for tbestoque_transacao_item
active before insert position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(10);
DECLARE VARIABLE DESCR VARCHAR(200);
DECLARE VARIABLE FRAC  CHAR(1);
DECLARE VARIABLE PROD_STATUS CHAR(1);
DECLARE VARIABLE FAMILIA_ID  INTEGER;
DECLARE VARIABLE FAM_USUARIO INTEGER;
DECLARE VARIABLE FAM_OPERACAO VARCHAR(1000);
DECLARE VARIABLE LOC VARCHAR(600);
DECLARE VARIABLE OPERACAO_ID INTEGER;
DECLARE VARIABLE GRADE_ID INTEGER;
DECLARE VARIABLE CCUSTO VARCHAR(10);
DECLARE VARIABLE VTOTALTAM NUMERIC(15,5);
DECLARE VARIABLE MENSAGEM VARCHAR(2000);
BEGIN

   IF (NEW.QUANTIDADE < 0 OR
       NEW.T01 < 0 OR NEW.T02 < 0 OR NEW.T03 < 0 OR NEW.T04 < 0 OR NEW.T05 < 0 OR
       NEW.T06 < 0 OR NEW.T07 < 0 OR NEW.T08 < 0 OR NEW.T09 < 0 OR NEW.T10 < 0 OR
       NEW.T11 < 0 OR NEW.T12 < 0 OR NEW.T13 < 0 OR NEW.T14 < 0 OR NEW.T15 < 0 OR
       NEW.T16 < 0 OR NEW.T17 < 0 OR NEW.T18 < 0 OR NEW.T19 < 0 OR NEW.T20 < 0) THEN
       BEGIN
            :MENSAGEM = 'QUANTIDADE NAO PODE SER NEGATIVO:';

            EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

            EXCEPTION "...":MENSAGEM;
       END

   IF (NEW.TIPO <> 'B') THEN --BENEFICIAMENTO
       BEGIN
       OPERACAO_ID = COALESCE((SELECT FIRST 1 O.ID FROM TBOPERACAO O
                            WHERE O.CODIGO = NEW.OPERACAO_CODIGO
                              AND O.TIPO   = NEW.TIPO
                              AND O.NOTAFISCAL = IIF(NEW.NFE_ITEM_CONTROLE>0 OR NEW.NFS_ITEM_CONTROLE > 0,'1','0')),0);
       END ELSE
       BEGIN
       OPERACAO_ID = COALESCE((SELECT FIRST 1 O.ID FROM TBOPERACAO O
                            WHERE O.CODIGO = NEW.OPERACAO_CODIGO
                              AND O.NOTAFISCAL = IIF(NEW.NFE_ITEM_CONTROLE>0 OR NEW.NFS_ITEM_CONTROLE > 0,'1','0')),0);
       END

   IF (:OPERACAO_ID = 0) THEN
       BEGIN
            :MENSAGEM = 'OPERACAO INVALIDA OU NAO CADASTRADA: '||COALESCE(NEW.OPERACAO_CODIGO,'');

            EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

            EXCEPTION "...":MENSAGEM;
       END

   USUARIO_NOME = (SELECT MON$USER FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION);
   USUARIO_NOME = CURRENT_USER;

   IF (:USUARIO_NOME <> 'SYSDBA' AND :USUARIO_NOME <> 'GC') THEN
       BEGIN

       USUARIO_ID = COALESCE((SELECT FIRST 1 U.CODIGO FROM TBUSUARIO U WHERE U.USUARIO = :USUARIO_NOME AND U.STATUS = '1'),0);

          IF (:USUARIO_ID = 0) THEN
              BEGIN
                    :MENSAGEM = 'USUARIO INATIVO OU NAO CADASTRADO: '||:USUARIO_NOME;

                    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

                    EXCEPTION "...":MENSAGEM;
              END

        ESTABELECIMENTO = COALESCE((SELECT FIRST 1 E.ESTABELECIMENTO_CODIGO FROM TBUSUARIO_ESTABELECIMENTO E WHERE E.USUARIO_CODIGO = :USUARIO_ID),0);
        IF (NEW.NFS_ITEM_CONTROLE > 0 OR NEW.NFE_ITEM_CONTROLE > 0) THEN
            BEGIN
            FAM_OPERACAO = '';
            END ELSE
            BEGIN
            FAM_OPERACAO = COALESCE((SELECT FIRST 1 O.FAMILIAS FROM TBOPERACAO O WHERE O.CODIGO = NEW.OPERACAO_CODIGO),'');
            END

        FOR
        SELECT FIRST 1
        U.SIGLA,
        P.DESCRICAO,
        U.PODE_FRACIONAR,
        P.FAMILIA_CODIGO,
        COALESCE((SELECT FIRST 1 F.FAMILIA_ID FROM TBUSUARIO_FAMILIA F WHERE F.FAMILIA_ID = P.FAMILIA_CODIGO AND F.USUARIO_ID = :USUARIO_ID),0),
        COALESCE((SELECT FIRST 1 C.VALOR_EXT FROM TBCONTROLE_USUARIO C WHERE C.USUARIO_ID = :USUARIO_ID AND C.ID = 127),''),
        IIF(:ESTABELECIMENTO>0,COALESCE((SELECT FIRST 1 E.ESTABELECIMENTO_CODIGO FROM TBUSUARIO_ESTABELECIMENTO E WHERE E.USUARIO_CODIGO = :USUARIO_ID AND E.ESTABELECIMENTO_CODIGO = NEW.ESTABELECIMENTO_CODIGO),0),-1),
        P.STATUS,
        P.GRADE_CODIGO,
        COALESCE((SELECT FIRST 1 L.CCUSTO FROM TBLOCALIZACAO L WHERE L.CODIGO = NEW.LOCALIZACAO_CODIGO),'')
        FROM TBPRODUTO P, TBUNIDADEMEDIDA U
        WHERE P.CODIGO = NEW.PRODUTO_CODIGO AND P.UNIDADEMEDIDA_SIGLA = U.SIGLA
        INTO :UM, :DESCR, :FRAC, :FAMILIA_ID, :FAM_USUARIO, :LOC, :ESTABELECIMENTO, :PROD_STATUS, :GRADE_ID, :CCUSTO
        DO
        BEGIN
          IF (:PROD_STATUS <> '1') THEN
              BEGIN
                    :MENSAGEM = 'TRANSACAO DE ESTOQUE NAO PERMITIDA PARA PRODUTO INATIVO, PRODUTO:'||COALESCE(NEW.PRODUTO_CODIGO,0);

                    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

                    EXCEPTION "...":MENSAGEM;

              END

           IF (:GRADE_ID > 0) THEN
               BEGIN

               IF (NEW.T01 + NEW.T02 + NEW.T03 + NEW.T04 + NEW.T05 +
                   NEW.T06 + NEW.T07 + NEW.T08 + NEW.T09 + NEW.T10 +
                   NEW.T11 + NEW.T12 + NEW.T13 + NEW.T14 + NEW.T15 +
                   NEW.T16 + NEW.T17 + NEW.T18 + NEW.T19 + NEW.T20 <= 0) THEN
                   BEGIN
                        :MENSAGEM = 'PRODUTO COM GRADE, EXIGE QUANTIDADE EM ALGUM TAMANHO! PROD.'||NEW.PRODUTO_CODIGO||' QUANT.'||NEW.QUANTIDADE||' OPER.'||NEW.OPERACAO_CODIGO;

                        EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

                        EXCEPTION "...":MENSAGEM;
                   END

               VTOTALTAM = NEW.T01 + NEW.T02 + NEW.T03 + NEW.T04 + NEW.T05 +
                   NEW.T06 + NEW.T07 + NEW.T08 + NEW.T09 + NEW.T10 +
                   NEW.T11 + NEW.T12 + NEW.T13 + NEW.T14 + NEW.T15 +
                   NEW.T16 + NEW.T17 + NEW.T18 + NEW.T19 + NEW.T20;

               IF (CAST(:VTOTALTAM AS NUMERIC(15,5)) <> CAST(NEW.QUANTIDADE AS NUMERIC(15,5))) THEN
                   BEGIN
                        :MENSAGEM = 'QUANTIDADE TOTAL NAO PODE SER DIFERENTE DO SOMATORIO DA QUANTIDADE NOS TAMANHOS DA GRADE! PROD.'||NEW.PRODUTO_CODIGO||' QUANT.'||NEW.QUANTIDADE||' QTD.TOT.TAMANHOS: '||:VTOTALTAM;

                        EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

                        EXCEPTION "...":MENSAGEM;

                   END

               END ELSE
           IF (:GRADE_ID = 0) THEN
               BEGIN
               IF (NEW.T01 + NEW.T02 + NEW.T03 + NEW.T04 + NEW.T05 +
                   NEW.T06 + NEW.T07 + NEW.T08 + NEW.T09 + NEW.T10 +
                   NEW.T11 + NEW.T12 + NEW.T13 + NEW.T14 + NEW.T15 +
                   NEW.T16 + NEW.T17 + NEW.T18 + NEW.T19 + NEW.T20 > 0) THEN
                   BEGIN
                        :MENSAGEM = 'PRODUTO SEM GRADE, NAO HA NECESSIDADE DE QUANTIDADE POR TAMANHO! ';

                        EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

                        EXCEPTION "...":MENSAGEM;

                   END
               END

          IF (:ESTABELECIMENTO = 0) THEN
              BEGIN 
                    :MENSAGEM = 'USUARIO NAO TEM PERMISSAO DE MOVIMENTAR ESTOQUE DO ESTABELECIMENTO INFORMADO: '||:ESTABELECIMENTO||'-'||COALESCE((SELECT FIRST 1 E.NOMEFANTASIA FROM TBESTABELECIMENTO E WHERE E.CODIGO = NEW.ESTABELECIMENTO_CODIGO),'')||' -> USUARIO: '||:USUARIO_ID||'-'||:USUARIO_NOME;

                    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

                    EXCEPTION "...":MENSAGEM;

              END
          IF (POSITION(LPAD(NEW.LOCALIZACAO_CODIGO,2,'0'),:LOC) = 0) THEN
              BEGIN
                
                :MENSAGEM = 'USUARIO NAO TEM PERMISSAO DE MOVIMENTAR ESTOQUE COM A LOCALIZACAO INFORMADA: '||NEW.LOCALIZACAO_CODIGO||'-'||COALESCE((SELECT FIRST 1 L.DESCRICAO FROM TBLOCALIZACAO L WHERE L.CODIGO = NEW.LOCALIZACAO_CODIGO),'')||' -> USUARIO: '||:USUARIO_ID||'-'||:USUARIO_NOME;

                EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

                EXCEPTION "...":MENSAGEM;

              END
          IF (:FAM_USUARIO = 0) THEN
              BEGIN
                    :MENSAGEM = 'USUARIO NAO TEM PERMISSAO DE MOVIMENTAR ESTOQUE DA FAMILIA DESTE PRODUTO: '||:FAMILIA_ID||'-'||COALESCE((SELECT FIRST 1 F.DESCRICAO FROM TBFAMILIA F WHERE F.CODIGO = :FAMILIA_ID),'')||' -> USUARIO: '||:USUARIO_ID||'-'||:USUARIO_NOME;

                    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);
    
                    EXCEPTION "...":MENSAGEM;
              END
          IF (:FRAC = 'N') THEN
              BEGIN
              IF (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  BEGIN
                    :MENSAGEM = 'PRODUTO NAO PERMITE QUANTIDADE FRACIONADA: '||NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM;

                    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);
    
                    EXCEPTION "...":MENSAGEM;

                  END
              END
          IF (:FAM_OPERACAO <> '' AND POSITION(LPAD(:FAMILIA_ID,4,'0'),:FAM_OPERACAO) = 0) THEN
              BEGIN
                    
                    :MENSAGEM = 'OPERACAO NAO PODE SER USADA COM A FAMILIA DE PRODUTOS INFORMADA.'||'OPERACAO: '||NEW.OPERACAO_CODIGO||'- FAMILIA: '||:FAMILIA_ID;

                    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);
    
                    EXCEPTION "...":MENSAGEM;

              END

          IF ((COALESCE(NEW.CENTRO_DE_CUSTO, '') = '') AND (COALESCE(:CCUSTO, '') <> '')) THEN
              BEGIN
              NEW.CENTRO_DE_CUSTO = :CCUSTO;
              END

          NEW.USUARIO_CODIGO = :USUARIO_ID;
        END
     END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_transacao_item_trava for tbestoque_transacao_item
active before insert or update or delete position 0
AS
DECLARE VARIABLE MENSAGEM VARCHAR(2000);
BEGIN
    :MENSAGEM = 'TRANSACAO NAO PERMITIDA, PERIODO FECHADO!';

    IF (INSERTING) THEN
        BEGIN
        IF (NEW.DATA <= '31.08.2022') THEN
        BEGIN

            EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

            EXCEPTION "...":MENSAGEM;
        END
        END ELSE
    IF (UPDATING) THEN
        BEGIN
        IF (OLD.DATA <= '31.08.2022') THEN
        BEGIN
            
            EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

            EXCEPTION "...":MENSAGEM;
        END
        IF (NEW.DATA <= '31.08.2022') THEN
        BEGIN
            EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

            EXCEPTION "...":MENSAGEM;
        END
        END ELSE
    IF (DELETING) THEN
        BEGIN
        IF (OLD.DATA <= '31.08.2022') THEN
        BEGIN
            EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

            EXCEPTION "...":MENSAGEM;
        END
        END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_transacao_item_bud0 for tbestoque_transacao_item
active before insert or update or delete position 0
AS
DECLARE VARIABLE INVENTARIO_ID INTEGER;
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE MENSAGEM VARCHAR(2000);
BEGIN
    IF(INSERTING OR (UPDATING)) THEN
        BEGIN
            FOR
                SELECT FIRST 1 T.ID
                FROM TBINVENTARIO_MATERIA_PRIMA T, TBINVENTARIO_MAT_PRIMA_DETALHE I
                WHERE T.ID = I.INVENTARIO_ID
                AND T.LOCALIZACAO_ID = NEW.LOCALIZACAO_CODIGO
                AND T.ESTABELECIMENTO_ID = NEW.ESTABELECIMENTO_CODIGO
                AND I.PRODUTO_ID = NEW.PRODUTO_CODIGO
                AND T.FLAG_AJUSTE = 0
                AND T.BLOQUEIA_ESTOQUE  = 1
                INTO :INVENTARIO_ID
              DO
                BEGIN
                    :MENSAGEM = '<h4>ATENCAO</h4>PRODUTO: <br> <strong>'||(SELECT FIRST 1 FN_LPAD(P.CODIGO,6,'0')||'-'||P.DESCRICAO FROM TBPRODUTO P WHERE P.CODIGO = NEW.PRODUTO_CODIGO)||' </strong>ESTA EM PROCESSO DE INVENTARIO, TRANSAÇÃO CANCELADA. ENTRE EM CONTATO COM O SETOR RESPONSAVEL! <br><strong>INVENTARIO:'||:INVENTARIO_ID||'</strong>';

                    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

                    EXCEPTION "...":MENSAGEM;
                END
        END

        IF(DELETING) THEN
        BEGIN
            FOR
                SELECT FIRST 1 T.ID
                FROM TBINVENTARIO_MATERIA_PRIMA T, TBINVENTARIO_MAT_PRIMA_DETALHE I
                WHERE T.ID = I.INVENTARIO_ID
                AND T.LOCALIZACAO_ID = NEW.LOCALIZACAO_CODIGO
                AND T.ESTABELECIMENTO_ID = NEW.ESTABELECIMENTO_CODIGO
                AND I.PRODUTO_ID = NEW.PRODUTO_CODIGO
                AND T.FLAG_AJUSTE = 0
                AND T.BLOQUEIA_ESTOQUE  = 1
                INTO :INVENTARIO_ID
              DO
                BEGIN
                    :MENSAGEM = '<h4>ATENCAO</h4>PRODUTO: <br> <strong>'||(SELECT FIRST 1 FN_LPAD(P.CODIGO,6,'0')||'-'||P.DESCRICAO FROM TBPRODUTO P WHERE P.CODIGO = OLD.PRODUTO_CODIGO)||' </strong>ESTA EM PROCESSO DE INVENTARIO, TRANSAÇÃO CANCELADA. ENTRE EM CONTATO COM O SETOR RESPONSAVEL!<br><strong>NVENTARIO:'||:INVENTARIO_ID||'</strong>';

                    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

                    EXCEPTION "...":MENSAGEM;
                END
        END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_transacao_item_b4i for tbestoque_transacao_item
active before insert or update position 0
AS
DECLARE VARIABLE LIBERADO BOOLEAN;
DECLARE VARIABLE FAMILIA_PRODUTO INTEGER;
DECLARE VARIABLE MENSAGEM VARCHAR(2000);
BEGIN

  IF ((INSERTING) OR (NEW.LOCALIZACAO_CODIGO <> OLD.LOCALIZACAO_CODIGO AND UPDATING)) THEN
      BEGIN
         FAMILIA_PRODUTO = COALESCE((SELECT FIRST 1 P.FAMILIA_CODIGO FROM TBPRODUTO P WHERE P.CODIGO = NEW.PRODUTO_CODIGO),0);
         LIBERADO = FN_LOCALIZACAO_FAMILIA(NEW.LOCALIZACAO_CODIGO, FAMILIA_PRODUTO);
    
         IF(LIBERADO =  FALSE)THEN
         BEGIN
            :MENSAGEM = 'FAMILIA NAO PERMITIDA PARA LOCALIZACAO INFORMADA. FAMILIA:'||COALESCE(:FAMILIA_PRODUTO,0)||' LOCALIZACAO:'||COALESCE(NEW.LOCALIZACAO_CODIGO,0)||'';

            EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

            EXCEPTION "...":MENSAGEM;
         END
      END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_trans_item_b0i_01 for tbestoque_transacao_item
active before insert position 0
AS
DECLARE VARIABLE DATAINICIAL DATE;
DECLARE VARIABLE DATAFINAL DATE;
DECLARE VARIABLE MODULO_CODIGO INTEGER;

DECLARE VARIABLE DATA1 VARCHAR(10);
DECLARE VARIABLE DATA2 VARCHAR(23);
declare variable MENSAGEM VARCHAR(2000);
BEGIN

FOR
SELECT   
(SELECT FIRST 1 A.DATAINICIAL   FROM TBCONFIGURACAO_PERIODO A WHERE A.ESTABELECIMENTO_CODIGO = NEW.ESTABELECIMENTO_CODIGO AND A.MODULO_CODIGO = 1),
(SELECT FIRST 1 A.DATAFINAL     FROM TBCONFIGURACAO_PERIODO A WHERE A.ESTABELECIMENTO_CODIGO = NEW.ESTABELECIMENTO_CODIGO AND A.MODULO_CODIGO = 1),
COALESCE((SELECT FIRST 1 A.MODULO_CODIGO FROM TBCONFIGURACAO_PERIODO A WHERE A.ESTABELECIMENTO_CODIGO = NEW.ESTABELECIMENTO_CODIGO AND A.MODULO_CODIGO = 1),0),

EXTRACT(DAY FROM NEW.DATA)||'/'||EXTRACT(MONTH FROM NEW.DATA)||'/'||EXTRACT(YEAR FROM NEW.DATA),
(SELECT FIRST 1 EXTRACT(DAY FROM A.DATAINICIAL)||'/'||EXTRACT(MONTH FROM A.DATAINICIAL)||'/'||EXTRACT(YEAR FROM A.DATAINICIAL)
                ||' A '||EXTRACT(DAY FROM A.DATAFINAL)||'/'||EXTRACT(MONTH FROM A.DATAFINAL)||'/'||EXTRACT(YEAR FROM A.DATAFINAL)
   FROM TBCONFIGURACAO_PERIODO A WHERE A.ESTABELECIMENTO_CODIGO = NEW.ESTABELECIMENTO_CODIGO AND A.MODULO_CODIGO = 1)

FROM RDB$DATABASE

INTO :DATAINICIAL,:DATAFINAL,:MODULO_CODIGO,:DATA1,:DATA2
DO
BEGIN

  IF (:MODULO_CODIGO = 0) THEN
  BEGIN
    :MENSAGEM = 'MÓDULO DE ESTOQUE[1] NÃO LOCALIZADO PARA ESSE ESTABELECIMENTO. ID.'||NEW.ESTABELECIMENTO_CODIGO;
    
    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

    EXCEPTION "...":MENSAGEM;

  END

  IF (NEW.DATA < :DATAINICIAL) THEN
  BEGIN
    
    :MENSAGEM = 'MÓDULO DE ESTOQUE[1]. DATA '||:DATA1||' FORA DO PERÍODO LIBERADO: '||:DATA2;
    
    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

    EXCEPTION "...":MENSAGEM;

  END

  IF (NEW.DATA > :DATAFINAL) THEN
  BEGIN
    :MENSAGEM = 'MÓDULO DE ESTOQUE[1]. DATA '||:DATA1||' FORA DO PERÍODO LIBERADO: '||:DATA2;
    
    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);

    EXCEPTION "...":MENSAGEM;
  END
END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_transacao_item_a0i for tbestoque_transacao_item
active after insert position 0
AS
DECLARE VARIABLE REGRAS BIGINT;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE GP_ID INTEGER;
DECLARE VARIABLE PERFIL_UP VARCHAR(40);
DECLARE VARIABLE FAMILIA_ID INTEGER;
DECLARE VARIABLE LOCALIZACAO_ID_SAIDA INTEGER;
DECLARE VARIABLE LOCALIZACAO_ID_ENTRADA INTEGER;
DECLARE VARIABLE CONFERENCIA INTEGER;
DECLARE VARIABLE OPERACAO_ESTOQUE_SAIDA VARCHAR(40);
DECLARE VARIABLE OPERACAO_ESTOQUE_ENTRADA VARCHAR(40);
DECLARE VARIABLE ALOCACAO_TIPO VARCHAR(10);
DECLARE VARIABLE ALOCACAO_TABELA_ID INTEGER;
DECLARE VARIABLE ALOCACAO_TAB_ITEM_ID INTEGER;
DECLARE VARIABLE MENSAGEM VARCHAR(2000);
BEGIN

    IF ( NEW.ESTOQUE_TRANSACAO_REGRA_ID > 0 AND NEW.CONFERENCIA = 1 ) THEN
    BEGIN
        ID = 0;

        SELECT
            ID,
            TIPO,
            GP_ID,
            PERFIL_UP,
            FAMILIA_ID,
            LOCALIZACAO_ID_SAIDA,
            LOCALIZACAO_ID_ENTRADA,
            CONFERENCIA,
            OPERACAO_ESTOQUE_SAIDA,
            OPERACAO_ESTOQUE_ENTRADA
        FROM TBESTOQUE_TRANSACAO_REGRA R
        WHERE R.ID = NEW.ESTOQUE_TRANSACAO_REGRA_ID
        INTO
            ID,
            TIPO,
            GP_ID,
            PERFIL_UP,
            FAMILIA_ID,
            LOCALIZACAO_ID_SAIDA,
            LOCALIZACAO_ID_ENTRADA,
            CONFERENCIA,
            OPERACAO_ESTOQUE_SAIDA,
            OPERACAO_ESTOQUE_ENTRADA
        ;
    
        IF ( ID = 0 ) THEN
        BEGIN
            :MENSAGEM = 'REGRA DE TRANSACAO DE ESTOQUE NAO ENCONTRADA. ENTRE EM CONTATO COM SUPORTE TECNICO.';
    
            EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);
        
            EXCEPTION "...":MENSAGEM;

        END
    
        IF ( CONFERENCIA = '1' AND NEW.TIPO = 'E' ) THEN
        BEGIN
          --  ALOCACAO_TIPO = '';
          --  ALOCACAO_TABELA_ID = 0;
          --  ALOCACAO_TAB_ITEM_ID = 0;
    
          --  IF ( TIPO = 1 ) THEN
          --  BEGIN
                ALOCACAO_TIPO = 'E'; -- E = REGRAS DE 'E'STOQUE;
                ALOCACAO_TABELA_ID   = NEW.CONTROLE;
                ALOCACAO_TAB_ITEM_ID = NEW.CONTROLE;
          --  END
    
    
            IF ( ALOCACAO_TIPO = '' OR ALOCACAO_TABELA_ID = 0 OR ALOCACAO_TAB_ITEM_ID = 0 ) THEN
            BEGIN
                :MENSAGEM = 'INFORMACOES DE ALOCACAO PARA CONFERENCIA DA TRANSACAO DE ESTOQUE NAO ENCONTRADA. ENTRE EM CONTATO COM O SUPORTE TECNICO.';
    
                EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);
            
                EXCEPTION "...":MENSAGEM;

            END
    
            INSERT INTO TBESTOQUE_DETALHE_ALOCACAO (
                ESTABELECIMENTO_ID,
                TABELA_ID,
                TAB_ITEM_ID,
                TIPO,
                LOCALIZACAO_ID,
                PRODUTO_ID,
                TAMANHO,
                QUANTIDADE,
                SALDO
            ) VALUES (
                NEW.ESTABELECIMENTO_CODIGO,
                :ALOCACAO_TABELA_ID,
                :ALOCACAO_TAB_ITEM_ID,
                :ALOCACAO_TIPO,
                NEW.LOCALIZACAO_CODIGO,
                NEW.PRODUTO_CODIGO,
                IIF(NEW.T01 > 0,01,
                IIF(NEW.T02 > 0,02,
                IIF(NEW.T03 > 0,03,
                IIF(NEW.T04 > 0,04,
                IIF(NEW.T05 > 0,05,
                IIF(NEW.T06 > 0,06,
                IIF(NEW.T07 > 0,07,
                IIF(NEW.T08 > 0,08,
                IIF(NEW.T09 > 0,09,
                IIF(NEW.T10 > 0,10,
                IIF(NEW.T11 > 0,11,
                IIF(NEW.T12 > 0,12,
                IIF(NEW.T13 > 0,13,
                IIF(NEW.T14 > 0,14,
                IIF(NEW.T15 > 0,15,
                IIF(NEW.T16 > 0,16,
                IIF(NEW.T17 > 0,17,
                IIF(NEW.T18 > 0,18,
                IIF(NEW.T19 > 0,19,
                IIF(NEW.T20 > 0,20,0)))))))))))))))))))),
                NEW.QUANTIDADE,
                NEW.QUANTIDADE
            );
    
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_transacao_item_a9iu for tbestoque_transacao_item
active after insert or update position 9
AS
declare variable REMESSA_ID integer;
declare variable CONSUMO_ID integer;
declare variable QUANTIDADE numeric(18,8);
declare variable SALDO_ALOCAR numeric(18,8);
declare variable MENSAGEM VARCHAR(2000);
begin
  IF(NEW.alocar_consumo > 0)THEN
  BEGIN

     IF((inserting AND NEW.conferencia = 0) or (updating AND NEW.conferencia IS distinct FROM OLD.conferencia AND NEW.conferencia = 2))THEN
     BEGIN

       SALDO_ALOCAR = new.quantidade;

       for
            select
                ID,
                REMESSA,
                CONSUMO_KG - quantidade_alocada SALDO
            from(
                    SELECT
                        D.id,
                        d.remessa,
                        d.consumo_kg,
                        coalesce((select sum(a.quantidade) from tbestoque_detalhe_alocacao a where a.tabela_id = d.remessa and a.tab_item_id = d.id and a.tipo = 'R'),0) as quantidade_alocada
                    FROM TBREMESSA_CONSUMO D, TBREMESSA C, TBPEDIDO_ITEM_PROCESSADO P, TBUP U, TBPRODUTO G, TBESTOQUE_TRANSACAO_REGRA R
                    WHERE C.NUMERO = D.REMESSA
                    AND P.REMESSA = C.NUMERO
                    AND P.REMESSA_ACUMULADO_CONTROLE = D.TALAO
                    AND P.CONTROLE = D.TALAO_DETALHE_ID
                    AND U.ID = P.SETOR_CODIGO
                    AND D.CONFERENCIA = '0'
                    AND G.CODIGO = D.PRODUTO_ID
                    AND R.FAMILIA_ID = G.FAMILIA_CODIGO
                    AND R.GP_ID = C.GP_ID
                    AND R.PERFIL_UP = U.PERFIL
                    AND R.TIPO = 3
                    AND R.LOCALIZACAO_ID_KANBAN > 0
                    AND R.id = NEW.alocar_consumo
                    and d.produto_id = new.produto_codigo
                    and d.tamanho = new.tamanho
                    order by d.id ascending
             ) where quantidade_alocada < consumo_kg
       into
           :CONSUMO_ID,
           :REMESSA_ID,
           :QUANTIDADE
       do BEGIN

            if(SALDO_ALOCAR >= :QUANTIDADE)then
            begin
                insert into TBESTOQUE_DETALHE_ALOCACAO (estabelecimento_id,tabela_id,tab_item_id,tipo, localizacao_id, produto_id, tamanho, tamanho_item, quantidade, saldo)
                values (new.estabelecimento_codigo, :REMESSA_ID, :CONSUMO_ID, 'R', new.localizacao_codigo, new.produto_codigo, new.tamanho, 0, :QUANTIDADE, :QUANTIDADE);

                SALDO_ALOCAR = SALDO_ALOCAR - :QUANTIDADE;

                if(SALDO_ALOCAR < 0)then
                begin
                    
                    :MENSAGEM = 'ERRO NA ALOCACAO AUTOMATICA DE CONSUMO';
    
                    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);
                
                    EXCEPTION "...":MENSAGEM;

                end
            end

       END
     END
  END
end
^

SET TERM ; ^

