SET TERM ^ ;

CREATE OR ALTER procedure SPC_TEMPO_UP (
    UP_ID numeric(15,4),
    MODELO_ID numeric(15,4),
    COR_ID numeric(15,4),
    TAMANHO numeric(15,4),
    QUANTIDADE numeric(15,4),
    PECA_ID 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
Begin

    delete from TMP22040;

    INSERT INTO
    TMP22040 (
        UP_ID, 
        MODELO_ID, 
        COR_ID, 
        TAMANHO, 
        QUANTIDADE,
        PECA_ID
    ) VALUES (
       :UP_ID, 
       :MODELO_ID, 
       :COR_ID, 
       :TAMANHO, 
       :QUANTIDADE,
       :PECA_ID
    );
      
    SELECT FIRST 1
        TEMPOSETUP,
        TEMPOSETCOR,
        TEMPOREB,
        TEMPOPROCESSO,
        TOTALSETUP,
        TOTALPROCESSO,
        TOTAL,
        QUANTIDADE_OPERADOR
    FROM SPC_TEMPO_MODELO_UP T
    into
        TEMPOSETUP,
        TEMPOSETCOR,
        TEMPOREB,
        TEMPOPROCESSO,
        TOTALSETUP,
        TOTALPROCESSO,
        TOTAL,
        QUANTIDADE_OPERADOR;

        TEMPOSETUP          = coalesce(TEMPOSETUP,0);
        TEMPOSETCOR         = coalesce(TEMPOSETCOR,0);
        TEMPOREB            = coalesce(TEMPOREB,0);
        TEMPOPROCESSO       = coalesce(TEMPOPROCESSO,0);
        TOTALSETUP          = coalesce(TOTALSETUP,0);
        TOTALPROCESSO       = coalesce(TOTALPROCESSO,0);
        TOTAL               = coalesce(TOTAL,0);
        QUANTIDADE_OPERADOR = coalesce(QUANTIDADE_OPERADOR,0);

   suspend;
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),
    PECA_ID integer)
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, IIF(M.nr_pecas>1,T.peca_id,0), Sum(T.Quantidade), (Select count(distinct(Cor_id)) From tmp22040)
        From Tmp22040 T, TBMODELO M
        WHERE M.CODIGO = T.MODELO_ID
        Group BY T.Up_Id, T.Modelo_Id, T.PECA_ID, M.nr_pecas
         Into :Up_Id, :Modelo_Id, :PECA_ID, :vQtdAcumulado, :vQtdCores
           Do Begin

           PECA_ID = coalesce(PECA_ID,0);

           -- 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 iif( :PECA_ID > 0, :PECA_ID = mf.peca or mf.peca = 0,true)
                          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 ; ^

