
DROP TRIGGER TTBMODELO_FLUXO_B01IUD;

DROP TRIGGER TTBMODELO_FLUXO_B02D;

DROP TRIGGER TTBMODELO_FLUXO_B02I;

DROP TRIGGER TTBMODELO_FLUXO_B02U;

DROP TRIGGER TTBMODELO_FLUXO_B03I;

DROP SEQUENCE GTBMODELO_FLUXO;

DROP TABLE TBMODELO_FLUXO;


CREATE GENERATOR GTBMODELO_FLUXO;

CREATE TABLE TBMODELO_FLUXO (
    MODELO_ID  INTEGER NOT NULL,
    FLUXO_ID   INTEGER NOT NULL,
    ORDEM      SMALLINT DEFAULT 0,
    OPERADOR   VARCHAR(50),
    ID         INTEGER NOT NULL,
    TEMPO      NUMERIC(15,4) DEFAULT 0,
    COR_ID     INTEGER DEFAULT 0 NOT NULL,
    TAMANHO    INTEGER DEFAULT 0 NOT NULL
);


ALTER TABLE TBMODELO_FLUXO ADD PRIMARY KEY (ID);

CREATE INDEX ITBMODELO_FLUXO_01 ON TBMODELO_FLUXO (MODELO_ID);
CREATE INDEX ITBMODELO_FLUXO_02 ON TBMODELO_FLUXO (MODELO_ID, COR_ID);
CREATE INDEX ITBMODELO_FLUXO_03 ON TBMODELO_FLUXO (MODELO_ID, COR_ID, TAMANHO);

CREATE OR ALTER TRIGGER TTBMODELO_FLUXO_B01IUD FOR TBMODELO_FLUXO
ACTIVE BEFORE INSERT OR UPDATE OR DELETE POSITION 0
AS
begin

  if(inserting or updating)then
  begin
    FN_ALTERACAO_TEMPO('TBMODELO', new.modelo_id);
  end else
  begin
    FN_ALTERACAO_TEMPO('TBMODELO', old.modelo_id);
  end

  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTBMODELO_FLUXO,1);

end;

CREATE OR ALTER TRIGGER TTBMODELO_FLUXO_B02D FOR TBMODELO_FLUXO
ACTIVE BEFORE DELETE POSITION 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF (OLD.MODELO_ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'FLUXO PROD: '||FN_LPAD(OLD.FLUXO_ID,4,'0')||' EXCLUÍDO.';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBMODELO', OLD.MODELO_ID, HISTORICO);
    END
END;

CREATE OR ALTER TRIGGER TTBMODELO_FLUXO_B02I FOR TBMODELO_FLUXO
ACTIVE BEFORE INSERT POSITION 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF (NEW.MODELO_ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'FLUXO PROD: '||FN_LPAD(NEW.FLUXO_ID,4,'0')||' INCLUÍDO.';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBMODELO', NEW.MODELO_ID, HISTORICO);
    END
END;

CREATE OR ALTER TRIGGER TTBMODELO_FLUXO_B02U FOR TBMODELO_FLUXO
ACTIVE BEFORE UPDATE POSITION 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF(NEW.ORDEM <> OLD.ORDEM) THEN
    BEGIN
        HISTORICO = HISTORICO||' ORDEM:'||OLD.ORDEM||'->'||NEW.ORDEM;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        HISTORICO = ' FLUXO PROD: '||FN_LPAD(NEW.FLUXO_ID,4,0)||' ALTERADO'||HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBMODELO', NEW.MODELO_ID, HISTORICO);
    END
END;

CREATE OR ALTER TRIGGER TTBMODELO_FLUXO_B03I FOR TBMODELO_FLUXO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable fluxo integer;
begin
  if(new.fluxo_id > 0)then
  begin
     fluxo = coalesce((select first 1 a.fluxo_id from TBMODELO_FLUXO a where a.MODELO_ID = new.modelo_id and a.FLUXO_ID = new.fluxo_id),0);
     if(fluxo > 0)then
     begin
       exception "..." 'FLUXO ID:'||FN_LPAD(FLUXO,4,0)||' JÁ INCLUÍDO PARA ESTE MODELO!, OPERAÇÃO CANCELADA!';
     end
  end
end;

COMMENT ON TRIGGER TTBMODELO_FLUXO_B01IUD IS 
'marca modelo para recalculo de tempo';

insert into TBMODELO_FLUXO (MODELO_ID, FLUXO_ID, ORDEM, OPERADOR, TEMPO, COR_ID, TAMANHO)
select MODELO_ID, FLUXO_ID, ORDEM, OPERADOR, TEMPO, COR_ID, TAMANHO from TBMODELO_FLUXO2;

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 First 1 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 First 1 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 First 1 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 First 1 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 First 1 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 First 1 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 First 1 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 First 1 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_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 First 1 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 First 1 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 First 1 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 First 1 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_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 First 1 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 First 1 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 First 1 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 First 1 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 First 1 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 First 1 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 First 1 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 First 1 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_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 First 1 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 First 1 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 First 1 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 First 1 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 SPU_COPIA_MODELO_FLUXO (
    ID1 integer,
    ID2 integer,
    DESCRICAO_1 varchar(50),
    USUARIO_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;

        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 SPU_MODELO_FLUXO (
    MODELO_1 integer)
returns (
    FLUXO_ID integer,
    ORDEM integer,
    ID integer)
as
declare variable I integer;
BEGIN
I =0;
FOR Select A.Fluxo_id, A.Ordem, A.ID
From TbModelo_Fluxo A
Where A.Modelo_ID = :Modelo_1
Order By 2, 3 Desc
INTO :Fluxo_id, :Ordem, :ID

DO

   if (:Fluxo_Id > 0) then
       Begin
       i = i+1;
       UPDATE TbModelo_Fluxo Set Ordem = :I
       Where Modelo_id = :Modelo_1 and Fluxo_Id = :Fluxo_Id;
       End

SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbfluxo_producao_b0d_01 for tbfluxo_producao
active before delete position 0
AS
DECLARE VARIABLE p1 Integer;
Begin

For Select
(Select First 1 A.modelo_id From tbmodelo_fluxo A Where A.Fluxo_Id = OLD.ID)  

FROM RDB$DATABASE
Into :p1
Do
begin

  if (:P1 > 0) Then Exception "..." 'REGISTRO JÁ VINCULADO AO FLUXO DE PRODUÇÃO POR MODELOS. MOD.'||:P1||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';

end

End
^

SET TERM ; ^

