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 First 1 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 First 1 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 First 1 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 First 1 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_remessa_intermediaria 
returns (
    remessa_id integer)
as
declare variable remessa_id_origem integer;
declare variable remessa_id_vinculo integer;
declare variable remessa_talao_detalhe_id integer;
declare variable observacao varchar(200);
declare variable gp_id integer;
declare variable talao_id integer;
declare variable talao_produto_descricao varchar(400);
declare variable talao_perfil_sku varchar(10);
declare variable talao_perfil_sku_descricao varchar(80);
declare variable talao_cor_classe varchar(10);
declare variable talao_cor_subclasse integer;
declare variable talao_controle varchar(4000);
declare variable talao_modelo_id integer;
declare variable talao_modelo_descricao varchar(200);
declare variable talao_tamanho integer;
declare variable talao_produto_id integer;
declare variable talao_tamanho_descricao varchar(200);
declare variable talao_quantidade numeric(18,5);
declare variable produto_descricao varchar(400);
declare variable tamanho_descricao varchar(200);
declare variable um varchar(12);
declare variable largura numeric(18,5);
declare variable comprimento numeric(18,5);
declare variable cor_classe varchar(10);
declare variable cor_subclasse integer;
declare variable id integer;
declare variable estabelecimento_id integer;
declare variable remessa_talao_id integer;
declare variable localizacao_id integer;
declare variable produto_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable tamanho integer;
declare variable quantidade numeric(18,5);
declare variable quantidade_alternativa numeric(18,4);
declare variable quantidade_sobra numeric(18,4);
declare variable densidade smallint;
declare variable espessura numeric(18,2);
declare variable status integer;
declare variable data_producao date;
declare variable data_liberacao date;
declare variable hora_producao timestamp;
declare variable hora_liberacao timestamp;
declare variable via_etiqueta integer;
declare variable turno char(4);
declare variable talao_extra integer;
declare variable percentual_extra numeric(18,4);
declare variable up_id integer;
declare variable estacao integer;
declare variable data date;
declare variable consumo_id integer;
declare variable consumo_quantidade numeric(15,5);
declare variable c_id_old integer;
declare variable c_id integer;
declare variable c_estabelecimento_id integer;
declare variable c_remessa_id integer;
declare variable c_remessa_talao_id integer;
declare variable c_remessa_talao_detalhe_id integer;
declare variable c_controle integer;
declare variable c_localizacao_id integer;
declare variable c_produto_id integer;
declare variable c_tamanho integer;
declare variable c_densidade integer;
declare variable c_espessura numeric(18,2);
declare variable c_quantidade_original numeric(18,4);
declare variable c_quantidade_neces numeric(18,4);
declare variable c_quantidade_neces_altern numeric(18,4);
declare variable c_fator_unidade numeric(18,8);
declare variable c_fator_unidade_altern numeric(18,8);
declare variable c_quantidade numeric(18,4);
declare variable c_quantidade_consumo numeric(18,4);
declare variable c_quantidade_saldo numeric(18,4);
declare variable c_quantidade_alternativa numeric(18,4);
declare variable c_quantidade_sobra numeric(18,4);
declare variable c_status char(4);
declare variable c_quantidade_alternativa_cons numeric(18,4);
declare variable c_quantidade_alternativa_saldo numeric(18,4);
declare variable c_datahora_conferencia timestamp;
declare variable c_componente smallint;
declare variable c_estoque_id integer;
declare variable c_saldo_baixar numeric(18,4);
declare variable tempo_total numeric(15,4);
declare variable quantidade_detalhe numeric(15,4);
declare variable tempo_setup numeric(15,4);
begin

    REMESSA_ID = GEN_ID(GTBREMESSA,1);


    SELECT FIRST 1
           T.OBSERVACAO,
           T.GP_ID
      FROM VWREMESSA_TALAO T
     WHERE T.REMESSA_ID = -99999--:REMESSA_ID
      INTO OBSERVACAO,
           GP_ID;
                    
    UPDATE VWREMESSA_TALAO T
       SET T.REMESSA_ID = :REMESSA_ID,
           T.GP_ID      = :GP_ID
     WHERE T.REMESSA_ID = -99999;


    REMESSA_ID_ORIGEM  = (SELECT FIRST 1 SKIP 0 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));
    REMESSA_ID_VINCULO = (SELECT FIRST 1 SKIP 1 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));


    INSERT INTO VWREMESSA
    SELECT ESTABELECIMENTO_ID,
           FAMILIA_ID,
           FAMILIA_ID_MP,
           :REMESSA_ID,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO),
           DATA,
           PERFIL,
           STATUS,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,1),
           '1',
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,2),
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,3),
           :GP_ID,
           FN_CURRENT_USER_ID(),
           AMOSTRA,
           'REMESSA INTERMEDIARIA',
           DATA,
           CURRENT_TIMESTAMP,
           ''
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = :REMESSA_ID_ORIGEM;



    SELECT FIRST 1
        R.ESTABELECIMENTO_ID
    FROM
        VWREMESSA R
    WHERE
        R.REMESSA_ID = :REMESSA_ID
    INTO
        ESTABELECIMENTO_ID;

    FOR

        SELECT
            P2.DESCRICAO TALAO_PRODUTO_DESCRICAO,
            TRIM(S.PERFIL) TALAO_PERFIL_SKU,
            PF.DESCRICAO TALAO_PERFIL_SKU_DESCRICAO,
            C.CLASSE TALAO_COR_CLASSE,
            C.SUBCLASSE TALAO_COR_SUBCLASSE,
            X.TALAO_CONTROLE,
            X.TALAO_MODELO_ID,
            X.TALAO_MODELO_DESCRICAO,
            X.TALAO_TAMANHO,
            X.TALAO_PRODUTO_ID,
            X.TALAO_TAMANHO_DESCRICAO,
            X.TALAO_QUANTIDADE,
            X.PRODUTO_DESCRICAO,
            X.TAMANHO_DESCRICAO,
            X.UM,
            X.LARGURA,
            X.COMPRIMENTO,
            X.COR_CLASSE,
            X.COR_SUBCLASSE,
            X.ID,
            X.REMESSA_TALAO_ID,
            X.LOCALIZACAO_ID,
            X.PRODUTO_ID,
            X.MODELO_ID,
            X.COR_ID,
            X.TAMANHO,
            X.QUANTIDADE,
            X.QUANTIDADE_ALTERNATIVA,
            X.QUANTIDADE_SOBRA,
            X.DENSIDADE,
            X.ESPESSURA,
            X.STATUS,
            X.DATA_PRODUCAO,
            X.DATA_LIBERACAO,
            X.HORA_PRODUCAO,
            X.HORA_LIBERACAO,
            X.VIA_ETIQUETA,
            X.TURNO,
            X.TALAO_EXTRA,
            X.PERCENTUAL_EXTRA
    
        FROM (
            SELECT
                FN_LPAD(T2.REMESSA_TALAO_ID,4,0) TALAO_CONTROLE,
                T2.MODELO_ID TALAO_MODELO_ID,
                M.DESCRICAO TALAO_MODELO_DESCRICAO,
                (SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_TAMANHO,
                (SELECT FIRST 1 PRODUTO_ID FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_PRODUTO_ID,
                FN_TAMANHO_GRADE(M.GRADE_CODIGO,(SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID)) TALAO_TAMANHO_DESCRICAO,
                SUM(T1.QUANTIDADE) OVER (PARTITION BY V.REMESSA_TALAO_ID) TALAO_QUANTIDADE,
                P.DESCRICAO PRODUTO_DESCRICAO,
                FN_TAMANHO_GRADE(P.GRADE_CODIGO,T1.TAMANHO) TAMANHO_DESCRICAO,                    
                P.UNIDADEMEDIDA_SIGLA UM,
                MT.LARGURA,
                MT.COMPRIMENTO,
                C2.CLASSE COR_CLASSE,
                C2.SUBCLASSE COR_SUBCLASSE,
                T1.ID,
                T1.ESTABELECIMENTO_ID,
                T1.REMESSA_ID,
                T1.REMESSA_TALAO_ID,
                T1.LOCALIZACAO_ID,
                T1.PRODUTO_ID,
                T1.MODELO_ID,
                P.COR_CODIGO COR_ID,
                T1.TAMANHO,
                T1.QUANTIDADE,
                T1.QUANTIDADE_ALTERNATIVA,
                T1.QUANTIDADE_SOBRA,
                T1.GP_ID,
                T1.UP_ID,
                T1.ESTACAO,
                T1.DENSIDADE,
                T1.ESPESSURA,
                T1.STATUS,
                T1.OBSERVACAO,
                T1.DATA_PRODUCAO,
                T1.DATA_LIBERACAO,
                T1.HORA_PRODUCAO,
                T1.HORA_LIBERACAO,
                T1.VIA_ETIQUETA,
                T1.TURNO,
                T1.TALAO_EXTRA,
                T1.PERCENTUAL_EXTRA
    
            FROM
                VWREMESSA_TALAO T1,
                VWREMESSA_CONSUMO C,
                TBREMESSA_CONSUMO_VINCULO V,
                VWREMESSA_TALAO T2,
                TBPRODUTO P,
                TBMODELO M,
                TBMODELO M2,
                SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT,
                TBCOR C2
    
            WHERE
                T1.REMESSA_ID = C.REMESSA_ID
            AND T1.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
            AND V.CONSUMO_ID = C.ID
            AND T2.REMESSA_ID = V.REMESSA_ID
            AND T2.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID
            AND P.CODIGO = T1.PRODUTO_ID
            AND M.CODIGO = T2.MODELO_ID
            AND M2.CODIGO = P.MODELO_CODIGO
            AND C2.CODIGO = P.COR_CODIGO
            AND T1.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND T2.REMESSA_ID = :REMESSA_ID_VINCULO
            ) X,
            TBPRODUTO P2,
            VWSKU S,
            TBPERFIL PF,
            TBCOR C
        WHERE
            P2.CODIGO = TALAO_PRODUTO_ID
        AND S.MODELO_ID = P2.MODELO_CODIGO
        AND S.COR_ID = P2.COR_CODIGO
        AND S.TAMANHO = TALAO_TAMANHO
        AND PF.TABELA = 'SKU'
        AND PF.ID = S.PERFIL
        AND C.CODIGO = P2.COR_CODIGO
    INTO
        TALAO_PRODUTO_DESCRICAO,
        TALAO_PERFIL_SKU,
        TALAO_PERFIL_SKU_DESCRICAO,
        TALAO_COR_CLASSE,
        TALAO_COR_SUBCLASSE,
        TALAO_CONTROLE,
        TALAO_MODELO_ID,
        TALAO_MODELO_DESCRICAO,
        TALAO_TAMANHO,
        TALAO_PRODUTO_ID,
        TALAO_TAMANHO_DESCRICAO,
        TALAO_QUANTIDADE,
        PRODUTO_DESCRICAO,
        TAMANHO_DESCRICAO,
        UM,
        LARGURA,
        COMPRIMENTO,
        COR_CLASSE,
        COR_SUBCLASSE,
        ID,
        REMESSA_TALAO_ID,
        LOCALIZACAO_ID,
        PRODUTO_ID,
        MODELO_ID,
        COR_ID,
        TAMANHO,
        QUANTIDADE,
        QUANTIDADE_ALTERNATIVA,
        QUANTIDADE_SOBRA,
        DENSIDADE,
        ESPESSURA,
        STATUS,
        DATA_PRODUCAO,
        DATA_LIBERACAO,
        HORA_PRODUCAO,
        HORA_LIBERACAO,
        VIA_ETIQUETA,
        TURNO,
        TALAO_EXTRA,
        PERCENTUAL_EXTRA
    DO
    BEGIN
        UPDATE VWREMESSA_TALAO T
           SET T.PRODUTO_ID = NULL,
               T.DENSIDADE = :DENSIDADE,
               T.ESPESSURA = :ESPESSURA
         WHERE T.REMESSA_ID = :REMESSA_ID
           AND T.REMESSA_TALAO_ID = :TALAO_CONTROLE;


        REMESSA_TALAO_DETALHE_ID = GEN_ID(GERADOR1_ID, 1);

        FOR
            SELECT
                C.ID,
                C.QUANTIDADE
            FROM
                VWREMESSA_CONSUMO C
            WHERE
                C.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND C.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
        INTO
            CONSUMO_ID,
            CONSUMO_QUANTIDADE
        DO
        BEGIN

            INSERT INTO TBREMESSA_CONSUMO_VINCULO (
                CONSUMO_ID,
                REMESSA_ID,
                REMESSA_TALAO_ID,
                REMESSA_TALAO_DETALHE_ID,
                QUANTIDADE
            ) VALUES (
                :CONSUMO_ID,
                :REMESSA_ID,
                :TALAO_CONTROLE,
                :REMESSA_TALAO_DETALHE_ID,
                :CONSUMO_QUANTIDADE
            );

        END

        INSERT INTO VWREMESSA_TALAO_DETALHE (
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            ID,
            PRODUTO_ID,
            MODELO_ID,
            COR_ID,
            TAMANHO,
            QUANTIDADE,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
--            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            GP_ID,
            STATUS
        ) VALUES (
           :ESTABELECIMENTO_ID,
           :REMESSA_ID,
           :TALAO_CONTROLE,
           :REMESSA_TALAO_DETALHE_ID,
           :PRODUTO_ID,
           :MODELO_ID,
           :COR_ID,
           :TAMANHO,
           :QUANTIDADE,
           0,
           0,
--           :QUANTIDADE_ALTERN,
           0,
           0,
           :GP_ID,
           1
        );

    END


    FOR
        SELECT
            T.GP_ID,
            T.UP_ID,
            T.ESTACAO,
            T.ID,
            T.REMESSA_TALAO_ID,
            T.QUANTIDADE,
            T.REMESSA_ID,
            R.DATA

        FROM
            VWREMESSA_TALAO T,
            VWREMESSA R

        WHERE
            R.REMESSA_ID = T.REMESSA_ID
        AND T.REMESSA_ID = :REMESSA_ID
    INTO
        :GP_ID,
        :UP_ID,
        :ESTACAO,
        :TALAO_ID,
        :REMESSA_TALAO_ID,
        :QUANTIDADE,
        :REMESSA_ID,
        :DATA
    DO
    BEGIN
        TEMPO_TOTAL = 0;
        DELETE FROM TMP22040;

        FOR
            SELECT P.MODELO_CODIGO,
                   P.COR_CODIGO,
                   D.TAMANHO,
                   D.QUANTIDADE
              FROM VWREMESSA_TALAO_DETALHE D,
                   TBPRODUTO P
             WHERE D.REMESSA_ID = :REMESSA_ID
               AND D.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
               AND P.CODIGO = D.PRODUTO_ID
        INTO
            :MODELO_ID,
            :COR_ID,
            :TAMANHO,
            :QUANTIDADE_DETALHE
        DO
        BEGIN
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               :UP_ID, 
               :MODELO_ID, 
               :COR_ID, 
               :TAMANHO, 
               :QUANTIDADE_DETALHE
            );
                     
--            TEMPO_TOTAL = TEMPO_TOTAL + COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),0);
    
