SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_baixa_b0d for tbestoque_baixa
active before delete position 0
AS
begin
    EXCEPTION "..." 'NAO E PERMITIDO EXCLUIR REGISTROS DESTA TABELA (TBESTOQUE_BAIXA), ATUALIZE O STATUSEXCLUSAO.';
end
^

SET TERM ; ^

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

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_baixa_b2u_03 for tbestoque_baixa
active before insert or update position 2
AS
/* BAIXA DE ESTOQUE */
DECLARE VARIABLE ESTOQUE_ID INTEGER;
DECLARE VARIABLE ESTABELECIMENTO_ID INTEGER;
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE TAMANHO INTEGER;
DECLARE VARIABLE DOCUMENTO INTEGER;
DECLARE VARIABLE TURNO_ID INTEGER;
DECLARE VARIABLE CCUSTO VARCHAR(10);
DECLARE VARIABLE OBSERVACAO VARCHAR(300);
DECLARE VARIABLE RESPOSTA VARCHAR(500);
DECLARE VARIABLE GRADE INTEGER;
BEGIN

    IF (NEW.TIPO = 'R') THEN
    BEGIN
        
        IF (((OLD.QUANTIDADE IS NULL) OR (NEW.QUANTIDADE <> OLD.QUANTIDADE))
           OR ((OLD.OPERACAO_CODIGO IS NULL) OR (NEW.OPERACAO_CODIGO <> OLD.OPERACAO_CODIGO))
           OR ((OLD.LOCALIZACAO_ID IS NULL) OR (NEW.LOCALIZACAO_ID <> OLD.LOCALIZACAO_ID)))
        THEN
        BEGIN
        
            RESPOSTA =  COALESCE((SELECT FIRST 1
                            LPAD(COALESCE(C.ESTABELECIMENTO_ID, 0), 4, '0')||
                            LPAD(COALESCE(C.PRODUTO_ID, 0), 6, '0')||
                            LPAD(COALESCE(C.TAMANHO, 0), 2, '0')||
                            LPAD(COALESCE(C.DOCUMENTO, 0), 6, '0')||
                            LPAD(COALESCE(C.TURNO_ID, 0), 2, '0')||
                            LPAD(COALESCE(C.CCUSTO, 0), 8, '0')||
                            LPAD(COALESCE(C.OBSERVACAO, ''), 200, '')
                        FROM TBCONSUMO_REQUISICAO C
                        WHERE
                            C.ID = NEW.TABELA_ID), 0);
    
            ESTABELECIMENTO_ID  = CAST(SUBSTRING(RESPOSTA FROM  1 FOR 4) AS INTEGER);
            PRODUTO_ID          = CAST(SUBSTRING(RESPOSTA FROM  5 FOR 6) AS INTEGER);
            TAMANHO             = CAST(SUBSTRING(RESPOSTA FROM 11 FOR 2) AS INTEGER);
            DOCUMENTO           = lpad(EXTRACT(YEAR FROM current_date), 4, '0') || lpad(EXTRACT(MONTH FROM current_date), 2, '0') || lpad(EXTRACT(DAY from current_date), 2, '0');
            TURNO_ID            = CAST(SUBSTRING(RESPOSTA FROM 19 FOR 2) AS INTEGER);
            CCUSTO              = cast(SUBSTRING(RESPOSTA FROM 21 FOR 8) as integer);
            OBSERVACAO          = cast('REQUISICAO DE CONSUMO - '||SUBSTRING(RESPOSTA FROM 29 FOR 200) as varchar(300));

            --se produto nao tem grade tamanho he 0
            GRADE               = COALESCE((select first 1 p.grade_codigo from tbproduto p where p.codigo = :PRODUTO_ID),0);
            if(GRADE = 0)then
            begin
                TAMANHO = 0;
            end
    
    
            IF (OLD.ESTOQUE_ID IS NULL) THEN
            BEGIN
                ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
            END
            ELSE
            BEGIN
                ESTOQUE_ID = OLD.ESTOQUE_ID;
            END
    
            EXECUTE PROCEDURE SPU_ESTOQUE_SALDO4 (
            :ESTABELECIMENTO_ID, NEW.LOCALIZACAO_ID,
            :PRODUTO_ID, 'S', CURRENT_DATE,
            NEW.QUANTIDADE,
            IIF(:TAMANHO = 1, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 2, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 3, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 4, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 5, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 6, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 7, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 8, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 9, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 10, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 11, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 12, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 13, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 14, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 15, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 16, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 17, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 18, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 19, NEW.QUANTIDADE, 0),
            IIF(:TAMANHO = 20, NEW.QUANTIDADE, 0),
            :ESTOQUE_ID, :DOCUMENTO,
            NULL, NULL, NEW.OPERACAO_CODIGO,
            NULL, 1, '0', 0, NEW.USUARIO_ID,
            CURRENT_DATE, :TURNO_ID, :CCUSTO,
            FN_ELIPSE(:OBSERVACAO, 100),
            '0', 0, 0, 0, 0);
    
            NEW.ESTOQUE_ID = :ESTOQUE_ID;
        END
    END
END
^

SET TERM ; ^

