/*

SELECT
    'UPDATE tbmodelo_fluxo_producao P SET P.grupo_fluxo_id = gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO, 1)WHERE P.modelo_id = '||A.MODELO_ID||' AND P.cor_id = '||A.COR_ID||';'

FROM(
    select distinct
        P.modelo_id,
        P.cor_id
    FROM tbmodelo_fluxo_producao P
) A

*/

ALTER TABLE TBMODELO_FLUXO_PRODUCAO
    ADD GRUPO_FLUXO_ID INTEGER;

CREATE SEQUENCE GTBMODELO_FLUXO_PRODUCAO_GRUPO;

SET TERM ^ ;

CREATE OR ALTER trigger ttbmodelo_b06i for tbmodelo
active before insert position 1
AS

DECLARE VARIABLE UP_ID INTEGER;
DECLARE VARIABLE ESTOQUE CHAR(1);
DECLARE VARIABLE ESTEIRA_PRODUCAO CHAR(1);
DECLARE VARIABLE ORDEM INTEGER;
DECLARE VARIABLE OBSERVACAO VARCHAR(100);
DECLARE VARIABLE FLUXO_ID INTEGER;
DECLARE VARIABLE TEMPO NUMERIC(15,4);

BEGIN
  FOR
    SELECT T.UP_ID, T.ESTOQUE, T.ESTEIRA_PRODUCAO, T.ORDEM, T.OBSERVACAO  FROM TBFAMILIA_ROTEIRO T WHERE T.FAMILIA_ID = NEW.FAMILIA_CODIGO

  INTO
    :UP_ID,
    :ESTOQUE,
    :ESTEIRA_PRODUCAO,
    :ORDEM,
    :OBSERVACAO
  DO BEGIN

    INSERT INTO TBMODELO_SETOR (MODELO_CODIGO, SETOR_CODIGO, ESTOQUE, ESTEIRA_PRODUCAO, ORDEM, OBSERVACAO)
                VALUES (NEW.CODIGO, :UP_ID, :ESTOQUE, :ESTEIRA_PRODUCAO, :ORDEM, :OBSERVACAO);

  END

  FOR
    SELECT FLUXO_ID, ORDEM, TEMPO  FROM TBFAMILIA_FLUXO T WHERE T.FAMILIA_ID = NEW.FAMILIA_CODIGO

  INTO
    :FLUXO_ID,
    :ORDEM,
    :TEMPO
  DO BEGIN

    INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, ORDEM, TEMPO) VALUES ( gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), NEW.CODIGO, :FLUXO_ID, :ORDEM, :TEMPO);

  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregistro_parada_b2i for tbregistro_parada
active before insert position 2
AS
declare variable vEMAIL VarChar(500);
declare variable vCORPO_EMAIL BLOB SUB_TYPE 0 SEGMENT SIZE 80;
declare variable VJUSTIFICATIVA VarChar(200);
declare variable vOPERADOR_NOME VarChar(20);
declare variable VTEMPOORIGINAL Integer;

declare variable LINHA_ID INTEGER;
declare variable LINHA_DESCRICAO VARCHAR(50);
declare variable MODELO_ID INTEGER;                                                
declare variable MODELO_DESCRICAO VARCHAR(50);
declare variable COR_ID INTEGER;
declare variable COR_DESCRICAO VARCHAR(20);
declare variable TAMANHO INTEGER;
declare variable TAM_DESCRICAO VARCHAR(10);
declare variable FERRAMENTA_ID INTEGER;
declare variable FERRAMENTA_DESCRICAO VARCHAR(100);
declare variable GP_ID INTEGER;
declare variable GP_DESCRICAO VARCHAR(20);
declare variable UP_ID INTEGER;
declare variable UP_DESCRICAO VARCHAR(20);
declare variable ESTACAO INTEGER;
declare variable ESTACAO_DESCRICAO VARCHAR(20);
declare variable REMESSA_ID INTEGER;
declare variable TALAO_ID INTEGER;
declare variable TALAO INTEGER;
declare variable QUANTIDADE NUMERIC(18,4);
declare variable UM VARCHAR(10);

BEGIN

  if (New.Status > 0 and New.tabela = 'INEFICIENCIA') then -- ID da Justificativa
      Begin

      For
      Select P.Linha_Codigo Linha_Id,
            (Select First 1 L.Descricao From TbModelo_Linha L Where L.Codigo = P.Linha_Codigo) Linha_Descricao,
             P.Modelo_Codigo Modelo_Id,
            (Select First 1 M.Descricao From TbModelo M Where M.Codigo = P.Modelo_Codigo) Modelo_Descricao,
             P.Cor_Codigo Cor_ID,
            (Select First 1 C.Descricao From TbCor C Where C.Codigo = P.Cor_Codigo) Cor_Descricao,
             PR.Tamanho,
            (Select First 1 Tam_Descricao From SP_TAMANHO_GRADE (P.Grade_Codigo,PR.Tamanho)) Tam_Descricao,
             PR.Ferramenta_ID,
            (Select First 1 F.Serie||'-'||F.Descricao From TbFerramentaria F Where F.ID = PR.Ferramenta_ID) Ferramenta_Descricao,
             PR.GP_Id,
            (Select First 1 G.Descricao From TBGP G Where G.ID = PR.Gp_ID) GP_Descricao,
             PR.UP_Id,
            (Select First 1 U.Descricao From TbUP U Where U.ID = PR.UP_ID) UP_Descricao,
             PR.Estacao,
            (Select First 1 S.Descricao From TbSub_UP S Where S.Up_ID = PR.Up_ID and S.ID = PR.Estacao) Estacao_Descricao,
             PR.Remessa_ID,
             PR.Tabela_ID Talao_ID,
            (Select First 1 R.Controle From TbRemessa_Item_Processado R Where R.Id = PR.Tabela_ID) Talao,
             PR.Quantidade, P.UNIDADEMEDIDA_SIGLA UM
        From TbProgramacao PR, TbProduto P
       Where PR.Produto_ID = P.Codigo
         and PR.ID = :NEW.Tabela_ID
        Into :LINHA_ID,:LINHA_DESCRICAO,:MODELO_ID,:MODELO_DESCRICAO,:COR_ID,
             :COR_DESCRICAO,:TAMANHO,:TAM_DESCRICAO,:FERRAMENTA_ID,
             :FERRAMENTA_DESCRICAO,:GP_ID,:GP_DESCRICAO,:UP_ID,:UP_DESCRICAO,
             :ESTACAO,:ESTACAO_DESCRICAO,:REMESSA_ID,:TALAO_ID,:TALAO,:QUANTIDADE,:UM

          Do Begin

             vEMAIL         = Coalesce((Select First 1 CC.VALOR_EXT from TbControle_N CC Where CC.ID = 239),'');
             vOPERADOR_NOME = Coalesce((Select First 1 O.Nome From TbOperador O Where O.Codigo = New.Operador_ID),'');
             VJUSTIFICATIVA = Coalesce((Select First 1 J.Descricao From TbJustificativa J Where J.ID = New.Status),'');
             VTEMPOORIGINAL = COALESCE((Select sum(MF.TM) from tbup_fluxo pf, TBMODELO_FLUXO_PRODUCAO mf
                                         where mf.fluxo_id  = pf.fluxo_id and pf.up_id = :UP_ID
                                           and mf.modelo_id = :MODELO_ID and mf.cor_id = :COR_ID
                                           and mf.tamanho   = :TAMANHO),0);

             if (vEMAIL <> '') then
                 Begin
                 vCORPO_EMAIL = ' LINHA: '||:LINHA_ID||' - '||:LINHA_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' MODELO: '||:MODELO_ID||' - '||:MODELO_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' COR: '||:COR_ID||' - '||:COR_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' TAMANHO: '||:TAM_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' FERRAMENTA: '||:FERRAMENTA_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' GP/UP/ESTACAO: '||:GP_DESCRICAO||'/'||:UP_DESCRICAO||'/'||:ESTACAO_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' REMESSA/TALAO: '||:REMESSA_ID||' - '||:TALAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' QUANTIDADE: '||Trunc(:QUANTIDADE)||' '||:UM||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' OPERADOR: '||NEW.OPERADOR_ID||' - '||vOPERADOR_NOME||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' DATA/HORA REGISTRO: '||FORMATDATETIME(Current_TimeStamp)||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' TEMPO MAQUINA ATUAL: '||Trunc(:VTEMPOORIGINAL)||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' JUSTIFICATIVA: '||:vJustificativa||': '||NEW.OBSERVACAO
                                --||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ;

                 Insert Into tbemail (email, usuario_id, assunto, corpo, status, datahora)
                 Values (:vEmail, 0, 'GC - REGISTRO DE JUSTIFICATIVA: '||:vJustificativa, :vCORPO_EMAIL, 0, Current_TimeStamp);
                 End
    
             End
      End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_REPROGRAMACAO (
    ESTABELECIMENTO_1 integer,
    TIPO_1 char(1),
    GP_1 integer,
    UP_1 integer,
    ESTACAO_1 integer,
    DATAHORA timestamp)
returns (
    PROGRAMACAO_ID integer,
    PRODUTO_ID integer,
    TAMANHO integer,
    QUANTIDADE numeric(15,4),
    TEMPO_PROGRAMACAO numeric(15,4))
as
declare variable DATAHORA_PARTIDA timestamp;
declare variable FLUXO_ID integer;
declare variable FLUXO_TIPO char(1);
declare variable FLUXO_TEMPO numeric(15,4);
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TEMPO numeric(15,4);
declare variable TEMPO_SETUP numeric(15,4);
Begin

  --Status
  --0 - Parado
  --1 - Iniciado, mas parado
  --2 - Em andamento
  --3 - Finalizado
  --4 - Encerrado

DataHora_Partida = :DataHora;

For
Select A.Id, produto_Id, Tamanho, quantidade, Tempo
  From TbProgramacao A
 Where A.Estabelecimento_id = :Estabelecimento_1
   and A.Tipo = :Tipo_1
   and A.Gp_id = :Gp_1
   and A.Up_id = :Up_1
   and A.Estacao = :Estacao_1
   and (A.DataHora_Inicio >= :DataHora or A.DataHora_Inicio < '01/01/2001 23:59:59')
   and A.Status in ('0')
   and A.Quantidade > 0
   Order By A.DataHora_Inicio

  Into :Programacao_Id, :produto_Id, :Tamanho, :quantidade, :Tempo_Programacao
    DO
      Begin

                      --Recalcula o tempo do modelo/cor/tamanho
                      fluxo_tempo = 0;
                      TEMPO_SETUP = 0;
                      Tempo = 0;
                
                        For
                        SELECT Distinct FB.Tipo, MF.fluxo_id, P.Modelo_Codigo, P.Cor_Codigo
                        From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo_producao MF, TbProduto P
                        Where MF.Fluxo_Id  = FB.Id
                          and UF.Fluxo_id  = FB.Id
                          and P.Codigo     = :produto_Id
                          and MF.Modelo_Id = P.Modelo_Codigo
                          and FB.Status    = '1'
                          and UF.Up_Id     = :UP_1
                        Order by MF.Ordem
                        Into :fluxo_Tipo, :fluxo_Id, :Modelo_Id, :Cor_Id
                          Do
                             Begin
                             if (:fluxo_Id > 0) then
                                 Begin
                                 --Mod/Cor/Tam
                                 if (fluxo_tempo = 0) Then
                                     Begin
                                     fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod/Cor
                                 if (fluxo_tempo = 0) Then
                                     Begin
                                     fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = 0),0);
                                     End
                                 --Mod/Tam
                                 if (fluxo_tempo = 0) Then
                                     Begin
                                     fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod
                                 if (fluxo_tempo = 0) Then
                                     Begin
                                     fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = 0),0);
                                     End
                
                                 if (:fluxo_tempo > 0) Then
                                     Begin
                                       if (:Fluxo_Tipo = '0') then --Fluxo de Setup
                                           Begin
                                           Tempo = :Tempo + :Fluxo_Tempo;
                                           TEMPO_SETUP = :TEMPO_SETUP + :Fluxo_Tempo;
                                           fluxo_tempo = 0;
                                           End else
                                       if (:Fluxo_Tipo = '1') then --Fluxo Operacional
                                           Begin
                                           Tempo = :Tempo + (:Fluxo_Tempo * :Quantidade);
                                           fluxo_tempo = 0;
                                           End
                                     End
                                 End
                             End

      if (tempo = 0) then
          Begin
          Tempo = Tempo_Programacao;
          End
    
       DataHora_Partida =
       (SELECT DataHora_Fim From SPU_PROGRAMACAO (:estabelecimento_1,
                                                  :tipo_1,
                                                  :Programacao_Id,
                                                  :DataHora_Partida,
                                                  :gp_1,
                                                  :up_1,
                                                  :Tempo,
                                                  :estacao_1,
                                                  :TEMPO_SETUP));
      End

End
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPU_REPLICAR_TEMPO_MODELO_COR (
    MODELO_ORIGEM integer,
    COR_ORIGEM integer,
    MODELO_DESTINO integer,
    COR_DESTINO integer)