--            IF ( TEMPO_TOTAL = 0 ) THEN
--            BEGIN
--                EXCEPTION "..." 'TEMPO NAO LOCALIZADO PARA UP:' || :UP_ID || ' MODELO: ' || :MODELO_ID || ' COR: ' || :COR_ID || ' TAM.: ' || :TAMANHO || ' QTD. ' || :QUANTIDADE_DETALHE;
--            END
        END
          
        SELECT FIRST 1 T.TOTAL, t.totalsetup FROM SPC_PROGRAMACAO_TEMPO_NOVO T
        into :TEMPO_TOTAL, :TEMPO_SETUP;

        TEMPO_TOTAL = COALESCE(:TEMPO_TOTAL,1);
        TEMPO_SETUP = COALESCE(:TEMPO_SETUP,0);

        IF ( TEMPO_TOTAL = 0 ) THEN
        BEGIN
            TEMPO_TOTAL = 1;
        END

        EXECUTE PROCEDURE SPI_PROGRAMACAO2(
            :ESTABELECIMENTO_ID,
            'A',
            :GP_ID,
            :UP_ID,
            :ESTACAO,
            :TALAO_ID,
            0,
            0,
            :QUANTIDADE,
            :TEMPO_TOTAL,
            :REMESSA_ID,
            :DATA,
            :TEMPO_SETUP
        );
    END


    FOR
        SELECT
            C.ID ID_OLD,
            GEN_ID(GTBREMESSA_CONSUMO,1),
            C.ESTABELECIMENTO_ID,
            :REMESSA_ID,
            V.REMESSA_TALAO_ID,
            C.REMESSA_TALAO_DETALHE_ID,
            C.CONTROLE,
            C.LOCALIZACAO_ID,
            C.PRODUTO_ID,
            C.TAMANHO,
            C.DENSIDADE,
            C.ESPESSURA,
            C.QUANTIDADE_ORIGINAL,
            C.QUANTIDADE_NECES,
            C.QUANTIDADE_NECES_ALTERN,
            C.FATOR_UNIDADE,
            C.FATOR_UNIDADE_ALTERN,
            C.QUANTIDADE,
            C.QUANTIDADE_CONSUMO,
            C.QUANTIDADE_SALDO,
            C.QUANTIDADE_ALTERNATIVA,
            C.QUANTIDADE_SOBRA,
            C.STATUS,
            C.QUANTIDADE_ALTERNATIVA_CONSUMO,
            C.QUANTIDADE_ALTERNATIVA_SALDO,
            C.DATAHORA_CONFERENCIA,
            C.COMPONENTE,
            C.ESTOQUE_ID,
            C.SALDO_BAIXAR
        
        FROM
            VWREMESSA_CONSUMO C,
            TBREMESSA_CONSUMO_VINCULO V
        
        WHERE   
            V.REMESSA_ID = :REMESSA_ID_VINCULO
        AND V.CONSUMO_ID = C.ID
        ORDER BY C.ID
    INTO
        C_ID_OLD,
        C_ID,
        C_ESTABELECIMENTO_ID,
        C_REMESSA_ID,
        C_REMESSA_TALAO_ID,
        C_REMESSA_TALAO_DETALHE_ID,
        C_CONTROLE,
        C_LOCALIZACAO_ID,
        C_PRODUTO_ID,
        C_TAMANHO,
        C_DENSIDADE,
        C_ESPESSURA,
        C_QUANTIDADE_ORIGINAL,
        C_QUANTIDADE_NECES,
        C_QUANTIDADE_NECES_ALTERN,
        C_FATOR_UNIDADE,
        C_FATOR_UNIDADE_ALTERN,
        C_QUANTIDADE,
        C_QUANTIDADE_CONSUMO,
        C_QUANTIDADE_SALDO,
        C_QUANTIDADE_ALTERNATIVA,
        C_QUANTIDADE_SOBRA,
        C_STATUS,
        C_QUANTIDADE_ALTERNATIVA_CONS,
        C_QUANTIDADE_ALTERNATIVA_SALDO,
        C_DATAHORA_CONFERENCIA,
        C_COMPONENTE,
        C_ESTOQUE_ID,
        C_SALDO_BAIXAR
    DO
    BEGIN

        UPDATE TBREMESSA_CONSUMO_VINCULO
           SET CONSUMO_ID = :C_ID
         WHERE CONSUMO_ID = :C_ID_OLD
           AND REMESSA_ID = :REMESSA_ID_VINCULO;

        INSERT INTO VWREMESSA_CONSUMO (
            ID,
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            REMESSA_TALAO_DETALHE_ID,
            CONTROLE,
            LOCALIZACAO_ID,
            PRODUTO_ID,
            TAMANHO,
            DENSIDADE,
            ESPESSURA,
            QUANTIDADE_ORIGINAL,
            QUANTIDADE_NECES,
            QUANTIDADE_NECES_ALTERN,
            QUANTIDADE,
            QUANTIDADE_CONSUMO,
            QUANTIDADE_ALTERNATIVA,
            QUANTIDADE_SOBRA,
            STATUS,
            QUANTIDADE_ALTERNATIVA_CONSUMO,
            DATAHORA_CONFERENCIA,
            COMPONENTE,
            ESTOQUE_ID,
            SALDO_BAIXAR
        ) VALUES (
            :C_ID,
            :C_ESTABELECIMENTO_ID,
            :C_REMESSA_ID,
            :C_REMESSA_TALAO_ID,
            :C_REMESSA_TALAO_DETALHE_ID,
            :C_CONTROLE,
            :C_LOCALIZACAO_ID,
            :C_PRODUTO_ID,
            :C_TAMANHO,
            :C_DENSIDADE,
            :C_ESPESSURA,
            :C_QUANTIDADE_ORIGINAL,
            :C_QUANTIDADE_NECES,
            :C_QUANTIDADE_NECES_ALTERN,
            :C_QUANTIDADE,
            :C_QUANTIDADE_CONSUMO,
            :C_QUANTIDADE_ALTERNATIVA,
            :C_QUANTIDADE_SOBRA,
            :C_STATUS,
            :C_QUANTIDADE_ALTERNATIVA_CONS,
            :C_DATAHORA_CONFERENCIA,
            :C_COMPONENTE,
            :C_ESTOQUE_ID,
            :C_SALDO_BAIXAR
        );

    END




  /* Procedure Text */
