ALTER TABLE TBPEDIDO_ITEM_PROCESSADO ADD ESTOQUE_ID_RESIDUO INTEGER;

CREATE INDEX ITBPEDIDO_ITEM_PROCESSADO_35
ON TBPEDIDO_ITEM_PROCESSADO (ESTOQUE_ID_RESIDUO);


SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_processado_b15u for tbpedido_item_processado
active before update position 1
AS
declare variable producao numeric(15,4);
declare variable saldo numeric(15,4);
declare variable baixar numeric(15,4);
declare variable REMESSA varchar(15);
declare variable TALAO_ESTOQUE_ID integer;
declare variable GP_ID integer;
declare variable PERFIL_UP varchar(20);
declare variable CCUSTO integer;
declare variable UP_ID integer;
begin

  IF(NEW.quantidade_saldo IS distinct FROM OLD.quantidade_saldo AND NEW.quantidade_saldo < OLD.quantidade_saldo AND NEW.quantidade_saldo > 0 AND NEW.situacao = 3)THEN
  BEGIN

     FOR
        select
            GP_ID,
            UP_ID,
            PERFIL_UP,
            CCUSTO,
            remessa,
            producao,
            saldo,
            producao - usado as baixar
        from(

            select
                R.remessa,
                r.gp_id,
                U.id AS UP_ID,
                u.perfil AS PERFIL_UP,
                u.CCUSTO,
                p.quantidade_producao as producao,
                p.quantidade_saldo as saldo,
                coalesce((select sum(j.quantidade) from tbremessa_consumo_vinculo j where j.remessa_talao_detalhe_id = p.controle),0) as usado
            from tbpedido_item_processado p, tbremessa r, tbremessa_item_processado K, tbup u
            where  p.controle = NEW.controle
            and p.situacao = 3
            and r.numero = p.remessa
            and r.web = '1'
            and r.familia_codigo = 71
            and r.componente = '1'
            and p.quantidade_saldo > 0
            AND K.remessa = P.remessa
            AND K.controle = P.remessa_acumulado_controle
            AND U.id = K.up_id

        ) a where producao >  usado
    INTO
        GP_ID,
        UP_ID,
        PERFIL_UP,
        CCUSTO,
        REMESSA,
        producao,
        saldo,
        baixar
    DO BEGIN

        saldo = new.quantidade_saldo;

        IF(baixar = saldo)THEN
        BEGIN
            TALAO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);

            EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                3,
                :GP_ID,
                :PERFIL_UP,
                71,
                NEW.localizacao_codigo,
                'TBREMESSA_CONSUMO',
                3,
                NEW.remessa_acumulado_controle,
                NEW.estabelecimento_codigo,
                current_date,
                NEW.produto_codigo,
                NEW.tamanho,
                :baixar,
                'S',
                '1',
                :CCUSTO,
                '(*) SAIDA DE RESIDUO DE CONSUMO. REMESSA:' || :REMESSA || ' TALAO: ' || FN_LPAD(NEW.remessa_acumulado_controle,4,0),
                :TALAO_ESTOQUE_ID,
                NEW.remessa, NEW.controle,
                'RD'||FN_LPAD(NEW.controle,11,0)
            );

            NEW.estoque_id_residuo = TALAO_ESTOQUE_ID;
            NEW.quantidade_saldo = 0;
        END

    END

  END

  IF(OLD.situacao = 3 AND NEW.situacao IS distinct FROM OLD.situacao AND coalesce(NEW.estoque_id_residuo,0) > 0)THEN
  BEGIN

    baixar = coalesce((select first 1 O.quantidade FROM tbestoque_transacao_item O WHERE O.controle = NEW.estoque_id_residuo),0);
    DELETE FROM tbestoque_transacao_item O WHERE O.controle = NEW.estoque_id_residuo;
    NEW.estoque_id_residuo = 0;
    NEW.quantidade_saldo = NEW.quantidade_saldo + baixar;

  END

  --exception "..." 'erro';
end
^

SET TERM ; ^


COMMENT ON TRIGGER TTBPEDIDO_ITEM_PROCESSADO_B15U IS 'BAIXAR RESIDUO DE MANTAS E RETORNAR RESIDUO SE TALAO FOR REABERTO';



