
CREATE OR ALTER procedure SP_BLOQUEAR_REMESSA_EM_ABERTO (
    GP_ID integer,
    UP_ID integer,
    REMESSA_ID integer,
    STATUS_REQUISICAO integer)
as
declare variable REMESSAS_NUMERO integer;
declare variable REMESSA integer;
declare variable DATA date;
declare variable TIPO varchar(1);
declare variable LS_REMESSAS_ABERTAS varchar(1000);
declare variable REMESSAS_ABERTAS integer;
declare variable EM_PRODUCAO integer;
declare variable REQUISICOES_DISPONIVEIS integer;
declare variable E_REQUISICAO integer;
declare variable REMESSA_LIB integer;
begin
    --EM 18/02/2020 VANUSA SOLICITOU PARA O HAROLDO O BLOQUEIO VIA LIBERAÇÃO DO CORTE

    :REMESSAS_NUMERO = (Select first 1 CAST(N.valor_ext AS integer) QUANTIDADE from tbcontrole_n n where n.id = 240);

    IF(:REMESSAS_NUMERO > 0)THEN
    BEGIN

        for
            Select R1.numero as REMESSA, R1.Data, R1.Tipo,

            Coalesce((Select list(Distinct(remessa_id),', ') from
            (Select p.remessa_id, Count(p.remessa_id) as qtd, sum(p.status_requisicao) as rec
              From tbprogramacao p, tbremessa k
              where p.status < 3
                and p.gp_id = p.gp_id
                and p.tipo = 'A'
                and p.ferramenta_id > 0
                and p.gp_id = :gp_id
                and p.remessa_id < :remessa_id
                and k.numero = p.remessa_id
                and k.tipo = '1'

                group by 1
            ))

            ,0) ls_remessas_abertas,

            Coalesce((Select count(Distinct(remessa_id)) from
            (Select p.remessa_id, Count(p.remessa_id) as qtd, sum(p.status_requisicao) as rec
              From tbprogramacao p, tbremessa k
              where p.status < 3
                and p.gp_id = p.gp_id
                and p.tipo = 'A'
                and p.ferramenta_id > 0
                and p.gp_id = :gp_id
                and p.remessa_id < :remessa_id
                and k.numero = p.remessa_id
                and k.tipo = '1'

                group by 1
            )),0) remessas_abertas,
        
            Coalesce((Select Count(Distinct(p.remessa_id))
              From tbprogramacao p
              where p.status = 2
                and p.tipo = 'A'
                and p.ferramenta_id > 0
                and p.remessa_id = :remessa_id
                and p.gp_id = :gp_id
                and p.up_id = :up_id
            ),0) em_producao,


            Coalesce((Select Count(Distinct(p.remessa_id))
              From tbprogramacao p
              where p.status < 3
                and p.tipo = 'A'
                and p.ferramenta_id > 0
                and p.status_requisicao = 1
                and p.gp_id = :gp_id
                and p.up_id = :up_id
                and Coalesce((SELECT first 1
                        coalesce((select first 1 v.SITUACAO
                           FROM
                                TBREMESSA_ITEM_PROCESSADO v,
                                TBREMESSA I
                            WHERE v.REMESSA    = j.REMESSA_GERADA
                                AND v.CONTROLE   = j.TALAO
                                AND I.NUMERO     = j.REMESSA_GERADA
                        ),0)
                    
                    FROM TBREQUISICAO j
                    
                    WHERE j.id = p.requisicao_id),0) = 3
        
            ),0) requisicoes_disponiveis,

            :status_requisicao as e_requisicao
        
        From TbRemessa R1
        Where R1.Numero = :remessa_id
        and R1.Tipo = '1'
    
        into
            :REMESSA,
            :DATA,
            :TIPO,
            :ls_remessas_abertas,
            :REMESSAS_ABERTAS,
            :EM_PRODUCAO,
            :REQUISICOES_DISPONIVEIS,
            :E_REQUISICAO
        do
        begin

                --se remessa "vip dentro da fabrica" pode iniciar independente da quantidade (liberado por haroldo em 14/01/2019)
               Remessa_Lib = Coalesce((Select First 1 A.Remessa From TbRemessa_Liberada A Where A.Esteira_ID = :gp_id and A.Remessa = :remessa_id),0);
                
               if(Remessa_Lib > 0)then
               begin
                  /* (ricardo pediu para desconsiderar em 14/01/2019)
                  if(:REQUISICOES_DISPONIVEIS > 0)then
                  begin
                      --se for requisicao vai abrir mais q o permitido
                      if (:E_REQUISICAO = 0) Then
                      Begin
                          if (:REMESSAS_ABERTAS >= REMESSAS_NUMERO) then
                          Begin
                            Exception "..." 'ATENCAO, EXISTEM '||coalesce(:REQUISICOES_DISPONIVEIS,0)||' REQUISICOES DISPONIVEIS PARA PRODUCAO, PRODUZA ELAS PRIMEIRO, EM CASO DE DUVIDA PROCURAR O PCP';
                          End
                      End
                  end
                  */
              end else
              begin
                  if (:REMESSAS_ABERTAS >= REMESSAS_NUMERO) then
                  Begin
                    Exception "..." 'ATENCAO, NAO SAO PERMITIDOS MAIS DE '||coalesce(:REMESSAS_NUMERO,0)||' ('||ls_remessas_abertas||') REMESSAS EM ABERTO, EM CASO DE DUVIDA PROCURAR O PCP';
                  End
              End
        end
    END