--  suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_processado_b7u for tbpedido_item_processado
active before update position 7
AS
declare variable OLD_TALAO_ID               INTEGER;
declare variable OLD_TALAO_STATUS           INTEGER;
declare variable TALAO_ID INTEGER;
declare variable NEW_TALAO_ID               INTEGER;
declare variable NEW_ESTABELECIMENTO_ID     INTEGER;
declare variable NEW_REMESSA_ID             INTEGER;
declare variable NEW_LOCALIZACAO_ID         INTEGER;
declare variable NEW_PRODUTO_ID             INTEGER;
declare variable NEW_MODELO_ID              INTEGER;
declare variable NEW_TAMANHO                INTEGER;
declare variable NEW_QUANTIDADE             NUMERIC(15,4);
declare variable NEW_QUANTIDADE_ALTERNATIVA NUMERIC(15,4);
declare variable NEW_GP_ID                  INTEGER;
declare variable NEW_UP_ID                  INTEGER;
declare variable NEW_ESTACAO                INTEGER;
declare variable NEW_DENSIDADE              NUMERIC(15,4);
declare variable NEW_ESPESSURA              NUMERIC(15,4);
declare variable NEW_STATUS                 INTEGER;

declare variable NEW_C_ESTABELECIMENTO_ID        INTEGER;
declare variable NEW_C_FAMILIA_ID                INTEGER;
declare variable NEW_C_REMESSA                   INTEGER;
declare variable NEW_C_TALAO                     INTEGER;
declare variable NEW_C_PRODUTO_ID                INTEGER;
declare variable NEW_C_TAMANHO                   INTEGER;
declare variable NEW_C_LOCALIZACAO_ID            INTEGER;
declare variable NEW_C_DENSIDADE                 NUMERIC(15,4);
declare variable NEW_C_ESPESSURA                 NUMERIC(15,4);
declare variable NEW_C_COR_ID                    INTEGER;
declare variable NEW_C_ESTEIRA_ID                INTEGER;
declare variable NEW_C_SETOR_ID                  INTEGER;
declare variable NEW_C_FATOR_CONVERSAO           NUMERIC(15,4);
declare variable NEW_C_QUANTIDADE                NUMERIC(15,4);
declare variable NEW_C_CONSUMO_ML                NUMERIC(15,4);
declare variable NEW_C_CONSUMO_KG                NUMERIC(15,4);
declare variable NEW_C_QUANTIDADE_CONFERENCIA    NUMERIC(15,4);
declare variable NEW_C_DATAHORA_CONFERENCIA      NUMERIC(15,4);
declare variable NEW_C_REQUISICAO_ID             INTEGER;
declare variable NEW_C_DATA                      DATE;
declare variable NEW_C_CCUSTO                    VARCHAR(12);
declare variable NEW_C_QUEBRA                    CHAR(1);
declare variable NEW_C_SEGURANCA                 NUMERIC(15,4);
declare variable NEW_C_TALAO_DETALHE_ID          INTEGER;
declare variable NEW_C_SALDO                     NUMERIC(15,4);
declare variable NEW_C_CONTROLE                  INTEGER;
declare variable NEW_C_QUANTIDADE_CONFERENCIA_ML NUMERIC(15,4);
declare variable NEW_C_SALDO_ML                  NUMERIC(15,4);
declare variable NEW_C_COMPONENTE                CHAR(1);
declare variable NEW_C_QUANTIDADE_SOBRA          NUMERIC(15,4);
declare variable NEW_C_SALDO_BAIXAR              NUMERIC(15,4);
declare variable NEW_C_QUANTIDADE_NECES          NUMERIC(15,4);
declare variable NEW_C_QUANTIDADE_NECES_ALTERN   NUMERIC(15,4);
declare variable TEMPO_SETUP                     NUMERIC(15,4);