as
declare variable FLUXO_ID integer;
declare variable TAMANHO integer;
declare variable ORDEM integer;
declare variable TEMPO integer;
declare variable TM integer;
declare variable OLD_FLUXO integer;
declare variable GRUPO_ID integer;
declare variable OLD_GRUPO_ID integer;
declare variable NEW_GRUPO_ID integer;
BEGIN

  delete from tbmodelo_fluxo_producao where modelo_id = :Modelo_Destino and Cor_id = :Cor_destino;


  OLD_FLUXO = 0;
  OLD_GRUPO_ID = 0;
  NEW_GRUPO_ID = 0;

  for

    Select
        fluxo_id,
        tamanho,
        ordem,
        tempo,
        tm,
        GRUPO_FLUXO_ID
    From tbmodelo_fluxo_producao where modelo_id = :Modelo_Origem and Cor_Id = :Cor_Origem

  into
     fluxo_id,
     tamanho,
     ordem,
     tempo,
     tm,
     GRUPO_ID
  do begin

        if(OLD_GRUPO_ID is distinct from GRUPO_ID)then
        begin
           NEW_GRUPO_ID = gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1);
           OLD_GRUPO_ID = GRUPO_ID;
        end

        Insert into tbmodelo_fluxo_producao (GRUPO_FLUXO_ID, modelo_id, fluxo_id, cor_id, tamanho, ordem, tempo, tm) values (
            :NEW_GRUPO_ID, :Modelo_Destino, :fluxo_id, :cor_destino, :tamanho, :ordem, :tempo, :tm
        );

  end

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_REPLICAR_FLUXO_MODELO (
    MODELO_ORIGEM integer,
    COR_ORIGEM integer,
    TAMANHO_ORIGEM integer,
    MODELO_DESTINO integer,
    COR_DESTINO integer,
    TAMANHO_DESTINO integer)
as
declare variable COR_PADRAO integer;
declare variable TAMANHO_PADRAO integer;
declare variable FLUXO_ID integer;
declare variable ORDEM smallint;
declare variable TEMPO numeric(18,4);
declare variable DATA_CRONOMETRAGEM date;
declare variable OBSERVACAO varchar(200);
declare variable TM numeric(18,4);
declare variable TH numeric(18,4);
declare variable PS numeric(18,4);
declare variable TT numeric(18,4);
declare variable QC numeric(18,4);
declare variable TF numeric(18,4);
declare variable GRUPO_FLUXO_ID integer;
declare variable OLD_GRUPO_FLUXO_ID integer;
declare variable NEW_GRUPO_FLUXO_ID integer;
begin

  for
    select
        COR_ID,
        TAMANHO
    from tbmodelo_padrao p
    where p.modelo_id = :MODELO_ORIGEM
  into
    :COR_PADRAO,
    :TAMANHO_PADRAO
  do begin
    --cor e tamanho padrao
  end

  if(:COR_ORIGEM = 0)then
  begin
    :COR_ORIGEM = :COR_PADRAO;
  end

  if(:TAMANHO_ORIGEM = 0)then
  begin
    :TAMANHO_ORIGEM = :TAMANHO_PADRAO;
  end

  OLD_GRUPO_FLUXO_ID = 0;

  for
    select first 10
        FLUXO_ID,
        ORDEM,
        TEMPO,
        DATA_CRONOMETRAGEM,
        OBSERVACAO,
        TM,
        TH,
        PS,
        TT,
        QC,
        TF,
        GRUPO_FLUXO_ID
    from(
        select
                FLUXO_ID,
                ORDEM,
                TEMPO,
                DATA_CRONOMETRAGEM,
                OBSERVACAO,
                TM,
                TH,
                PS,
                TT,
                QC,
                TF,
                1 as flag,
                GRUPO_FLUXO_ID
            from tbmodelo_fluxo_producao f
            where f.modelo_id = :MODELO_ORIGEM
            and f.cor_id      = :COR_ORIGEM
            and f.tamanho     = :TAMANHO_ORIGEM
        
        union
        
        select
                FLUXO_ID,
                ORDEM,
                TEMPO,
                DATA_CRONOMETRAGEM,
                OBSERVACAO,
                TM,
                TH,
                PS,
                TT,
                QC,
                TF,
                2 as flag,
                GRUPO_FLUXO_ID
            from tbmodelo_fluxo_producao f
            where f.modelo_id = :MODELO_ORIGEM
            and f.cor_id      = :COR_ORIGEM
            and f.tamanho     = :TAMANHO_PADRAO
        union
        select
                FLUXO_ID,
                ORDEM,
                TEMPO,
                DATA_CRONOMETRAGEM,
                OBSERVACAO,
                TM,
                TH,
                PS,
                TT,
                QC,
                TF,
                3 as flag,
                GRUPO_FLUXO_ID
            from tbmodelo_fluxo_producao f
            where f.modelo_id = :MODELO_ORIGEM
            and f.cor_id      = 13
            and f.tamanho     = :TAMANHO_PADRAO
    ) order by flag
  into
    FLUXO_ID,
    ORDEM,
    TEMPO,
    DATA_CRONOMETRAGEM,
    OBSERVACAO,
    TM,
    TH,
    PS,
    TT,
    QC,
    TF,
    GRUPO_FLUXO_ID
  do begin

     if(FLUXO_ID <> fn_parametro('TBFLUXO_PRODUCAO.CONFORMACAO') )then
     begin

        if(GRUPO_FLUXO_ID is distinct from OLD_GRUPO_FLUXO_ID)then
        begin
            NEW_GRUPO_FLUXO_ID = gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1);
            OLD_GRUPO_FLUXO_ID = GRUPO_FLUXO_ID;
        end

        UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO, DATA_CRONOMETRAGEM, OBSERVACAO, TM, TH, PS, TT, QC, TF)
            VALUES (:NEW_GRUPO_FLUXO_ID, :MODELO_DESTINO, :FLUXO_ID, :COR_DESTINO, :TAMANHO_DESTINO, :ORDEM, :TEMPO, :DATA_CRONOMETRAGEM, '(Ajuste Para Calcular Custo)', :TM, :TH, :PS, :TT, :QC, :TF)
            MATCHING (MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM);
     end

  end

end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPU_PROGRAMACAO_PRODUZIDO (
    ESTABELECIMENTO_1 integer,
    TIPO_1 char(1),
    ID_1 integer)
returns (
    PROGRAMACAO_ID integer,
    GP_1 integer,
    UP_1 integer,
    ESTACAO_1 integer,
    PRODUTO_ID integer,
    TAMANHO integer,
    QUANTIDADE numeric(15,4),
    TEMPO_PROGRAMACAO numeric(15,4))
as
declare variable STATUS char(1);
declare variable DATAHORA_PARTIDA timestamp;
declare variable DATAHORA_FIM timestamp;
declare variable FLUXO_ID integer;
declare variable FLUXO_TIPO char(1);
declare variable FLUXO_TEMPO numeric(15,4);
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TEMPO numeric(15,4);
declare variable TEMPO_SETUP numeric(15,4);
Begin

  -- EXECUTAR ESTA PROCEDURE APÃ“S A FINALIZAÃ‡ÃƒO/PRODUÃ‡ÃƒO DE UM REGISTRO --
  --      ELA RECALCULARÃ OS TEMPOS DOS OUTROS TALÃ•ES EM ABERTO         --

  --Status
  --0 - Parado
  --1 - Iniciado, mas parado
  --2 - Em andamento
  --3 - Finalizado
  --4 - Encerrado

    For
    Select First 1 A.DataHora_Inicio, A.DataHora_Fim, A.Status, A.Gp_id, A.Up_id, A.Estacao, A.Tempo
      From TbProgramacao A
     Where A.Estabelecimento_id = :Estabelecimento_1
       and A.Tipo = :Tipo_1
       and A.Tabela_Id = :Id_1
      Into :DataHora_Partida, :DataHora_Fim, :Status, :Gp_1, :Up_1, :Estacao_1, :Tempo
        DO
          Begin

--        if (:Status <> '3') then
--            Begin
--            Exception "..." 'REGISTRO DEVE TER SIDO FINALIZADO, OPERACAO CANCELADA! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
--            End

--        if (:DataHora_Fim > Current_TimeStamp) then
--             Begin

--             if (:DataHora_Partida < Current_TimeStamp) then
--                  Begin
--                  DataHora_Partida = Current_TimeStamp;
--                  End

--  (1.00000000/24.00000000/60.00000000) = 1 minuto  = DateAdd(1 Minute To Campo_TimeStamp)

              if (:Status = '3') then
                  begin
                  DataHora_Partida = DateAdd(1 Minute To Current_TimeStamp);
                  end else
              if (:Status = '0' or :Status = '1' or:Status = '2') then
                  begin
                  DataHora_Partida = DateAdd(2 Minute To (DateAdd(Trunc(:Tempo) Minute To Current_TimeStamp)));
                  end

                    For
                    Select A.Id, produto_Id, Tamanho, quantidade, Tempo
                      From TbProgramacao A
                     Where A.Estabelecimento_id = :Estabelecimento_1
                       and A.Tipo = :Tipo_1
                       and A.Gp_id = :Gp_1
                       and A.Up_id = :Up_1
--                     and A.Estacao = :Estacao_1
--                     and A.DataHora_Inicio > :DataHora_Partida
                       and A.Status in ('0','1')
                       and A.Quantidade > 0
                       Order By A.DataHora_Inicio
                      Into :Programacao_Id, :produto_Id, :Tamanho, :quantidade, :Tempo_Programacao
                        DO
                          Begin
        
                                          --Recalcula o tempo do modelo/cor/tamanho
                                          fluxo_tempo = 0;
                                          TEMPO_SETUP = 0;
                                          Tempo = 0;
                                    
                                            For
                                            SELECT Distinct FB.Tipo, MF.fluxo_id, P.Modelo_Codigo, P.Cor_Codigo
                                            From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo_producao MF, TbProduto P
                                            Where MF.Fluxo_Id  = FB.Id
                                              and UF.Fluxo_id  = FB.Id
                                              and P.Codigo     = :produto_Id
                                              and MF.Modelo_Id = P.Modelo_Codigo
                                              and FB.Status    = '1'
                                              and UF.Up_Id     = :UP_1
                                            Order by MF.Ordem
                                            Into :fluxo_Tipo, :fluxo_Id, :Modelo_Id, :Cor_Id
                                              Do
                                                 Begin
                                                 if (:fluxo_Id > 0) then
                                                     Begin
                                                     --Mod/Cor/Tam
                                                     if (fluxo_tempo = 0) Then
                                                         Begin
                                                         fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = :Tamanho),0);
                                                         End
                                                     --Mod/Cor
                                                     if (fluxo_tempo = 0) Then
                                                         Begin
                                                         fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = 0),0);
                                                         End
                                                     --Mod/Tam
                                                     if (fluxo_tempo = 0) Then
                                                         Begin
                                                         fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = :Tamanho),0);
                                                         End
                                                     --Mod
                                                     if (fluxo_tempo = 0) Then
                                                         Begin
                                                         fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = 0),0);
                                                         End
                                    
                                                     if (:fluxo_tempo > 0) Then
                                                         Begin
                                                           if (:Fluxo_Tipo = '0') then --Fluxo de Setup
                                                               Begin
                                                               Tempo = :Tempo + :Fluxo_Tempo;
                                                               TEMPO_SETUP = TEMPO_SETUP + :Fluxo_Tempo;
                                                               fluxo_tempo = 0;
                                                               End else
                                                           if (:Fluxo_Tipo = '1') then --Fluxo Operacional
                                                               Begin
                                                               Tempo = :Tempo + (:Fluxo_Tempo * :Quantidade);
                                                               fluxo_tempo = 0;
                                                               End
                                                         End
                                                     End
                                                 End
        
                          if (tempo = 0) then
                              Begin
                              Tempo = Tempo_Programacao;
                              End
                        
                           DataHora_Partida =
                           (SELECT DataHora_Fim From SPU_PROGRAMACAO (:estabelecimento_1,
                                                                      :tipo_1,
                                                                      :Programacao_Id,
                                                                      :DataHora_Partida,
                                                                      :gp_1,
                                                                      :up_1,
                                                                      :Tempo,
                                                                      :estacao_1,
                                                                      :TEMPO_SETUP));
                          End
          End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_COPIA_MODELO_FLUXO (
    ID1 integer,
    ID2 integer,
    DESCRICAO_1 varchar(50),
    USUARIO_ID integer)
returns (
    FLUXO_ID integer,
    COR_ID integer,
    TAMANHO integer,
    ORDEM integer,
    TEMPO integer,
    TM numeric(15,4),
    TH numeric(15,4),
    PS numeric(15,4),
    TT numeric(15,4),
    QC numeric(15,4),
    TF numeric(15,4),
    GRUPO_FLUXO_ID integer,
    OLD_GRUPO_FLUXO_ID integer,
    NEW_GRUPO_FLUXO_ID integer)
