SET TERM ^ ;

CREATE OR ALTER trigger ttbromaneio_b02u for tbromaneio
active before update position 0
AS
/* Variáveis para os itens do romaneio */
declare variable item integer;
declare variable peca_id integer;
declare variable oc_item integer;
declare variable sequencia integer;
declare variable qtd_bruta numeric(15,5);
declare variable qtd_liquida numeric(15,5);
declare variable status_item1 VARCHAR(1);

/* Variáveis para as peças da revisão */
declare variable ESTABELECIMENTO_ID INTEGER;
declare variable PRODUTO_ID INTEGER;
declare variable ID INTEGER;
declare variable DATA_REVISAO DATE;
declare variable EMPRESA_ID INTEGER;
declare variable NUMERO_NOTAFISCAL INTEGER;
declare variable SERIE VARCHAR(12);
declare variable NFE_ID INTEGER;
declare variable OPERADOR_ID INTEGER;
declare variable USUARIO_ID INTEGER;
declare variable OB INTEGER;
declare variable DATA TIMESTAMP;
declare variable PESO_LIQUIDO NUMERIC(18,4);
declare variable PESO_BRUTO NUMERIC(18,4);
declare variable METRAGEM NUMERIC(18,4);
declare variable LARGURA NUMERIC(18,4);
declare variable LOTE VARCHAR(40);
declare variable FALHAS INTEGER;
declare variable PECA INTEGER;
declare variable MAQUINA INTEGER;
declare variable RESULTADO CHAR(4);
declare variable OBSERVACAO VARCHAR(800);
declare variable NFE_ITEM_ID INTEGER;
declare variable LOCALIZACAO_ENTRADA INTEGER;
declare variable LOCALIZACAO_SAIDA INTEGER;
declare variable ESTOQUE_ID_PESAGEM INTEGER;
declare variable ESTOQUE_ID_AJUSTE INTEGER;
declare variable ESTOQUE_ID_REVISAO INTEGER;
declare variable ESTOQUE_ID_COLETADO INTEGER;
declare variable ESTOQUE_ID_INVENTARIO INTEGER;
declare variable ESTOQUE_ID_BAIXA INTEGER;
declare variable ESTOQUE_ID_SOBRA INTEGER;
declare variable ENDERECAMENTO_ID INTEGER;
declare variable UP_ID INTEGER;
declare variable SALDO NUMERIC(18,4);
declare variable STATUS_SALDO CHAR(4);
declare variable STATUS_COLETA CHAR(4);
declare variable TAMANHO INTEGER;
declare variable PESO_PECA NUMERIC(18,4);
declare variable DATAHORA_COLETA TIMESTAMP;
declare variable OPERADOR_PESAGEM_ID INTEGER;
declare variable OPERACAO_INVENTARIO CHAR(12);
declare variable OPERADOR_COLETA_ID INTEGER;
declare variable DATA_INVENTARIO DATE;
declare variable STATUS_OB INTEGER;
declare variable DATA_STATUS_OB DATE;
declare variable TALAO_ID INTEGER;
declare variable RENDIMENTO_CONSUMO NUMERIC(18,4);
declare variable DATAHORA TIMESTAMP;
declare variable QUANTIDADE_BAIXA NUMERIC(18,4);
declare variable AVULSO CHAR(4);
declare variable ID_ORIGEM INTEGER;
declare variable ID_DESTINO INTEGER;
declare variable SITUACAO INTEGER;
declare variable ESTOQUE_ID_S_TRANSF INTEGER;
declare variable ESTOQUE_ID_E_TRANSF INTEGER;
declare variable BLOQUEIO CHAR(4);
declare variable TIPO_BAIXA CHAR(4);
declare variable MOTIVO_BAIXA VARCHAR(400);
declare variable CCUSTO_BAIXA VARCHAR(32);
declare variable OBSERVACAO_AJUSTE VARCHAR(200);
declare variable MOTIVO_BAIXA_ID INTEGER;

begin

