SET TERM ^ ;

CREATE OR ALTER trigger ttbpdv_cfe_b12u for tbpdv_cfe
active before update position 12
AS
DECLARE VARIABLE ESTAB_TRANS_EST INTEGER;
DECLARE VARIABLE LOC_TRANS_EST INTEGER;

DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE PRODUTO_DESCRICAO VARCHAR(200);
DECLARE VARIABLE TAMANHO INTEGER;
DECLARE VARIABLE QUANTIDADE NUMERIC(15,2);
DECLARE VARIABLE SALDO NUMERIC(15,2);
DECLARE VARIABLE SALDO_HOJE NUMERIC(15,2);
DECLARE VARIABLE LOCALIZACAO_ENTRADA_ID INTEGER;
DECLARE VARIABLE TRANSACAO_SAIDA_ID INTEGER;
DECLARE VARIABLE TRANSACAO_ENTRADA_ID INTEGER;
DECLARE VARIABLE OPERACAO_SAIDA VARCHAR(3);
DECLARE VARIABLE OPERACAO_ENTRADA VARCHAR(3);

BEGIN

    /* SITUACAO AUTORIZADO */
    IF(OLD.SITUACAO = 1 AND NEW.SITUACAO = 2 AND COALESCE(NEW.IMPORTACAO, 0) = 0) THEN
    BEGIN

        :ESTAB_TRANS_EST    =  CAST(FN_PARAMETRO('TBPDV.ESTAB_TRANS_EST', NEW.PDV_ID) AS INTEGER);
        :LOC_TRANS_EST      =  CAST(FN_PARAMETRO('TBPDV.LOCAL_TRANS_EST', NEW.PDV_ID) AS INTEGER);

        IF(COALESCE(:ESTAB_TRANS_EST, 0) > 0 AND COALESCE(:LOC_TRANS_EST, 0) > 0) THEN
        BEGIN

            FOR SELECT
                T.ID,
                T.PRODUTO_ID,
                T.PRODUTO_DESCRICAO,
                T.LOCALIZACAO_ID,
                T.TAMANHO,
                T.QUANTIDADE
            FROM TBPDV_CFE_ITEM T
            INNER JOIN TBPRODUTO P ON P.CODIGO = T.PRODUTO_ID
            WHERE T.PDV_CFE_ID = NEW.ID
            INTO :ID, :PRODUTO_ID, :PRODUTO_DESCRICAO, :LOCALIZACAO_ENTRADA_ID, :TAMANHO, :QUANTIDADE
            DO BEGIN
                :SALDO      = FN_ESTOQUE_SALDO_DIARIO_DISP(:ESTAB_TRANS_EST, :LOC_TRANS_EST, :PRODUTO_ID, :TAMANHO, NEW.DATA_EMISSAO);

                :SALDO_HOJE = FN_ESTOQUE_SALDO(:ESTAB_TRANS_EST, :LOC_TRANS_EST, :PRODUTO_ID, :TAMANHO);

                IF((:SALDO >= :QUANTIDADE) AND (:SALDO_HOJE >= :QUANTIDADE)) THEN
                BEGIN
                    /* DAR SAIDA DO PRODUTO */
                    :TRANSACAO_SAIDA_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);

                    :OPERACAO_SAIDA = FN_PARAMETRO('TBPDV.OPER_SAIDA_ESTOQUE', NEW.PDV_ID);
    
                    EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO('TBPDV_CFE_ITEM', 0, :ID,
                        :ESTAB_TRANS_EST, :LOC_TRANS_EST, NEW.DATA_EMISSAO, :PRODUTO_ID,
                        :TAMANHO, :QUANTIDADE, 'S', :OPERACAO_SAIDA, 0, '', 'TRANSFERENCIA DE ESTOQUE - SAIDA',
                        :TRANSACAO_SAIDA_ID, NEW.NUMERO_CFE, NULL, NULL, 0, 0, 0, 0);


                     /* DAR SAIDA DO PRODUTO */
                    :TRANSACAO_ENTRADA_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);

                    :OPERACAO_ENTRADA = FN_PARAMETRO('TBPDV.OPER_ENTRADA_ESTOQUE', NEW.PDV_ID);
    
                    EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO('TBPDV_CFE_ITEM', 0, :ID,
                        NEW.ESTABELECIMENTO_ID, :LOCALIZACAO_ENTRADA_ID, NEW.DATA_EMISSAO, :PRODUTO_ID,
                        :TAMANHO, :QUANTIDADE, 'E', :OPERACAO_ENTRADA, 0, '', 'TRANSFERENCIA DE ESTOQUE - ENTRADA',
                        :TRANSACAO_ENTRADA_ID, NEW.NUMERO_CFE, NULL, NULL, 0, 0, 0, 0);
                END
            END

        END
    END

    
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpdv_cfe_a03u for tbpdv_cfe
active after update position 3
AS
DECLARE VARIABLE ESTAB_TRANS_EST INTEGER;
DECLARE VARIABLE LOC_TRANS_EST INTEGER;

DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE PRODUTO_DESCRICAO VARCHAR(200);
DECLARE VARIABLE TAMANHO INTEGER;
DECLARE VARIABLE QUANTIDADE NUMERIC(15,2);
DECLARE VARIABLE SALDO NUMERIC(15,2);
DECLARE VARIABLE SALDO_HOJE NUMERIC(15,2);
DECLARE VARIABLE LOCALIZACAO_ENTRADA_ID INTEGER;
DECLARE VARIABLE TRANSACAO_SAIDA_ID INTEGER;
DECLARE VARIABLE TRANSACAO_ENTRADA_ID INTEGER;
DECLARE VARIABLE OPERACAO_SAIDA VARCHAR(3);
DECLARE VARIABLE OPERACAO_ENTRADA VARCHAR(3);

BEGIN

    /* SITUACAO CANCELADO */
    IF((OLD.SITUACAO = 2 AND NEW.SITUACAO = 3) OR (OLD.SITUACAO = 1 AND NEW.SITUACAO = 3) OR (OLD.SITUACAO = 2 AND NEW.SITUACAO = 1) ) THEN
    BEGIN

        :ESTAB_TRANS_EST    =  CAST(FN_PARAMETRO('TBPDV.ESTAB_TRANS_EST', NEW.PDV_ID) AS INTEGER);
        :LOC_TRANS_EST      =  CAST(FN_PARAMETRO('TBPDV.LOCAL_TRANS_EST', NEW.PDV_ID) AS INTEGER);

        IF(COALESCE(:ESTAB_TRANS_EST, 0) > 0 AND COALESCE(:LOC_TRANS_EST, 0) > 0) THEN
        BEGIN

            FOR SELECT
                T.ID,
                T.PRODUTO_ID,
                T.PRODUTO_DESCRICAO,
                T.LOCALIZACAO_ID,
                T.TAMANHO,
                T.QUANTIDADE
            FROM TBPDV_CFE_ITEM T
            INNER JOIN TBPRODUTO P ON P.CODIGO = T.PRODUTO_ID
            WHERE T.PDV_CFE_ID = NEW.ID
            INTO :ID, :PRODUTO_ID, :PRODUTO_DESCRICAO, :LOCALIZACAO_ENTRADA_ID, :TAMANHO, :QUANTIDADE
            DO BEGIN

                 /* DAR SAIDA DO PRODUTO */
                :TRANSACAO_ENTRADA_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);

                :OPERACAO_ENTRADA = FN_PARAMETRO('TBPDV.OPER_ENTRADA_ESTOQUE', NEW.PDV_ID);

                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO('TBPDV_CFE_ITEM', 0, :ID,
                    :ESTAB_TRANS_EST, :LOC_TRANS_EST, NEW.DATA_EMISSAO, :PRODUTO_ID,
                    :TAMANHO, :QUANTIDADE, 'E', :OPERACAO_ENTRADA, 0, '', 'TRANSFERENCIA DE ESTOQUE - ENTRADA',
                    :TRANSACAO_ENTRADA_ID, NEW.NUMERO_CFE, NULL, NULL, 0, 0, 0, 0);

            END

        END
    END

    
END
^

SET TERM ; ^