as
BEGIN

    IF (:ID1 > 0 AND :ID2 > 0) then
    Begin
        DELETE FROM TBMODELO_FLUXO WHERE MODELO_ID = :ID2;
        DELETE FROM TBMODELO_FLUXO_PRODUCAO WHERE MODELO_ID = :ID2;

        OLD_GRUPO_FLUXO_ID = 0;
        NEW_GRUPO_FLUXO_ID = 0;

        for
            Select fluxo_id, cor_id, tamanho, ordem, tempo, TM,TH,PS,TT,QC,TF, GRUPO_FLUXO_ID From tbmodelo_fluxo_producao where modelo_id = :id1
        into
            :fluxo_id,
            :cor_id,
            :tamanho,
            :ordem,
            :tempo,
            :TM,
            :TH,
            :PS,
            :TT,
            :QC,
            :TF,
            :GRUPO_FLUXO_ID
        do begin

            if(OLD_GRUPO_FLUXO_ID is distinct from GRUPO_FLUXO_ID)then
            begin
                NEW_GRUPO_FLUXO_ID = gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1);
                OLD_GRUPO_FLUXO_ID = GRUPO_FLUXO_ID;
            end

            Insert into tbmodelo_fluxo_producao (GRUPO_FLUXO_ID, modelo_id, fluxo_id, cor_id, tamanho, ordem, tempo, TM,TH,PS,TT,QC,TF) values(
                :NEW_GRUPO_FLUXO_ID, :id2, :fluxo_id, :cor_id, :tamanho, :ordem, :tempo, :TM, :TH, :PS, :TT, :QC, :TF
            );

        end

        --Insert into tbmodelo_fluxo_producao (modelo_id, fluxo_id, cor_id, tamanho, ordem, tempo, TM,TH,PS,TT,QC,TF)
        --Select :id2, fluxo_id, cor_id, tamanho, ordem, tempo, TM,TH,PS,TT,QC,TF From tbmodelo_fluxo_producao where modelo_id = :id1;

        Insert into tbmodelo_fluxo (modelo_id, operador, fluxo_id, ordem)
        Select :id2, operador, fluxo_id, ordem From tbmodelo_fluxo where modelo_id = :id1;
    End

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_TEMPO_PRODUCAO (
    MODELO_ID integer,
    COR_ID integer,
    TAMANHO integer,
    BALANCIM numeric(15,4),
    BALANCIM_CELULA numeric(15,4),
    CORTE_MESA_1 numeric(15,4),
    CORTE_MESA_2 numeric(15,4),
    REFILAGEM numeric(15,4),
    REVISAO numeric(15,4),
    EMBALAGEM numeric(15,4),
    FECHAMENTO numeric(15,4),
    ABASTECIMENTO numeric(15,4))
as
begin

UPDATE TBMODELO_FLUXO_PRODUCAO P
   SET P.ORDEM = 3
 WHERE P.MODELO_ID = :MODELO_ID
   AND P.FLUXO_ID = fn_parametro('TBFLUXO_PRODUCAO.CONFORMACAO');


--CORTE MESA 1
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                             VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.CORTE_MESA_1') , :COR_ID, :TAMANHO, 1, :CORTE_MESA_1)
                            MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                                  VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.CORTE_MESA_1'), :COR_ID, 0, 1, (SELECT FIRST 1 P.TEMPO FROM TBFLUXO_PRODUCAO P WHERE P.ID = fn_parametro('TBFLUXO_PRODUCAO.CORTE_MESA_1')))
                                 MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);


--CORTE MESA 2
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                             VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.CORTE_MESA_2'), :COR_ID, :TAMANHO, 2, :CORTE_MESA_2)
                            MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                                  VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.CORTE_MESA_2'), :COR_ID, 0, 2, (SELECT FIRST 1 P.TEMPO FROM TBFLUXO_PRODUCAO P WHERE P.ID = fn_parametro('TBFLUXO_PRODUCAO.CORTE_MESA_2')))
                                  MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);

-- ABASTECIMENTO
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                             VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.ABASTECIMENTO'), :COR_ID, :TAMANHO, 4, :ABASTECIMENTO)
                            MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                                  VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.ABASTECIMENTO'), :COR_ID, 0, 4, (SELECT FIRST 1 P.TEMPO FROM TBFLUXO_PRODUCAO P WHERE P.ID = fn_parametro('TBFLUXO_PRODUCAO.ABASTECIMENTO')))
                                  MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);

-- BALANCIM
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                             VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.BALANCIM'), :COR_ID, :TAMANHO, 5, :BALANCIM)
                            MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                                  VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.BALANCIM'), :COR_ID, 0, 5, (SELECT FIRST 1 P.TEMPO FROM TBFLUXO_PRODUCAO P WHERE P.ID = fn_parametro('TBFLUXO_PRODUCAO.BALANCIM')))
                                  MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);

-- BALANCIM CELULA
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                             VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1),:MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.BALANCIM_CELULA'), :COR_ID, :TAMANHO, 6, :BALANCIM_CELULA)
                            MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                                  VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.BALANCIM_CELULA'), :COR_ID, 0, 6, (SELECT FIRST 1 P.TEMPO FROM TBFLUXO_PRODUCAO P WHERE P.ID = fn_parametro('TBFLUXO_PRODUCAO.BALANCIM_CELULA')))
                                  MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);

-- REFILAGEM
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                             VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.REFILAGEM'), :COR_ID, :TAMANHO, 7, :REFILAGEM)
                            MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                                  VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.REFILAGEM'), :COR_ID, 0, 7, (SELECT FIRST 1 P.TEMPO FROM TBFLUXO_PRODUCAO P WHERE P.ID = fn_parametro('TBFLUXO_PRODUCAO.REFILAGEM')))
                                  MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);

-- REVISAO
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                             VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.REVISAO'), :COR_ID, :TAMANHO, 8, :REVISAO)
                            MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                                  VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.REVISAO'), :COR_ID, 0, 8, (SELECT FIRST 1 P.TEMPO FROM TBFLUXO_PRODUCAO P WHERE P.ID = fn_parametro('TBFLUXO_PRODUCAO.REVISAO')))
                                  MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);

-- EMBALAGEM
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                             VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.EMBALAGEM'), :COR_ID, :TAMANHO, 9, :EMBALAGEM)
                            MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                                  VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.EMBALAGEM'), :COR_ID, 0, 9, (SELECT FIRST 1 P.TEMPO FROM TBFLUXO_PRODUCAO P WHERE P.ID = fn_parametro('TBFLUXO_PRODUCAO.EMBALAGEM')))
                                  MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);

-- FECHAMENTO
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                             VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.FECHAMENTO'), :COR_ID, :TAMANHO, 10, :FECHAMENTO)
                            MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);
UPDATE OR INSERT INTO TBMODELO_FLUXO_PRODUCAO (GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO, ORDEM, TEMPO)
                                  VALUES (gen_id(GTBMODELO_FLUXO_PRODUCAO_GRUPO,1), :MODELO_ID, fn_parametro('TBFLUXO_PRODUCAO.FECHAMENTO'), :COR_ID, 0, 10, (SELECT FIRST 1 P.TEMPO FROM TBFLUXO_PRODUCAO P WHERE P.ID = fn_parametro('TBFLUXO_PRODUCAO.FECHAMENTO')))
                                  MATCHING(GRUPO_FLUXO_ID, MODELO_ID, FLUXO_ID, COR_ID, TAMANHO);
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPI_PROGRAMACAO3 (
    ESTABELECIMENTO_1 integer,
    TIPO_1 char(1),
    GP_1 integer,
    UP_1 integer,
    ESTACAO_1 integer,
    ID_1 integer,
    PRODUTO_1 integer,
    TAMANHO_1 integer,
    QUANTIDADE_1 numeric(15,4),
    REMESSA_ID integer,
    REMESSA_DATA date)
returns (
    DATA_CALENDARIO date,
    DATAHORA_DISPONIVEL timestamp)
as
declare variable DATAHORA_PARTIDA timestamp;
declare variable PROGRAMACAO_ID integer;
declare variable SALDO integer;
declare variable VINICIO char(1);
declare variable FLUXO_ID integer;
declare variable FLUXO_TIPO char(1);
declare variable FLUXO_TEMPO numeric(15,4);
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TEMPO numeric(15,4);
declare variable TEMPO_SETUP numeric(15,4);
Begin

  if (:Quantidade_1 <= 0) then
      Begin
      Exception "..." 'QUANTIDADE DEVE SER MAIOR QUE ZERO, OPERACAO CANCELADA! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
      End else
      Begin

      programacao_id = Coalesce((Select First 1 Id From TbProgramacao
                                  Where Estabelecimento_id = :estabelecimento_1
                                    and Tipo = :tipo_1
                                    and Tabela_Id = :id_1),0);

       if (:programacao_id = 0) then
            Begin
        
              fluxo_tempo = 0;
              TEMPO_SETUP = 0;
              Tempo = 0;
        
                For
                SELECT Distinct FB.Tipo, MF.fluxo_id, P.Modelo_Codigo, P.Cor_Codigo
                From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo_producao MF, TbProduto P
                Where MF.Fluxo_Id  = FB.Id
                  and UF.Fluxo_id  = FB.Id
                  and P.Codigo     = :Produto_1
                  and MF.Modelo_Id = P.Modelo_Codigo
                  and FB.Status    = '1'
                  and UF.Up_Id     = :UP_1
                Order by MF.Ordem
                Into :fluxo_Tipo, :fluxo_Id, :Modelo_Id, :Cor_Id
                  Do
                     Begin
                     if (:fluxo_Id > 0) then
                         Begin
                         --Mod/Cor/Tam
                         if (fluxo_tempo = 0) Then
                             Begin
                             fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = :Tamanho_1),0);
                             End
                         --Mod/Cor
                         if (fluxo_tempo = 0) Then
                             Begin
                             fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = 0),0);
                             End
                         --Mod/Tam
                         if (fluxo_tempo = 0) Then
                             Begin
                             fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = :Tamanho_1),0);
                             End
                         --Mod
                         if (fluxo_tempo = 0) Then
                             Begin
                             fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = 0),0);
                             End
        
                         if (:fluxo_tempo > 0) Then
                             Begin
                               if (:Fluxo_Tipo = '0') then --Fluxo de Setup
                                   Begin
                                   Tempo = :Tempo + :Fluxo_Tempo;
                                   TEMPO_SETUP = :TEMPO_SETUP + :Fluxo_Tempo;
                                   fluxo_tempo = 0;
                                   End else
                               if (:Fluxo_Tipo = '1') then --Fluxo Operacional
                                   Begin
                                   Tempo = :Tempo + (:Fluxo_Tempo * :Quantidade_1);
                                   fluxo_tempo = 0;
                                   End
                             End
                         End
                     End
        
              if (tempo = 0) then
                  Begin
                  Exception "..." '1 - TEMPO DAS OPERACOES DO SKU SELECIONADO ESTA ZERADO OU NAO CONFIGURADO, OPERACAO CANCELADA! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
                  End
            
              if (Trunc(:Tempo) = :Tempo) Then
                  Begin
                  Saldo = Trunc(:Tempo);
                  End else
                  Begin
                  Saldo = Trunc(:Tempo) + 1;
                  End
        
              vInicio = '0';
            
                For
                Select
                Coalesce((
                Select First 1 A.DataHora_Fim
                From TbProgramacao A
                Where A.Estabelecimento_id = :Estabelecimento_1
                  and A.Tipo = :Tipo_1
                  and A.Gp_id = :Gp_1
                  and A.Up_id = :Up_1
                  and A.Estacao = :Estacao_1
                  and A.Status in ('0','1')
                  and A.DataHora_Fim >= Current_TimeStamp
                Order By A.DataHora_Fim Desc),Current_TimeStamp) DataHora
                From RDB$DataBase
            
                Into :DataHora_Partida
                DO
                  Begin
            
                     DataHora_Partida = :DataHora_Partida + 0.000694444;
            
                        For
                        Select C.Data
                          From TbCalendario_Up C
                         Where C.Gp_id = :Gp_1
                           and C.Up_id = :Up_1
                           and C.Minutos > 0
                           and C.Data >= Cast(:DataHora_Partida as Date)
                         Order By C.Data
            
                        Into :Data_Calendario
                        DO
                          Begin
            
                              For
                                Select Cast(Cast(:Data_Calendario as Date)||' '||M.Hora as TimeStamp) DataHora
                                From (
                                Select Substring(OSPLIT From 1 for 5) INICIO,
                                       Substring(OSPLIT From 7 for 5) FIM
                                From Split (
                                                (Select C.Horario From TbCalendario_Up C
                                                   Where C.Gp_Id = :Gp_1
                                                     and C.Up_Id = :Up_1
                                                     and C.Data  = :Data_Calendario)
                                            , ';')
                                ) Z, TbMinuto M
                                Where M.Hora Between Z.Inicio and Z.Fim
                                Order By M.Hora
            
                              Into :DataHora_Disponivel
                              Do
                                Begin
            
                                  if (:DataHora_Disponivel >= :DataHora_Partida and :Saldo > 0) then
                                       Begin
            
                                         if (vInicio = '0') then
                                             Begin
                                             DataHora_Partida = :DataHora_Disponivel;
                                             vInicio = '1';
                                             End
            
                                         Saldo = :Saldo - 1;
                                         if (Saldo = 0) then
                                             Begin
                                                update or
                                                insert into tbprogramacao (estabelecimento_id,
                                                                           tipo,
                                                                           DATAHORA_INICIO,
                                                                           DATA_INICIO,
                                                                           TEMPO,
                                                                           TEMPO_SETUP,
                                                                           DATAHORA_FIM,
                                                                           DATA_FIM,
                                                                           tabela_id,
                                                                           gp_id,
                                                                           up_id,
                                                                           estacao,
                                                                           produto_id,
                                                                           tamanho,
                                                                           quantidade,
                                                                           remessa_id,
                                                                           data)
                                                values (:Estabelecimento_1,
                                                        :Tipo_1,
                                                        :DataHora_Partida,
                                                        Cast(:DataHora_Partida as Date),
                                                        :Tempo,
                                                        :TEMPO_SETUP,
                                                        :DataHora_Disponivel,
                                                        Cast(:DataHora_Disponivel as Date),
                                                        :id_1,
                                                        :Gp_1,
                                                        :Up_1,
                                                        :Estacao_1,
                                                        :Produto_1,
                                                        :Tamanho_1,
                                                        :Quantidade_1,
                                                        :Remessa_id,
                                                        :Remessa_Data)
                                                Matching (estabelecimento_id,tipo,tabela_id);
            
                                                SUSPEND;
                                                EXIT;
                                             End
            
                                       End
            
                                End
                          End
                
                  if (:Saldo > 0) then
                      begin
                      Exception "..." 'NAO HA CALENDARIO DISPONIVEL PARA ESSA PROGRAMACAO!'|| ' UP: ' || :UP_1 || ' ESTACAO: ' || :ESTACAO_1 ||  'PRODUTO: ' || :PRODUTO_1 || ' QUANTIDADE: ' || :QUANTIDADE_1 || '  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                      end 
                  End

            End
      End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_PROGRAMACAO (
    ESTABELECIMENTO_1 integer,
    TIPO_1 char(1),
    GP_1 integer,
    UP_1 integer,
    ESTACAO_1 integer,
    ID_1 integer,
    PRODUTO_1 integer,
    TAMANHO_1 integer,
    QUANTIDADE_1 numeric(15,4))