BEGIN
    IF ( OLD.REMESSA_ACUMULADO_CONTROLE <> NEW.REMESSA_ACUMULADO_CONTROLE ) THEN
    BEGIN

        SELECT FIRST 1 ID, STATUS
          FROM VWREMESSA_TALAO T
         WHERE T.REMESSA_ID = OLD.REMESSA
           AND T.REMESSA_TALAO_ID = OLD.REMESSA_ACUMULADO_CONTROLE
        INTO
            :OLD_TALAO_ID,
            :OLD_TALAO_STATUS;

        IF ( OLD_TALAO_STATUS < 3 ) THEN
        BEGIN
            DELETE FROM TBREMESSA_TALAO_VINCULO V WHERE V.TALAO_ID = :OLD_TALAO_ID;
    
            UPDATE VWREMESSA_TALAO_DETALHE D
               SET D.QUANTIDADE_PRODUCAO_TMP = 0,
                   D.QUANTIDADE_ALTERN_PRODUCAO_TMP = 0,
                   D.QUANTIDADE_SOBRA_TMP = 0
             WHERE D.REMESSA_ID = OLD.REMESSA
               AND D.REMESSA_TALAO_ID = OLD.REMESSA_ACUMULADO_CONTROLE;

        END

        TALAO_ID = COALESCE((SELECT FIRST 1 ID
                               FROM VWREMESSA_TALAO T
                              WHERE T.REMESSA_ID = NEW.REMESSA
                                AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE),0);

        IF ( TALAO_ID = 0 ) THEN
        BEGIN
            SELECT FIRST 1
                ESTABELECIMENTO_ID,
                REMESSA_ID,
                LOCALIZACAO_ID,
                PRODUTO_ID,
                MODELO_ID,
                TAMANHO,
                QUANTIDADE,
                QUANTIDADE_ALTERNATIVA,
                GP_ID,
                UP_ID,
                ESTACAO,
                DENSIDADE,
                ESPESSURA,
                STATUS
            FROM VWREMESSA_TALAO T
            WHERE T.REMESSA_ID = NEW.REMESSA
              AND T.REMESSA_TALAO_ID = OLD.REMESSA_ACUMULADO_CONTROLE
            INTO
            :NEW_ESTABELECIMENTO_ID    ,
            :NEW_REMESSA_ID            ,
            :NEW_LOCALIZACAO_ID        ,
            :NEW_PRODUTO_ID            ,
            :NEW_MODELO_ID             ,
            :NEW_TAMANHO               ,
            :NEW_QUANTIDADE            ,
            :NEW_QUANTIDADE_ALTERNATIVA,
            :NEW_GP_ID                 ,
            :NEW_UP_ID                 ,
            :NEW_ESTACAO               ,
            :NEW_DENSIDADE             ,
            :NEW_ESPESSURA             ,
            :NEW_STATUS                ;


            NEW_MODELO_ID = COALESCE((SELECT FIRST 1 P.MODELO_CODIGO FROM TBPRODUTO P WHERE P.CODIGO = NEW.PRODUTO_CODIGO),NEW_MODELO_ID);

            INSERT INTO VWREMESSA_TALAO (
                ESTABELECIMENTO_ID,
                REMESSA_ID,
                REMESSA_TALAO_ID,
                LOCALIZACAO_ID,
                PRODUTO_ID,
                MODELO_ID,
                TAMANHO,
                QUANTIDADE,
                QUANTIDADE_ALTERNATIVA,
                GP_ID,
                UP_ID,
                ESTACAO,
                DENSIDADE,
                ESPESSURA,
                STATUS
            )VALUES (
                :NEW_ESTABELECIMENTO_ID        ,
                :NEW_REMESSA_ID                ,
                 NEW.REMESSA_ACUMULADO_CONTROLE,
                :NEW_LOCALIZACAO_ID            ,
                :NEW_PRODUTO_ID                ,
                :NEW_MODELO_ID                 ,
                :NEW_TAMANHO                   ,
                 NEW.QUANTIDADE_PEDIDO         ,
                 NEW.QUANTIDADE_ALTERN         ,
                :NEW_GP_ID                     ,
                :NEW_UP_ID                     ,
                :NEW_ESTACAO                   ,
                :NEW_DENSIDADE                 ,
                :NEW_ESPESSURA                 ,
                :NEW_STATUS
            ) returning ID into :NEW_TALAO_ID;

            EXECUTE PROCEDURE SPI_PROGRAMACAO2(
                :NEW_ESTABELECIMENTO_ID,
                'A',
                :NEW_GP_ID,
                :NEW_UP_ID,
                :NEW_ESTACAO,
                :NEW_TALAO_ID,
                :NEW_PRODUTO_ID,
                :NEW_TAMANHO,
                NEW.QUANTIDADE_PEDIDO,
                1,
                :NEW_REMESSA_ID,
                CURRENT_DATE,
                0
            );

        
            FOR
                SELECT        
                    ESTABELECIMENTO_ID       ,
                    FAMILIA_ID               ,
                    REMESSA                  ,
                    TALAO                    ,
                    PRODUTO_ID               ,
                    TAMANHO                  ,
                    LOCALIZACAO_ID           ,
                    DENSIDADE                ,
                    ESPESSURA                ,
                    COR_ID                   ,
                    ESTEIRA_ID               ,
                    SETOR_ID                 ,
                    FATOR_CONVERSAO          ,
                    QUANTIDADE               ,
                    CONSUMO_ML               ,
                    CONSUMO_KG               ,
                    QUANTIDADE_CONFERENCIA   ,
                    DATAHORA_CONFERENCIA     ,
                    REQUISICAO_ID            ,
                    DATA                     ,
                    CCUSTO                   ,
                    QUEBRA                   ,
                    SEGURANCA                ,
                    TALAO_DETALHE_ID         ,
                    CONTROLE                 ,
                    QUANTIDADE_CONFERENCIA_ML,
                    COMPONENTE               ,
                    QUANTIDADE_SOBRA         ,
                    SALDO_BAIXAR             ,
                    QUANTIDADE_NECES         ,
                    QUANTIDADE_NECES_ALTERN  
                FROM
                    TBREMESSA_CONSUMO C
                WHERE
                    C.REMESSA = NEW.REMESSA
                AND C.TALAO = OLD.REMESSA_ACUMULADO_CONTROLE
                AND C.TALAO_DETALHE_ID = 0
            INTO
                :NEW_C_ESTABELECIMENTO_ID       ,
                :NEW_C_FAMILIA_ID               ,
                :NEW_C_REMESSA                  ,
                :NEW_C_TALAO                    ,
                :NEW_C_PRODUTO_ID               ,
                :NEW_C_TAMANHO                  ,
                :NEW_C_LOCALIZACAO_ID           ,
                :NEW_C_DENSIDADE                ,
                :NEW_C_ESPESSURA                ,
                :NEW_C_COR_ID                   ,
                :NEW_C_ESTEIRA_ID               ,
                :NEW_C_SETOR_ID                 ,
                :NEW_C_FATOR_CONVERSAO          ,
                :NEW_C_QUANTIDADE               ,
                :NEW_C_CONSUMO_ML               ,
                :NEW_C_CONSUMO_KG               ,
                :NEW_C_QUANTIDADE_CONFERENCIA   ,
                :NEW_C_DATAHORA_CONFERENCIA     ,
                :NEW_C_REQUISICAO_ID            ,
                :NEW_C_DATA                     ,
                :NEW_C_CCUSTO                   ,
                :NEW_C_QUEBRA                   ,
                :NEW_C_SEGURANCA                ,
                :NEW_C_TALAO_DETALHE_ID         ,
                :NEW_C_CONTROLE                 ,
                :NEW_C_QUANTIDADE_CONFERENCIA_ML,
                :NEW_C_COMPONENTE               ,
                :NEW_C_QUANTIDADE_SOBRA         ,
                :NEW_C_SALDO_BAIXAR             ,
                :NEW_C_QUANTIDADE_NECES         ,
                :NEW_C_QUANTIDADE_NECES_ALTERN  
            DO
            BEGIN
                INSERT INTO TBREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    FAMILIA_ID,
                    REMESSA,
                    TALAO,
                    PRODUTO_ID,
                    TAMANHO,
                    LOCALIZACAO_ID,
                    DENSIDADE,
                    ESPESSURA,
                    COR_ID,
                    ESTEIRA_ID,
                    SETOR_ID,
                    FATOR_CONVERSAO,
                    QUANTIDADE,
                    CONSUMO_ML,
                    CONSUMO_KG,
                    QUANTIDADE_CONFERENCIA,
                    DATAHORA_CONFERENCIA,
                    REQUISICAO_ID,
                    DATA,
                    CCUSTO,
                    QUEBRA,
                    SEGURANCA,
                    TALAO_DETALHE_ID,
                    CONTROLE,
                    QUANTIDADE_CONFERENCIA_ML,
                    COMPONENTE,
                    QUANTIDADE_SOBRA,
                    SALDO_BAIXAR,
                    QUANTIDADE_NECES,
                    QUANTIDADE_NECES_ALTERN
                ) VALUES (
                    :NEW_C_ESTABELECIMENTO_ID       ,
                    :NEW_C_FAMILIA_ID               ,
                    :NEW_C_REMESSA                  ,
                     NEW.REMESSA_ACUMULADO_CONTROLE ,
                    :NEW_C_PRODUTO_ID               ,
                    :NEW_C_TAMANHO                  ,
                    :NEW_C_LOCALIZACAO_ID           ,
                    :NEW_C_DENSIDADE                ,
                    :NEW_C_ESPESSURA                ,
                    :NEW_C_COR_ID                   ,
                    :NEW_C_ESTEIRA_ID               ,
                    :NEW_C_SETOR_ID                 ,
                    :NEW_C_FATOR_CONVERSAO          ,
                    :NEW_C_QUANTIDADE               ,
                    :NEW_C_CONSUMO_ML               ,
                    :NEW_C_CONSUMO_KG               ,
                    :NEW_C_QUANTIDADE_CONFERENCIA   ,
                    :NEW_C_DATAHORA_CONFERENCIA     ,
                    :NEW_C_REQUISICAO_ID            ,
                    :NEW_C_DATA                     ,
                    :NEW_C_CCUSTO                   ,
                    :NEW_C_QUEBRA                   ,
                    :NEW_C_SEGURANCA                ,
                    :NEW_C_TALAO_DETALHE_ID         ,
                    :NEW_C_CONTROLE                 ,
                    :NEW_C_QUANTIDADE_CONFERENCIA_ML,
                    :NEW_C_COMPONENTE               ,
                    :NEW_C_QUANTIDADE_SOBRA         ,
                    :NEW_C_SALDO_BAIXAR             ,
                    :NEW_C_QUANTIDADE_NECES         ,
                    :NEW_C_QUANTIDADE_NECES_ALTERN  
                );
            END

        END
        ELSE
        BEGIN
            UPDATE VWREMESSA_TALAO T
               SET T.QUANTIDADE = T.QUANTIDADE + NEW.QUANTIDADE_PEDIDO,
                   T.QUANTIDADE_ALTERNATIVA = T.QUANTIDADE_ALTERNATIVA + NEW.QUANTIDADE_ALTERN
             WHERE T.ID = :TALAO_ID;
        END
        

        UPDATE VWREMESSA_CONSUMO C
           SET C.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
         WHERE C.REMESSA_TALAO_DETALHE_ID = OLD.CONTROLE;

        UPDATE TBREMESSA_CONSUMO_VINCULO V
           SET V.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
         WHERE V.REMESSA_TALAO_DETALHE_ID = OLD.CONTROLE;

        NEW.TALAO_DESMEMBRAMENTO = OLD.REMESSA_ACUMULADO_CONTROLE;

        EXECUTE PROCEDURE SPI_HISTORICO (
            'TBREMESSA',
            NEW.REMESSA,
            'DETALHAMENTO: ' || NEW.CONTROLE || ' DESMEMBRADO DO TALAO: ' || OLD.REMESSA_ACUMULADO_CONTROLE || ' PARA: ' || NEW.REMESSA_ACUMULADO_CONTROLE
        );

