SET TERM ^ ;

CREATE OR ALTER procedure SPI_REQUISITAR_PLACA (
    COR_ID integer,
    MODELO_ORIGEM integer,
    DENSIDADE numeric(15,2),
    ESPESSURA numeric(15,2),
    LARGURA numeric(15,4),
    COMPRIMENTO numeric(15,4),
    QUANTIDADE_REQUISITAR numeric(15,2),
    FATOR integer,
    UP_ID integer,
    REMESSA integer,
    TALAO integer,
    TALAO_DE_PLACA integer,
    DATA date,
    DATAHORA timestamp,
    MINIMO integer)
as
declare variable ID integer;
declare variable PRODUTO varchar(200);
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable SALDO integer;
declare variable SALDO_INDISPONIVEL integer;
declare variable SALDO_ALOCADO integer;
declare variable QTD_SALDO integer;
declare variable QTD_GRAVAR integer;
declare variable ID_REQ integer;
declare variable TALAO_ID integer;
declare variable SALDO_ESTOQUE integer;
declare variable SALDO_PECA integer;
declare variable SALDO_JA_BAIXADO integer;
begin

    QTD_SALDO = QUANTIDADE_REQUISITAR;

    for
        SELECT
            ID,
            PRODUTO,
            ESTABELECIMENTO_ID,
            LOCALIZACAO_ID,
            SALDO_ESTOQUE,
            saldo_peca,
            --iif(saldo_estoque > saldo_indisponivel, saldo_estoque - saldo_indisponivel, 0) as saldo,
            iif(saldo_estoque > saldo_peca, saldo_peca - saldo_indisponivel - SALDO_JA_BAIXADO, saldo_estoque - saldo_indisponivel - SALDO_JA_BAIXADO) as saldo,
            SALDO_INDISPONIVEL,
            saldo_ALOCADO AS ALOCADO,
            SALDO_JA_BAIXADO
        from(
            SELECT
                ID,
                PRODUTO,
                ESTABELECIMENTO_ID,
                LOCALIZACAO_ID,
                iif(SALDO_ALOCADO_INI >= 0, (SALDO_ESTOQUE - SALDO_ALOCADO_INI), (SALDO_ESTOQUE - SALDO_ALOCADO)) as SALDO_ESTOQUE,
                SALDO_ALOCADO,
                SALDO_JA_BAIXADO,
                coalesce(cast(fn_array(saldos,1,'|') as numeric(15,4)),0) as saldo_peca,
                coalesce(cast(fn_array(saldos,2,'|') as numeric(15,4)),0) as saldo_indisponivel
            FROM (
                SELECT
                    p.DESCRICAO as PRODUTO,
                    s.estabelecimento_codigo as ESTABELECIMENTO_ID, s.codigo as LOCALIZACAO_ID,
                    p.codigo as ID,
                    FN_ESTOQUE_SALDO(s.estabelecimento_codigo, s.codigo, p.codigo, 0) as SALDO_ESTOQUE,
                    FN_ESTOQUE_SALDO_ALOCADO(s.estabelecimento_codigo, s.codigo, p.codigo, 0) as SALDO_ALOCADO,
                    coalesce((select sum(k.baixado) from TMPCALC_PLACA k where k.remessa_id = :REMESSA and k.produto_id = P.codigo),0) SALDO_JA_BAIXADO,
                    coalesce((select first 1 k.alocado from TMPCALC_PLACA k where k.remessa_id = :REMESSA and k.produto_id = P.codigo order by k.id ascending),-1) SALDO_ALOCADO_INI,
                    coalesce((select sum(iif(ABERTO = 0,e.saldo, 0))||'|'||sum(iif(ABERTO = 0,0,e.saldo)) from VWESTOQUE_PLACA_V2 e where e.produto_id = p.codigo),0) as saldos
                from tbproduto p, tbproduto_ficha f, tblocalizacao s
                where p.familia_alternativa = (select fn_parametro('SISTEMA.FAMILIA_PLACA') from rdb$database)
                and f.LARGURA         >=:LARGURA
                and f.COMPRIMENTO     >=:COMPRIMENTO
                and p.cor_codigo      = :COR_ID
                and f.produto_codigo  = p.codigo
                and f.densidade       = :DENSIDADE
                and f.espessura       = :ESPESSURA
                and s.codigo          = fn_parametro('SISTEMA.LOCALIZACAO_PLACAS')
                AND P.modelo_origem   = :MODELO_ORIGEM
            ) x  

        ) where saldo_estoque > 0 and (saldo_peca > 0 /*or saldo_indisponivel > 0*/)

        order by saldo asc
    into
        ID,
        PRODUTO,
        ESTABELECIMENTO_ID,
        LOCALIZACAO_ID,
        SALDO_ESTOQUE,
        SALDO_PECA,
        SALDO,
        SALDO_INDISPONIVEL,
        SALDO_ALOCADO,
        SALDO_JA_BAIXADO
    do begin

        if(QTD_SALDO > MINIMO and SALDO > 0)then
        begin

            if(QTD_SALDO > SALDO)then
            begin
                if((QTD_SALDO - MINIMO) > SALDO)then
                begin
                    QTD_GRAVAR = SALDO;
                end else
                begin
                   QTD_GRAVAR = (QTD_SALDO - MINIMO);
                end
            end else
            begin
                QTD_GRAVAR = (QTD_SALDO - MINIMO);
            end

            insert into TMPCALC_PLACA (PRODUTO_ID, PRODUTO, ESTABELECIMENTO_ID, LOCALIZACAO_ID, SALDO_ESTOQUE, SALDO_PECA, SALDO, SALDO_INDISPONIVEL, ALOCADO, REMESSA_ID, BAIXADO)
            values (:ID, :PRODUTO, :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :SALDO_ESTOQUE, :SALDO_PECA, :SALDO, :SALDO_INDISPONIVEL, :SALDO_ALOCADO, :REMESSA, :QTD_GRAVAR);

            INSERT INTO TBREQUISICAO_PLACA_ALOCACAO (
                PRODUTO_ID, QTD, SALDO, REQUISICAO_PLACA_ID, ESTABELECIMENTO_ID, LOCALIZACAO_ID, DENSIDADE, ESPESSURA
            ) VALUES (
                :ID, :QTD_GRAVAR, :QTD_GRAVAR, fn_current_user_id() * -1, :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :DENSIDADE, :ESPESSURA
            );

            QTD_SALDO = QTD_SALDO - QTD_GRAVAR;
        end
    end

    QTD_GRAVAR = QUANTIDADE_REQUISITAR - QTD_SALDO;

    --exception "..." QUANTIDADE_REQUISITAR||' | '||QTD_SALDO||' | '||QTD_GRAVAR;

    if(QTD_GRAVAR > 0)then
    begin

        if(TALAO_DE_PLACA = 0)then
        begin
            ID_REQ = GEN_ID(GTBREQUISICAO_PLACA,1);
    
            INSERT INTO TBREQUISICAO_PLACA (
                ID,
                REQUISICAO_ID,
                QUANTIDADE,
                SALDO,
                STATUS,
                REMESSA,
                TALAO,
                DENSIDADE,
                ESPESSURA,
                LARGURA,
                COMPRIMENTO,
                COR_ID,
                SOBRA_ID,
                PARES,
                URGENTE,
                UP_ID,
                TIPO,
                DATA,
                DATAHORA
            ) VALUES (
                :ID_REQ,
                0,
                :QTD_GRAVAR,
                :QTD_GRAVAR,
                0,
                :REMESSA,
                :TALAO,
                :DENSIDADE,
                :ESPESSURA,
                :LARGURA,
                :COMPRIMENTO,
                :COR_ID,
                0,
                (:FATOR * :QTD_GRAVAR),
                0,
                :UP_ID,
                1,
                :DATA,
                :DATAHORA
            );
    
            update tbrequisicao_placa_alocacao a set a.REQUISICAO_PLACA_ID = :ID_REQ where a.REQUISICAO_PLACA_ID = fn_current_user_id() * -1;
            update TBESTOQUE_DETALHE_ALOCACAO b set b.alocacao_id = :ID_REQ where b.alocacao_id = fn_current_user_id() * -1 and b.tipo = 'L';

        end else
        begin

            TALAO_ID = coalesce((select first 1 p.id from tbremessa_item_processado p where p.remessa = :REMESSA and p.controle = :TALAO),0);
                
            if(QTD_SALDO = 0)then
            begin
                update tbremessa_item_processado p set p.situacao = 6 where p.remessa = :REMESSA and p.controle = :TALAO;
                update tbprogramacao s set s.status = 6 where s.tabela_id = :TALAO_ID and s.tipo = 'A' and s.remessa_id = :REMESSA;
                update tbpedido_item_processado p set p.situacao = 6 where p.remessa = :REMESSA and p.remessa_acumulado_controle = :TALAO and p.situacao <> 3 and p.situacao <> 6;

                update tbremessa_item_processado p set p.quantidade_original = p.quantidade where p.remessa = :REMESSA and p.controle = :TALAO   and p.quantidade_original is null;
                update tbremessa_item_processado p set p.quantidade          = 0 where p.remessa  = :REMESSA and p.controle = :TALAO;
                update tbpedido_item_processado  z set z.quantidade_pedido   = 0 where z.remessa  = :REMESSA and z.remessa_acumulado_controle = :TALAO;

            end else
            begin
                --update tbremessa_item_processado p set p.situacao = 0 where p.remessa = :REMESSA and p.controle = :TALAO;
                --update tbprogramacao s set s.status = 0 where s.tabela_id = :TALAO_ID and s.tipo = 'A' and s.remessa_id = :REMESSA;

                update tbremessa_item_processado p set p.quantidade_original = p.quantidade where p.remessa = :REMESSA and p.controle = :TALAO   and p.quantidade_original is null;
                update tbremessa_item_processado p set p.quantidade          = :QUANTIDADE_REQUISITAR - :QTD_GRAVAR  where p.remessa  = :REMESSA and p.controle = :TALAO;
                update tbpedido_item_processado  z set z.quantidade_pedido   = :QUANTIDADE_REQUISITAR - :QTD_GRAVAR  where z.remessa  = :REMESSA and z.remessa_acumulado_controle = :TALAO;
            end
        end

    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_processado_b99u for tbpedido_item_processado
active before update position 99
AS
begin

  if(
        new.situacao = 3
    and new.data_producao is null
    and new.quantidade_producao = 0
    and new.quantidade_pedido > 0
  )then
  begin
     execute procedure spi_notificar(current_timestamp, 186, 'Talão sem registro de estoque','Remessa: '||new.remessa||', Controle:'||new.controle,1,1);
  end

  if(
        old.situacao <> 3
    and new.situacao = 3
    and new.data_producao is null
    and new.quantidade_producao = 0
    and new.quantidade_pedido > 0
  )then
  begin
     exception "..." 'Quantidade do talão('||new.controle||') detalhado deve ser maior que 0, click no botão "Gravar Todos" e tente novamente!"';
  end

  if(new.data_producao is not null and coalesce(new.quantidade_pedido,0) > 0 and coalesce(new.quantidade_producao,0) > 0 and (coalesce(new.quantidade_pedido,0) * 10) < coalesce(new.quantidade_producao,0))then
  begin
        exception "..." 'Quantidade produzida do talão('||new.controle||') mais de 10x o programado, Q:'||coalesce(new.quantidade_pedido,0)||', P:'||coalesce(new.quantidade_producao,0)||'. Tente novamente!"';
  end
end
^

SET TERM ; ^