returns (
    DATA_CALENDARIO date,
    DATAHORA_DISPONIVEL timestamp)
as
declare variable DATAHORA_PARTIDA timestamp;
declare variable PROGRAMACAO_ID integer;
declare variable SALDO integer;
declare variable VINICIO char(1);
declare variable FLUXO_ID integer;
declare variable FLUXO_TIPO char(1);
declare variable FLUXO_TEMPO numeric(15,4);
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TEMPO numeric(15,4);
declare variable TEMPO_SETUP numeric(15,4);
Begin

  if (:Quantidade_1 <= 0) then
      Begin
      Exception "..." 'QUANTIDADE DEVE SER MAIOR QUE ZERO, OPERACAO CANCELADA! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
      End else
      Begin

      programacao_id = Coalesce((Select First 1 Id From TbProgramacao
                                  Where Estabelecimento_id = :estabelecimento_1
                                    and Tipo = :tipo_1
                                    and Tabela_Id = :id_1),0);

       if (:programacao_id = 0) then
            Begin
        
              fluxo_tempo = 0;
              Tempo       = 0;
              TEMPO_SETUP = 0;
        
                For
                SELECT Distinct FB.Tipo, MF.fluxo_id, P.Modelo_Codigo, P.Cor_Codigo
                From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo_producao MF, TbProduto P
                Where MF.Fluxo_Id  = FB.Id
                  and UF.Fluxo_id  = FB.Id
                  and P.Codigo     = :Produto_1
                  and MF.Modelo_Id = P.Modelo_Codigo
                  and FB.Status    = '1'
                  and UF.Up_Id     = :UP_1
                Order by MF.Ordem
                Into :fluxo_Tipo, :fluxo_Id, :Modelo_Id, :Cor_Id
                  Do
                     Begin
                     if (:fluxo_Id > 0) then
                         Begin
                         --Mod/Cor/Tam
                         if (fluxo_tempo = 0) Then
                             Begin
                             fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = :Tamanho_1),0);
                             End
                         --Mod/Cor
                         if (fluxo_tempo = 0) Then
                             Begin
                             fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = 0),0);
                             End
                         --Mod/Tam
                         if (fluxo_tempo = 0) Then
                             Begin
                             fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = :Tamanho_1),0);
                             End
                         --Mod
                         if (fluxo_tempo = 0) Then
                             Begin
                             fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = 0),0);
                             End
        
                         if (:fluxo_tempo > 0) Then
                             Begin
                               if (:Fluxo_Tipo = '0') then --Fluxo de Setup
                                   Begin
                                   Tempo = :Tempo + :Fluxo_Tempo;
                                   TEMPO_SETUP = TEMPO_SETUP + :Fluxo_Tempo;
                                   fluxo_tempo = 0;
                                   End else
                               if (:Fluxo_Tipo = '1') then --Fluxo Operacional
                                   Begin
                                   Tempo = :Tempo + (:Fluxo_Tempo * :Quantidade_1);
                                   fluxo_tempo = 0;
                                   End
                             End
                         End
                     End
        
              if (tempo = 0) then
                  Begin
                  Exception "..." 'TEMPO DAS OPERACOES DO SKU SELECIONADO ESTA ZERADO OU NAO CONFIGURADO, OPERACAO CANCELADA! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
                  End
            
              if (Trunc(:Tempo) = :Tempo) Then
                  Begin
                  Saldo = Trunc(:Tempo);
                  End else
                  Begin
                  Saldo = Trunc(:Tempo) + 1;
                  End
        
              vInicio = '0';
            
                For
                Select
                Coalesce((
                Select First 1 A.DataHora_Fim
                From TbProgramacao A
                Where A.Estabelecimento_id = :Estabelecimento_1
                  and A.Tipo = :Tipo_1
                  and A.Gp_id = :Gp_1
                  and A.Up_id = :Up_1
                  and A.Estacao = :Estacao_1
                  and A.Status in ('0','1')
                  and A.DataHora_Fim >= Current_TimeStamp
                Order By A.DataHora_Fim Desc),Current_TimeStamp) DataHora
                From RDB$DataBase
            
                Into :DataHora_Partida
                DO
                  Begin
            
                     DataHora_Partida = :DataHora_Partida + 0.000694444;
            
                        For
                        Select C.Data
                          From TbCalendario_Up C
                         Where C.Gp_id = :Gp_1
                           and C.Up_id = :Up_1
                           and C.Minutos > 0
                           and C.Data >= Cast(:DataHora_Partida as Date)
                         Order By C.Data
            
                        Into :Data_Calendario
                        DO
                          Begin
            
                              For
                                Select Cast(Cast(:Data_Calendario as Date)||' '||M.Hora as TimeStamp) DataHora
                                From (
                                Select Substring(OSPLIT From 1 for 5) INICIO,
                                       Substring(OSPLIT From 7 for 5) FIM
                                From Split (
                                                (Select C.Horario From TbCalendario_Up C
                                                   Where C.Gp_Id = :Gp_1
                                                     and C.Up_Id = :Up_1
                                                     and C.Data  = :Data_Calendario)
                                            , ';')
                                ) Z, TbMinuto M
                                Where M.Hora Between Z.Inicio and Z.Fim
                                Order By M.Hora
            
                              Into :DataHora_Disponivel
                              Do
                                Begin
            
                                  if (:DataHora_Disponivel >= :DataHora_Partida and :Saldo > 0) then
                                       Begin
            
                                         if (vInicio = '0') then
                                             Begin
                                             DataHora_Partida = :DataHora_Disponivel;
                                             vInicio = '1';
                                             End
            
                                         Saldo = :Saldo - 1;
                                         if (Saldo = 0) then
                                             Begin
                                                update or
                                                insert into tbprogramacao (estabelecimento_id,
                                                                           tipo,
                                                                           DATAHORA_INICIO,
                                                                           DATA_INICIO,
                                                                           TEMPO,
                                                                           TEMPO_SETUP,
                                                                           DATAHORA_FIM,
                                                                           DATA_FIM,
                                                                           tabela_id,
                                                                           gp_id,
                                                                           up_id,
                                                                           estacao,
                                                                           produto_id,
                                                                           tamanho,
                                                                           quantidade)
                                                values (:Estabelecimento_1,
                                                        :Tipo_1,
                                                        :DataHora_Partida,
                                                        Cast(:DataHora_Partida as Date),
                                                        :Tempo,
                                                        :TEMPO_SETUP,
                                                        :DataHora_Disponivel,
                                                        Cast(:DataHora_Disponivel as Date),
                                                        :id_1,
                                                        :Gp_1,
                                                        :Up_1,
                                                        :Estacao_1,
                                                        :Produto_1,
                                                        :Tamanho_1,
                                                        :Quantidade_1)
                                                Matching (estabelecimento_id,tipo,tabela_id);
            
                                                SUSPEND;
                                                EXIT;
                                             End
            
                                       End
            
                                End
                          End
                
                  if (:Saldo > 0) then
                      begin
                      Exception "..." 'NAO HA CALENDARIO DISPONIVEL PARA ESSA PROGRAMACAO!'|| ' UP: ' || :UP_1 || ' ESTACAO: ' || :ESTACAO_1 ||  'PRODUTO: ' || :PRODUTO_1 || ' QUANTIDADE: ' || :QUANTIDADE_1 || '  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                      end 
                  End

            End
      End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPD_PROGRAMACAO (
    ESTABELECIMENTO_1 integer,
    TIPO_1 char(1),
    ID_1 integer)
returns (
    PROGRAMACAO_ID integer,
    GP_1 integer,
    UP_1 integer,
    ESTACAO_1 integer,
    PRODUTO_ID integer,
    TAMANHO integer,
    QUANTIDADE numeric(15,4),
    TEMPO_PROGRAMACAO numeric(15,4))
as
declare variable STATUS char(1);
declare variable DATAHORA_PARTIDA timestamp;
declare variable DATAHORA_FIM timestamp;
declare variable FLUXO_ID integer;
declare variable FLUXO_TIPO char(1);
declare variable FLUXO_TEMPO numeric(15,4);
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TEMPO numeric(15,4);
declare variable TEMPO_SETUP numeric(15,4);
Begin

  --Status
  --0 - Parado
  --1 - Iniciado, mas parado
  --2 - Em andamento
  --3 - Finalizado
  --4 - Encerrado

    For
    Select First 1 A.DataHora_Inicio, A.DataHora_Fim, A.Status, A.Gp_id, A.Up_id, A.Estacao
      From TbProgramacao A
     Where A.Estabelecimento_id = :Estabelecimento_1
       and A.Tipo = :Tipo_1
       and A.Tabela_Id = :Id_1
      Into :DataHora_Partida, :DataHora_Fim, :Status, :Gp_1, :Up_1, :Estacao_1
        DO
          Begin

          if (:Status = '2' or :Status = '3' or :Status = '6') then
              Begin
              Exception "..." 'PROCESSO DE PRODUÇÃO IMPEDE A EXCLUSÃO DESTE REGISTRO, ITEM EM ANDAMENTO, FINALIZADO OU ENCERRADO! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              End

          if (:DataHora_Fim > Current_TimeStamp) then
               Begin

               if (:DataHora_Partida < Current_TimeStamp) then
                    Begin
                    DataHora_Partida = Current_TimeStamp;
                    End

                    For
                    Select A.Id, produto_Id, Tamanho, quantidade, Tempo
                      From TbProgramacao A
                     Where A.Estabelecimento_id = :Estabelecimento_1
                       and A.Tipo = :Tipo_1
                       and A.Gp_id = :Gp_1
                       and A.Up_id = :Up_1
                       and A.Estacao = :Estacao_1
                       and A.DataHora_Inicio > :DataHora_Partida
                       and A.Status in ('0','1')
                       and A.Quantidade > 0
                       Order By A.DataHora_Inicio
                      Into :Programacao_Id, :produto_Id, :Tamanho, :quantidade, :Tempo_Programacao
                        DO
                          Begin
        
                                          --Recalcula o tempo do modelo/cor/tamanho
                                          fluxo_tempo = 0;
                                          TEMPO_SETUP = 0;
                                          Tempo = 0;
                                    
                                            For
                                            SELECT Distinct FB.Tipo, MF.fluxo_id, P.Modelo_Codigo, P.Cor_Codigo
                                            From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo_producao MF, TbProduto P
                                            Where MF.Fluxo_Id  = FB.Id
                                              and UF.Fluxo_id  = FB.Id
                                              and P.Codigo     = :produto_Id
                                              and MF.Modelo_Id = P.Modelo_Codigo
                                              and FB.Status    = '1'
                                              and UF.Up_Id     = :UP_1
                                            Order by MF.Ordem
                                            Into :fluxo_Tipo, :fluxo_Id, :Modelo_Id, :Cor_Id
                                              Do
                                                 Begin
                                                 if (:fluxo_Id > 0) then
                                                     Begin
                                                     --Mod/Cor/Tam
                                                     if (fluxo_tempo = 0) Then
                                                         Begin
                                                         fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = :Tamanho),0);
                                                         End
                                                     --Mod/Cor
                                                     if (fluxo_tempo = 0) Then
                                                         Begin
                                                         fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = 0),0);
                                                         End
                                                     --Mod/Tam
                                                     if (fluxo_tempo = 0) Then
                                                         Begin
                                                         fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = :Tamanho),0);
                                                         End
                                                     --Mod
                                                     if (fluxo_tempo = 0) Then
                                                         Begin
                                                         fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = 0),0);
                                                         End
                                    
                                                     if (:fluxo_tempo > 0) Then
                                                         Begin
                                                           if (:Fluxo_Tipo = '0') then --Fluxo de Setup
                                                               Begin
                                                               Tempo = :Tempo + :Fluxo_Tempo;
                                                               TEMPO_SETUP = :TEMPO_SETUP + :Fluxo_Tempo;
                                                               fluxo_tempo = 0;
                                                               End else
                                                           if (:Fluxo_Tipo = '1') then --Fluxo Operacional
                                                               Begin
                                                               Tempo = :Tempo + (:Fluxo_Tempo * :Quantidade);
                                                               fluxo_tempo = 0;
                                                               End
                                                         End
                                                     End
                                                 End
        
                          if (tempo = 0) then
                              Begin
                              Tempo = Tempo_Programacao;
                              End
                        
                           DataHora_Partida =
                           (SELECT DataHora_Fim From SPU_PROGRAMACAO (:estabelecimento_1,
                                                                      :tipo_1,
                                                                      :Programacao_Id,
                                                                      :DataHora_Partida,
                                                                      :gp_1,
                                                                      :up_1,
                                                                      :Tempo,
                                                                      :estacao_1,
                                                                      :TEMPO_SETUP));
                          End
               End

            Delete From TbProgramacao A
             Where A.Estabelecimento_id = :Estabelecimento_1
               and A.Tipo = :Tipo_1
               and A.Tabela_Id = :Id_1
               and A.Gp_id = :Gp_1
               and A.Up_id = :Up_1
               and A.Estacao = :Estacao_1;

          End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_TEMPO_MODELO_UP