--        EXECUTE PROCEDURE SPI_EMAIL('emersoncoelho@delfa.com.br','Desmembramento Realizado REMESSA: ' || COALESCE((SELECT FIRST 1 REMESSA FROM VWREMESSA R WHERE R.REMESSA_ID = NEW.REMESSA),'') || ' PARA: ' || NEW.REMESSA_ACUMULADO_CONTROLE,'
--        REMESSA: ' || COALESCE((SELECT FIRST 1 REMESSA FROM VWREMESSA R WHERE R.REMESSA_ID = NEW.REMESSA),'') || '
--        REMESSA_ID: ' || NEW.REMESSA || '<br/>
--        DETALHAMENTO: ' || NEW.CONTROLE || ' DESMEMBRADO DO TALAO: ' || OLD.REMESSA_ACUMULADO_CONTROLE || ' PARA: ' || NEW.REMESSA_ACUMULADO_CONTROLE
--        );
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbtaloes_avulsos_b02i for tbtaloes_avulsos
active before insert or update position 1
AS
declare variable nova_remessa integer;
declare variable ANO integer;
declare variable MES integer;
declare variable PERFIL_UP varchar(10);
declare variable FAMILIA_ID varchar(10);
declare variable ABREVGP varchar(10);
declare variable ESTABELECIMENTO_CODIGO integer;
declare variable TALAO_ID integer;
declare variable quantidade_producao numeric(15,4);
declare variable quantidade_alternativa numeric(15,4);
declare variable espessura numeric(15,4);
declare variable densidade numeric(15,4);
declare variable produto_id integer;
declare variable um varchar(10);
declare variable uma varchar(10);
declare variable fator numeric(15,4);
declare variable linha_codigo integer;
declare variable densidade_espessura integer;
declare variable ITEM_PROCESSADO integer;
declare variable localizacao_id integer;
declare variable perfil_sku varchar(10);
declare variable programacao_id integer;
declare variable TEMPO_TOTAL numeric(18,8);
declare variable TEMPO_SETUP numeric(18,8);
declare variable autorizaCAO varchar(300);
declare variable gerar_taloes integer;
declare variable USUARIO_NOTIFICAR integer;
declare variable corpo1 blob sub_type 1 segment size 80;
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

    ESTABELECIMENTO_CODIGO = 1;

    select
        g.familia_id,
        p.id as PERFIL,
        FN_REPLACE(substring(g.descricao from 1 for 3),'.|-|1|2|3|4|5|6|7||9|0','') as ABREVGP
    from TBGP_UP s, tbgp g, tbup u, tbperfil p, tbfamilia f
    where g.id = new.gp_id
        and g.id = s.gp_id
        and s.up_id = u.id
        and u.perfil = p.id
        and p.tabela = 'UP'
        and u.id = new.up_id
        and f.codigo = g.familia_id
    into FAMILIA_ID, PERFIL_UP, ABREVGP;

    gerar_taloes = 0;

    IF(inserting)THEN
    BEGIN

        autorizaCAO = trim(fn_parametro('TBFAMILIA.AUTORIZAR_AVULSOS', :FAMILIA_ID));

        IF(autorizaCAO = '0')THEN
        BEGIN
          NEW.autorizacao = 1;
          gerar_taloes = 1;
        end ELSE
        BEGIN
          NEW.autorizacao = 0;
          gerar_taloes = 0;

          for
            select OSPLIT FROM split(:autorizaCAO, ',')
          INTO
            :USUARIO_NOTIFICAR
          DO BEGIN

            corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
            corpo1 = corpo1 || '<p></p>';
            corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_22450?ID='||new.id||'" target="_blank">[ABRIR NA WEB]</a></p>';
            corpo1 = corpo1 || '<br>';
            corpo1 = corpo1 || '<p style="font-weight: bold;"><u>ID: '||new.id||'</u></p>';
            corpo1 = corpo1 || '<p><u>Usuário</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = fn_current_user_id() ),'')||'</p>';
            corpo1 = corpo1 || '<p><u>Produto</u>: '||(coalesce((select first 1 j.codigo||' - '||j.descricao from tbproduto j where j.modelo_codigo = new.modelo_id and j.cor_codigo = new.cor_id),''))||'</p>';
            corpo1 = corpo1 || '<p><u>Quantidade</u>: '||replace(new.quantidade||'','.',',')||'</p>';
            corpo1 = corpo1 || '<p><u>Observação</u>: '||new.observacao||'</p>';
            corpo1 = corpo1 || '<br>';
            corpo1 = corpo1 || '</body></html>';

            execute procedure SPI_NOTIFICAR(current_timestamp, :USUARIO_NOTIFICAR, 'Talão Avulso Pendente de autorização', :corpo1,1,1);

          END
        END

    END

    IF(updating)THEN
    BEGIN

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
        corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_22450?ID='||new.id||'" target="_blank">[ABRIR NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"><u>ID: '||new.id||'</u></p>';
        corpo1 = corpo1 || '<p><u>Usuário</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = fn_current_user_id() ),'')||'</p>';
        corpo1 = corpo1 || '<p><u>Produto</u>: '||(coalesce((select first 1 j.codigo||' - '||j.descricao from tbproduto j where j.modelo_codigo = new.modelo_id and j.cor_codigo = new.cor_id),''))||'</p>';
        corpo1 = corpo1 || '<p><u>Quantidade</u>: '||replace(new.quantidade||'','.',',')||'</p>';
        corpo1 = corpo1 || '<p><u>Observação</u>: '||new.observacao||'</p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '</body></html>';

      IF(OLD.autorizacao = 0 AND NEW.autorizacao = 1)THEN
      BEGIN
        HISTORICO = 'Aprovado';
        execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);

        execute procedure SPI_NOTIFICAR(current_timestamp, new.usuario_id, 'Talão Avulso Aprovado', :corpo1,1,1);

        gerar_taloes = 1;
      END ELSE
      BEGIN
        gerar_taloes = 0;
      END

      IF(OLD.autorizacao <> 2 AND NEW.autorizacao = 2)THEN
      BEGIN
        HISTORICO = 'Reprovado';
        execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);
        gerar_taloes = 0;

        execute procedure SPI_NOTIFICAR(current_timestamp, new.usuario_id, 'Talão Avulso Reprovado', :corpo1,1,1);

      END

    END

    IF(gerar_taloes = 1)THEN
    BEGIN
        ABREVGP = fn_lpad(new.up_id, 4, '0');
    
        ANO = extract(year from current_timestamp);
        MES = extract(month from current_timestamp);
    
        nova_remessa =  coalesce((select first 1 s.remessa_id from TBTALOES_AVULSOS_REMESSAS s, tbremessa r where r.numero = s.remessa_id and s.ANO = :ANO and s.MES = :MES and s.gp_id = new.gp_id and s.up_id = new.up_id),0);
    
        if(nova_remessa = 0)then
        begin
            nova_remessa = GEN_ID(GTBREMESSA,1);
    
            INSERT INTO TBTALOES_AVULSOS_REMESSAS (REMESSA_ID, ANO, MES, GP_ID, PERFIL_UP, UP_ID) VALUES (:nova_remessa, :ANO, :MES, new.gp_id, :PERFIL_UP, new.up_id);
    
            --########################## - remessa - ###############################
            INSERT INTO TBREMESSA (
                NUMERO,
                ESTABELECIMENTO_CODIGO,
                FAMILIA_CODIGO,
                TURNO_CODIGO,
                DATA,
                USUARIO_CODIGO,
                TIPO,
                TONALIDADE,
                PROJECAO,
                OC,
                BLOQ,
                STATUS,
                REMESSA,
                AGRUPAMENTO_ID,
                FAMILIA_MP,
                REQUISICAO,
                DESCRICAO,
                DATA_BSC,
                DATAHORA,
                GP_ID,
                CONTROLE_TALAO,
                COMPONENTE,
                WEB,
                AMOSTRA,
                DATA_DISPONIBILIDADE,
                OBSERVACAO,
                EMPRESA_ID,
                DATA_PREVISAO,
                PERFIL,
                CLASSIFICACAO
            ) VALUES (
                :nova_remessa,
                :ESTABELECIMENTO_CODIGO,
                :FAMILIA_ID,
                NULL,
                '01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4),
                new.usuario_id,
                '1',
                '',
                '0',
                '0',
                '0',
                '1',
                :ABREVGP||'_'||lpad(:ano, 4)||lpad(:mes, 2),
                0,
                0,
                '0',
                NULL,
                fn_start_of_month('01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4)),
                fn_start_of_month('01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4)),
                new.gp_id,
                '',
                '0',
                '1',
                '0',
                NULL,
                '',
                0,
                NULL,
                '1',
                ''
            );
        end
    
        if(nova_remessa = 0)then
        begin
          exception "..." 'Erro ao gerar remessa.';
        end
    
        new.talao_id = coalesce((select max(t.talao_id) from TBTALOES_AVULSOS t where t.remessa_id = :nova_remessa),0) + 1;
    
        new.remessa_id = :nova_remessa;
    
        -- ################################ - talao acumulado - ########################################
    
        select
            p.codigo,
            f.unidademedida_sigla,
            f.unidademedida_alternativo,
            m.linha_codigo,
            m.densidade,
            m.espessura,
            f.densidade_espessura
        from tbproduto p, tbfamilia f, tbmodelo m
            where p.modelo_codigo = new.modelo_id
            and p.cor_codigo = new.cor_id
            and f.codigo = p.familia_codigo
            and m.codigo = new.modelo_id
            and p.status = '1'
            and m.status = '1'
            and f.status = '1'
        into :produto_id, um, uma, linha_codigo, densidade, espessura, densidade_espessura;
    
        produto_id = coalesce(produto_id,0);
    
        if(produto_id = 0)then
        begin
           exception "..." 'Produto não encontrado. Verifique se tem um produto ativo com esse modelo e cor.';
        end
    
        quantidade_producao    = new.quantidade;
        quantidade_alternativa = 0;
        fator                  = coalesce(fn_parametro('TBMODELO_LINHA.FATOR_CONVERSAO', :linha_codigo),0);
    
    
        if(char_length(trim(uma)) > 0)then
        begin
    
            if(fator = 0)then
            begin
              exception "..." 'Família com unidade de medida alternativa, mais fator não foi encontrado na linha. Linha:'||:linha_codigo||', Parametro:604 da linha.';
            end
    
            quantidade_producao    = new.quantidade / fator;
            quantidade_alternativa = new.quantidade;
        end
    
        if(coalesce(densidade_espessura,0) = 0)then
        begin
            Select
                Cast(Substring(Dens_Esp from 1 for 5) as Integer) Densidade,
                Cast(Substring(Dens_Esp from 6 for 5) as Numeric(15,2)) Espessura
            From (
                Select First 1
                Coalesce((Select First 1 lPad(M.Densidade,5,'0')||lPad(M.Espessura,5,'0')
                From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000') Dens_Esp
                From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
                Where MC.Modelo_Id = new.modelo_id
                and MC.Cor_Id = new.cor_id
                and MC.Produto_Id = P2.Codigo
                and P2.Familia_Codigo = F.Codigo
                and F.Densidade_Espessura = '1'
                and((new.tamanho = 1 and MC.T01 > 0) or
                (new.tamanho = 2 and MC.T02 > 0) or
                (new.tamanho = 3 and MC.T03 > 0) or
                (new.tamanho = 4 and MC.T04 > 0) or
                (new.tamanho = 5 and MC.T05 > 0) or
                (new.tamanho = 6 and MC.T06 > 0) or
                (new.tamanho = 7 and MC.T07 > 0) or
                (new.tamanho = 8 and MC.T08 > 0) or
                (new.tamanho = 9 and MC.T09 > 0) or
                (new.tamanho =10 and MC.T10 > 0) or
                (new.tamanho =11 and MC.T11 > 0) or
                (new.tamanho =12 and MC.T12 > 0) or
                (new.tamanho =13 and MC.T13 > 0) or
                (new.tamanho =14 and MC.T14 > 0) or
                (new.tamanho =15 and MC.T15 > 0) or
                (new.tamanho =16 and MC.T16 > 0) or
                (new.tamanho =17 and MC.T17 > 0) or
                (new.tamanho =18 and MC.T18 > 0) or
                (new.tamanho =19 and MC.T19 > 0) or
                (new.tamanho =20 and MC.T20 > 0))
            ) into densidade, espessura;
    
        end
    
        TALAO_ID = GEN_ID(GTBREMESSA_ITEM_PROCESSADO,1);
    
        INSERT INTO TBREMESSA_ITEM_PROCESSADO (
            REMESSA,
            CONTROLE,
            ESTABELECIMENTO_CODIGO,
            FAMILIA_CODIGO,
            MODELO_CODIGO,
            MATRIZ_CODIGO,
            OPERADOR_CODIGO,
            PRODUTO_CODIGO,
            DATA_LIBERACAO,
            DATA_PRODUCAO,
            HORA_PRODUCAO,
            HORA_LIBERACAO,
            TAMANHO,
            QUANTIDADE,
            CHAPAS,
            PLACAS,
            SOBRAS,
            CONSUMO_MEDIO,
            OBSERVACAO,
            SITUACAO,
            PROGRAMACAO_CONTROLE,
            PROGRAMACAO_SEQUENCIA,
            ESPESSURA,
            SOBRAS_,
            PLACAS_,
            DENSIDADE,
            TOLERANCIA,
            OPERADOR_LIBERACAO,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            PLANOMESTRE_ID,
            LIB,
            UP_ID,
            OPERADOR_PRODUCAO,
            LOCALIZACAO_ID,
            TURNO,
            REQUISICAO_ID,
            PERC_SOBRA,
            QUANTIDADE_SOBRA,
            APROVEITAMENTO,
            ESTOQUE_ID,
            SEQ,
            ID,
            DATAHORA,
            QUANTIDADE_ALTERNATIVA,
            VIA_ETIQUETA,
            OPERADOR_GP,
            PERCENTUAL_TALAO_EXTRA,
            TALAO_EXTRA,
            TALAO_VINCULO,
            FERRAMENTA_ID,
            REPROCESSAR,
            FLAG_DATA,
            PERFIL
        ) VALUES (
            new.remessa_id,
            new.talao_id,
            :ESTABELECIMENTO_CODIGO,
            0,
            new.modelo_id,
            NULL,
            NULL,
            :produto_id,
            NULL,
            NULL,
            NULL,
            NULL,
            new.tamanho,
            :quantidade_producao,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            1,
            0,
            0,
            :espessura,
            NULL,
            NULL,
            :densidade,
            NULL,
            0,
            new.gp_id,
            1,
            0,
            '1',
            new.up_id,
            NULL,
            0,
            '',
            0,
            0,
            0,
            0,
            0,
            '',
            :TALAO_ID,
            current_timestamp,
            :quantidade_alternativa,
            0,
            0,
            NULL,
            NULL,
            NULL,
            NULL,
            0,
            0,
            NULL
        );
    
        --############################### - talao detalhado - ########################################
    
        ITEM_PROCESSADO = GEN_ID(GERADOR1_ID,1);
    
        localizacao_id = coalesce((select first 1 f.localizacao_codigo from TBFAMILIA f where f.codigo = :familia_id),0);
    
        :perfil_sku    = coalesce((select first 1 k.perfil from vwsku k where k.modelo_id = new.modelo_id and k.cor_id = new.cor_id and k.tamanho = new.tamanho),'');
    
        if(:perfil_sku = '')then
        begin
            exception "..." 'Erro ao consultar perfil do produto '||:produto_id;
        end
    
        INSERT INTO TBPEDIDO_ITEM_PROCESSADO (
            PEDIDO_ITEM_CONTROLE,
            CONTROLE,
            ESTABELECIMENTO_CODIGO,
            FAMILIA_CODIGO,
            MODELO_CODIGO,
            CLIENTE_CODIGO,
            PEDIDO,
            REMESSA,
            REMESSA_ACUMULADO_CONTROLE,
            TURNO_LIBERACAO,
            TURNO_PRODUCAO,
            ESTEIRA_LIBERACAO,
            ESTEIRA_PRODUCAO,
            SETOR_CODIGO,
            PRODUTO_CODIGO,
            EXPEDICAO_PRODUTO_CODIGO,
            DATA_PROCESSAMENTO,
            DATA_EXPEDICAO,
            DATA_LIBERACAO,
            DATA_PRODUCAO,
            HORA_EXPEDICAO,
            HORA_LIBERACAO,
            HORA_PRODUCAO,
            LOTE,
            TAMANHO,
            QUANTIDADE_PEDIDO,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
            SITUACAO,
            OPERADOR_ID_PRODUCAO,
            OPERADOR,
            PROGRAMACAO_CONTROLE,
            PROGRAMACAO_SEQUENCIA,
            PROGRAMACAO_TURNO,
            COR_ID,
            VOLUME,
            PECA_CONJUNTO,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            VIA_ETIQUETA,
            LIB,
            LOCALIZACAO_CODIGO,
            REG_ESTOQUE,
            STATUS_PRODUCAO,
            AGRUPAMENTO_ID,
            COLETA_ID,
            ESTOQUE_ID,
            DATAHORA,
            QUANTIDADE_PRODUCAO_TMP,
            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            QUANTIDADE_ALTERN_PRODUCAO_TMP,
            QUANTIDADE_SOBRA_TMP,
            QUANTIDADE_SOBRA,
            ESTOQUE_ID_BAIXA,
            QUANTIDADE_BAIXA,
            TURNO,
            ACRESCIMO,
            TALAO_DESMEMBRAMENTO,
            ESTOQUE_ID_S_TRANSF,
            ESTOQUE_ID_E_TRANSF,
            MOTIVO_BAIXA,
            TIPO_BAIXA,
            CCUSTO_BAIXA,
            OBSERVACAO,
            FERRAMENTA_ID,
            ENDERECAMENTO_ID,
            FLAG_DATA,
            MOTIVO_BAIXA_ID,
            PERFIL
        )VALUES (
            0,
            :ITEM_PROCESSADO,
            :estabelecimento_codigo,
            0,
            new.modelo_id,
            NULL,
            NULL,
            new.remessa_id,
            new.talao_id,
            NULL,
            1,
            NULL,
            NULL,
            NULL,
            :produto_id,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            new.tamanho,
            :quantidade_producao,
            :quantidade_producao,
            :quantidade_producao,
            1,
            NULL,
            NULL,
            0,
            0,
            0,
            new.cor_id,
            0,
            1,
            new.gp_id,
            1,
            0,
            '0',
            :localizacao_id,
            '0',
            '0',
            0,
            NULL,
            0,
            current_timestamp,
            0,
            :quantidade_alternativa,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            0,
            NULL,
            NULL,
            NULL,
            '',
            '',
            '',
            NULL,
            NULL,
            NULL,
            0,
            0,
            :perfil_sku
        );
    
        localizacao_id = coalesce((select LOCALIZACAO_ID from SPC_ESTOQUE_TRANSACAO_REGRA(5,new.gp_id, :perfil_up, :produto_id, 'E', :ITEM_PROCESSADO)),0);
    
        if(:localizacao_id = 0)then
        begin
            exception "..." 'Erro ao consultar localização. Produto: '||:produto_id||', GP: '||new.gp_id||', Tipo: "E", Perfil: '||:perfil_up||' Regra: 5';
        end
    
        update TBPEDIDO_ITEM_PROCESSADO t set t.localizacao_codigo = :localizacao_id where t.controle = :ITEM_PROCESSADO;
    
    
        --################### - programacao - ####################
    
    
            TEMPO_TOTAL = 0;
            TEMPO_SETUP = 0;
            DELETE FROM TMP22040;
    
    
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               new.up_id,
               new.modelo_id,
               new.cor_id,
               new.tamanho,
               :quantidade_producao
            );
                         
            --TEMPO_TOTAL = COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),1);

            SELECT FIRST 1 T.TOTAL, t.totalsetup FROM SPC_PROGRAMACAO_TEMPO_NOVO T
            into :TEMPO_TOTAL, :TEMPO_SETUP;
    
            TEMPO_TOTAL = COALESCE(:TEMPO_TOTAL,1);
            TEMPO_SETUP = COALESCE(:TEMPO_SETUP,0);
    
            IF ( TEMPO_TOTAL = 0 ) THEN
            BEGIN
                TEMPO_TOTAL = 1;
            END
    
            EXECUTE PROCEDURE SPI_PROGRAMACAO2(
                :estabelecimento_codigo,
                'A',
                new.gp_id,
                new.up_id,
                1,
                :TALAO_ID,
                0,
                0,
                :quantidade_producao,
                :TEMPO_TOTAL,
                new.remessa_id,
                current_date,
                :TEMPO_SETUP
            );
    
            --########################### - consumo - ############################
            execute procedure SPI_REM_CONSUMO_INSUMO_TALAO(:estabelecimento_codigo, new.remessa_id, new.talao_id);
     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 First 1 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 First 1 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 First 1 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 First 1 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 ; ^