IF((old.status is distinct from new.status) and (NEW.STATUS = '1')) then
begin
    for select a.ID, A.OC, a.PRODUTO_ID, A.SEQUENCIA, a.QUANTIDADE_BRUTA, a.QUANTIDADE_LIQUIDA, cast(a.PRODUTO_TAMANHO as integer)
        from tbromaneio_item a WHERE a.ROMANEIO_ID = new.ID into item,oc_item,PRODUTO_ID,sequencia,qtd_bruta,QTD_LIQUIDA,TAMANHO
    do begin
        peca_id = GEN_ID(GTBREVISAO,1);
        SELECT FIRST 1 B.ESTABELECIMENTO_CODIGO, B.FORNECEDOR_CODIGO FROM TBOC B WHERE B.OC = :oc_item INTO ESTABELECIMENTO_ID,EMPRESA_ID;
        ID = peca_id;
        DATA_REVISAO = CURRENT_TIMESTAMP;
        SELECT FIRST 1 C.NUMERO_NOTAFISCAL FROM TBROMANEIO C WHERE C.ID = new.ID INTO NUMERO_NOTAFISCAL;
        SELECT FIRST 1 D.SERIE, D.CONTROLE FROM TBNFE D WHERE D.NUMERO_NOTAFISCAL = :NUMERO_NOTAFISCAL INTO SERIE, NFE_ID;
        SERIE  = COALESCE(SERIE,0);
        NFE_ID = COALESCE(NFE_ID,0);
        OPERADOR_ID = 0;
        USUARIO_ID = FN_CURRENT_USER_ID();
        OB = NULL;
        DATA = CURRENT_TIMESTAMP;
        PESO_LIQUIDO = CAST(QTD_LIQUIDA AS NUMERIC(15,5));
        PESO_BRUTO = QTD_BRUTA;
        METRAGEM = QTD_BRUTA;
        LARGURA = 0;
        LOTE = NULL;
        FALHAS = 0;
        PECA = NULL;
        MAQUINA = 0;
        RESULTADO = 'P';
        OBSERVACAO = 'Item do Romaneio: '||new.ID||', Item id: '||:item||', Sequencia: '||:sequencia;
        NFE_ITEM_ID = 0;
        LOCALIZACAO_ENTRADA = COALESCE((SELECT FIRST 1 E.LOCALIZACAO_CODIGO FROM TBPRODUTO E WHERE E.CODIGO = :PRODUTO_ID),0);
        LOCALIZACAO_SAIDA = 0;
        ESTOQUE_ID_PESAGEM = 0;
        ESTOQUE_ID_AJUSTE = 0;
        ESTOQUE_ID_REVISAO = 0;
        ESTOQUE_ID_COLETADO = 0;
        ESTOQUE_ID_INVENTARIO = 0;
        ESTOQUE_ID_BAIXA = 0;
        ESTOQUE_ID_SOBRA = 0;
        ENDERECAMENTO_ID = NULL;
        UP_ID = NULL;
        SALDO = 0;
        STATUS_SALDO = '1';
        STATUS_COLETA = '0';
        PESO_PECA = QTD_BRUTA;
        DATAHORA_COLETA = NULL;
        OPERADOR_PESAGEM_ID = 0;
        OPERACAO_INVENTARIO = '';
        OPERADOR_COLETA_ID = 0;
        DATA_INVENTARIO = CURRENT_TIMESTAMP;
        STATUS_OB = 2;
        DATA_STATUS_OB = NULL;
        TALAO_ID = 0;
        RENDIMENTO_CONSUMO = 0;
        DATAHORA = CURRENT_TIMESTAMP;
        QUANTIDADE_BAIXA = 0;
        AVULSO = NULL;
        ID_ORIGEM = NULL;
        ID_DESTINO = 0;
        SITUACAO = 1;
        ESTOQUE_ID_S_TRANSF = 0;
        ESTOQUE_ID_E_TRANSF = 0;
        BLOQUEIO = 0;
        TIPO_BAIXA = NULL;
        MOTIVO_BAIXA = NULL;
        CCUSTO_BAIXA = NULL;
        OBSERVACAO_AJUSTE = '';
        MOTIVO_BAIXA_ID = NULL;
        IF(LOCALIZACAO_ENTRADA = 0) THEN
        BEGIN
            EXCEPTION "..." 'A FAMILIA DO PRODUTO NÃO POSSUI LOCALIZAÇÃO PADRÃO DEFINIDA, PRODUTO: '||:PRODUTO_ID;
        END
    
        INSERT INTO TBREVISAO (ESTABELECIMENTO_ID, PRODUTO_ID, ID, DATA_REVISAO, EMPRESA_ID, NUMERO_NOTAFISCAL, SERIE, NFE_ID, OPERADOR_ID,
                                USUARIO_ID, OB, DATA, PESO_LIQUIDO, PESO_BRUTO, METRAGEM, LARGURA, LOTE, FALHAS, PECA, MAQUINA, RESULTADO,
                                OBSERVACAO, NFE_ITEM_ID, LOCALIZACAO_ENTRADA, LOCALIZACAO_SAIDA, ESTOQUE_ID_PESAGEM, ESTOQUE_ID_AJUSTE,
                                ESTOQUE_ID_REVISAO, ESTOQUE_ID_COLETADO, ESTOQUE_ID_INVENTARIO, ESTOQUE_ID_BAIXA, ESTOQUE_ID_SOBRA,
                                ENDERECAMENTO_ID, UP_ID, SALDO, STATUS_SALDO, STATUS_COLETA, TAMANHO, PESO_PECA, DATAHORA_COLETA,
                                OPERADOR_PESAGEM_ID, OPERACAO_INVENTARIO, OPERADOR_COLETA_ID, DATA_INVENTARIO, STATUS_OB, DATA_STATUS_OB,
                                TALAO_ID, RENDIMENTO_CONSUMO, DATAHORA, QUANTIDADE_BAIXA, AVULSO, ID_ORIGEM, ID_DESTINO, SITUACAO,
                                ESTOQUE_ID_S_TRANSF, ESTOQUE_ID_E_TRANSF, BLOQUEIO, TIPO_BAIXA, MOTIVO_BAIXA, CCUSTO_BAIXA, OBSERVACAO_AJUSTE,
                                MOTIVO_BAIXA_ID)
                       VALUES (:ESTABELECIMENTO_ID, :PRODUTO_ID, :ID, :DATA_REVISAO, :EMPRESA_ID, :NUMERO_NOTAFISCAL, :SERIE, :NFE_ID, :OPERADOR_ID,
                                :USUARIO_ID, :OB, :DATA, :PESO_LIQUIDO, :PESO_BRUTO, :METRAGEM, :LARGURA, :LOTE, :FALHAS, :PECA, :MAQUINA, :RESULTADO,
                                :OBSERVACAO,:NFE_ITEM_ID, :LOCALIZACAO_ENTRADA, :LOCALIZACAO_SAIDA, :ESTOQUE_ID_PESAGEM, :ESTOQUE_ID_AJUSTE,:ESTOQUE_ID_REVISAO,
                                :ESTOQUE_ID_COLETADO, :ESTOQUE_ID_INVENTARIO, :ESTOQUE_ID_BAIXA,:ESTOQUE_ID_SOBRA,:ENDERECAMENTO_ID,:UP_ID,:SALDO,:STATUS_SALDO,
                                :STATUS_COLETA,:TAMANHO,:PESO_PECA,:DATAHORA_COLETA,:OPERADOR_PESAGEM_ID, :OPERACAO_INVENTARIO, :OPERADOR_COLETA_ID, :DATA_INVENTARIO,
                                :STATUS_OB, :DATA_STATUS_OB, :TALAO_ID, :RENDIMENTO_CONSUMO, :DATAHORA, :QUANTIDADE_BAIXA, :AVULSO, :ID_ORIGEM, :ID_DESTINO,
                                :SITUACAO, :ESTOQUE_ID_S_TRANSF, :ESTOQUE_ID_E_TRANSF, :BLOQUEIO, :TIPO_BAIXA, :MOTIVO_BAIXA, :CCUSTO_BAIXA, :OBSERVACAO_AJUSTE,
                                :MOTIVO_BAIXA_ID);

        UPDATE TBROMANEIO_ITEM G SET G.PECA_ID = :peca_id WHERE G.ID = :item;
        --EXECUTE PROCEDURE SPI_NOTIFICAR(CURRENT_TIMESTAMP,666,'Notificação Romaneio Novo','Romaneio novo ID:'||new.id,1,1);
    end
end

IF ((old.status is distinct from new.status) and (NEW.STATUS = '0')) THEN
begin
    for select A.ID, A.PECA_ID from tbromaneio_item a WHERE a.ROMANEIO_ID = new.ID into item, peca_id
    do begin
        DELETE FROM TBREVISAO H WHERE H.ID = :peca_id;
        UPDATE TBROMANEIO_ITEM B SET B.PECA_ID = 0 WHERE B.ID = :item;
    end
end

if ((old.status is distinct from new.status) and (NEW.STATUS = '2' or NEW.STATUS = '3')) then
begin
    for select A.ID, A.PECA_ID, A.QUANTIDADE_LIQUIDA,a.status from tbromaneio_item a WHERE a.ROMANEIO_ID = new.ID into item, peca_id, qtd_liquida, status_item1
    do begin
    if(:status_item1 = '1') then
        begin
            UPDATE TBREVISAO H SET H.SALDO = :qtd_liquida WHERE H.ID = :peca_id;
        end
        
    end
end

end
^

SET TERM ; ^

CREATE INDEX ITBHISTORICO_04 ON TBHISTORICO (DATAHORA);