returns (
    TEMPOSETUP numeric(15,4),
    TEMPOSETCOR numeric(15,4),
    TEMPOREB numeric(15,4),
    TEMPOPROCESSO numeric(15,4),
    TOTALSETUP numeric(15,4),
    TOTALPROCESSO numeric(15,4),
    TOTAL numeric(15,4),
    QUANTIDADE_OPERADOR numeric(15,4))
as
declare variable UP_ID integer;
declare variable MODELO_ID integer;
declare variable VQTDACUMULADO numeric(15,4);
declare variable VQTDCORES integer;
declare variable VTEMPOSETUP numeric(15,4); /* Setup normal */
declare variable VTEMPOSETCOR numeric(15,4); /* Setup de cores */
declare variable VTEMPOREB numeric(15,4); /* rebobinamento */
declare variable VTEMPOFLUXO numeric(15,4);
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable VQTDDETALHE numeric(15,4);
declare variable IDFLUXO integer;
declare variable TIPOFLUXO char(1);
declare variable VTEMPOOPERACIONAL numeric(15,4);
Begin

  vTempoSetup = 0.0000;
  vTempoSetCor= 0.0000;
  vTempoReb   = 0.0000;

      For
      --Consulta parametros iniciais para calculo do tempo (UP,MODELO,QUAT.TOTAL,QUANT.CORES)
      Select T.Up_Id, T.Modelo_Id, Sum(T.Quantidade), (Select count(distinct(Cor_id)) From tmp22040)
        From Tmp22040 T
        Group BY T.Up_Id, T.Modelo_Id
         Into :Up_Id, :Modelo_Id, :vQtdAcumulado, :vQtdCores
           Do Begin

           -- Processa 1º Setup Normal
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbModelo_Fluxo MF, tbup_fluxo u
                 Where MF.Fluxo_Id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '0'
                   and Coalesce(FB.Tempo_Var_Cor1,'0') = '0'  --Rebobinamento
                   and Coalesce(FB.Tempo_Var_Cor2,'0') = '0'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                   and u.up_id = :Up_Id
                   and u.fluxo_id = fb.id

                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoSetup = :vTempoSetup + :vTempoFluxo;
                           end
                       End

           -- Processa Setup de Cores
           if (:vQtdCores > 1) then
                begin
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbModelo_Fluxo MF, tbup_fluxo u
                 Where MF.Fluxo_Id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '0'
                   and Coalesce(FB.Tempo_Var_Cor2,'0') = '1'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                   and u.up_id = :Up_Id
                   and u.fluxo_id = fb.id

                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoSetCor = :vTempoSetCor + (:vTempoFluxo * (:vQtdCores - 1));
                           end
                       End
                End

           -- Processa Tempo de Rebobinamento
           if (:vQtdCores > 1) then
                begin
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbModelo_Fluxo MF, tbup_fluxo u
                 Where MF.Fluxo_Id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '1'
                   and Coalesce(FB.Tempo_Var_Cor1,'0') = '1'  --Rebobinamento
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                   and u.up_id = :Up_Id
                   and u.fluxo_id = fb.id

                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoReb = :vTempoReb + (:vTempoFluxo * (:vQtdAcumulado/2));
                           end
                       End
                End

            vTempoOperacional = 0.0000;
            --Consulta detalhada das peças
              For
              Select T.Cor_Id, T.Tamanho, T.Quantidade
                From Tmp22040 T
                Into :Cor_Id, :Tamanho, :vQtdDetalhe
                  Do Begin
        
                        For
                        SELECT Distinct FB.Tipo, MF.fluxo_id, 1
                        From TbFluxo_Producao FB, TbModelo_Fluxo_Producao MF, tbup_fluxo u
                        Where MF.Fluxo_Id  = FB.Id
                          and MF.Modelo_Id = :Modelo_Id
                          and FB.Status    = '1'
                          and :vQtdDetalhe between FB.Quantidade_Inicial and FB.Quantidade_Final
                          and u.up_id = :Up_Id
                          and u.fluxo_id = fb.id

                        Order by FB.Tipo
                        Into :tipoFluxo, :idFluxo, :QUANTIDADE_OPERADOR
                          Do
                             Begin

                             -- Processa Tempo Setup e Operacional
                             if (:idFluxo > 0) then
                                 Begin
                                 vTempoFluxo = 0.0000;

                                 --Mod/Cor/Tam
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod/Cor
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = 0),0);
                                     End
                                 --Mod/Tam
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = 0),0);
                                     End
                
                                 if (:vTempoFluxo > 0) Then
                                     Begin
                                       :vTempoFluxo = :vTempoFluxo / :QUANTIDADE_OPERADOR;

                                       if (:tipoFluxo = '0') then --Fluxo de Setup
                                           Begin
                                           vTempoSetup = :vTempoSetup + :vTempoFluxo;
                                           End else
                                       if (:tipoFluxo = '1') then --Fluxo Operacional
                                           Begin
                                           vTempoOperacional = :vTempoOperacional + (:vTempoFluxo * :vQtdDetalhe);
                                           End
                                     End
                                 End
                             End
                
                     End

                TempoSetup = vTempoSetup;
                TempoSetCor= vTempoSetCor;
                TempoReb   = vTempoReb;
                TempoProcesso = vTempoOperacional;

                TotalSetup = TempoSetup + TempoSetCor;
                TotalProcesso = TempoReb + TempoProcesso;
                Total = TotalSetup + TotalProcesso;
                Suspend;

              End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_TEMPO_MODELO_GP
returns (
    TEMPOSETUP numeric(15,4),
    TEMPOSETCOR numeric(15,4),
    TEMPOREB numeric(15,4),
    TEMPOPROCESSO numeric(15,4),
    TOTALSETUP numeric(15,4),
    TOTALPROCESSO numeric(15,4),
    TOTAL numeric(15,4),
    QUANTIDADE_OPERADOR numeric(15,4))
as
declare variable GP_ID integer;
declare variable MODELO_ID integer;
declare variable VQTDACUMULADO numeric(15,4);
declare variable VQTDCORES integer;
declare variable VTEMPOSETUP numeric(15,4); /* Setup normal */
declare variable VTEMPOSETCOR numeric(15,4); /* Setup de cores */
declare variable VTEMPOREB numeric(15,4); /* rebobinamento */
declare variable VTEMPOFLUXO numeric(15,4);
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable VQTDDETALHE numeric(15,4);
declare variable IDFLUXO integer;
declare variable TIPOFLUXO char(1);
declare variable VTEMPOOPERACIONAL numeric(15,4);
Begin

  vTempoSetup = 0.0000;
  vTempoSetCor= 0.0000;
  vTempoReb   = 0.0000;

      For
      --Consulta parametros iniciais para calculo do tempo (UP,MODELO,QUAT.TOTAL,QUANT.CORES)
      Select T.Up_Id, T.Modelo_Id, Sum(T.Quantidade), (Select count(distinct(Cor_id)) From tmp22040)
        From Tmp22040 T
        Group BY T.Up_Id, T.Modelo_Id
         Into :gp_id, :Modelo_Id, :vQtdAcumulado, :vQtdCores
           Do Begin

           -- Processa 1º Setup Normal
                For
                SELECT Sum(coalesce(FB.Tempo,0))
                  From TbFluxo_Producao FB, TbModelo_Fluxo MF, tbgp_fluxo u
                 Where MF.Fluxo_Id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '0'
                   and Coalesce(FB.Tempo_Var_Cor1,'0') = '0'  --Rebobinamento
                   and Coalesce(FB.Tempo_Var_Cor2,'0') = '0'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                   and u.gp_id = :gp_id
                   and u.fluxo_id = fb.id

                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoSetup = :vTempoSetup + :vTempoFluxo;
                           end
                       End

           -- Processa Setup de Cores
           if (:vQtdCores > 1) then
                begin
                For
                SELECT Sum(coalesce(FB.Tempo,0))
                  From TbFluxo_Producao FB, TbModelo_Fluxo MF, tbgp_fluxo u
                 Where MF.Fluxo_Id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '0'
                   and Coalesce(FB.Tempo_Var_Cor2,'0') = '1'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                   and u.gp_id = :gp_id
                   and u.fluxo_id = fb.id

                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoSetCor = :vTempoSetCor + (:vTempoFluxo * (:vQtdCores - 1));
                           end
                       End
                End

           -- Processa Tempo de Rebobinamento
           if (:vQtdCores > 1) then
                begin
                For
                SELECT Sum(coalesce(FB.Tempo,0))
                  From TbFluxo_Producao FB, TbModelo_Fluxo MF, tbgp_fluxo u
                 Where MF.Fluxo_Id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '1'
                   and Coalesce(FB.Tempo_Var_Cor1,'0') = '1'  --Rebobinamento
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                   and u.gp_id = :gp_id
                   and u.fluxo_id = fb.id

                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoReb = :vTempoReb + (:vTempoFluxo * (:vQtdAcumulado/2));
                           end
                       End
                End

            vTempoOperacional = 0.0000;
            --Consulta detalhada das peças
              For
              Select T.Cor_Id, T.Tamanho, T.Quantidade
                From Tmp22040 T
                Into :Cor_Id, :Tamanho, :vQtdDetalhe
                  Do Begin
        
                        For
                        SELECT Distinct FB.Tipo, MF.fluxo_id, 1
                        From TbFluxo_Producao FB, TbModelo_Fluxo_Producao MF, tbgp_fluxo u
                        Where MF.Fluxo_Id  = FB.Id
                          and MF.Modelo_Id = :Modelo_Id
                          and FB.Status    = '1'
                          and :vQtdDetalhe between FB.Quantidade_Inicial and FB.Quantidade_Final
                          and u.gp_id = :gp_id
                          and u.fluxo_id = fb.id

                        Order by FB.Tipo
                        Into :tipoFluxo, :idFluxo, :QUANTIDADE_OPERADOR
                          Do
                             Begin

                             -- Processa Tempo Setup e Operacional
                             if (:idFluxo > 0) then
                                 Begin
                                 vTempoFluxo = 0.0000;

                                 --Mod/Cor/Tam
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod/Cor
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = 0),0);
                                     End
                                 --Mod/Tam
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = 0),0);
                                     End
                
                                 if (:vTempoFluxo > 0) Then
                                     Begin
                                       :vTempoFluxo = :vTempoFluxo / :QUANTIDADE_OPERADOR;

                                       if (:tipoFluxo = '0') then --Fluxo de Setup
                                           Begin
                                           vTempoSetup = :vTempoSetup + :vTempoFluxo;
                                           End else
                                       if (:tipoFluxo = '1') then --Fluxo Operacional
                                           Begin
                                           vTempoOperacional = :vTempoOperacional + (:vTempoFluxo * :vQtdDetalhe);
                                           End
                                     End
                                 End
                             End
                
                     End

                TempoSetup = vTempoSetup;
                TempoSetCor= vTempoSetCor;
                TempoReb   = vTempoReb;
                TempoProcesso = vTempoOperacional;

                TotalSetup = TempoSetup + TempoSetCor;
                TotalProcesso = TempoReb + TempoProcesso;
                Total = TotalSetup + TotalProcesso;
                Suspend;

              End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_TEMPO_MODELO
