CREATE TRIGGER TTBROMANEIO_B0I FOR TBROMANEIO
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTBROMANEIO,1);
END;

CREATE TRIGGER TTBROMANEIO_B02I FOR TBROMANEIO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF (NEW.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'Romaneio incluido';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBROMANEIO',NEW.ID, HISTORICO);
    END
END;

CREATE TRIGGER TTBROMANEIO_B01U FOR TBROMANEIO
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';
    
    IF (OLD.CHAVE_ACESSO <> NEW.CHAVE_ACESSO) THEN
    BEGIN
        HISTORICO = HISTORICO||', Chave acesso: '||OLD.CHAVE_ACESSO||' -> '||NEW.CHAVE_ACESSO;
    END

    IF (OLD.NUMERO_NOTAFISCAL <> NEW.NUMERO_NOTAFISCAL) THEN
    BEGIN
        HISTORICO = HISTORICO||', Núm. NF: '||OLD.NUMERO_NOTAFISCAL||' -> '||NEW.NUMERO_NOTAFISCAL;
    END

    IF (OLD.EMPRESA_ID <> NEW.EMPRESA_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||', Fornecedor: '||(select first 1 A.CODIGO||' - '||A.NOMEFANTASIA AS DESC_FND from tbempresa A WHERE A.CODIGO = OLD.EMPRESA_ID)||' -> '||(select first 1 A.CODIGO||' - '||A.NOMEFANTASIA AS DESC_FND from tbempresa A WHERE A.CODIGO = NEW.EMPRESA_ID);
    END

    IF (OLD.DATA_EMISSAO <> NEW.DATA_EMISSAO) THEN
    BEGIN
        HISTORICO = HISTORICO||', Dt. Emissao: '||FN_DATE_TO_STRING(OLD.DATA_EMISSAO)||' -> '||FN_DATE_TO_STRING(NEW.DATA_EMISSAO);
    END

    IF (OLD.DATA_EMBARQUE <> NEW.DATA_EMBARQUE) THEN
    BEGIN
        HISTORICO = HISTORICO||', Dt. Embarque: '||FN_DATE_TO_STRING(OLD.DATA_EMBARQUE)||' -> '||FN_DATE_TO_STRING(NEW.DATA_EMBARQUE);
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBROMANEIO', NEW.ID, HISTORICO);
    END
END;

CREATE TRIGGER TTBROMANEIO_B01D FOR TBROMANEIO
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF (OLD.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'Romaneio excluido';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBROMANEIO',OLD.ID, HISTORICO);
    END
END;

CREATE SEQUENCE GTBROMANEIO_ITEM;

CREATE TRIGGER TTBROMANEIO_ITEM_B01I FOR TBROMANEIO_ITEM
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTBROMANEIO,1);
END;

CREATE TRIGGER TTBROMANEIO_ITEM_B02I FOR TBROMANEIO_ITEM
ACTIVE BEFORE INSERT POSITION 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF (NEW.ID > 0) THEN
    BEGIN
       HISTORICO = HISTORICO||'Item ID: '||LPAD(NEW.ID,5,'0')||' Incluido';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBROMANEIO',NEW.ROMANEIO_ID, HISTORICO);
    END
END;

CREATE OR ALTER TRIGGER TTBROMANEIO_B01U FOR TBROMANEIO
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE STATUS_ANTIGO VARCHAR(500);
DECLARE VARIABLE STATUS_NOVO VARCHAR(500);
BEGIN

    HISTORICO = '';
    
    IF (OLD.CHAVE_ACESSO <> NEW.CHAVE_ACESSO) THEN
    BEGIN
        HISTORICO = HISTORICO||', Chave acesso: '||OLD.CHAVE_ACESSO||' -> '||NEW.CHAVE_ACESSO;
    END

    IF (OLD.OBSERVACAO <> NEW.OBSERVACAO) THEN
    BEGIN
        HISTORICO = HISTORICO||', Observacao alterada.';
    END
    
    IF (OLD.STATUS <> NEW.STATUS) THEN
    BEGIN
        IF (OLD.STATUS = '0') THEN
        BEGIN
             STATUS_ANTIGO = 'Pendente de Recebimento';
        END
        IF (OLD.STATUS = '1') THEN
        BEGIN
             STATUS_ANTIGO = 'Recebido em Conferencia';
        END
        IF (OLD.STATUS = '2') THEN
        BEGIN
             STATUS_ANTIGO = 'Recebido com Restricoes';
        END
        IF (OLD.STATUS = '3') THEN
        BEGIN
             STATUS_ANTIGO = 'Recebido';
        END
        IF (NEW.STATUS = '0') THEN
        BEGIN
             STATUS_NOVO = 'Pendente de Recebimento';
        END
        IF (NEW.STATUS = '1') THEN
        BEGIN
             STATUS_NOVO = 'Recebido em Conferencia';
        END
        IF (NEW.STATUS = '2') THEN
        BEGIN
             STATUS_NOVO = 'Recebido com Restricoes';
        END
        IF (NEW.STATUS = '3') THEN
        BEGIN
             STATUS_NOVO = 'Recebido';
        END
        HISTORICO = HISTORICO||', Status: '||STATUS_ANTIGO||' -> '||STATUS_NOVO;
    END

    IF (OLD.NUMERO_NOTAFISCAL <> NEW.NUMERO_NOTAFISCAL) THEN
    BEGIN
        HISTORICO = HISTORICO||', Núm. NF: '||OLD.NUMERO_NOTAFISCAL||' -> '||NEW.NUMERO_NOTAFISCAL;
    END 

    IF (OLD.QUANTIDADE_NOTAFISCAL <> NEW.QUANTIDADE_NOTAFISCAL) THEN
    BEGIN
        HISTORICO = HISTORICO||', Qtd.Reg.NF: '||OLD.QUANTIDADE_NOTAFISCAL||' -> '||NEW.QUANTIDADE_NOTAFISCAL;
    END

    IF (OLD.EMPRESA_ID <> NEW.EMPRESA_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||', Fornecedor: '||(select first 1 A.CODIGO||' - '||A.NOMEFANTASIA AS DESC_FND from tbempresa A WHERE A.CODIGO = OLD.EMPRESA_ID)||' -> '||(select first 1 A.CODIGO||' - '||A.NOMEFANTASIA AS DESC_FND from tbempresa A WHERE A.CODIGO = NEW.EMPRESA_ID);
    END

    IF (OLD.DATA_EMISSAO <> NEW.DATA_EMISSAO) THEN
    BEGIN
        HISTORICO = HISTORICO||', Dt. Emissao: '||FN_DATE_TO_STRING(OLD.DATA_EMISSAO)||' -> '||FN_DATE_TO_STRING(NEW.DATA_EMISSAO);
    END

    IF (OLD.DATA_EMBARQUE <> NEW.DATA_EMBARQUE) THEN
    BEGIN
        HISTORICO = HISTORICO||', Dt. Embarque: '||FN_DATE_TO_STRING(OLD.DATA_EMBARQUE)||' -> '||FN_DATE_TO_STRING(NEW.DATA_EMBARQUE);
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBROMANEIO', NEW.ID, HISTORICO);
    END
END;

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);

/* 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 CHAR(4);
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(NEW.STATUS = '1') then
    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;
        --PRODUTO_ID = NEW.PRODUTO_ID;
        --NEW.PECA_ID = GEN_ID(GTBREVISAO,1);
        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 F.LOCALIZACAO_ID from tbproduto E,TBFAMILIA_LOCALIZACAO F where E.CODIGO = :PRODUTO_ID and F.ID = E.FAMILIA_CODIGO AND F.LOCALIZACAO_TIPO_ID = 1),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;
    
        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;
    end
IF (NEW.STATUS = '0') THEN
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
if (NEW.STATUS = '2' or NEW.STATUS = '3') then
for select A.ID, A.PECA_ID, A.QUANTIDADE_LIQUIDA from tbromaneio_item a WHERE a.ROMANEIO_ID = new.ID into item, peca_id, qtd_liquida
    do begin
        UPDATE TBREVISAO H SET H.SALDO = :qtd_liquida WHERE H.ID = :peca_id;
    end
end;

CREATE OR ALTER TRIGGER TTBROMANEIO_ITEM_B01U FOR TBROMANEIO_ITEM
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';
    
    IF (OLD.SEQUENCIA <> NEW.SEQUENCIA) THEN
    BEGIN
        HISTORICO = HISTORICO||', Sequencia: '||OLD.SEQUENCIA||' -> '||NEW.SEQUENCIA;
    END

    IF (OLD.OC <> NEW.OC) THEN
    BEGIN
        HISTORICO = HISTORICO||', Ordem de Compra: '||OLD.OC||' -> '||NEW.OC;
    END

    IF (OLD.PRODUTO_ID <> NEW.PRODUTO_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||', Cod. Produto: '||OLD.PRODUTO_ID||' -> '||NEW.PRODUTO_ID;
    END

    IF (OLD.QUANTIDADE_BRUTA <> NEW.QUANTIDADE_BRUTA) THEN
    BEGIN
        HISTORICO = HISTORICO||', Qtd. Bruta: '||OLD.QUANTIDADE_BRUTA||' -> '||NEW.QUANTIDADE_BRUTA;
    END   

    IF (OLD.QUANTIDADE_LIQUIDA <> NEW.QUANTIDADE_LIQUIDA) THEN
    BEGIN
        HISTORICO = HISTORICO||', Qtd. Liquida: '||OLD.QUANTIDADE_LIQUIDA||' -> '||NEW.QUANTIDADE_LIQUIDA;
    END

    IF (OLD.PERDA <> NEW.PERDA) THEN
    BEGIN
        HISTORICO = HISTORICO||', Perda: '||OLD.PERDA||' -> '||NEW.PERDA;
    END

    IF (OLD.LOTE <> NEW.LOTE) THEN
    BEGIN
        HISTORICO = HISTORICO||', Lote: '||OLD.LOTE||' -> '||NEW.LOTE;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        HISTORICO = ' Item ID: '||LPAD(OLD.ID,5,'0')||HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBROMANEIO', NEW.ROMANEIO_ID, FN_ELIPSES(HISTORICO,500));
    END
END;

CREATE TRIGGER TTBROMANEIO_ITEM_B01D FOR TBROMANEIO_ITEM
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF (OLD.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'Item ID: '||LPAD(OLD.ID,5,'0')||' excluido';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBROMANEIO',OLD.ROMANEIO_ID, HISTORICO);
    END
END;