end;

CREATE OR ALTER trigger ttbprogramacao_b7u for tbprogramacao
active before update position 0
AS
begin

    if(new.status = 2 and new.ferramenta_id > 0 and new.tipo = 'A')then
    begin
        execute procedure SP_BLOQUEAR_REMESSA_EM_ABERTO(NEW.gp_id, NEW.up_id, NEW.remessa_id, NEW.status_requisicao);
    end
end;

CREATE OR ALTER trigger ttbremessa_item_processado_b08u for tbremessa_item_processado
active before update position 8
AS
declare variable programacao_status integer;
declare variable ferramenta integer;
begin

  if(new.data_producao is not null and old.data_producao is distinct from new.data_producao)then
  begin
    for
        select first 1
            p.status,
            p.ferramenta_id
        from tbprogramacao p
        where p.tabela_id        = NEW.controle
         and p.remessa_id       = NEW.remessa
         AND P.tipo = 'A'
    into
        :programacao_status,
        :ferramenta
    do
    begin
    
        if(:programacao_status < 3 and :ferramenta = 0)then
        begin
            exception "..." 'PROGRAMACAO NÃO FINALIZADA, OPERACAO CANCELADA.';
        end

    end
  end

end;

COMMENT ON TRIGGER TTBREMESSA_ITEM_PROCESSADO_B08U IS 'impedir finalizar talao sem finalizar programacao';


CREATE OR ALTER trigger ttbpedido_item_prttocessado_b9u for tbpedido_item_processado
active before update position 9
AS
declare variable situacao integer;
declare variable ferramenta integer;
declare variable programacao_status integer;
begin

  if(old.data_producao is distinct from new.data_producao and new.data_producao is not null)then
  begin
    for
        select first 1
        
            p.status,
            p.ferramenta_id
        
        from vwremessa_talao r, tbprogramacao p
        where r.remessa_id = NEW.remessa
         and r.remessa_talao_id = NEW.remessa_acumulado_controle
         and p.tabela_id = r.id
         and p.remessa_id = r.remessa_id
    into
        :programacao_status,
        :ferramenta
    do
    begin

        if(:programacao_status < 3 and :ferramenta > 0)then
        begin
           :situacao = coalesce(
                       (select
                            count(a.situacao)
                        from tbpedido_item_processado a
                        where a.remessa = NEW.remessa
                         and a.remessa_acumulado_controle = NEW.remessa_acumulado_controle
                         and a.controle <> NEW.controle
                         and a.situacao <= 2),0);

            if (:situacao = 0) then
            begin
               exception "..." 'TALAO NAO FINALIZADO NA CONFORMACAO, OPERACAO CANCELADA.';
            end
        end

    end
  end

end;

CREATE OR ALTER trigger ttbremessa_item_processado_b12u for tbremessa_item_processado
active before update position 12
AS
begin
  if(new.situacao = 3 and old.situacao is distinct from new.situacao new.familia_codigo > 0)then
  begin
    execute procedure SP_BLOQUEAR_REMESSA_EM_ABERTO(NEW.PROGRAMACAO_ESTEIRA, NEW.up_id, NEW.remessa, 0);
  end
end;

COMMENT ON TRIGGER TTBREMESSA_ITEM_PROCESSADO_B12U IS 'bloquear uma quantidade definidas de remessas em aberto';