returns (
    TEMPOSETUP numeric(15,4),
    TEMPOSETCOR numeric(15,4),
    TEMPOREB numeric(15,4),
    TEMPOPROCESSO numeric(15,4),
    TOTALSETUP numeric(15,4),
    TOTALPROCESSO numeric(15,4),
    TOTAL numeric(15,4),
    QUANTIDADE_OPERADOR numeric(15,4))
as
declare variable UP_ID integer;
declare variable MODELO_ID integer;
declare variable VQTDACUMULADO numeric(15,4);
declare variable VQTDCORES integer;
declare variable VTEMPOSETUP numeric(15,4); /* Setup normal */
declare variable VTEMPOSETCOR numeric(15,4); /* Setup de cores */
declare variable VTEMPOREB numeric(15,4); /* rebobinamento */
declare variable VTEMPOFLUXO numeric(15,4);
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable VQTDDETALHE numeric(15,4);
declare variable IDFLUXO integer;
declare variable TIPOFLUXO char(1);
declare variable VTEMPOOPERACIONAL numeric(15,4);
Begin

  vTempoSetup = 0.0000;
  vTempoSetCor= 0.0000;
  vTempoReb   = 0.0000;

      For
      --Consulta parametros iniciais para calculo do tempo (UP,MODELO,QUAT.TOTAL,QUANT.CORES)
      Select T.Up_Id, T.Modelo_Id, Sum(T.Quantidade), (Select count(distinct(Cor_id)) From tmp22040)
        From Tmp22040 T
        Group BY T.Up_Id, T.Modelo_Id
         Into :Up_Id, :Modelo_Id, :vQtdAcumulado, :vQtdCores
           Do Begin

           -- Processa 1º Setup Normal
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbModelo_Fluxo MF
                 Where MF.Fluxo_Id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '0'
                   and Coalesce(FB.Tempo_Var_Cor1,'0') = '0'  --Rebobinamento
                   and Coalesce(FB.Tempo_Var_Cor2,'0') = '0'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoSetup = :vTempoSetup + :vTempoFluxo;
                           end
                       End

           -- Processa Setup de Cores
           if (:vQtdCores > 1) then
                begin
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbModelo_Fluxo MF
                 Where MF.Fluxo_Id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '0'
                   and Coalesce(FB.Tempo_Var_Cor2,'0') = '1'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoSetCor = :vTempoSetCor + (:vTempoFluxo * (:vQtdCores - 1));
                           end
                       End
                End

           -- Processa Tempo de Rebobinamento
           if (:vQtdCores > 1) then
                begin
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbModelo_Fluxo MF
                 Where MF.Fluxo_Id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '1'
                   and Coalesce(FB.Tempo_Var_Cor1,'0') = '1'  --Rebobinamento
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoReb = :vTempoReb + (:vTempoFluxo * (:vQtdAcumulado/2));
                           end
                       End
                End

            vTempoOperacional = 0.0000;
            --Consulta detalhada das peças
              For
              Select T.Cor_Id, T.Tamanho, T.Quantidade
                From Tmp22040 T
                Into :Cor_Id, :Tamanho, :vQtdDetalhe
                  Do Begin
        
                        For
                        SELECT Distinct FB.Tipo, MF.fluxo_id, 1
                        From TbFluxo_Producao FB, TbModelo_Fluxo_Producao MF
                        Where MF.Fluxo_Id  = FB.Id
                          and MF.Modelo_Id = :Modelo_Id
                          and FB.Status    = '1'
                          and :vQtdDetalhe between FB.Quantidade_Inicial and FB.Quantidade_Final
                        Order by FB.Tipo
                        Into :tipoFluxo, :idFluxo, :QUANTIDADE_OPERADOR
                          Do
                             Begin

                             -- Processa Tempo Setup e Operacional
                             if (:idFluxo > 0) then
                                 Begin
                                 vTempoFluxo = 0.0000;

                                 --Mod/Cor/Tam
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod/Cor
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = 0),0);
                                     End
                                 --Mod/Tam
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = 0),0);
                                     End
                
                                 if (:vTempoFluxo > 0) Then
                                     Begin
                                       :vTempoFluxo = :vTempoFluxo / :QUANTIDADE_OPERADOR;

                                       if (:tipoFluxo = '0') then --Fluxo de Setup
                                           Begin
                                           vTempoSetup = :vTempoSetup + :vTempoFluxo;
                                           End else
                                       if (:tipoFluxo = '1') then --Fluxo Operacional
                                           Begin
                                           vTempoOperacional = :vTempoOperacional + (:vTempoFluxo * :vQtdDetalhe);
                                           End
                                     End
                                 End
                             End
                
                     End

                TempoSetup = vTempoSetup;
                TempoSetCor= vTempoSetCor;
                TempoReb   = vTempoReb;
                TempoProcesso = vTempoOperacional;

                TotalSetup = TempoSetup + TempoSetCor;
                TotalProcesso = TempoReb + TempoProcesso;
                Total = TotalSetup + TotalProcesso;
                Suspend;

              End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROGRAMACAO_TEMPO_VALIDAR (
    CUSTO integer = 0)
returns (
    TEMPOSETUP numeric(15,4),
    TEMPOSETCOR numeric(15,4),
    TEMPOREB numeric(15,4),
    TEMPOPROCESSO numeric(15,4),
    TOTALSETUP numeric(15,4),
    TOTALPROCESSO numeric(15,4),
    TOTAL numeric(15,4),
    QUANTIDADE_OPERADOR numeric(15,4))
as
declare variable UP_ID integer;
declare variable MODELO_ID integer;
declare variable VQTDACUMULADO numeric(15,4);
declare variable VQTDCORES integer;
declare variable VTEMPOSETUP numeric(15,4); /* Setup normal */
declare variable VTEMPOSETCOR numeric(15,4); /* Setup de cores */
declare variable VTEMPOREB numeric(15,4); /* rebobinamento */
declare variable VTEMPOFLUXO numeric(15,4);
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable VQTDDETALHE numeric(15,4);
declare variable IDFLUXO integer;
declare variable TIPOFLUXO char(1);
declare variable VTEMPOOPERACIONAL numeric(15,4);
Begin

    CUSTO = COALESCE(CUSTO,0);

            /*
            --EDC
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (81, 3541, 218, 13, 40);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (81, 3541, 399, 13, 40);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (81, 3541, 302, 13, 30);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (81, 3541, 5, 13, 20);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (81, 3541, 490, 13, 15);
            select * from TMP22040
            select * from SPC_PROGRAMACAO_TEMPO_NOVO
            --CACHARREL
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (109, 238, 218, 0, 80);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (109, 238, 399, 0, 35);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (109, 238, 302, 0, 22);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (109, 238, 005, 0, 08);
            select * from TMP22040
            select * from SPC_PROGRAMACAO_TEMPO_NOVO
            */

  vTempoSetup = 0.0000;
  vTempoSetCor= 0.0000;
  vTempoReb   = 0.0000;

      For
      --Consulta parametros iniciais para calculo do tempo (UP,MODELO,QUAT.TOTAL,QUANT.CORES)
      Select T.Up_Id, T.Modelo_Id, T.Quantidade, (Select count(distinct(Cor_id)) From tmp22040) as vQtdCores, T.Cor_Id, T.Tamanho, T.Quantidade
        From Tmp22040 T
        --Group BY T.Up_Id, T.Modelo_Id
         Into :Up_Id, :Modelo_Id, :vQtdAcumulado, :vQtdCores, :Cor_Id, :Tamanho, :vQtdDetalhe
           Do Begin
                
                vTempoSetup = 0.0000;
                vTempoSetCor= 0.0000;
                vTempoReb   = 0.0000;

                TempoSetup = 0;
                TempoSetCor= 0;
                TempoReb   = 0;
                TempoProcesso = 0;

                TotalSetup = 0;
                TotalProcesso = 0;
                Total = 0;

           -- Processa 1º Setup Normal
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo MF
                 Where MF.Fluxo_Id  = FB.Id
                   and UF.Fluxo_id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and UF.Up_Id     = :Up_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '0'
                   and Coalesce(FB.Tempo_Var_Cor1,'0') = '0'  --Rebobinamento
                   and Coalesce(FB.Tempo_Var_Cor2,'0') = '0'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoSetup = :vTempoSetup + :vTempoFluxo;
                           end
                       End

           -- Processa Setup de Cores
           if (:vQtdCores > 1) then
                begin
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo MF
                 Where MF.Fluxo_Id  = FB.Id
                   and UF.Fluxo_id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and UF.Up_Id     = :Up_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '0'
                -- and Coalesce(Tempo_Var_Cor1,'0') = '0'  --Rebobinamento
                   and Coalesce(FB.Tempo_Var_Cor2,'0') = '1'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoSetCor = :vTempoSetCor + (:vTempoFluxo * (:vQtdCores - 1));
                           end
                       End
                End

           -- Processa Tempo de Rebobinamento
           if (:vQtdCores > 1) then
                begin
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo MF
                 Where MF.Fluxo_Id  = FB.Id
                   and UF.Fluxo_id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and UF.Up_Id     = :Up_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '1'
                   and Coalesce(FB.Tempo_Var_Cor1,'0') = '1'  --Rebobinamento
               --  and Coalesce(FB.Tempo_Var_Cor2,'0') = '0'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoReb = :vTempoReb + (:vTempoFluxo * (:vQtdAcumulado/2));
                           end
                       End
                End

            vTempoOperacional = 0.0000;
            --Consulta detalhada das peças
              --For
              --Select first 1 T.Cor_Id, T.Tamanho, T.Quantidade
                --From Tmp22040 T
                --Into :Cor_Id, :Tamanho, :vQtdDetalhe
                  --Do Begin
        
                        For
                        SELECT Distinct FB.Tipo, MF.fluxo_id, IIF(:CUSTO = 1,1,UF.QUANTIDADE_OPERADOR)
                        From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo_Producao MF
                        Where MF.Fluxo_Id  = FB.Id
                          and UF.Fluxo_id  = FB.Id
                          and IIF(:CUSTO = 1,TRUE,uf.FLUXO_PADRAO = 1)
                          and MF.Modelo_Id = :Modelo_Id
                          and FB.Status    = '1'
                          and UF.Up_Id     = :UP_id
                          and :vQtdDetalhe between FB.Quantidade_Inicial and FB.Quantidade_Final
                        Order by FB.Tipo
                        Into :tipoFluxo, :idFluxo, :QUANTIDADE_OPERADOR
                          Do
                             Begin

                             -- Processa Tempo Setup e Operacional
                             if (:idFluxo > 0) then
                                 Begin
                                 vTempoFluxo = 0.0000;

                                 --Mod/Cor/Tam
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod/Cor
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = 0),0);
                                     End
                                 --Mod/Tam
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = 0),0);
                                     End
                
                                 if (:vTempoFluxo > 0) Then
                                     Begin
                                        :vTempoFluxo = :vTempoFluxo / :QUANTIDADE_OPERADOR;

                                       if (:tipoFluxo = '0') then --Fluxo de Setup
                                           Begin
                                           vTempoSetup = :vTempoSetup + :vTempoFluxo;
                                           End else
                                       if (:tipoFluxo = '1') then --Fluxo Operacional
                                           Begin
                                           vTempoOperacional = :vTempoOperacional + (:vTempoFluxo * :vQtdDetalhe);
                                           End
                                     End
                                 End
                             End
                
                     --End
                /*
                if (Trunc(:vTempoOperacional) <> :vTempoOperacional) Then
                    Begin
                    vTempoOperacional = Trunc(:vTempoOperacional) + 1;
                    End
        
                if (Trunc(:vTempoSetup) <> :vTempoSetup) Then
                    Begin
                    vTempoSetup = Trunc(:vTempoSetup) + 1;
                    End
                */
                TempoSetup = vTempoSetup;
                TempoSetCor= vTempoSetCor;
                TempoReb   = vTempoReb;
                TempoProcesso = vTempoOperacional;

                TotalSetup = TempoSetup + TempoSetCor;
                TotalProcesso = TempoReb + TempoProcesso;
                Total = TotalSetup + TotalProcesso;
                Suspend;

              End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROGRAMACAO_TEMPO_TESTE (
    CUSTO integer = 0)
