SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_placa_b02u for tbrequisicao_placa
active before update position 2
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE estabelecimento_id integer;
DECLARE VARIABLE localizacao_id integer;
DECLARE VARIABLE produto_id integer;
DECLARE VARIABLE requisicao_placa_id integer;
DECLARE VARIABLE saldo numeric(15,4);
DECLARE VARIABLE qtd_req numeric(15,4);
BEGIN

    HISTORICO = '';

    IF ( NEW.saldo > 0 and NEW.saldo is distinct from old.saldo) THEN
    BEGIN
        HISTORICO = HISTORICO||'Saldo: '||old.saldo||' -> '||NEW.saldo;
    END

    IF ( NEW.saldo = 0 and new.status = '1') THEN
    BEGIN
        HISTORICO = HISTORICO||'Registro baixado.';
    END

    IF ( NEW.saldo = 0 and new.status = '2') THEN
    BEGIN
        HISTORICO = HISTORICO||'Registro Conferido.';
    END

    IF ( new.status = '3' and old.status is distinct from new.status and NEW.saldo > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'Registro Encerrado.';

        qtd_req = coalesce((select r.quantidade from tbrequisicao r where r.id = new.requisicao_id),0);

        if(qtd_req = 0)then
        begin
            update tbrequisicao r set r.status = '3' where r.id = new.requisicao_id;
        end

        for
            select
                a.estabelecimento_id,
                a.localizacao_id,
                a.produto_id,
                a.requisicao_placa_id
            from tbrequisicao_placa_alocacao a
            where a.requisicao_placa_id = new.id
            and a.saldo > 0
            and a.status < 2
       into
            estabelecimento_id,
            localizacao_id,
            produto_id,
            requisicao_placa_id
       do begin
            update TBESTOQUE_DETALHE_ALOCACAO w
            set w.saldo = 0
            where w.estabelecimento_id = :estabelecimento_id
            and w.localizacao_id       = :localizacao_id
            and w.produto_id           = :produto_id
            and w.alocacao_id          = :requisicao_placa_id
            and w.tipo = 'L';
       end
    END

    IF ( old.status = '3' and new.status is distinct from old.status and NEW.saldo > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'Registro Encerrado.';

        qtd_req = coalesce((select r.quantidade from tbrequisicao r where r.id = new.requisicao_id),0);

        if(qtd_req = 0)then
        begin
            update tbrequisicao r set r.status = '0' where r.id = new.requisicao_id;
        end

        for
            select
                a.estabelecimento_id,
                a.localizacao_id,
                a.produto_id,
                a.requisicao_placa_id,
                a.saldo
            from tbrequisicao_placa_alocacao a
            where a.requisicao_placa_id = new.id
            and a.saldo > 0
            and a.status < 2
       into
            estabelecimento_id,
            localizacao_id,
            produto_id,
            requisicao_placa_id,
            saldo
       do begin
            update TBESTOQUE_DETALHE_ALOCACAO w
            set w.saldo = :saldo
            where w.estabelecimento_id = :estabelecimento_id
            and w.localizacao_id       = :localizacao_id
            and w.produto_id           = :produto_id
            and w.alocacao_id          = :requisicao_placa_id
            and w.tipo = 'L';
       end
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBREQUISICAO_PLACA',NEW.id, HISTORICO);
    END
end
^

SET TERM ; ^