returns (
    RMODELO_ID integer,
    RCOR_ID integer,
    RTAMANHO integer,
    RFLUXO integer,
    RQUANTIDADE integer,
    RTEMPO numeric(18,4),
    TIPO integer,
    TEMPOSETUP numeric(15,4),
    TEMPOSETCOR numeric(15,4),
    TEMPOREB numeric(15,4),
    TEMPOPROCESSO numeric(15,4),
    TOTALSETUP numeric(15,4),
    TOTALPROCESSO numeric(15,4),
    TOTAL numeric(15,4),
    QUANTIDADE_OPERADOR numeric(15,4))
as
declare variable UP_ID integer;
declare variable MODELO_ID integer;
declare variable VQTDACUMULADO numeric(15,4);
declare variable VQTDCORES integer;
declare variable VTEMPOSETUP numeric(15,4); /* Setup normal */
declare variable VTEMPOSETCOR numeric(15,4); /* Setup de cores */
declare variable VTEMPOREB numeric(15,4); /* rebobinamento */
declare variable VTEMPOFLUXO numeric(15,4);
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable VQTDDETALHE numeric(15,4);
declare variable IDFLUXO integer;
declare variable TIPOFLUXO char(1);
declare variable VTEMPOOPERACIONAL numeric(15,4);
Begin

    CUSTO = COALESCE(CUSTO,0);

  vTempoSetup = 0.0000;
  vTempoSetCor= 0.0000;
  vTempoReb   = 0.0000;

      For
      --Consulta parametros iniciais para calculo do tempo (UP,MODELO,QUAT.TOTAL,QUANT.CORES)
      Select T.Up_Id, T.Modelo_Id, Sum(T.Quantidade), (Select count(distinct(Cor_id)) From tmp22040)
        From Tmp22040 T
        Group BY T.Up_Id, T.Modelo_Id
         Into :Up_Id, :Modelo_Id, :vQtdAcumulado, :vQtdCores
           Do Begin

           -- Processa 1º Setup Normal
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo MF
                 Where MF.Fluxo_Id  = FB.Id
                   and UF.Fluxo_id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and UF.Up_Id     = :Up_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '0'
                   and Coalesce(FB.Tempo_Var_Cor1,'0') = '0'  --Rebobinamento
                   and Coalesce(FB.Tempo_Var_Cor2,'0') = '0'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoSetup = :vTempoSetup + :vTempoFluxo;
                           end
                       End

           -- Processa Setup de Cores
           if (:vQtdCores > 1) then
                begin
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo MF
                 Where MF.Fluxo_Id  = FB.Id
                   and UF.Fluxo_id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and UF.Up_Id     = :Up_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '0'
                -- and Coalesce(Tempo_Var_Cor1,'0') = '0'  --Rebobinamento
                   and Coalesce(FB.Tempo_Var_Cor2,'0') = '1'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoSetCor = :vTempoSetCor + (:vTempoFluxo * (:vQtdCores - 1));
                           end
                       End
                End

           -- Processa Tempo de Rebobinamento
           if (:vQtdCores > 1) then
                begin
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo MF
                 Where MF.Fluxo_Id  = FB.Id
                   and UF.Fluxo_id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and UF.Up_Id     = :Up_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '1'
                   and Coalesce(FB.Tempo_Var_Cor1,'0') = '1'  --Rebobinamento
               --  and Coalesce(FB.Tempo_Var_Cor2,'0') = '0'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoReb = :vTempoReb + (:vTempoFluxo * (:vQtdAcumulado/2));
                           end
                       End
                End



      End

      vTempoOperacional = 0.0000;
            --Consulta detalhada das peças
              For
              Select t.modelo_id, T.Cor_Id, T.Tamanho, T.Quantidade
                From Tmp22040 T
                Into :Modelo_Id, :Cor_Id, :Tamanho, :vQtdDetalhe
                  Do Begin
        
                        For
                        SELECT Distinct FB.Tipo, MF.fluxo_id, IIF(:CUSTO = 1,1,UF.QUANTIDADE_OPERADOR)
                        From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo_Producao MF
                        Where MF.Fluxo_Id  = FB.Id
                          and UF.Fluxo_id  = FB.Id
                          and IIF(:CUSTO = 1,TRUE,uf.FLUXO_PADRAO = 1)
                          and MF.Modelo_Id = :Modelo_Id
                          and FB.Status    = '1'
                          and UF.Up_Id     = :UP_id
                          and :vQtdDetalhe between FB.Quantidade_Inicial and FB.Quantidade_Final
                        Order by FB.Tipo
                        Into :tipoFluxo, :idFluxo, :QUANTIDADE_OPERADOR
                          Do
                             Begin

                             -- Processa Tempo Setup e Operacional
                             if (:idFluxo > 0) then
                                 Begin
                                 vTempoFluxo = 0.0000;

                                 --Mod/Cor/Tam
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     TIPO = 1;
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod/Cor
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     TIPO = 2;
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = 0),0);
                                     End
                                 --Mod/Tam
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     TIPO = 3;
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     TIPO = 4;
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = 0),0);
                                     End
                
                                 if (:vTempoFluxo > 0) Then
                                     Begin
                                        :vTempoFluxo = :vTempoFluxo / :QUANTIDADE_OPERADOR;

                                       if (:tipoFluxo = '0') then --Fluxo de Setup
                                           Begin
                                              vTempoSetup = :vTempoSetup + :vTempoFluxo;
                                              TempoSetup = vTempoSetup;
                                           End else
                                       if (:tipoFluxo = '1') then --Fluxo Operacional
                                           Begin
                                              vTempoOperacional = :vTempoOperacional + (:vTempoFluxo * :vQtdDetalhe);
                                              TempoProcesso = vTempoOperacional;
                                           End
                                     End
                                 End

                                RMODELO_ID = :Modelo_Id;
                                RCOR_ID = :Cor_Id;
                                RTAMANHO = :Tamanho;
                                RFLUXO = idFluxo;
                                RQUANTIDADE = vQtdDetalhe;
                                RTEMPO = vTempoFluxo;
                                suspend;
                             End
                
                     End

                TempoSetup = vTempoSetup;
                TempoSetCor= vTempoSetCor;
                TempoReb   = vTempoReb;
                TempoProcesso = vTempoOperacional;

                TotalSetup = TempoSetup + TempoSetCor;
                TotalProcesso = TempoReb + TempoProcesso;
                Total = TotalSetup + TotalProcesso;
               -- Suspend;
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROGRAMACAO_TEMPO_NOVO (
    CUSTO integer = 0)
returns (
    TEMPOSETUP numeric(15,4),
    TEMPOSETCOR numeric(15,4),
    TEMPOREB numeric(15,4),
    TEMPOPROCESSO numeric(15,4),
    TOTALSETUP numeric(15,4),
    TOTALPROCESSO numeric(15,4),
    TOTAL numeric(15,4),
    QUANTIDADE_OPERADOR numeric(15,4))
as
declare variable UP_ID integer;
declare variable MODELO_ID integer;
declare variable VQTDACUMULADO numeric(15,4);
declare variable VQTDCORES integer;
declare variable VTEMPOSETUP numeric(15,4); /* Setup normal */
declare variable VTEMPOSETCOR numeric(15,4); /* Setup de cores */
declare variable VTEMPOREB numeric(15,4); /* rebobinamento */
declare variable VTEMPOFLUXO numeric(15,4);
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable VQTDDETALHE numeric(15,4);
declare variable IDFLUXO integer;
declare variable TIPOFLUXO char(1);
declare variable VTEMPOOPERACIONAL numeric(15,4);
Begin

    CUSTO = COALESCE(CUSTO,0);

            /*
            --EDC
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (81, 3541, 218, 13, 40);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (81, 3541, 399, 13, 40);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (81, 3541, 302, 13, 30);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (81, 3541, 5, 13, 20);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (81, 3541, 490, 13, 15);
            select * from TMP22040
            select * from SPC_PROGRAMACAO_TEMPO_NOVO
            --CACHARREL
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (109, 238, 218, 0, 80);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (109, 238, 399, 0, 35);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (109, 238, 302, 0, 22);
            INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (109, 238, 005, 0, 08);
            select * from TMP22040
            select * from SPC_PROGRAMACAO_TEMPO_NOVO
            */

  vTempoSetup = 0.0000;
  vTempoSetCor= 0.0000;
  vTempoReb   = 0.0000;

      For
      --Consulta parametros iniciais para calculo do tempo (UP,MODELO,QUAT.TOTAL,QUANT.CORES)
      Select T.Up_Id, T.Modelo_Id, Sum(T.Quantidade), (Select count(distinct(Cor_id)) From tmp22040)
        From Tmp22040 T
        Group BY T.Up_Id, T.Modelo_Id
         Into :Up_Id, :Modelo_Id, :vQtdAcumulado, :vQtdCores
           Do Begin

           -- Processa 1º Setup Normal
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo MF
                 Where MF.Fluxo_Id  = FB.Id
                   and UF.Fluxo_id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and UF.Up_Id     = :Up_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '0'
                   and Coalesce(FB.Tempo_Var_Cor1,'0') = '0'  --Rebobinamento
                   and Coalesce(FB.Tempo_Var_Cor2,'0') = '0'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoSetup = :vTempoSetup + :vTempoFluxo;
                           end
                       End

           -- Processa Setup de Cores
           if (:vQtdCores > 1) then
                begin
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo MF
                 Where MF.Fluxo_Id  = FB.Id
                   and UF.Fluxo_id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and UF.Up_Id     = :Up_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '0'
                -- and Coalesce(Tempo_Var_Cor1,'0') = '0'  --Rebobinamento
                   and Coalesce(FB.Tempo_Var_Cor2,'0') = '1'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoSetCor = :vTempoSetCor + (:vTempoFluxo * (:vQtdCores - 1));
                           end
                       End
                End

           -- Processa Tempo de Rebobinamento
           if (:vQtdCores > 1) then
                begin
                For
                SELECT Sum(FB.Tempo)
                  From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo MF
                 Where MF.Fluxo_Id  = FB.Id
                   and UF.Fluxo_id  = FB.Id
                   and MF.Modelo_Id = :Modelo_Id
                   and UF.Up_Id     = :Up_Id
                   and FB.Status    = '1'
                   and FB.Tipo      = '1'
                   and Coalesce(FB.Tempo_Var_Cor1,'0') = '1'  --Rebobinamento
               --  and Coalesce(FB.Tempo_Var_Cor2,'0') = '0'  --mudança de cores
                   and :vQtdAcumulado between FB.Quantidade_Inicial and FB.Quantidade_Final
                  Into :vTempoFluxo
                    Do Begin
                       if (:vTempoFluxo > 0) then
                           begin
                           vTempoReb = :vTempoReb + (:vTempoFluxo * (:vQtdAcumulado/2));
                           end
                       End
                End

            vTempoOperacional = 0.0000;
            --Consulta detalhada das peças
              For
              Select T.Cor_Id, T.Tamanho, T.Quantidade
                From Tmp22040 T
                Into :Cor_Id, :Tamanho, :vQtdDetalhe
                  Do Begin
        
                        For
                        SELECT Distinct FB.Tipo, MF.fluxo_id, IIF(:CUSTO = 1,1,UF.QUANTIDADE_OPERADOR)
                        From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo_Producao MF
                        Where MF.Fluxo_Id  = FB.Id
                          and UF.Fluxo_id  = FB.Id
                          and IIF(:CUSTO = 1,TRUE,uf.FLUXO_PADRAO = 1)
                          and MF.Modelo_Id = :Modelo_Id
                          and FB.Status    = '1'
                          and UF.Up_Id     = :UP_id
                          and :vQtdDetalhe between FB.Quantidade_Inicial and FB.Quantidade_Final
                        Order by FB.Tipo
                        Into :tipoFluxo, :idFluxo, :QUANTIDADE_OPERADOR
                          Do
                             Begin

                             -- Processa Tempo Setup e Operacional
                             if (:idFluxo > 0) then
                                 Begin
                                 vTempoFluxo = 0.0000;

                                 --Mod/Cor/Tam
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod/Cor
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = 0),0);
                                     End
                                 --Mod/Tam
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = :Tamanho),0);
                                     End
                                 --Mod
                                 if (vTempoFluxo = 0) Then
                                     Begin
                                     vTempoFluxo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :idFluxo and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = 0),0);
                                     End
                
                                 if (:vTempoFluxo > 0) Then
                                     Begin
                                        :vTempoFluxo = :vTempoFluxo / :QUANTIDADE_OPERADOR;

                                       if (:tipoFluxo = '0') then --Fluxo de Setup
                                           Begin
                                           vTempoSetup = :vTempoSetup + :vTempoFluxo;
                                           End else
                                       if (:tipoFluxo = '1') then --Fluxo Operacional
                                           Begin
                                           vTempoOperacional = :vTempoOperacional + (:vTempoFluxo * :vQtdDetalhe);
                                           End
                                     End
                                 End
                             End
                
                     End
                /*
                if (Trunc(:vTempoOperacional) <> :vTempoOperacional) Then
                    Begin
                    vTempoOperacional = Trunc(:vTempoOperacional) + 1;
                    End
        
                if (Trunc(:vTempoSetup) <> :vTempoSetup) Then
                    Begin
                    vTempoSetup = Trunc(:vTempoSetup) + 1;
                    End
                */
                TempoSetup = vTempoSetup;
                TempoSetCor= vTempoSetCor;
                TempoReb   = vTempoReb;
                TempoProcesso = vTempoOperacional;

                TotalSetup = TempoSetup + TempoSetCor;
                TotalProcesso = TempoReb + TempoProcesso;
                Total = TotalSetup + TotalProcesso;
                Suspend;

              End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROGRAMACAO_TEMPO_BOJO (
    MODELO_ID integer,
    TAMANHO integer,
    COR_ID integer,
    QUANTIDADE numeric(15,4))
returns (
    TEMPO numeric(15,4),
    TEMPO_SETUP numeric(15,4),
    TEMPO_FERRAMENTA_AQUECIMENTO numeric(15,4),
    TEMPO_FERRAMENTA_SETUP numeric(15,4),
    TEMPO_COR_APROVACAO numeric(15,4))
as
begin

--    SELECT
--        SUM(TEMPO)
--    FROM (
--        SELECT
--            FLUXO_ID,
--            FLUXO_DESCRICAO,
--            TIPO,
--            COR_ID,
--            TAMANHO,
--            TEMPO,
--            CONFERE,
--            RANK() OVER(ORDER BY CONFERE DESC, TAMANHO DESC, COR_ID DESC) RANK
--        FROM (
--            SELECT
--                FLUXO_ID,
--                FLUXO_DESCRICAO,
--                TIPO,
--                COR_ID,
--                TAMANHO,
--                TEMPO,
--                IIF( COR_ID = :COR_ID  AND TAMANHO = :TAMANHO, 4,
--                IIF( COR_ID = :COR_ID  AND TAMANHO =        0, 3,
--                IIF( COR_ID =  0       AND TAMANHO = :TAMANHO, 2,
--                IIF( COR_ID =  0       AND TAMANHO =        0, 1,0)))) CONFERE
--            FROM (
--                SELECT
--                    MFP.FLUXO_ID,
--                    FP.DESCRICAO FLUXO_DESCRICAO,
--                    TIPO,
--                    COR_ID,
--                    TAMANHO,
--                    SUM(MFP.TEMPO) TEMPO
--                FROM
--                    TBMODELO_FLUXO_PRODUCAO MFP,
--                    TBFLUXO_PRODUCAO FP,
--                    TBFLUXO_COMPOSICAO_DETALHE D
--                
--                WHERE
--                    FP.ID = MFP.FLUXO_ID
--                AND FP.TIPO = '0'      
--                AND D.FLUXO_ID = FP.ID
--                AND D.ID       = 37 -- CONFORMACAO
--                AND MFP.TEMPO > 0
--                AND MFP.MODELO_ID = :MODELO_ID
--                GROUP BY 1,2,3,4,5
--            
--                UNION
--            
--                SELECT
--                    MFP.FLUXO_ID,
--                    FP.DESCRICAO FLUXO_DESCRICAO,
--                    TIPO,
--                    COR_ID,
--                    TAMANHO,
--                    (SUM(MFP.TEMPO) * CAST(:QUANTIDADE AS NUMERIC(15,4))) TEMPO
--                FROM
--                    TBMODELO_FLUXO_PRODUCAO MFP,
--                    TBFLUXO_PRODUCAO FP,
--                    TBFLUXO_COMPOSICAO_DETALHE D
--                
--                WHERE
--                    FP.ID = MFP.FLUXO_ID
--                AND FP.TIPO = '1'
--                AND D.FLUXO_ID = FP.ID
--                AND D.ID       = 37 -- CONFORMACAO
--                AND MFP.TEMPO > 0
--                AND MFP.MODELO_ID = :MODELO_ID
--                GROUP BY 1,2,3,4,5
--                ) X
--            
--                ORDER BY CONFERE DESC, TAMANHO DESC, COR_ID DESC
--            ) Y
--        WHERE CONFERE > 0
--        ) K
--    WHERE RANK = 1
--    INTO :TEMPO;

    TEMPO =
        COALESCE((
            SELECT sum(MFP.TEMPO)
              FROM TBMODELO_FLUXO_PRODUCAO MFP
             WHERE TRUE
               AND MFP.MODELO_ID = :MODELO_ID
               AND MFP.COR_ID    = :COR_ID
               AND MFP.TAMANHO   = :TAMANHO
               AND MFP.FLUXO_ID  = fn_parametro('TBFLUXO_PRODUCAO.CONFORMACAO')),0) * QUANTIDADE;

    SELECT FIRST 1
           F.TEMPO_SETUP,
           F.TEMPO_SETUP_AQUECIMENTO
      FROM TBFERRAMENTARIA F,
           TBMODELO M
     WHERE F.MATRIZ_ID = M.MATRIZ_CODIGO
       AND M.CODIGO    = :MODELO_ID
      INTO TEMPO_FERRAMENTA_SETUP,
           TEMPO_FERRAMENTA_AQUECIMENTO;

    SELECT FIRST 1 
           C.TEMPO_SETUP_APROVACAO
      FROM TBCOR C
     WHERE C.CODIGO = :COR_ID
      INTO TEMPO_COR_APROVACAO;


    TEMPO_FERRAMENTA_SETUP       = COALESCE(TEMPO_FERRAMENTA_SETUP,0);
    TEMPO_FERRAMENTA_AQUECIMENTO = COALESCE(TEMPO_FERRAMENTA_AQUECIMENTO,0);
    TEMPO_COR_APROVACAO          = COALESCE(TEMPO_COR_APROVACAO,0);
    TEMPO_SETUP                  = TEMPO_FERRAMENTA_SETUP+TEMPO_FERRAMENTA_AQUECIMENTO+TEMPO_COR_APROVACAO;
    TEMPO                        = COALESCE(TEMPO,0);

  SUSPEND;
end
^

SET TERM ; ^

COMMENT ON PARAMETER SPC_PROGRAMACAO_TEMPO_BOJO.TEMPO IS
'Tempo Operacional';

COMMENT ON PARAMETER SPC_PROGRAMACAO_TEMPO_BOJO.TEMPO_SETUP IS
'Tempo Setup (Ferramenta Troca, Ferramenta Aquecimento, Cor Aprovacao)';

COMMENT ON PARAMETER SPC_PROGRAMACAO_TEMPO_BOJO.TEMPO_FERRAMENTA_AQUECIMENTO IS
'Tempo de aquecimento da ferramenta';

COMMENT ON PARAMETER SPC_PROGRAMACAO_TEMPO_BOJO.TEMPO_FERRAMENTA_SETUP IS
'Tempo de troca da ferramenta';

COMMENT ON PARAMETER SPC_PROGRAMACAO_TEMPO_BOJO.TEMPO_COR_APROVACAO IS
'Tempo de aprovacao da cor';

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROGRAMACAO_TEMPO (
    UP_ID integer,
    PRODUTO_ID integer,
    TAMANHO integer)
returns (
    TEMPO_OPERACIONAL numeric(15,4),
    TEMPO_SETUP numeric(15,4),
    QUEBRA_ACUMULADO integer,
    QUEBRA_DETALHADO integer)
as
declare variable FLUXO_ID integer;
declare variable FLUXO_TIPO char(1);
declare variable FLUXO_TEMPO numeric(15,4);
declare variable MODELO_ID integer;
declare variable COR_ID integer;
Begin

              fluxo_tempo = 0;
              tempo_setup = 0;
              tempo_operacional = 0;

                For
                SELECT Distinct FB.Tipo, MF.fluxo_id, P.Modelo_Codigo, P.Cor_Codigo
                From TbFluxo_Producao FB, TbUP_Fluxo UF, TbModelo_Fluxo_producao MF, TbProduto P
                Where MF.Fluxo_Id  = FB.Id
                  and UF.Fluxo_id  = FB.Id
                  and P.Codigo     = :Produto_id
                  and MF.Modelo_Id = P.Modelo_Codigo
                  and FB.Status    = '1'
                  and UF.Up_Id     = :UP_id
                Order by MF.Ordem
                Into :fluxo_Tipo, :fluxo_Id, :Modelo_Id, :Cor_Id
                  Do
                     Begin
                     if (:fluxo_Id > 0) then
                         Begin
                         --Mod/Cor/Tam
                         if (fluxo_tempo = 0) Then
                             Begin
                             fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = :Tamanho),0);
                             End
                         --Mod/Cor
                         if (fluxo_tempo = 0) Then
                             Begin
                             fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = :Cor_Id and MF.Tamanho = 0),0);
                             End
                         --Mod/Tam
                         if (fluxo_tempo = 0) Then
                             Begin
                             fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = :Tamanho),0);
                             End
                         --Mod
                         if (fluxo_tempo = 0) Then
                             Begin
                             fluxo_tempo = Coalesce((SELECT sum(MF.Tempo) From TbModelo_Fluxo_producao MF Where MF.Fluxo_Id  = :Fluxo_Id and MF.Modelo_Id = :Modelo_Id and MF.Cor_Id = 0 and MF.Tamanho = 0),0);
                             End
        
                         if (:fluxo_tempo > 0) Then
                             Begin
                               if (:Fluxo_Tipo = '0') then --Fluxo de Setup
                                   Begin
                                   tempo_setup = :tempo_setup + :Fluxo_Tempo;
                                   fluxo_tempo = 0;
                                   End else
                               if (:Fluxo_Tipo = '1') then --Fluxo Operacional
                                   Begin
                                   tempo_operacional = :tempo_operacional + :Fluxo_Tempo;
                                   fluxo_tempo = 0;
                                   End
                             End
                         End
                     End
        
              if (Trunc(:tempo_operacional) = :tempo_operacional) Then
                  Begin
                  tempo_operacional = Trunc(:tempo_operacional);
                  End else
                  Begin
                  tempo_operacional = Trunc(:tempo_operacional) + 1;
                  End

              if (Trunc(:tempo_setup) = :tempo_setup) Then
                  Begin
                  tempo_setup = Trunc(:tempo_setup);
                  End else
                  Begin
                  tempo_setup = Trunc(:tempo_setup) + 1;
                  End

              Quebra_Acumulado = Coalesce((Select IIF(:Tamanho=0,MRC.Quantidade,
                                               IIF(:Tamanho=1,MRC.T01,IIF(:Tamanho=2,MRC.T02,
                                               IIF(:Tamanho=3,MRC.T03,IIF(:Tamanho=4,MRC.T04,
                                               IIF(:Tamanho=5,MRC.T05,IIF(:Tamanho=6,MRC.T06,
                                               IIF(:Tamanho=7,MRC.T07,IIF(:Tamanho=8,MRC.T08,
                                               IIF(:Tamanho=9,MRC.T09,IIF(:Tamanho=10,MRC.T10,
                                               IIF(:Tamanho=11,MRC.T11,IIF(:Tamanho=12,MRC.T12,
                                               IIF(:Tamanho=13,MRC.T13,IIF(:Tamanho=14,MRC.T14,
                                               IIF(:Tamanho=15,MRC.T15,IIF(:Tamanho=16,MRC.T16,
                                               IIF(:Tamanho=17,MRC.T17,IIF(:Tamanho=18,MRC.T18,
                                               IIF(:Tamanho=19,MRC.T19,IIF(:Tamanho=20,MRC.T20,0)))))))))))))))))))))
                                          From TBMODELO_REMESSA_COTA MRC Where MRC.Modelo_Codigo = :Modelo_Id),0);

             Quebra_Detalhado = Coalesce((Select IIF(:Tamanho=0,MRC.Quantidade,
                                               IIF(:Tamanho=1,MRC.T01,IIF(:Tamanho=2,MRC.T02,
                                               IIF(:Tamanho=3,MRC.T03,IIF(:Tamanho=4,MRC.T04,
                                               IIF(:Tamanho=5,MRC.T05,IIF(:Tamanho=6,MRC.T06,
                                               IIF(:Tamanho=7,MRC.T07,IIF(:Tamanho=8,MRC.T08,
                                               IIF(:Tamanho=9,MRC.T09,IIF(:Tamanho=10,MRC.T10,
                                               IIF(:Tamanho=11,MRC.T11,IIF(:Tamanho=12,MRC.T12,
                                               IIF(:Tamanho=13,MRC.T13,IIF(:Tamanho=14,MRC.T14,
                                               IIF(:Tamanho=15,MRC.T15,IIF(:Tamanho=16,MRC.T16,
                                               IIF(:Tamanho=17,MRC.T17,IIF(:Tamanho=18,MRC.T18,
                                               IIF(:Tamanho=19,MRC.T19,IIF(:Tamanho=20,MRC.T20,0)))))))))))))))))))))
                                          From TBMODELO_PRODUCAO_COTA MRC Where MRC.Modelo_Codigo = :Modelo_Id),0);

      Suspend;
 
End
^

SET TERM ; ^

